diff --git a/internal/db/dameng_impl.go b/internal/db/dameng_impl.go index e68fecc7..427d72fc 100644 --- a/internal/db/dameng_impl.go +++ b/internal/db/dameng_impl.go @@ -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) } diff --git a/internal/db/dameng_metadata.go b/internal/db/dameng_metadata.go index 620c97f5..d26958f9 100644 --- a/internal/db/dameng_metadata.go +++ b/internal/db/dameng_metadata.go @@ -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") diff --git a/internal/db/dameng_metadata_test.go b/internal/db/dameng_metadata_test.go index 52e4f534..8da4e45e 100644 --- a/internal/db/dameng_metadata_test.go +++ b/internal/db/dameng_metadata_test.go @@ -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": "主键", }, })