diff --git a/internal/endtoend/testdata/quoted_colname/sqlite/go/db.go b/internal/endtoend/testdata/quoted_colname/sqlite/go/db.go new file mode 100644 index 0000000000..57406b68e8 --- /dev/null +++ b/internal/endtoend/testdata/quoted_colname/sqlite/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.20.0 + +package querytest + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/quoted_colname/sqlite/go/models.go b/internal/endtoend/testdata/quoted_colname/sqlite/go/models.go new file mode 100644 index 0000000000..c1a7404836 --- /dev/null +++ b/internal/endtoend/testdata/quoted_colname/sqlite/go/models.go @@ -0,0 +1,11 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.20.0 + +package querytest + +import () + +type Test struct { + ID string +} diff --git a/internal/endtoend/testdata/quoted_colname/sqlite/go/query.sql.go b/internal/endtoend/testdata/quoted_colname/sqlite/go/query.sql.go new file mode 100644 index 0000000000..c7ba8d9109 --- /dev/null +++ b/internal/endtoend/testdata/quoted_colname/sqlite/go/query.sql.go @@ -0,0 +1,37 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.20.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const testList = `-- name: TestList :many +SELECT id FROM "test" +` + +func (q *Queries) TestList(ctx context.Context) ([]string, error) { + rows, err := q.db.QueryContext(ctx, testList) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var id string + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/quoted_colname/sqlite/query.sql b/internal/endtoend/testdata/quoted_colname/sqlite/query.sql new file mode 100644 index 0000000000..a40ba6fd45 --- /dev/null +++ b/internal/endtoend/testdata/quoted_colname/sqlite/query.sql @@ -0,0 +1,8 @@ +-- Example queries for sqlc +CREATE TABLE "test" +( + "id" TEXT NOT NULL +); + +-- name: TestList :many +SELECT * FROM "test"; \ No newline at end of file diff --git a/internal/endtoend/testdata/quoted_colname/sqlite/sqlc.json b/internal/endtoend/testdata/quoted_colname/sqlite/sqlc.json new file mode 100644 index 0000000000..3ed5eea856 --- /dev/null +++ b/internal/endtoend/testdata/quoted_colname/sqlite/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "sqlite", + "schema": "query.sql", + "queries": "query.sql", + "name": "querytest" + } + ] +} \ No newline at end of file diff --git a/internal/engine/sqlite/convert.go b/internal/engine/sqlite/convert.go index 3dbe9ee663..6af2ffc245 100644 --- a/internal/engine/sqlite/convert.go +++ b/internal/engine/sqlite/convert.go @@ -29,10 +29,14 @@ func todo(funcname string, n node) *ast.TODO { } func identifier(id string) string { + if len(id) >= 2 && id[0] == '"' && id[len(id)-1] == '"' { + unquoted, _ := strconv.Unquote(id) + return unquoted + } return strings.ToLower(id) } -func NewIdentifer(t string) *ast.String { +func NewIdentifier(t string) *ast.String { return &ast.String{Str: identifier(t)} } @@ -293,7 +297,7 @@ func (c *cc) convertFuncContext(n *parser.Expr_functionContext) ast.Node { }, Funcname: &ast.List{ Items: []ast.Node{ - NewIdentifer(funcName), + NewIdentifier(funcName), }, }, AggStar: n.STAR() != nil, @@ -317,16 +321,16 @@ func (c *cc) convertColumnNameExpr(n *parser.Expr_qualified_column_nameContext) if schema, ok := n.Schema_name().(*parser.Schema_nameContext); ok { schemaText := schema.GetText() if schemaText != "" { - items = append(items, NewIdentifer(schemaText)) + items = append(items, NewIdentifier(schemaText)) } } if table, ok := n.Table_name().(*parser.Table_nameContext); ok { tableName := table.GetText() if tableName != "" { - items = append(items, NewIdentifer(tableName)) + items = append(items, NewIdentifier(tableName)) } } - items = append(items, NewIdentifer(n.Column_name().GetText())) + items = append(items, NewIdentifier(n.Column_name().GetText())) return &ast.ColumnRef{ Fields: &ast.List{ Items: items, @@ -384,7 +388,7 @@ func (c *cc) convertMultiSelect_stmtContext(n *parser.Select_stmtContext) ast.No tableName := identifier(cte.Table_name().GetText()) var cteCols ast.List for _, col := range cte.AllColumn_name() { - cteCols.Items = append(cteCols.Items, NewIdentifer(col.GetText())) + cteCols.Items = append(cteCols.Items, NewIdentifier(col.GetText())) } ctes = append(ctes, &ast.CommonTableExpr{ Ctename: &tableName, @@ -506,7 +510,7 @@ func (c *cc) getCols(core *parser.Select_coreContext) []ast.Node { func (c *cc) convertWildCardField(n *parser.Result_columnContext) *ast.ColumnRef { items := []ast.Node{} if n.Table_name() != nil { - items = append(items, NewIdentifer(n.Table_name().GetText())) + items = append(items, NewIdentifier(n.Table_name().GetText())) } items = append(items, &ast.A_Star{}) @@ -853,7 +857,7 @@ func (c *cc) convertTablesOrSubquery(n []parser.ITable_or_subqueryContext) []ast }, Funcname: &ast.List{ Items: []ast.Node{ - NewIdentifer(rel), + NewIdentifier(rel), }, }, Args: &ast.List{ @@ -965,7 +969,7 @@ func (c *cc) convertCastExpr(n *parser.Expr_castContext) ast.Node { TypeName: &ast.TypeName{ Name: name, Names: &ast.List{Items: []ast.Node{ - NewIdentifer(name), + NewIdentifier(name), }}, ArrayBounds: &ast.List{}, },