mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-18 11:22:08 +08:00
🐛 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:
@@ -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_comment(Error -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)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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": "主键",
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user