From d0ff43684d124895105377d6055d46bf55f0591d Mon Sep 17 00:00:00 2001 From: actiontech-zihan Date: Fri, 24 Apr 2026 13:09:59 +0000 Subject: [PATCH] fix: use case-insensitive column name matching in ShowCreateTable/ShowCreateView GoldenDB returns uppercase column names ("CREATE TABLE", "CREATE VIEW") instead of MySQL's mixed-case ("Create Table", "Create View"), causing SQLE schema meta collection to fail with "column not found" error. Replace hardcoded map key lookups with case-insensitive iteration over result keys. Also improve error messages to include available column names for easier debugging of similar issues with other DB engines. Fixes #2772 --- sqle/driver/mysql/executor/executor.go | 40 ++++++++++++++++---------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/sqle/driver/mysql/executor/executor.go b/sqle/driver/mysql/executor/executor.go index 92f17c7e91..6d86649e02 100644 --- a/sqle/driver/mysql/executor/executor.go +++ b/sqle/driver/mysql/executor/executor.go @@ -307,21 +307,29 @@ func (c *Executor) ShowCreateTable(schema, tableName string) (string, error) { return "", errors.New(errors.ConnectRemoteDatabaseError, err) } - var queryCreate sql.NullString - var ok bool - if queryCreate, ok = result[0]["Create Table"]; ok { - return queryCreate.String, nil - } - - if queryCreate, ok = result[0]["Create View"]; ok { - return queryCreate.String, nil + // Different databases may return different column names for SHOW CREATE TABLE. + // For example, MySQL returns "Create Table" / "Create View", while GoldenDB returns + // "CREATE TABLE" / "CREATE VIEW". Use case-insensitive matching to handle all variants. + for key, val := range result[0] { + upperKey := strings.ToUpper(key) + if upperKey == "CREATE TABLE" || upperKey == "CREATE VIEW" { + return val.String, nil + } } - err = fmt.Errorf("show create table error, column \"Create Table\" or \"Create View\" not found") + err = fmt.Errorf("show create table error, column \"Create Table\" or \"Create View\" not found, available columns: %v", getResultKeys(result[0])) c.Db.Logger().Error(err) return "", errors.New(errors.ConnectRemoteDatabaseError, err) } +func getResultKeys(row map[string]sql.NullString) []string { + keys := make([]string, 0, len(row)) + for k := range row { + keys = append(keys, k) + } + return keys +} + /* 示例: @@ -484,13 +492,15 @@ func (c *Executor) ShowCreateView(tableName string) (string, error) { c.Db.Logger().Error(err) return "", errors.New(errors.ConnectRemoteDatabaseError, err) } - if query, ok := result[0]["Create View"]; !ok { - err := fmt.Errorf("show create view error, column \"Create View\" not found") - c.Db.Logger().Error(err) - return "", errors.New(errors.ConnectRemoteDatabaseError, err) - } else { - return query.String, nil + for key, val := range result[0] { + if strings.ToUpper(key) == "CREATE VIEW" { + return val.String, nil + } } + + err = fmt.Errorf("show create view error, column \"Create View\" not found, available columns: %v", getResultKeys(result[0])) + c.Db.Logger().Error(err) + return "", errors.New(errors.ConnectRemoteDatabaseError, err) } func (c *Executor) ShowCurrentMaxColumnWidth(tableName, columnName string) (int, error) {