🐛 fix(dameng): 修复设计表加载字段因 comment 保留字别名失败

- GetColumns/GetAllColumns 将 AS comment 改为 AS col_comment
- 达梦 COMMENT 为保留字,AS comment 会触发 Error -2007 语法分析出错
- 结果映射优先读取 COL_COMMENT,兼容 COMMENT/COMMENTS
- 补充单测锁定禁止使用 AS comment 别名
This commit is contained in:
Syngnat
2026-07-09 09:48:52 +08:00
parent 6fb6674803
commit 8808a5aa77
3 changed files with 23 additions and 14 deletions

View File

@@ -491,7 +491,8 @@ func (d *DamengDB) ApplyChanges(tableName string, changes connection.ChangeSet)
}
func (d *DamengDB) GetAllColumns(dbName string) ([]connection.ColumnDefinitionWithTable, error) {
query := fmt.Sprintf(`SELECT c.table_name, c.column_name, c.data_type, cc.comments AS comment
// 达梦 COMMENT 为保留字,别名使用 col_commentError -2007: AS comment 语法分析出错)
query := fmt.Sprintf(`SELECT c.table_name, c.column_name, c.data_type, cc.comments AS col_comment
FROM all_tab_columns c
LEFT JOIN all_col_comments cc
ON cc.owner = c.owner AND cc.table_name = c.table_name AND cc.column_name = c.column_name
@@ -508,7 +509,7 @@ func (d *DamengDB) GetAllColumns(dbName string) ([]connection.ColumnDefinitionWi
TableName: fmt.Sprintf("%v", row["TABLE_NAME"]),
Name: fmt.Sprintf("%v", row["COLUMN_NAME"]),
Type: fmt.Sprintf("%v", row["DATA_TYPE"]),
Comment: fmt.Sprintf("%v", row["COMMENT"]),
Comment: getDamengRowString(row, "COL_COMMENT", "COMMENT", "COMMENTS"),
}
cols = append(cols, col)
}

View File

@@ -109,8 +109,9 @@ func buildDamengColumnsQuery(dbName, tableName string) string {
upperTableName := strings.ToUpper(strings.TrimSpace(tableName))
upperDBName := strings.ToUpper(strings.TrimSpace(dbName))
// 注意:达梦中 COMMENT 为保留字,不能使用 AS comment 作为列别名Error -2007 语法分析出错)。
if upperDBName == "" {
return fmt.Sprintf(`SELECT c.column_name, c.data_type, c.data_length, c.char_length, c.data_precision, c.data_scale, c.nullable, c.data_default, cc.comments AS comment,
return fmt.Sprintf(`SELECT c.column_name, c.data_type, c.data_length, c.char_length, c.data_precision, c.data_scale, c.nullable, c.data_default, cc.comments AS col_comment,
CASE WHEN pk.column_name IS NOT NULL THEN 'PRI' ELSE '' END AS column_key
FROM user_tab_columns c
LEFT JOIN user_col_comments cc
@@ -127,7 +128,7 @@ func buildDamengColumnsQuery(dbName, tableName string) string {
ORDER BY c.column_id`, upperTableName, upperTableName, upperTableName)
}
return fmt.Sprintf(`SELECT c.column_name, c.data_type, c.data_length, c.char_length, c.data_precision, c.data_scale, c.nullable, c.data_default, cc.comments AS comment,
return fmt.Sprintf(`SELECT c.column_name, c.data_type, c.data_length, c.char_length, c.data_precision, c.data_scale, c.nullable, c.data_default, cc.comments AS col_comment,
CASE WHEN pk.column_name IS NOT NULL THEN 'PRI' ELSE '' END AS column_key
FROM all_tab_columns c
LEFT JOIN all_col_comments cc
@@ -247,7 +248,8 @@ func buildDamengColumnDefinitions(data []map[string]interface{}) []connection.Co
Type: formatDamengColumnType(row),
Nullable: normalizeDamengNullable(getDamengRowString(row, "NULLABLE")),
Key: getDamengRowString(row, "COLUMN_KEY"),
Comment: getDamengRowString(row, "COMMENT", "COMMENTS"),
// col_comment避免达梦保留字 comment 别名;兼容旧别名与原生 comments 列名
Comment: getDamengRowString(row, "COL_COMMENT", "COMMENT", "COMMENTS"),
}
defaultValue := getDamengRowString(row, "DATA_DEFAULT")

View File

@@ -127,16 +127,22 @@ func TestBuildDamengColumnsQuery_IncludesColumnCommentsJoin(t *testing.T) {
if !strings.Contains(userQuery, "user_col_comments") {
t.Fatalf("expected user query to join user_col_comments, got: %s", userQuery)
}
if !strings.Contains(userQuery, "cc.comments AS comment") {
t.Fatalf("expected user query to select column comments, got: %s", userQuery)
if !strings.Contains(userQuery, "cc.comments AS col_comment") {
t.Fatalf("expected user query to select column comments as col_comment, got: %s", userQuery)
}
if strings.Contains(strings.ToLower(userQuery), " as comment") {
t.Fatalf("dameng forbids AS comment alias (reserved word), got: %s", userQuery)
}
allQuery := buildDamengColumnsQuery("app", "orders")
if !strings.Contains(allQuery, "all_col_comments") {
t.Fatalf("expected schema query to join all_col_comments, got: %s", allQuery)
}
if !strings.Contains(allQuery, "cc.comments AS comment") {
t.Fatalf("expected schema query to select column comments, got: %s", allQuery)
if !strings.Contains(allQuery, "cc.comments AS col_comment") {
t.Fatalf("expected schema query to select column comments as col_comment, got: %s", allQuery)
}
if strings.Contains(strings.ToLower(allQuery), " as comment") {
t.Fatalf("dameng forbids AS comment alias (reserved word), got: %s", allQuery)
}
}
@@ -145,11 +151,11 @@ func TestBuildDamengColumnDefinitions_MapsComment(t *testing.T) {
columns := buildDamengColumnDefinitions([]map[string]interface{}{
{
"COLUMN_NAME": "ID",
"DATA_TYPE": "NUMBER",
"NULLABLE": "N",
"COLUMN_KEY": "PRI",
"COMMENT": "主键",
"COLUMN_NAME": "ID",
"DATA_TYPE": "NUMBER",
"NULLABLE": "N",
"COLUMN_KEY": "PRI",
"COL_COMMENT": "主键",
},
})