snapshot of https://github.com/sqlc-dev/sqlc.git (main, 2026-09-16; blobs > 131072B omitted)
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled
This commit is contained in:
1244
internal/engine/duckdb/convert.go
Normal file
1244
internal/engine/duckdb/convert.go
Normal file
File diff suppressed because it is too large
Load Diff
26
internal/engine/duckdb/dialect/dialect.json
Normal file
26
internal/engine/duckdb/dialect/dialect.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"dialect": "duckdb",
|
||||
"default_schema": "main",
|
||||
"const": {
|
||||
"integer": "integer",
|
||||
"float": "double",
|
||||
"string": "varchar",
|
||||
"bool": "boolean"
|
||||
},
|
||||
"bool": "boolean",
|
||||
"comparison": ["=", "==", "<>", "!=", "<", "<=", ">", ">=", "IS DISTINCT FROM", "IS NOT DISTINCT FROM"],
|
||||
"comparison_categories": "BNSDU",
|
||||
"arithmetic": ["+", "-", "*", "/", "//", "%", "**", "^"],
|
||||
"arithmetic_categories": "N",
|
||||
"cast_categories": "NSD",
|
||||
"rewrites": [
|
||||
{
|
||||
"from": "varchar($1)",
|
||||
"to": "varchar"
|
||||
},
|
||||
{
|
||||
"from": "decimal",
|
||||
"to": "decimal(18, 3)"
|
||||
}
|
||||
]
|
||||
}
|
||||
157
internal/engine/duckdb/dialect/operators.jsonl
Normal file
157
internal/engine/duckdb/dialect/operators.jsonl
Normal file
@@ -0,0 +1,157 @@
|
||||
{"name":"!~~","left":"varchar","right":"varchar","result":"boolean"}
|
||||
{"name":"!~~*","left":"varchar","right":"varchar","result":"boolean"}
|
||||
{"name":"%","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"%","left":"decimal","right":"decimal","result":"decimal"}
|
||||
{"name":"%","left":"double","right":"double","result":"double"}
|
||||
{"name":"%","left":"float","right":"float","result":"float"}
|
||||
{"name":"%","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"%","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"%","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"%","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"%","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"%","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"%","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"%","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"%","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"\u0026","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"\u0026","left":"bit","right":"bit","result":"bit"}
|
||||
{"name":"\u0026","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"\u0026","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"\u0026","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"\u0026","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"\u0026","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"\u0026","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"\u0026","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"\u0026","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"\u0026","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"\u0026\u0026","left":"geometry","right":"geometry","result":"boolean"}
|
||||
{"name":"*","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"*","left":"bigint","right":"interval","result":"interval"}
|
||||
{"name":"*","left":"decimal","right":"decimal","result":"decimal"}
|
||||
{"name":"*","left":"double","right":"double","result":"double"}
|
||||
{"name":"*","left":"double","right":"interval","result":"interval"}
|
||||
{"name":"*","left":"float","right":"float","result":"float"}
|
||||
{"name":"*","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"*","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"*","left":"interval","right":"bigint","result":"interval"}
|
||||
{"name":"*","left":"interval","right":"double","result":"interval"}
|
||||
{"name":"*","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"*","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"*","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"*","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"*","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"*","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"*","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"**","left":"double","right":"double","result":"double"}
|
||||
{"name":"+","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"+","left":"bignum","right":"bignum","result":"bignum"}
|
||||
{"name":"+","left":"date","right":"integer","result":"date"}
|
||||
{"name":"+","left":"date","right":"interval","result":"timestamp"}
|
||||
{"name":"+","left":"date","right":"time with time zone","result":"timestamp with time zone"}
|
||||
{"name":"+","left":"date","right":"time","result":"timestamp"}
|
||||
{"name":"+","left":"decimal","right":"decimal","result":"decimal"}
|
||||
{"name":"+","left":"double","right":"double","result":"double"}
|
||||
{"name":"+","left":"float","right":"float","result":"float"}
|
||||
{"name":"+","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"+","left":"integer","right":"date","result":"date"}
|
||||
{"name":"+","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"+","left":"interval","right":"date","result":"timestamp"}
|
||||
{"name":"+","left":"interval","right":"interval","result":"interval"}
|
||||
{"name":"+","left":"interval","right":"time with time zone","result":"time with time zone"}
|
||||
{"name":"+","left":"interval","right":"timestamp with time zone","result":"timestamp with time zone"}
|
||||
{"name":"+","left":"interval","right":"timestamp","result":"timestamp"}
|
||||
{"name":"+","left":"interval","right":"time","result":"time"}
|
||||
{"name":"+","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"+","left":"time with time zone","right":"date","result":"timestamp with time zone"}
|
||||
{"name":"+","left":"time with time zone","right":"interval","result":"time with time zone"}
|
||||
{"name":"+","left":"time","right":"date","result":"timestamp"}
|
||||
{"name":"+","left":"time","right":"interval","result":"time"}
|
||||
{"name":"+","left":"timestamp with time zone","right":"interval","result":"timestamp with time zone"}
|
||||
{"name":"+","left":"timestamp","right":"interval","result":"timestamp"}
|
||||
{"name":"+","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"+","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"+","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"+","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"+","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"+","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"-","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"-","left":"bignum","right":"bignum","result":"bignum"}
|
||||
{"name":"-","left":"date","right":"date","result":"bigint"}
|
||||
{"name":"-","left":"date","right":"integer","result":"date"}
|
||||
{"name":"-","left":"date","right":"interval","result":"timestamp"}
|
||||
{"name":"-","left":"decimal","right":"decimal","result":"decimal"}
|
||||
{"name":"-","left":"double","right":"double","result":"double"}
|
||||
{"name":"-","left":"float","right":"float","result":"float"}
|
||||
{"name":"-","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"-","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"-","left":"interval","right":"interval","result":"interval"}
|
||||
{"name":"-","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"-","left":"time with time zone","right":"interval","result":"time with time zone"}
|
||||
{"name":"-","left":"time","right":"interval","result":"time"}
|
||||
{"name":"-","left":"timestamp with time zone","right":"interval","result":"timestamp with time zone"}
|
||||
{"name":"-","left":"timestamp with time zone","right":"timestamp with time zone","result":"interval"}
|
||||
{"name":"-","left":"timestamp","right":"interval","result":"timestamp"}
|
||||
{"name":"-","left":"timestamp","right":"timestamp","result":"interval"}
|
||||
{"name":"-","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"-","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"-","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"-","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"-","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"-","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"-\u003e\u003e","left":"json","right":"bigint","result":"varchar"}
|
||||
{"name":"-\u003e\u003e","left":"json","right":"varchar","result":"varchar"}
|
||||
{"name":"-\u003e\u003e","left":"varchar","right":"bigint","result":"varchar"}
|
||||
{"name":"-\u003e\u003e","left":"varchar","right":"varchar","result":"varchar"}
|
||||
{"name":"/","left":"double","right":"double","result":"double"}
|
||||
{"name":"/","left":"float","right":"float","result":"float"}
|
||||
{"name":"/","left":"interval","right":"double","result":"interval"}
|
||||
{"name":"//","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"//","left":"double","right":"double","result":"double"}
|
||||
{"name":"//","left":"float","right":"float","result":"float"}
|
||||
{"name":"//","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"//","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"//","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"//","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"//","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"//","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"//","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"//","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"//","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"\u003c\u003c","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"\u003c\u003c","left":"bit","right":"integer","result":"bit"}
|
||||
{"name":"\u003c\u003c","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"\u003c\u003c","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"\u003c\u003c","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"\u003c\u003c","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"\u003c\u003c","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"\u003c\u003c","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"\u003c\u003c","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"\u003c\u003c","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"\u003c\u003c","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"\u003e\u003e","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"\u003e\u003e","left":"bit","right":"integer","result":"bit"}
|
||||
{"name":"\u003e\u003e","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"\u003e\u003e","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"\u003e\u003e","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"\u003e\u003e","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"\u003e\u003e","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"\u003e\u003e","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"\u003e\u003e","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"\u003e\u003e","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"\u003e\u003e","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"^","left":"double","right":"double","result":"double"}
|
||||
{"name":"^@","left":"varchar","right":"varchar","result":"boolean"}
|
||||
{"name":"|","left":"bigint","right":"bigint","result":"bigint"}
|
||||
{"name":"|","left":"bit","right":"bit","result":"bit"}
|
||||
{"name":"|","left":"hugeint","right":"hugeint","result":"hugeint"}
|
||||
{"name":"|","left":"integer","right":"integer","result":"integer"}
|
||||
{"name":"|","left":"smallint","right":"smallint","result":"smallint"}
|
||||
{"name":"|","left":"tinyint","right":"tinyint","result":"tinyint"}
|
||||
{"name":"|","left":"ubigint","right":"ubigint","result":"ubigint"}
|
||||
{"name":"|","left":"uhugeint","right":"uhugeint","result":"uhugeint"}
|
||||
{"name":"|","left":"uinteger","right":"uinteger","result":"uinteger"}
|
||||
{"name":"|","left":"usmallint","right":"usmallint","result":"usmallint"}
|
||||
{"name":"|","left":"utinyint","right":"utinyint","result":"utinyint"}
|
||||
{"name":"~~","left":"varchar","right":"varchar","result":"boolean"}
|
||||
{"name":"~~*","left":"varchar","right":"varchar","result":"boolean"}
|
||||
{"name":"~~~","left":"varchar","right":"varchar","result":"boolean"}
|
||||
40
internal/engine/duckdb/dialect/types.jsonl
Normal file
40
internal/engine/duckdb/dialect/types.jsonl
Normal file
@@ -0,0 +1,40 @@
|
||||
{"name":"any","category":"U"}
|
||||
{"name":"array","category":"C"}
|
||||
{"name":"bigint","category":"N","aliases":["int64","int8","long","oid"]}
|
||||
{"name":"bignum","category":"U","aliases":["varint"]}
|
||||
{"name":"bit","category":"U","aliases":["bitstring"]}
|
||||
{"name":"blob","category":"U","aliases":["binary","bytea","varbinary"]}
|
||||
{"name":"boolean","category":"B","aliases":["bool","logical"]}
|
||||
{"name":"date","category":"D"}
|
||||
{"name":"decimal","category":"N","aliases":["dec","numeric"]}
|
||||
{"name":"double","category":"N","aliases":["float8"]}
|
||||
{"name":"enum","category":"U"}
|
||||
{"name":"float","category":"N","aliases":["float4","real"]}
|
||||
{"name":"geometry","category":"U"}
|
||||
{"name":"hugeint","category":"N","aliases":["int128"]}
|
||||
{"name":"integer","category":"N","aliases":["int","int32","int4","integral","signed"]}
|
||||
{"name":"interval","category":"D"}
|
||||
{"name":"list","category":"C"}
|
||||
{"name":"map","category":"C"}
|
||||
{"name":"smallint","category":"N","aliases":["int16","int2","short"]}
|
||||
{"name":"struct","category":"C","aliases":["row"]}
|
||||
{"name":"time","category":"D"}
|
||||
{"name":"time with time zone","category":"D","aliases":["timetz"]}
|
||||
{"name":"time_ns","category":"D"}
|
||||
{"name":"timestamp","category":"D","aliases":["datetime","timestamp_us"]}
|
||||
{"name":"timestamp with time zone","category":"D","aliases":["timestamptz"]}
|
||||
{"name":"timestamp_ms","category":"D"}
|
||||
{"name":"timestamp_ns","category":"D"}
|
||||
{"name":"timestamp_s","category":"D"}
|
||||
{"name":"timestamptz_ns","category":"D"}
|
||||
{"name":"tinyint","category":"N","aliases":["int1"]}
|
||||
{"name":"tuple","category":"U"}
|
||||
{"name":"ubigint","category":"N","aliases":["uint64"]}
|
||||
{"name":"uhugeint","category":"N","aliases":["uint128"]}
|
||||
{"name":"uinteger","category":"N","aliases":["uint32"]}
|
||||
{"name":"union","category":"C"}
|
||||
{"name":"usmallint","category":"N","aliases":["uint16"]}
|
||||
{"name":"utinyint","category":"N","aliases":["uint8"]}
|
||||
{"name":"uuid","category":"U","aliases":["guid"]}
|
||||
{"name":"varchar","category":"S","aliases":["json","bpchar","char","nvarchar","string","text"]}
|
||||
{"name":"variant","category":"U"}
|
||||
67
internal/engine/duckdb/parse.go
Normal file
67
internal/engine/duckdb/parse.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package duckdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
|
||||
"github.com/sqlc-dev/darkwing/parser"
|
||||
|
||||
"github.com/sqlc-dev/sqlc/internal/source"
|
||||
"github.com/sqlc-dev/sqlc/internal/sql/ast"
|
||||
"github.com/sqlc-dev/sqlc/internal/sql/sqlerr"
|
||||
)
|
||||
|
||||
func NewParser() *Parser {
|
||||
return &Parser{}
|
||||
}
|
||||
|
||||
type Parser struct{}
|
||||
|
||||
// Parse converts DuckDB SQL into sqlc's AST. darkwing assigns every
|
||||
// statement a byte span and the spans tile the input — each statement
|
||||
// starts where the previous one ended — so a statement's span covers the
|
||||
// comments before it, which is where the sqlc query annotation lives.
|
||||
func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) {
|
||||
stmts, err := parser.Parse(context.Background(), r)
|
||||
if err != nil {
|
||||
var perr *parser.Error
|
||||
if errors.As(err, &perr) {
|
||||
serr := &sqlerr.Error{
|
||||
Message: err.Error(),
|
||||
Line: perr.Line,
|
||||
Column: perr.Column,
|
||||
}
|
||||
if perr.Offset >= 0 {
|
||||
serr.Location = perr.Offset
|
||||
}
|
||||
return nil, serr
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var out []ast.Statement
|
||||
for _, stmt := range stmts {
|
||||
converter := &cc{}
|
||||
node := converter.convert(stmt)
|
||||
if _, ok := node.(*ast.TODO); ok {
|
||||
continue
|
||||
}
|
||||
out = append(out, ast.Statement{
|
||||
Raw: &ast.RawStmt{
|
||||
Stmt: node,
|
||||
StmtLocation: stmt.Pos(),
|
||||
StmtLen: stmt.End() - stmt.Pos(),
|
||||
},
|
||||
})
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// https://duckdb.org/docs/stable/sql/introduction#comments
|
||||
func (p *Parser) CommentSyntax() source.CommentSyntax {
|
||||
return source.CommentSyntax{
|
||||
Dash: true, // -- comment
|
||||
SlashStar: true, // /* comment */
|
||||
}
|
||||
}
|
||||
9
internal/engine/duckdb/reserved.go
Normal file
9
internal/engine/duckdb/reserved.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package duckdb
|
||||
|
||||
import "github.com/sqlc-dev/darkwing/token"
|
||||
|
||||
// IsReservedKeyword reports whether s is a reserved keyword in DuckDB's
|
||||
// grammar, per the keyword lists darkwing vendors from DuckDB.
|
||||
func (p *Parser) IsReservedKeyword(s string) bool {
|
||||
return token.Categories(s).Has(token.KeywordReserved)
|
||||
}
|
||||
23
internal/engine/duckdb/seed.go
Normal file
23
internal/engine/duckdb/seed.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package duckdb
|
||||
|
||||
import (
|
||||
"embed"
|
||||
|
||||
"github.com/sqlc-dev/sqlc/internal/core"
|
||||
"github.com/sqlc-dev/sqlc/internal/core/seed"
|
||||
)
|
||||
|
||||
// The dialect directory describes DuckDB's type system. types.jsonl,
|
||||
// functions.jsonl and operators.jsonl are generated from a live DuckDB 2.0
|
||||
// CLI by goldeneye (internal/goldeneye), which also checks them against one;
|
||||
// dialect.json is authored by hand. Regenerate from internal/goldeneye with:
|
||||
//
|
||||
// DUCKDB=/path/to/duckdb go run ./cmd/goldeneye generate duckdb
|
||||
//
|
||||
//go:embed dialect
|
||||
var dialectFS embed.FS
|
||||
|
||||
// Dialect returns the catalog option that seeds DuckDB's type system.
|
||||
func Dialect() core.Option {
|
||||
return seed.Dialect(dialectFS, "dialect")
|
||||
}
|
||||
47
internal/engine/duckdb/utils.go
Normal file
47
internal/engine/duckdb/utils.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package duckdb
|
||||
|
||||
import (
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
dw "github.com/sqlc-dev/darkwing/ast"
|
||||
|
||||
"github.com/sqlc-dev/sqlc/internal/debug"
|
||||
"github.com/sqlc-dev/sqlc/internal/sql/ast"
|
||||
)
|
||||
|
||||
func todo(n dw.Node) *ast.TODO {
|
||||
if debug.Active {
|
||||
log.Printf("duckdb.convert: Unknown node type %T\n", n)
|
||||
}
|
||||
return &ast.TODO{}
|
||||
}
|
||||
|
||||
// identifier normalizes an identifier. DuckDB identifiers are
|
||||
// case-insensitive (though case-preserving); the catalog matches them
|
||||
// lowercased.
|
||||
func identifier(id string) string {
|
||||
return strings.ToLower(id)
|
||||
}
|
||||
|
||||
func NewIdentifier(t string) *ast.String {
|
||||
return &ast.String{Str: identifier(t)}
|
||||
}
|
||||
|
||||
// schemaName normalizes a schema qualifier. DuckDB's default "main" schema
|
||||
// maps to the catalog's default namespace, so it is treated as unqualified.
|
||||
func schemaName(s string) string {
|
||||
s = identifier(s)
|
||||
if s == "main" {
|
||||
return ""
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func parseTableName(catalog, schema, name string) *ast.TableName {
|
||||
return &ast.TableName{
|
||||
Catalog: identifier(catalog),
|
||||
Schema: schemaName(schema),
|
||||
Name: identifier(name),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user