[Bug] Postgres 系源库(Postgres/Kingbase/Redshift/Highgo/Uxdb/Kwdb/Vastbase/GaussDB 自身)迁移到 GaussDB/openGauss 且保留表名时,仍会触发 #6205 的引号折叠问题
数据库类型和版本
GaussDB / openGauss(目标库),源库为 Postgres 系(Postgres、Kingbase、Redshift、Highgo、Uxdb、Kwdb、Vastbase 或 GaussDB/openGauss 自身)
问题描述
#6205 报告的问题是:数据迁移到 GaussDB 时,若字段/表名被强制加上引号,会锁定大小写,导致后续不带引号查询报"字段不存在"。#6283 已经修复了这个问题,但只覆盖了 generate_create_table_ddl 这一条建表路径 (典型场景:MySQL → GaussDB)。
迁移引擎里还有一条"复用源表 DDL"的快捷路径 can_reuse_source_table_ddl(crates/dbx-core/src/transfer.rs:3382-3399):
preserves_target_table_name
&& !matches ! ( target_db_type, DatabaseType :: ClickHouse )
&& ( source_db_type == target_db_type
|| ( is_mysql_family_target ( source_db_type) && is_mysql_family_target ( target_db_type) )
|| ( is_postgres_family_target ( source_db_type) && is_postgres_family_target ( target_db_type) ) )
is_postgres_family_target(crates/dbx-core/src/transfer.rs:1580-1593)把 Postgres | Gaussdb | OpenGauss | Redshift | Kingbase | Highgo | Uxdb | Kwdb | Vastbase 归为同一族。只要源库和目标库都在这一族里、且保留目标表名,就会命中这条分支:直接读取源表的建表 DDL 文本,只经过 rewrite_transfer_source_table_ddl(crates/dbx-core/src/transfer.rs:3402-3414,只改写 schema 限定符),完全不经过 #6283 里改动的 quote_transfer_identifier。
复现步骤(预期):
在 Postgres(或 Kingbase/Redshift/Highgo/Uxdb/Kwdb/Vastbase)建一张表,字段/表名为纯小写、非保留字(如 id、created_at),保持源库默认的不加引号写法。
数据传输到 GaussDB/openGauss,目标表名与源表相同(保留表名)。
预期结果:目标表的字段/表名和源库一样不需要引号即可查询。
实际结果(推测,待复现确认):因为直接复用了源 DDL 文本原样建表,若 GaussDB 对该文本中的无引号标识符采用了与源库不同的大小写折叠规则(如 GaussDB 的 Oracle 兼容模式),后续用户工具里无引号查询该字段仍可能报"字段不存在"——与 [Bug] 数据传输时,源表字段及表名带引号或者反引号时,迁移到目标库时字段及表名能否去掉引号及反引号 #6205 是同一根因,只是触发路径不同。
支持信息
跟随实际复现环境填写(DBX 版本、操作系统、架构)。
优先级(是否紧急)
🟠 P1 重要 · 尽快处理
补充信息
[Bug] Postgres 系源库(Postgres/Kingbase/Redshift/Highgo/Uxdb/Kwdb/Vastbase/GaussDB 自身)迁移到 GaussDB/openGauss 且保留表名时,仍会触发 #6205 的引号折叠问题
数据库类型和版本
GaussDB / openGauss(目标库),源库为 Postgres 系(Postgres、Kingbase、Redshift、Highgo、Uxdb、Kwdb、Vastbase 或 GaussDB/openGauss 自身)
问题描述
#6205 报告的问题是:数据迁移到 GaussDB 时,若字段/表名被强制加上引号,会锁定大小写,导致后续不带引号查询报"字段不存在"。#6283 已经修复了这个问题,但只覆盖了
generate_create_table_ddl这一条建表路径(典型场景:MySQL → GaussDB)。迁移引擎里还有一条"复用源表 DDL"的快捷路径
can_reuse_source_table_ddl(crates/dbx-core/src/transfer.rs:3382-3399):preserves_target_table_name && !matches!(target_db_type, DatabaseType::ClickHouse) && (source_db_type == target_db_type || (is_mysql_family_target(source_db_type) && is_mysql_family_target(target_db_type)) || (is_postgres_family_target(source_db_type) && is_postgres_family_target(target_db_type)))is_postgres_family_target(crates/dbx-core/src/transfer.rs:1580-1593)把Postgres | Gaussdb | OpenGauss | Redshift | Kingbase | Highgo | Uxdb | Kwdb | Vastbase归为同一族。只要源库和目标库都在这一族里、且保留目标表名,就会命中这条分支:直接读取源表的建表 DDL 文本,只经过rewrite_transfer_source_table_ddl(crates/dbx-core/src/transfer.rs:3402-3414,只改写 schema 限定符),完全不经过 #6283 里改动的quote_transfer_identifier。复现步骤(预期):
id、created_at),保持源库默认的不加引号写法。支持信息
跟随实际复现环境填写(DBX 版本、操作系统、架构)。
优先级(是否紧急)
🟠 P1 重要 · 尽快处理
补充信息
generate_create_table_ddl路径)。can_reuse_source_table_ddl判定为 true、目标库为 GaussDB/OpenGauss 时,对读取到的源 DDL 文本中的标识符做同等的"按需加引号"改写,而不是原样透传;或者对 GaussDB/OpenGauss 目标干脆不复用源 DDL,退回走generate_create_table_ddl。