From 88b10e23af12351bbb56b02f2b28f23f974722a0 Mon Sep 17 00:00:00 2001 From: dingyuanhong <754046513@qq.com> Date: Thu, 28 Nov 2024 14:22:36 +0800 Subject: [PATCH] fix error in same name column reference "id" is ambiguous MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit example: CREATE TABLE IF NOT EXISTS `app` ( `id` INT NOT NULL AUTO_INCREMENT, `parent_app_id` INT NOT NULL DEFAULT 0 COMMENT '合并父应用id', PRIMARY KEY (`id`) USING BTREE ) AUTO_INCREMENT = 105 COMMENT = 'API所属的应用信息'; CREATE TABLE IF NOT EXISTS `user_account` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键id', `name` VARCHAR(255) COMMENT '账号名称', PRIMARY KEY (`id`) USING BTREE ) AUTO_INCREMENT = 1 COMMENT='账号表,存储账号的基本信息和安全评分'; -- name: GetUserAccountAllChildIDs :exec WITH app_user_account_id AS ( SELECT tua.id, tua.name, CAST(IFNULL(tb.id, ta.id) AS SIGNED) AS parent_app_id FROM user_account AS tua LEFT JOIN app AS ta ON ta.id = tua.app_id LEFT JOIN app as tb ON ta.parent_app_id = tb.id WHERE tua.masked_sign = 1 AND tua.deleted_sign = 1 AND ta.masked_sign = 1 AND ta.deleted_sign = 1 ) SELECT a.name FROM app_user_account_id AS a LEFT JOIN app_user_account_id AS b ON b.id IN (sqlc.slice('account_id_set')) AND a.name = b.name AND a.parent_app_id = b.parent_app_id; --- internal/compiler/query_catalog.go | 30 ++++++++++++++++++++++++++++++ internal/compiler/resolve.go | 13 ++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/internal/compiler/query_catalog.go b/internal/compiler/query_catalog.go index 80b59d876c..e71a709861 100644 --- a/internal/compiler/query_catalog.go +++ b/internal/compiler/query_catalog.go @@ -2,6 +2,7 @@ package compiler import ( "fmt" + "strings" "github.com/sqlc-dev/sqlc/internal/sql/ast" "github.com/sqlc-dev/sqlc/internal/sql/catalog" @@ -77,6 +78,35 @@ func ConvertColumn(rel *ast.TableName, c *catalog.Column) *Column { } } +func RevertConvertColumn(c *Column) *catalog.Column { + out := &catalog.Column{ + Name: c.Name, + IsNotNull: c.NotNull, + IsUnsigned: c.Unsigned, + IsArray: c.IsArray, + ArrayDims: c.ArrayDims, + Length: c.Length, + } + if c.Type != nil { + out.Type = *c.Type + } + dataTypes := strings.Split(c.DataType, ".") + if len(dataTypes) == 1 { + out.Type.Name = dataTypes[0] + } else if len(dataTypes) == 2 { + out.Type.Schema = dataTypes[0] + out.Type.Name = dataTypes[1] + } + return out +} + +func RevertConvertColumns(columns []*Column) (out []*catalog.Column) { + for i := range columns { + out = append(out, RevertConvertColumn(columns[i])) + } + return +} + func (qc QueryCatalog) GetTable(rel *ast.TableName) (*Table, error) { cte, exists := qc.ctes[rel.Name] if exists { diff --git a/internal/compiler/resolve.go b/internal/compiler/resolve.go index b1fbb1990e..fe5793fdd1 100644 --- a/internal/compiler/resolve.go +++ b/internal/compiler/resolve.go @@ -67,9 +67,20 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar, continue } // If the table name doesn't exist, first check if it's a CTE - if _, qcerr := qc.GetTable(fqn); qcerr != nil { + cteTable, qcerr := qc.GetTable(fqn) + if qcerr != nil { return nil, err } + err = indexTable(catalog.Table{ + Rel: cteTable.Rel, + Columns: RevertConvertColumns(cteTable.Columns), + }) + if err != nil { + return nil, err + } + if rv.Alias != nil { + aliasMap[*rv.Alias.Aliasname] = fqn + } continue } err = indexTable(table)