From 4b4dba2ef7e69e01086108f7f6ab4073a6f2e4ff Mon Sep 17 00:00:00 2001 From: Yaiba <4yaiba@gmail.com> Date: Sun, 21 Jan 2024 16:10:11 -0600 Subject: [PATCH 1/7] parse: ast tree visitor, and walker --- go.mod | 3 +- go.sum | 6 +- internal/engine/execution/procedure.go | 10 +- internal/engine/sqlanalyzer/analyzer.go | 32 +- .../sqlanalyzer/attributes/select_core.go | 10 +- .../attributes/select_core_test.go | 2 +- .../engine/sqlanalyzer/attributes/types.go | 10 +- internal/engine/sqlanalyzer/clean/walker.go | 6 +- internal/engine/sqlanalyzer/join/visitor.go | 12 +- .../sqlanalyzer/mutative/mutative_test.go | 2 +- .../engine/sqlanalyzer/mutative/walker.go | 6 +- internal/engine/sqlanalyzer/mutativity.go | 4 +- internal/engine/sqlanalyzer/order/order.go | 10 +- .../engine/sqlanalyzer/order/order_test.go | 6 +- .../engine/sqlanalyzer/parameters/visitor.go | 14 +- .../sqlanalyzer/parameters/visitor_test.go | 7 +- internal/engine/sqlanalyzer/schema/walker.go | 8 +- .../engine/sqlanalyzer/schema/walker_test.go | 5 +- .../engine/sqlanalyzer/utils/column_search.go | 2 +- internal/engine/sqlanalyzer/utils/utils.go | 2 +- parse/action/{visitor.go => ast_builder.go} | 62 +- parse/action/parser.go | 9 +- parse/action/parser_test.go | 56 +- parse/internal/util/util.go | 24 + .../util/util_test.go} | 7 +- parse/option.go | 50 + parse/sql/{visitor.go => ast_builder.go} | 251 +-- parse/sql/ast_builder_test.go | 49 + parse/sql/ast_traversaler.go | 1 + parse/sql/parser.go | 17 +- parse/sql/parser_test.go | 10 +- parse/sql/tree/CTE.go | 10 +- parse/sql/tree/aggregate-funcs.go | 57 +- parse/sql/tree/aggregate-funcs_test.go | 6 +- parse/sql/tree/ast.go | 24 +- parse/sql/tree/ast_listener.go | 1366 ++++++++++++++++ parse/sql/tree/ast_visitor.go | 269 ++++ parse/sql/tree/base.go | 31 + parse/sql/tree/conflict-target.go | 10 +- parse/sql/tree/delete.go | 43 +- parse/sql/tree/delete_test.go | 2 +- parse/sql/tree/expression.go | 158 +- parse/sql/tree/expression_test.go | 4 +- parse/sql/tree/functions.go | 101 +- parse/sql/tree/functions_test.go | 8 +- parse/sql/tree/group-by.go | 12 +- parse/sql/tree/insert.go | 41 +- parse/sql/tree/insert_test.go | 2 +- parse/sql/tree/join-clause.go | 30 +- parse/sql/tree/limit.go | 12 +- parse/sql/tree/order-by.go | 20 +- parse/sql/tree/qualified-table-name.go | 8 +- parse/sql/tree/result-column.go | 30 +- parse/sql/tree/returning-clause.go | 20 +- parse/sql/tree/select.go | 83 +- parse/sql/tree/select_test.go | 2 +- parse/sql/tree/table-or-subquery.go | 40 +- parse/sql/tree/update-set-clause.go | 10 +- parse/sql/tree/update.go | 47 +- parse/sql/tree/update_test.go | 2 +- parse/sql/tree/upsert.go | 14 +- parse/sql/tree/utils.go | 18 + parse/sql/tree/walker.go | 1380 +---------------- 63 files changed, 2662 insertions(+), 1891 deletions(-) rename parse/action/{visitor.go => ast_builder.go} (84%) create mode 100644 parse/internal/util/util.go rename parse/{sql/visitor_test.go => internal/util/util_test.go} (71%) create mode 100644 parse/option.go rename parse/sql/{visitor.go => ast_builder.go} (76%) create mode 100644 parse/sql/ast_builder_test.go create mode 100644 parse/sql/ast_traversaler.go create mode 100644 parse/sql/tree/ast_listener.go create mode 100644 parse/sql/tree/ast_visitor.go create mode 100644 parse/sql/tree/base.go create mode 100644 parse/sql/tree/utils.go diff --git a/go.mod b/go.mod index 8a89c097c..65d72f9f7 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/jackc/pglogrepl v0.0.0-20231111135425-1627ab1b5780 github.com/jackc/pgx/v5 v5.5.2 github.com/jpillora/backoff v1.0.0 - github.com/kwilteam/kuneiform v0.6.0 + github.com/kwilteam/kuneiform v0.5.1-0.20240322160357-eb097d520367 github.com/kwilteam/kwil-db/core v0.1.0 github.com/kwilteam/kwil-db/parse v0.1.1 github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 @@ -44,6 +44,7 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/antihax/optional v1.0.0 // indirect + github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect diff --git a/go.sum b/go.sum index cd8943177..019bf8c9d 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/alexliesenfeld/health v0.6.0 h1:HRBTCgybNSe4lqGEk7nU82c3bjwh9W+3b46W6 github.com/alexliesenfeld/health v0.6.0/go.mod h1:N4NDIeQtlWumG+6z1ne1v62eQxktz5ylEgGgH9emdMw= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -274,8 +276,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/kuneiform v0.6.0 h1:Y8VWrJN1cl9idqX+LBSQd+c3m/JjDDRInBSKq3i27NY= -github.com/kwilteam/kuneiform v0.6.0/go.mod h1:b3Ce6falEDBQ0xgLpa/hjFjUQoD8aFEg96yewS/3wzg= +github.com/kwilteam/kuneiform v0.5.1-0.20240322160357-eb097d520367 h1:YXtzTYSEpfZuFCZL8O0GDrl9bvvo+9z1jbprQz/FfV4= +github.com/kwilteam/kuneiform v0.5.1-0.20240322160357-eb097d520367/go.mod h1:UdBmsFaV+APgQ7VBcjasH0WLRkK0gNzsrWL7ggtuTg4= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 h1:YiPBu0pOeYOtOVfwKQqdWB07SUef9LvngF4bVFD+x34= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7/go.mod h1:+BrFrV+3qcdYIfptqjwatE5gT19azuRHJzw77wMPY8c= github.com/kwilteam/sql-grammar-go v0.1.0 h1:rSS7DER9PWVDmFwNyoInG5oXrn+E9UrZkjref84L4Qk= diff --git a/internal/engine/execution/procedure.go b/internal/engine/execution/procedure.go index 04aa0f189..96e41ca18 100644 --- a/internal/engine/execution/procedure.go +++ b/internal/engine/execution/procedure.go @@ -453,16 +453,16 @@ func makeExecutables(exprs []tree.Expression) ([]evaluatable, error) { } // clean expression, since it is submitted by the user - err := expr.Accept(clean.NewStatementCleaner()) + err := expr.Walk(clean.NewStatementCleaner()) if err != nil { return nil, err } // The schema walker is not necessary for inline expressions, since // we do not support table references in inline expressions. - accept := sqlanalyzer.NewAcceptRecoverer(expr) - paramVisitor := parameters.NewParametersVisitor() - err = accept.Accept(paramVisitor) + walker := sqlanalyzer.NewWalkerRecoverer(expr) + paramVisitor := parameters.NewParametersWalker() + err = walker.Walk(paramVisitor) if err != nil { return nil, fmt.Errorf("error replacing parameters: %w", err) } @@ -486,7 +486,7 @@ func makeExecutables(exprs []tree.Expression) ([]evaluatable, error) { }, } - stmt, err := selectTree.ToSQL() + stmt, err := tree.SafeToSQL(selectTree) if err != nil { return nil, err } diff --git a/internal/engine/sqlanalyzer/analyzer.go b/internal/engine/sqlanalyzer/analyzer.go index 3503dd10a..6a905d55d 100644 --- a/internal/engine/sqlanalyzer/analyzer.go +++ b/internal/engine/sqlanalyzer/analyzer.go @@ -13,24 +13,24 @@ import ( "github.com/kwilteam/kwil-db/parse/sql/tree" ) -// AcceptRecoverer is a wrapper around a statement that implements the accepter interface -// it catches panics and returns them as errors -type AcceptRecoverer struct { - tree.Accepter +// WalkerRecoverer is a wrapper around a statement that implements the AstWalker +// interface, it catches panics and returns them as errors +type WalkerRecoverer struct { + inner tree.AstWalker } -func NewAcceptRecoverer(a tree.Accepter) *AcceptRecoverer { - return &AcceptRecoverer{a} +func NewWalkerRecoverer(a tree.AstWalker) *WalkerRecoverer { + return &WalkerRecoverer{a} } -func (a *AcceptRecoverer) Accept(walker tree.Walker) (err error) { +func (a *WalkerRecoverer) Walk(walker tree.AstListener) (err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("panic while walking statement: %v", r) } }() - return a.Accepter.Accept(walker) + return a.inner.Walk(walker) } // ApplyRules analyzes the given statement and returns the transformed statement. @@ -48,29 +48,29 @@ func ApplyRules(stmt string, flags VerifyFlag, tables []*common.Table, pgSchemaN return nil, fmt.Errorf("error parsing statement: %w", err) } - accept := &AcceptRecoverer{parsed} + walker := &WalkerRecoverer{parsed} clnr := clean.NewStatementCleaner() - err = accept.Accept(clnr) + err = walker.Walk(clnr) if err != nil { return nil, fmt.Errorf("error cleaning statement: %w", err) } schemaWalker := schema.NewSchemaWalker(pgSchemaName) - err = accept.Accept(schemaWalker) + err = walker.Walk(schemaWalker) if err != nil { return nil, fmt.Errorf("error applying schema rules: %w", err) } if flags&NoCartesianProduct != 0 { - err := accept.Accept(join.NewJoinWalker()) + err := walker.Walk(join.NewJoinWalker()) if err != nil { return nil, fmt.Errorf("error applying join rules: %w", err) } } if flags&GuaranteedOrder != 0 { - err := accept.Accept(order.NewOrderWalker(cleanedTables)) + err := walker.Walk(order.NewOrderWalker(cleanedTables)) if err != nil { return nil, fmt.Errorf("error enforcing guaranteed order: %w", err) } @@ -78,8 +78,8 @@ func ApplyRules(stmt string, flags VerifyFlag, tables []*common.Table, pgSchemaN orderedParams := make([]string, 0) if flags&ReplaceNamedParameters != 0 { - paramVisitor := parameters.NewParametersVisitor() - err := accept.Accept(paramVisitor) + paramVisitor := parameters.NewParametersWalker() + err := walker.Walk(paramVisitor) if err != nil { return nil, fmt.Errorf("error replacing named parameters: %w", err) } @@ -91,7 +91,7 @@ func ApplyRules(stmt string, flags VerifyFlag, tables []*common.Table, pgSchemaN return nil, fmt.Errorf("error determining mutativity: %w", err) } - generated, err := parsed.ToSQL() + generated, err := tree.SafeToSQL(parsed) if err != nil { return nil, fmt.Errorf("error generating SQL: %w", err) } diff --git a/internal/engine/sqlanalyzer/attributes/select_core.go b/internal/engine/sqlanalyzer/attributes/select_core.go index 9ecb0e23c..76d93548b 100644 --- a/internal/engine/sqlanalyzer/attributes/select_core.go +++ b/internal/engine/sqlanalyzer/attributes/select_core.go @@ -45,7 +45,7 @@ type RelationAttribute struct { // then the result column expressions will be tbl.col_1, tbl.col_2, etc. func GetSelectCoreRelationAttributes(selectCore *tree.SelectCore, tables []*common.Table) ([]*RelationAttribute, error) { walker := newSelectCoreWalker(tables) - err := selectCore.Accept(walker) + err := selectCore.Walk(walker) if err != nil { return nil, fmt.Errorf("error analyzing select core: %w", err) } @@ -55,7 +55,7 @@ func GetSelectCoreRelationAttributes(selectCore *tree.SelectCore, tables []*comm func newSelectCoreWalker(tables []*common.Table) *selectCoreAnalyzer { return &selectCoreAnalyzer{ - Walker: tree.NewBaseWalker(), + AstListener: tree.NewBaseListener(), context: newSelectCoreContext(nil), schemaTables: tables, detectedAttributes: []*RelationAttribute{}, @@ -64,7 +64,7 @@ func newSelectCoreWalker(tables []*common.Table) *selectCoreAnalyzer { // selectCoreAnalyzer will walk the tree and identify the returned attributes for the select core type selectCoreAnalyzer struct { - tree.Walker + tree.AstListener context *selectCoreContext schemaTables []*common.Table @@ -278,8 +278,8 @@ func findColumn(columns []*common.Column, name string) (*common.Column, error) { } // addTableIfNotPresent adds the table name to the column if it is not already present. -func addTableIfNotPresent(tableName string, expr tree.Accepter) error { - return expr.Accept(&tree.ImplementedWalker{ +func addTableIfNotPresent(tableName string, expr tree.AstWalker) error { + return expr.Walk(&tree.ImplementedListener{ FuncEnterExpressionColumn: func(col *tree.ExpressionColumn) error { if col.Table == "" { col.Table = tableName diff --git a/internal/engine/sqlanalyzer/attributes/select_core_test.go b/internal/engine/sqlanalyzer/attributes/select_core_test.go index 7d9cc737b..2c051f8d3 100644 --- a/internal/engine/sqlanalyzer/attributes/select_core_test.go +++ b/internal/engine/sqlanalyzer/attributes/select_core_test.go @@ -211,7 +211,7 @@ func TestGetSelectCoreRelationAttributes(t *testing.T) { assert.ElementsMatch(t, tt.resultTableCols, genTable.Columns, "GetSelectCoreRelationAttributes() got = %v, want %v", got, tt.want) - sql, err := selectStmt.ToSQL() + sql, err := tree.SafeToSQL(selectStmt) assert.NoErrorf(t, err, "error converting query to SQL: %s", err) err = postgres.CheckSyntaxReplaceDollar(sql) diff --git a/internal/engine/sqlanalyzer/attributes/types.go b/internal/engine/sqlanalyzer/attributes/types.go index efa0c562d..bb37c4458 100644 --- a/internal/engine/sqlanalyzer/attributes/types.go +++ b/internal/engine/sqlanalyzer/attributes/types.go @@ -13,11 +13,11 @@ import ( // If it is invalid, it will return an error. func predictReturnType(expr tree.Expression, tables []*common.Table) (common.DataType, error) { w := &returnTypeWalker{ - Walker: tree.NewBaseWalker(), - tables: tables, + AstListener: tree.NewBaseListener(), + tables: tables, } - err := expr.Accept(w) + err := expr.Walk(w) if err != nil { return common.TEXT, fmt.Errorf("error predicting return type: %w", err) } @@ -38,13 +38,13 @@ func errReturnExpr(expr tree.Expression) error { } type returnTypeWalker struct { - tree.Walker + tree.AstListener detected bool detectedType common.DataType tables []*common.Table } -var _ tree.Walker = &returnTypeWalker{} +var _ tree.AstListener = &returnTypeWalker{} func (r *returnTypeWalker) EnterExpressionArithmetic(p0 *tree.ExpressionArithmetic) error { r.set(common.INT) diff --git a/internal/engine/sqlanalyzer/clean/walker.go b/internal/engine/sqlanalyzer/clean/walker.go index cb56a82ca..c6fd97146 100644 --- a/internal/engine/sqlanalyzer/clean/walker.go +++ b/internal/engine/sqlanalyzer/clean/walker.go @@ -10,14 +10,14 @@ import ( // TODO: the statement cleaner should also check for table / column existence func NewStatementCleaner() *StatementCleaner { return &StatementCleaner{ - Walker: tree.NewBaseWalker(), + AstListener: tree.NewBaseListener(), } } -var _ tree.Walker = &StatementCleaner{} +var _ tree.AstListener = &StatementCleaner{} type StatementCleaner struct { - tree.Walker + tree.AstListener } // EnterAggregateFunc checks that the function name is a valid identifier diff --git a/internal/engine/sqlanalyzer/join/visitor.go b/internal/engine/sqlanalyzer/join/visitor.go index 4d05e62a3..a7af5fe65 100644 --- a/internal/engine/sqlanalyzer/join/visitor.go +++ b/internal/engine/sqlanalyzer/join/visitor.go @@ -2,17 +2,17 @@ package join import "github.com/kwilteam/kwil-db/parse/sql/tree" -type joinVisitor struct { - tree.Walker +type joinWalker struct { + tree.AstListener } -func NewJoinWalker() tree.Walker { - return &joinVisitor{ - Walker: tree.NewBaseWalker(), +func NewJoinWalker() tree.AstListener { + return &joinWalker{ + AstListener: tree.NewBaseListener(), } } -func (s *joinVisitor) EnterJoinPredicate(j *tree.JoinPredicate) error { +func (s *joinWalker) EnterJoinPredicate(j *tree.JoinPredicate) error { err := checkJoin(j) if err != nil { return err diff --git a/internal/engine/sqlanalyzer/mutative/mutative_test.go b/internal/engine/sqlanalyzer/mutative/mutative_test.go index 9e6bf12a5..dc127de69 100644 --- a/internal/engine/sqlanalyzer/mutative/mutative_test.go +++ b/internal/engine/sqlanalyzer/mutative/mutative_test.go @@ -46,7 +46,7 @@ func Test_Mutativity(t *testing.T) { mutativityWalker := mutative.NewMutativityWalker() - err = stmt.Accept(mutativityWalker) + err = stmt.Walk(mutativityWalker) if err != nil { t.Fatalf("failed to walk statement: %v", err) } diff --git a/internal/engine/sqlanalyzer/mutative/walker.go b/internal/engine/sqlanalyzer/mutative/walker.go index 5615e71c5..e57ba349c 100644 --- a/internal/engine/sqlanalyzer/mutative/walker.go +++ b/internal/engine/sqlanalyzer/mutative/walker.go @@ -4,14 +4,14 @@ import "github.com/kwilteam/kwil-db/parse/sql/tree" func NewMutativityWalker() *MutativityWalker { return &MutativityWalker{ - Walker: tree.NewBaseWalker(), - Mutative: false, + AstListener: tree.NewBaseListener(), + Mutative: false, } } type MutativityWalker struct { Mutative bool - tree.Walker + tree.AstListener } func (m *MutativityWalker) EnterDeleteStmt(node *tree.DeleteStmt) error { diff --git a/internal/engine/sqlanalyzer/mutativity.go b/internal/engine/sqlanalyzer/mutativity.go index 85f2ba6d1..acc5b9060 100644 --- a/internal/engine/sqlanalyzer/mutativity.go +++ b/internal/engine/sqlanalyzer/mutativity.go @@ -5,10 +5,10 @@ import ( "github.com/kwilteam/kwil-db/parse/sql/tree" ) -func isMutative(stmt tree.Accepter) (bool, error) { +func isMutative(stmt tree.AstWalker) (bool, error) { mutativityWalker := mutative.NewMutativityWalker() - err := stmt.Accept(mutativityWalker) + err := stmt.Walk(mutativityWalker) if err != nil { return false, err } diff --git a/internal/engine/sqlanalyzer/order/order.go b/internal/engine/sqlanalyzer/order/order.go index d2ad22878..23d7a9208 100644 --- a/internal/engine/sqlanalyzer/order/order.go +++ b/internal/engine/sqlanalyzer/order/order.go @@ -10,7 +10,7 @@ import ( "github.com/kwilteam/kwil-db/parse/sql/tree" ) -func NewOrderWalker(tables []*common.Table) tree.Walker { +func NewOrderWalker(tables []*common.Table) tree.AstListener { // copy tables, since we will be modifying the tables slice to register CTEs tbls := make([]*common.Table, len(tables)) copy(tbls, tables) @@ -22,12 +22,12 @@ func NewOrderWalker(tables []*common.Table) tree.Walker { // orderingWalker is the highest level walker to order a statement type orderingWalker struct { - tree.BaseWalker + tree.BaseListener tables []*common.Table // all tables in the schema } -var _ tree.Walker = &orderingWalker{} +var _ tree.AstListener = &orderingWalker{} // we need to register common table expressions as tables, so that we can order them. func (o *orderingWalker) EnterCTE(node *tree.CTE) error { @@ -245,7 +245,7 @@ func containsAggregateFunc(ret tree.ResultColumn) (bool, error) { containsAggregateFunc := false depth := 0 // depth tracks if we are in a subquery or not - err := ret.Accept(&tree.ImplementedWalker{ + err := ret.Walk(&tree.ImplementedListener{ FuncEnterAggregateFunc: func(p0 *tree.AggregateFunc) error { if depth == 0 { containsAggregateFunc = true @@ -307,7 +307,7 @@ func containsGroupBy(stmt *tree.SelectCore) (bool, error) { contains := false depth := 0 - err := stmt.Accept(&tree.ImplementedWalker{ + err := stmt.Walk(&tree.ImplementedListener{ FuncEnterGroupBy: func(p0 *tree.GroupBy) error { if depth == 0 { if len(p0.Expressions) > 0 { diff --git a/internal/engine/sqlanalyzer/order/order_test.go b/internal/engine/sqlanalyzer/order/order_test.go index d84b91489..d8b944105 100644 --- a/internal/engine/sqlanalyzer/order/order_test.go +++ b/internal/engine/sqlanalyzer/order/order_test.go @@ -8,6 +8,7 @@ import ( "github.com/kwilteam/kwil-db/internal/engine/sqlanalyzer/order" sqlparser "github.com/kwilteam/kwil-db/parse/sql" "github.com/kwilteam/kwil-db/parse/sql/postgres" + "github.com/kwilteam/kwil-db/parse/sql/tree" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -156,14 +157,15 @@ func Test_Order(t *testing.T) { require.NoError(t, err) walker := order.NewOrderWalker(defaultTables) - err = stmt.Accept(walker) + err = stmt.Walk(walker) + if err != nil { require.True(t, errors.Is(err, tt.err)) return } require.Equal(t, tt.err, err) - sql, err := stmt.ToSQL() + sql, err := tree.SafeToSQL(stmt) require.NoError(t, err) assert.Equal(t, removeSpaces(tt.want), removeSpaces(sql)) diff --git a/internal/engine/sqlanalyzer/parameters/visitor.go b/internal/engine/sqlanalyzer/parameters/visitor.go index 0e921d40f..ec924ab4d 100644 --- a/internal/engine/sqlanalyzer/parameters/visitor.go +++ b/internal/engine/sqlanalyzer/parameters/visitor.go @@ -6,25 +6,25 @@ import ( "github.com/kwilteam/kwil-db/parse/sql/tree" ) -// ParametersVisitor visits the AST and replaces all bind parameters with numbered parameters. -type ParametersVisitor struct { +// ParametersWalker walks the AST and replaces all bind parameters with numbered parameters. +type ParametersWalker struct { // OrderedParameters are the passed named identifiers in the order that they have become numbered. // For example, if a query was SELECT * FROM tbl WHERE a = $a AND b = $b, the query would be rewritten // as SELECT * FROM tbl WHERE a = $1 AND b = $2, and OrderedParameters would be []string{"$a", "$b"}. OrderedParameters []string renamedParams map[string]string // maps $bindParam to $1 - tree.Walker + tree.AstListener } -func NewParametersVisitor() *ParametersVisitor { - return &ParametersVisitor{ +func NewParametersWalker() *ParametersWalker { + return &ParametersWalker{ OrderedParameters: []string{}, renamedParams: map[string]string{}, - Walker: tree.NewBaseWalker(), + AstListener: tree.NewBaseListener(), } } -func (p *ParametersVisitor) EnterExpressionBindParameter(b *tree.ExpressionBindParameter) error { +func (p *ParametersWalker) EnterExpressionBindParameter(b *tree.ExpressionBindParameter) error { // check if the parameter has already been numbered // if not, then we will number it if param, ok := p.renamedParams[b.Parameter]; ok { diff --git a/internal/engine/sqlanalyzer/parameters/visitor_test.go b/internal/engine/sqlanalyzer/parameters/visitor_test.go index d3362e6bb..a57b17f71 100644 --- a/internal/engine/sqlanalyzer/parameters/visitor_test.go +++ b/internal/engine/sqlanalyzer/parameters/visitor_test.go @@ -8,6 +8,7 @@ import ( "github.com/kwilteam/kwil-db/internal/engine/sqlanalyzer/parameters" sqlparser "github.com/kwilteam/kwil-db/parse/sql" "github.com/kwilteam/kwil-db/parse/sql/postgres" + "github.com/kwilteam/kwil-db/parse/sql/tree" "github.com/stretchr/testify/assert" ) @@ -59,9 +60,9 @@ func Test_NumberedParameters(t *testing.T) { t.Errorf("Parameters() = %v, want %v", err, tt.wantParams) } - v := parameters.NewParametersVisitor() + v := parameters.NewParametersWalker() - if err := ast.Accept(v); err != nil { + if err := ast.Walk(v); err != nil { t.Errorf("Parameters() = %v, want %v", err, tt.wantParams) } @@ -77,7 +78,7 @@ func Test_NumberedParameters(t *testing.T) { } } - str, err := ast.ToSQL() + str, err := tree.SafeToSQL(ast) if err != nil { t.Errorf("Parameters() = %v, want %v", err, tt.wantParams) } diff --git a/internal/engine/sqlanalyzer/schema/walker.go b/internal/engine/sqlanalyzer/schema/walker.go index adeb83f84..3afdee2d6 100644 --- a/internal/engine/sqlanalyzer/schema/walker.go +++ b/internal/engine/sqlanalyzer/schema/walker.go @@ -4,7 +4,7 @@ import "github.com/kwilteam/kwil-db/parse/sql/tree" // SchemaWalker walks statements and ensures that their statements are targeting a postgres schema / namespace. type SchemaWalker struct { - tree.Walker + tree.AstListener schema string ctes map[string]struct{} // we keep track of ctes since they should not be prefixed with a schema @@ -14,9 +14,9 @@ type SchemaWalker struct { func NewSchemaWalker(targetSchema string) *SchemaWalker { return &SchemaWalker{ - Walker: tree.NewBaseWalker(), - schema: targetSchema, - ctes: make(map[string]struct{}), + AstListener: tree.NewBaseListener(), + schema: targetSchema, + ctes: make(map[string]struct{}), } } diff --git a/internal/engine/sqlanalyzer/schema/walker_test.go b/internal/engine/sqlanalyzer/schema/walker_test.go index c116f9001..1acba6817 100644 --- a/internal/engine/sqlanalyzer/schema/walker_test.go +++ b/internal/engine/sqlanalyzer/schema/walker_test.go @@ -8,6 +8,7 @@ import ( "github.com/kwilteam/kwil-db/internal/engine/sqlanalyzer/schema" sqlparser "github.com/kwilteam/kwil-db/parse/sql" "github.com/kwilteam/kwil-db/parse/sql/postgres" + "github.com/kwilteam/kwil-db/parse/sql/tree" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -60,10 +61,10 @@ func Test_PGSchemas(t *testing.T) { w := schema.NewSchemaWalker(tt.schema) - err = ast.Accept(w) + err = ast.Walk(w) require.NoError(t, err) - got, err := ast.ToSQL() + got, err := tree.SafeToSQL(ast) require.NoError(t, err) require.Equal(t, removeWhitespace(tt.want), removeWhitespace(got)) diff --git a/internal/engine/sqlanalyzer/utils/column_search.go b/internal/engine/sqlanalyzer/utils/column_search.go index aef20e765..54eaf6c5b 100644 --- a/internal/engine/sqlanalyzer/utils/column_search.go +++ b/internal/engine/sqlanalyzer/utils/column_search.go @@ -62,6 +62,6 @@ func SearchResultColumns(expr tree.Expression) []*tree.ExpressionColumn { return append(SearchResultColumns(e.Left), SearchResultColumns(e.Right)...) } - fmt.Println("UNEXPECTED BUG: unhandled expression type in Walker column search", expr) + fmt.Println("UNEXPECTED BUG: unhandled expression type in AstListener column search", expr) return nil } diff --git a/internal/engine/sqlanalyzer/utils/utils.go b/internal/engine/sqlanalyzer/utils/utils.go index 14e88b418..5558f7e66 100644 --- a/internal/engine/sqlanalyzer/utils/utils.go +++ b/internal/engine/sqlanalyzer/utils/utils.go @@ -39,7 +39,7 @@ func GetUsedTables(join *tree.JoinClause) ([]*tree.TableOrSubqueryTable, error) tables := make([]*tree.TableOrSubqueryTable, 0) depth := 0 // depth tracks if we are in a subquery or not - err := join.Accept(&tree.ImplementedWalker{ + err := join.Walk(&tree.ImplementedListener{ FuncEnterExpressionSelect: func(p0 *tree.ExpressionSelect) error { depth++ diff --git a/parse/action/visitor.go b/parse/action/ast_builder.go similarity index 84% rename from parse/action/visitor.go rename to parse/action/ast_builder.go index 6ab39b17b..193beb4eb 100644 --- a/parse/action/visitor.go +++ b/parse/action/ast_builder.go @@ -8,39 +8,48 @@ import ( "github.com/antlr4-go/antlr/v4" "github.com/kwilteam/action-grammar-go/actgrammar" + "github.com/kwilteam/kwil-db/parse/internal/util" "github.com/kwilteam/kwil-db/parse/sql/tree" ) -type kfActionVisitor struct { +// astBuilder is the visitor to build the ast from the parse tree +type astBuilder struct { actgrammar.BaseActionParserVisitor // @yaiba NOTE: may need schema to distinguish extension and action - trace bool + trace bool + trackPos bool } -type kfActionVisitorOption func(*kfActionVisitor) +var _ actgrammar.ActionParserVisitor = &astBuilder{} -func kfActionVisitorWithTrace(on bool) kfActionVisitorOption { - return func(l *kfActionVisitor) { - l.trace = on +func newAstBuilder(trace bool, trackPos bool) *astBuilder { + k := &astBuilder{ + trace: trace, + trackPos: trackPos, } -} - -var _ actgrammar.ActionParserVisitor = &kfActionVisitor{} -func newKFActionVisitor(opts ...kfActionVisitorOption) *kfActionVisitor { - k := &kfActionVisitor{} - for _, opt := range opts { - opt(k) - } return k } +//func (v *astBuilder) getPos(ctx antlr.ParserRuleContext) *tree.Position { +// if !v.trackPos { +// return nil +// } +// +// return &tree.Position{ +// StartLine: ctx.GetStart().GetLine(), +// StartColumn: ctx.GetStart().GetColumn(), +// EndLine: ctx.GetStop().GetLine(), +// EndColumn: ctx.GetStop().GetColumn(), +// } +//} + // Visit dispatch to the visit method of the ctx // e.g. if the tree is a ParseContext, then dispatch call VisitParse. // Overwrite is needed, // refer to https://github.com/antlr/antlr4/pull/1841#issuecomment-576791512 -func (v *kfActionVisitor) Visit(tree antlr.ParseTree) interface{} { +func (v *astBuilder) Visit(tree antlr.ParseTree) interface{} { if v.trace { fmt.Printf("visit tree: %v, %s\n", reflect.TypeOf(tree), tree.GetText()) } @@ -51,7 +60,7 @@ func (v *kfActionVisitor) Visit(tree antlr.ParseTree) interface{} { // Overwrite is needed, // refer to https://github.com/antlr/antlr4/pull/1841#issuecomment-576791512 // calling function need to convert the result to asts -func (v *kfActionVisitor) VisitChildren(node antlr.RuleNode) interface{} { +func (v *astBuilder) VisitChildren(node antlr.RuleNode) interface{} { var result []ActionStmt n := node.GetChildCount() for i := 0; i < n; i++ { @@ -69,7 +78,7 @@ func (v *kfActionVisitor) VisitChildren(node antlr.RuleNode) interface{} { return result } -func (v *kfActionVisitor) shouldVisitNextChild(node antlr.Tree, currentResult interface{}) bool { +func (v *astBuilder) shouldVisitNextChild(node antlr.Tree, currentResult interface{}) bool { if _, ok := node.(antlr.TerminalNode); ok { return false } @@ -78,7 +87,7 @@ func (v *kfActionVisitor) shouldVisitNextChild(node antlr.Tree, currentResult in } // VisitStatement is called when start parsing, return []types.ActionStmt -func (v *kfActionVisitor) VisitStatement(ctx *actgrammar.StatementContext) interface{} { +func (v *astBuilder) VisitStatement(ctx *actgrammar.StatementContext) interface{} { stmtCount := len(ctx.AllStmt()) stmts := make([]ActionStmt, stmtCount) @@ -94,13 +103,13 @@ func (v *kfActionVisitor) VisitStatement(ctx *actgrammar.StatementContext) inter } // VisitSql_stmt is called when parse sql statement, return *types.DMLStmt -func (v *kfActionVisitor) VisitSql_stmt(ctx *actgrammar.Sql_stmtContext) interface{} { +func (v *astBuilder) VisitSql_stmt(ctx *actgrammar.Sql_stmtContext) interface{} { stmt := ctx.GetText() return &DMLStmt{Statement: stmt} } // VisitCall_stmt is called when parse call statement, return *types.CallStmt -func (v *kfActionVisitor) VisitCall_stmt(ctx *actgrammar.Call_stmtContext) interface{} { +func (v *astBuilder) VisitCall_stmt(ctx *actgrammar.Call_stmtContext) interface{} { // `a.b` is only for extension calls for now fnName := ctx.Call_body().Fn_name().GetText() if ctx.Call_body().Fn_name().Extension_call_name() != nil { @@ -140,7 +149,7 @@ func (v *kfActionVisitor) VisitCall_stmt(ctx *actgrammar.Call_stmtContext) inter } // VisitCall_receivers is called when parse call receivers, return []string -func (v *kfActionVisitor) VisitCall_receivers(ctx *actgrammar.Call_receiversContext) interface{} { +func (v *astBuilder) VisitCall_receivers(ctx *actgrammar.Call_receiversContext) interface{} { receivers := make([]string, len(ctx.AllVariable())) for i, varCtx := range ctx.AllVariable() { receivers[i] = varCtx.GetText() @@ -149,7 +158,7 @@ func (v *kfActionVisitor) VisitCall_receivers(ctx *actgrammar.Call_receiversCont } // VisitFn_arg_list is called when parse function argument list, return []tree.Expression -func (v *kfActionVisitor) VisitFn_arg_list(ctx *actgrammar.Fn_arg_listContext) interface{} { +func (v *astBuilder) VisitFn_arg_list(ctx *actgrammar.Fn_arg_listContext) interface{} { args := make([]tree.Expression, len(ctx.AllFn_arg_expr())) for i, argCtx := range ctx.AllFn_arg_expr() { args[i] = v.Visit(argCtx).(tree.Expression) @@ -158,12 +167,12 @@ func (v *kfActionVisitor) VisitFn_arg_list(ctx *actgrammar.Fn_arg_listContext) i } // VisitFn_arg_expr is called when parse function argument expression return tree.Expression -// NOTE: this is a subset of sqlparser.KFSqliteVisitor.VisitExpr -func (v *kfActionVisitor) VisitFn_arg_expr(ctx *actgrammar.Fn_arg_exprContext) interface{} { +// NOTE: this is a subset of util.KFSqliteVisitor.VisitExpr +func (v *astBuilder) VisitFn_arg_expr(ctx *actgrammar.Fn_arg_exprContext) interface{} { return v.visitFn_arg_expr(ctx) } -func (v *kfActionVisitor) visitFn_arg_expr(ctx actgrammar.IFn_arg_exprContext) tree.Expression { +func (v *astBuilder) visitFn_arg_expr(ctx actgrammar.IFn_arg_exprContext) tree.Expression { if ctx == nil { return nil } @@ -306,8 +315,7 @@ func (v *kfActionVisitor) visitFn_arg_expr(ctx actgrammar.IFn_arg_exprContext) t expr := &tree.ExpressionFunction{ Inputs: make([]tree.Expression, len(ctx.AllFn_arg_expr())), } - funcName := ctx.Sfn_name().GetText() - + funcName := util.ExtractSQLName(ctx.Sfn_name().GetText()) f, ok := tree.SQLFunctions[strings.ToLower(funcName)] if !ok { panic(fmt.Sprintf("unsupported function '%s'", funcName)) diff --git a/parse/action/parser.go b/parse/action/parser.go index 37979481f..b8427d086 100644 --- a/parse/action/parser.go +++ b/parse/action/parser.go @@ -21,15 +21,16 @@ import ( // Parse parses an action statement string and returns an ActionStmt. // A new error listener will be created, and parsing trace is disabled. func Parse(stmt string) (ast ActionStmt, err error) { - return ParseActionStmt(stmt, nil, false) + return ParseActionStmt(stmt, nil, false, false) } // ParseActionStmt parses a single action statement and returns an ActionStmt. // errorListener is optional, if nil, a new error listener is created, it's // mostly used for testing. // trace is optional, if true, parsing trace will be enabled. -func ParseActionStmt(stmt string, errorListener *sqlparser.ErrorListener, trace bool) (ast ActionStmt, err error) { - var visitor *kfActionVisitor +func ParseActionStmt(stmt string, errorListener *sqlparser.ErrorListener, + trace bool, trackPos bool) (ast ActionStmt, err error) { + var visitor *astBuilder if errorListener == nil { errorListener = sqlparser.NewErrorListener() @@ -58,7 +59,7 @@ func ParseActionStmt(stmt string, errorListener *sqlparser.ErrorListener, trace err = errorListener.Err() }() - visitor = newKFActionVisitor(kfActionVisitorWithTrace(trace)) + visitor = newAstBuilder(trace, trackPos) parseTree := p.Statement() result := visitor.Visit(parseTree) diff --git a/parse/action/parser_test.go b/parse/action/parser_test.go index fe8b8bcc0..a124f7b85 100644 --- a/parse/action/parser_test.go +++ b/parse/action/parser_test.go @@ -61,19 +61,19 @@ func TestParseActionStmt(t *testing.T) { Operator: tree.LogicalOperatorAnd, Right: &tree.ExpressionBindParameter{Parameter: "$c"}, }, - &tree.ExpressionFunction{ - Function: &tree.FunctionABS, - Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - }, - &tree.ExpressionFunction{ - Function: &tree.FunctionABS, - Inputs: []tree.Expression{ - &tree.ExpressionFunction{ - Function: &tree.FunctionUPPER, - Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - }, - }, - }, + //&tree.ExpressionFunction{ + // Function: tree.FunctionAddressGetter(nil), + // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + //}, + //&tree.ExpressionFunction{ + // Function: tree.FunctionAddressGetter(nil), + // Inputs: []tree.Expression{ + // &tree.ExpressionFunction{ + // Function: tree.FunctionUPPERGetter(nil), + // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + // }, + // }, + //}, }, }, }, @@ -122,19 +122,19 @@ func TestParseActionStmt(t *testing.T) { Operator: tree.LogicalOperatorAnd, Right: &tree.ExpressionBindParameter{Parameter: "$c"}, }, - &tree.ExpressionFunction{ - Function: &tree.FunctionABS, - Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - }, - &tree.ExpressionFunction{ - Function: &tree.FunctionABS, - Inputs: []tree.Expression{ - &tree.ExpressionFunction{ - Function: &tree.FunctionUPPER, - Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - }, - }, - }, + //&tree.ExpressionFunction{ + // Function: tree.FunctionAddressGetter(nil), + // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + //}, + //&tree.ExpressionFunction{ + // Function: tree.FunctionAddressGetter(nil), + // Inputs: []tree.Expression{ + // &tree.ExpressionFunction{ + // Function: tree.FunctionUPPERGetter(nil), + // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + // }, + // }, + //}, }, }, }, @@ -186,7 +186,7 @@ func TestParseActionStmt(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotAst, err := actparser.ParseActionStmt(tt.input, nil, *trace) + gotAst, err := actparser.ParseActionStmt(tt.input, nil, *trace, false) if err != nil { t.Errorf("ParseActionStmt() error = %v", err) return @@ -228,7 +228,7 @@ func TestParseActionStmt_scalar_function(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _, err := actparser.ParseActionStmt(tt.input, nil, *trace) + _, err := actparser.ParseActionStmt(tt.input, nil, *trace, false) if tt.wantErr { assert.Error(t, err, "ParseActionStmt(%v)", tt.input) } else { diff --git a/parse/internal/util/util.go b/parse/internal/util/util.go new file mode 100644 index 000000000..c8bc98a67 --- /dev/null +++ b/parse/internal/util/util.go @@ -0,0 +1,24 @@ +package util + +// ExtractSQLName remove surrounding lexical token(pair) of an identifier(name). +// Those tokens are: `"` and `[` `]` and "`". +// In sqlparser identifiers are used for: table name, table alias name, column name, +// column alias name, collation name, index name, function name. +func ExtractSQLName(name string) string { + // remove surrounding token pairs + if len(name) > 1 { + if name[0] == '"' && name[len(name)-1] == '"' { + name = name[1 : len(name)-1] + } + + if name[0] == '[' && name[len(name)-1] == ']' { + name = name[1 : len(name)-1] + } + + if name[0] == '`' && name[len(name)-1] == '`' { + name = name[1 : len(name)-1] + } + } + + return name +} diff --git a/parse/sql/visitor_test.go b/parse/internal/util/util_test.go similarity index 71% rename from parse/sql/visitor_test.go rename to parse/internal/util/util_test.go index 66d3dbbc2..f44dc457e 100644 --- a/parse/sql/visitor_test.go +++ b/parse/internal/util/util_test.go @@ -1,12 +1,13 @@ -package sqlparser +package util_test import ( "testing" + "github.com/kwilteam/kwil-db/parse/internal/util" "github.com/stretchr/testify/assert" ) -func Test_extractIdentifierValue(t *testing.T) { +func TestExtractSQLName(t *testing.T) { tests := []struct { name string args string @@ -22,7 +23,7 @@ func Test_extractIdentifierValue(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - assert.Equalf(t, tt.want, extractSQLName(tt.args), "extractSQLName(%v)", tt.args) + assert.Equalf(t, tt.want, util.ExtractSQLName(tt.args), "ExtractSQLName(%v)", tt.args) }) } } diff --git a/parse/option.go b/parse/option.go new file mode 100644 index 000000000..a65ab9191 --- /dev/null +++ b/parse/option.go @@ -0,0 +1,50 @@ +package parse + +import "github.com/antlr4-go/antlr/v4" + +// parseConfig is the configuration for parser(sql&action). +type parseConfig struct { + Trace bool + TrackPos bool + + LexerErrorListener antlr.ErrorListener + ParserErrorListener antlr.ErrorListener +} + +func DefaultOpt() *parseConfig { + return new(parseConfig) +} + +type Option interface { + ApplyOption(*parseConfig) +} + +type optionFunc func(*parseConfig) + +func (fn optionFunc) ApplyOption(opt *parseConfig) { + fn(opt) +} + +func WithTrace(trace bool) Option { + return optionFunc(func(cfg *parseConfig) { + cfg.Trace = trace + }) +} + +func WithTrackPos(trackPos bool) Option { + return optionFunc(func(cfg *parseConfig) { + cfg.TrackPos = trackPos + }) +} + +func WithLexerErrorListener(listener antlr.ErrorListener) Option { + return optionFunc(func(cfg *parseConfig) { + cfg.LexerErrorListener = listener + }) +} + +func WithParserErrorListener(listener antlr.ErrorListener) Option { + return optionFunc(func(cfg *parseConfig) { + cfg.ParserErrorListener = listener + }) +} diff --git a/parse/sql/visitor.go b/parse/sql/ast_builder.go similarity index 76% rename from parse/sql/visitor.go rename to parse/sql/ast_builder.go index 63c421f23..250307aa5 100644 --- a/parse/sql/visitor.go +++ b/parse/sql/ast_builder.go @@ -7,46 +7,69 @@ import ( "github.com/antlr4-go/antlr/v4" + "github.com/kwilteam/kwil-db/parse/internal/util" "github.com/kwilteam/kwil-db/parse/sql/tree" "github.com/kwilteam/sql-grammar-go/sqlgrammar" ) -// KFSqliteVisitor is visitor that visit Antlr parsed tree and returns the AST. -type KFSqliteVisitor struct { - sqlgrammar.BaseSQLParserVisitor +// astBuilder is a visitor that visits Antlr parsed tree and builds sql AST. +type astBuilder struct { + *sqlgrammar.BaseSQLParserVisitor - trace bool + trace bool + trackPos bool } -type KFSqliteVisitorOption func(*KFSqliteVisitor) +type astBuilderOption func(*astBuilder) -func KFVisitorWithTrace(on bool) KFSqliteVisitorOption { - return func(l *KFSqliteVisitor) { +func astBuilderWithTrace(on bool) astBuilderOption { + return func(l *astBuilder) { l.trace = on } } -var _ sqlgrammar.SQLParserVisitor = &KFSqliteVisitor{} +func astBuilderWithPos(on bool) astBuilderOption { + return func(l *astBuilder) { + l.trackPos = on + } +} + +var _ sqlgrammar.SQLParserVisitor = &astBuilder{} + +func newAstBuilder(opts ...astBuilderOption) *astBuilder { + k := &astBuilder{} -func NewKFSqliteVisitor(opts ...KFSqliteVisitorOption) *KFSqliteVisitor { - k := &KFSqliteVisitor{} for _, opt := range opts { opt(k) } + return k } +func (v *astBuilder) getPos(ctx antlr.ParserRuleContext) *tree.Position { + if !v.trackPos { + return nil + } + + return &tree.Position{ + StartLine: ctx.GetStart().GetLine(), + StartColumn: ctx.GetStart().GetColumn(), + EndLine: ctx.GetStop().GetLine(), + EndColumn: ctx.GetStop().GetColumn(), + } +} + // VisitCommon_table_expression is called when visiting a common_table_expression, return *tree.CTE -func (v *KFSqliteVisitor) VisitCommon_table_expression(ctx *sqlgrammar.Common_table_expressionContext) interface{} { +func (v *astBuilder) VisitCommon_table_expression(ctx *sqlgrammar.Common_table_expressionContext) interface{} { cte := tree.CTE{} // cte_table_name cteTableCtx := ctx.Cte_table_name() - cte.Table = extractSQLName(cteTableCtx.Table_name().GetText()) + cte.Table = util.ExtractSQLName(cteTableCtx.Table_name().GetText()) if len(cteTableCtx.AllColumn_name()) > 0 { cte.Columns = make([]string, len(cteTableCtx.AllColumn_name())) for i, colNameCtx := range cteTableCtx.AllColumn_name() { - cte.Columns[i] = extractSQLName(colNameCtx.GetText()) + cte.Columns[i] = util.ExtractSQLName(colNameCtx.GetText()) } } @@ -56,7 +79,7 @@ func (v *KFSqliteVisitor) VisitCommon_table_expression(ctx *sqlgrammar.Common_ta } // VisitCommon_table_stmt is called when visiting a common_table_stmt, return []*tree.CTE. -func (v *KFSqliteVisitor) VisitCommon_table_stmt(ctx *sqlgrammar.Common_table_stmtContext) interface{} { +func (v *astBuilder) VisitCommon_table_stmt(ctx *sqlgrammar.Common_table_stmtContext) interface{} { if ctx == nil { return nil } @@ -82,7 +105,7 @@ func getInsertType(ctx *sqlgrammar.Insert_stmtContext) tree.InsertType { // } // VisitType_cast is called when visiting a type_cast, return tree.TypeCastType -func (v *KFSqliteVisitor) VisitType_cast(ctx *sqlgrammar.Type_castContext) interface{} { +func (v *astBuilder) VisitType_cast(ctx *sqlgrammar.Type_castContext) interface{} { if ctx != nil { typeCastRaw := ctx.Cast_type().GetText() if typeCastRaw[0] == '`' || typeCastRaw[0] == '"' || typeCastRaw[0] == '[' { @@ -106,7 +129,7 @@ func (v *KFSqliteVisitor) VisitType_cast(ctx *sqlgrammar.Type_castContext) inter } // VisitLiteral is called when visiting a literal, return *tree.ExpressionLiteral -func (v *KFSqliteVisitor) VisitLiteral(ctx *sqlgrammar.LiteralContext) interface{} { +func (v *astBuilder) VisitLiteral(ctx *sqlgrammar.LiteralContext) interface{} { // all literal values are string text := ctx.GetText() if strings.EqualFold(text, "null") { @@ -116,7 +139,7 @@ func (v *KFSqliteVisitor) VisitLiteral(ctx *sqlgrammar.LiteralContext) interface } // VisitLiteral_expr is called when visiting a literal_expr, return *tree.ExpressionLiteral -func (v *KFSqliteVisitor) VisitLiteral_expr(ctx *sqlgrammar.Literal_exprContext) interface{} { +func (v *astBuilder) VisitLiteral_expr(ctx *sqlgrammar.Literal_exprContext) interface{} { // all literal values are string expr := &tree.ExpressionLiteral{ Value: v.Visit(ctx.Literal()).(string), @@ -128,7 +151,7 @@ func (v *KFSqliteVisitor) VisitLiteral_expr(ctx *sqlgrammar.Literal_exprContext) } // VisitVariable_expr is called when visiting a variable_expr, return *tree.ExpressionBindParameter -func (v *KFSqliteVisitor) VisitVariable_expr(ctx *sqlgrammar.Variable_exprContext) interface{} { +func (v *astBuilder) VisitVariable_expr(ctx *sqlgrammar.Variable_exprContext) interface{} { expr := &tree.ExpressionBindParameter{ Parameter: ctx.Variable().GetText(), } @@ -140,17 +163,17 @@ func (v *KFSqliteVisitor) VisitVariable_expr(ctx *sqlgrammar.Variable_exprContex // VisitColumn_ref is called when visiting a column_ref, return *tree.ExpressionColumn, without // type cast info. -func (v *KFSqliteVisitor) VisitColumn_ref(ctx *sqlgrammar.Column_refContext) interface{} { +func (v *astBuilder) VisitColumn_ref(ctx *sqlgrammar.Column_refContext) interface{} { expr := &tree.ExpressionColumn{} if ctx.Table_name() != nil { - expr.Table = extractSQLName(ctx.Table_name().GetText()) + expr.Table = util.ExtractSQLName(ctx.Table_name().GetText()) } - expr.Column = extractSQLName(ctx.Column_name().GetText()) + expr.Column = util.ExtractSQLName(ctx.Column_name().GetText()) return expr } // VisitColumn_expr is called when visiting a column_expr, return *tree.ExpressionColumn -func (v *KFSqliteVisitor) VisitColumn_expr(ctx *sqlgrammar.Column_exprContext) interface{} { +func (v *astBuilder) VisitColumn_expr(ctx *sqlgrammar.Column_exprContext) interface{} { expr := v.Visit(ctx.Column_ref()).(*tree.ExpressionColumn) if ctx.Type_cast() != nil { expr.TypeCast = v.Visit(ctx.Type_cast()).(tree.TypeCastType) @@ -159,7 +182,7 @@ func (v *KFSqliteVisitor) VisitColumn_expr(ctx *sqlgrammar.Column_exprContext) i } // VistUnary_expr is called when visiting a unary_expr, return *tree.ExpressionUnary -func (v *KFSqliteVisitor) VisitUnary_expr(ctx *sqlgrammar.Unary_exprContext) interface{} { +func (v *astBuilder) VisitUnary_expr(ctx *sqlgrammar.Unary_exprContext) interface{} { expr := &tree.ExpressionUnary{} switch { case ctx.MINUS() != nil: @@ -173,7 +196,7 @@ func (v *KFSqliteVisitor) VisitUnary_expr(ctx *sqlgrammar.Unary_exprContext) int return expr } -func (v *KFSqliteVisitor) getCollateType(collationName string) tree.CollationType { +func (v *astBuilder) getCollateType(collationName string) tree.CollationType { // case insensitive switch strings.ToLower(collationName) { case "nocase": @@ -185,9 +208,9 @@ func (v *KFSqliteVisitor) getCollateType(collationName string) tree.CollationTyp } // VisitCollate_expr is called when visiting a collate_expr, return *tree.ExpressionCollate -func (v *KFSqliteVisitor) VisitCollate_expr(ctx *sqlgrammar.Collate_exprContext) interface{} { +func (v *astBuilder) VisitCollate_expr(ctx *sqlgrammar.Collate_exprContext) interface{} { expr := v.Visit(ctx.Expr()).(tree.Expression) - collationName := extractSQLName(ctx.Collation_name().GetText()) + collationName := util.ExtractSQLName(ctx.Collation_name().GetText()) return &tree.ExpressionCollate{ Expression: expr, Collation: v.getCollateType(collationName), @@ -195,7 +218,7 @@ func (v *KFSqliteVisitor) VisitCollate_expr(ctx *sqlgrammar.Collate_exprContext) } // VisitParenthesized_expr is called when visiting a parenthesized_expr, return *tree.Expression -func (v *KFSqliteVisitor) VisitParenthesized_expr(ctx *sqlgrammar.Parenthesized_exprContext) interface{} { +func (v *astBuilder) VisitParenthesized_expr(ctx *sqlgrammar.Parenthesized_exprContext) interface{} { var typeCast tree.TypeCastType if ctx.Type_cast() != nil { typeCast = v.Visit(ctx.Type_cast()).(tree.TypeCastType) @@ -249,12 +272,12 @@ func (v *KFSqliteVisitor) VisitParenthesized_expr(ctx *sqlgrammar.Parenthesized_ return expr } -func (v *KFSqliteVisitor) VisitSubquery(ctx *sqlgrammar.SubqueryContext) interface{} { +func (v *astBuilder) VisitSubquery(ctx *sqlgrammar.SubqueryContext) interface{} { return v.Visit(ctx.Select_stmt_core()).(*tree.SelectStmt) } // VisitSubquery_expr is called when visiting a subquery_expr, return *tree.ExpressionSelect -func (v *KFSqliteVisitor) VisitSubquery_expr(ctx *sqlgrammar.Subquery_exprContext) interface{} { +func (v *astBuilder) VisitSubquery_expr(ctx *sqlgrammar.Subquery_exprContext) interface{} { stmt := v.Visit(ctx.Subquery()).(*tree.SelectStmt) expr := &tree.ExpressionSelect{ Select: stmt, @@ -269,7 +292,7 @@ func (v *KFSqliteVisitor) VisitSubquery_expr(ctx *sqlgrammar.Subquery_exprContex } // VisitWhen_clause is called when visiting a when_clause, return [2]*tree.Expression -func (v *KFSqliteVisitor) VisitWhen_clause(ctx *sqlgrammar.When_clauseContext) interface{} { +func (v *astBuilder) VisitWhen_clause(ctx *sqlgrammar.When_clauseContext) interface{} { var when = [2]tree.Expression{} when[0] = v.Visit(ctx.GetCondition()).(tree.Expression) when[1] = v.Visit(ctx.GetResult()).(tree.Expression) @@ -277,7 +300,7 @@ func (v *KFSqliteVisitor) VisitWhen_clause(ctx *sqlgrammar.When_clauseContext) i } // VisitCase_expr is called when visiting a case_expr, return *tree.ExpressionCase -func (v *KFSqliteVisitor) VisitCase_expr(ctx *sqlgrammar.Case_exprContext) interface{} { +func (v *astBuilder) VisitCase_expr(ctx *sqlgrammar.Case_exprContext) interface{} { expr := &tree.ExpressionCase{} if ctx.GetCase_clause() != nil { expr.CaseExpression = v.Visit(ctx.GetCase_clause()).(tree.Expression) @@ -295,11 +318,11 @@ func (v *KFSqliteVisitor) VisitCase_expr(ctx *sqlgrammar.Case_exprContext) inter } // VisitFunction_call is called when visiting a function_call, return *tree.ExpressionFunction -func (v *KFSqliteVisitor) VisitFunction_call(ctx *sqlgrammar.Function_callContext) interface{} { +func (v *astBuilder) VisitFunction_call(ctx *sqlgrammar.Function_callContext) interface{} { expr := &tree.ExpressionFunction{ Inputs: make([]tree.Expression, len(ctx.AllExpr())), } - funcName := extractSQLName(ctx.Function_name().GetText()) + funcName := util.ExtractSQLName(ctx.Function_name().GetText()) f, ok := tree.SQLFunctions[strings.ToLower(funcName)] if !ok { @@ -319,7 +342,7 @@ func (v *KFSqliteVisitor) VisitFunction_call(ctx *sqlgrammar.Function_callContex } // VisitFunction_expr is called when visiting a function_expr, return *tree.ExpressionFunction -func (v *KFSqliteVisitor) VisitFunction_expr(ctx *sqlgrammar.Function_exprContext) interface{} { +func (v *astBuilder) VisitFunction_expr(ctx *sqlgrammar.Function_exprContext) interface{} { expr := v.Visit(ctx.Function_call()).(*tree.ExpressionFunction) if ctx.Type_cast() != nil { expr.TypeCast = v.Visit(ctx.Type_cast()).(tree.TypeCastType) @@ -328,27 +351,27 @@ func (v *KFSqliteVisitor) VisitFunction_expr(ctx *sqlgrammar.Function_exprContex } // VisitExpr_list_expr is called when visiting a expr_list_expr, return *tree.ExpressionList -func (v *KFSqliteVisitor) VisitExpr_list_expr(ctx *sqlgrammar.Expr_list_exprContext) interface{} { +func (v *astBuilder) VisitExpr_list_expr(ctx *sqlgrammar.Expr_list_exprContext) interface{} { return v.Visit(ctx.Expr_list()).(*tree.ExpressionList) } // VisitArithmetic_expr is called when visiting a arithmetic_expr, return *tree.ExpressionArithmetic -func (v *KFSqliteVisitor) VisitArithmetic_expr(ctx *sqlgrammar.Arithmetic_exprContext) interface{} { +func (v *astBuilder) VisitArithmetic_expr(ctx *sqlgrammar.Arithmetic_exprContext) interface{} { expr := &tree.ExpressionArithmetic{} expr.Left = v.Visit(ctx.GetLeft()).(tree.Expression) expr.Right = v.Visit(ctx.GetRight()).(tree.Expression) switch { - case ctx.PLUS() != nil: - expr.Operator = tree.ArithmeticOperatorAdd - case ctx.MINUS() != nil: - expr.Operator = tree.ArithmeticOperatorSubtract case ctx.STAR() != nil: expr.Operator = tree.ArithmeticOperatorMultiply case ctx.DIV() != nil: expr.Operator = tree.ArithmeticOperatorDivide case ctx.MOD() != nil: expr.Operator = tree.ArithmeticOperatorModulus + case ctx.PLUS() != nil: + expr.Operator = tree.ArithmeticOperatorAdd + case ctx.MINUS() != nil: + expr.Operator = tree.ArithmeticOperatorSubtract default: panic(fmt.Sprintf("unknown arithmetic operator %s", ctx.GetText())) } @@ -357,7 +380,7 @@ func (v *KFSqliteVisitor) VisitArithmetic_expr(ctx *sqlgrammar.Arithmetic_exprCo } // VisitIn_subquery_expr is called when visiting a in_suquery_expr, return *tree.ExpressionBinaryComparison -func (v *KFSqliteVisitor) VisitIn_subquery_expr(ctx *sqlgrammar.In_subquery_exprContext) interface{} { +func (v *astBuilder) VisitIn_subquery_expr(ctx *sqlgrammar.In_subquery_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetElem()).(tree.Expression), Operator: tree.ComparisonOperatorIn, @@ -371,7 +394,7 @@ func (v *KFSqliteVisitor) VisitIn_subquery_expr(ctx *sqlgrammar.In_subquery_expr } // VisitExpr_list is called when visiting a expr_list, return *tree.ExpressionList -func (v *KFSqliteVisitor) VisitExpr_list(ctx *sqlgrammar.Expr_listContext) interface{} { +func (v *astBuilder) VisitExpr_list(ctx *sqlgrammar.Expr_listContext) interface{} { exprCount := len(ctx.AllExpr()) exprs := make([]tree.Expression, exprCount) for i, exprCtx := range ctx.AllExpr() { @@ -381,7 +404,7 @@ func (v *KFSqliteVisitor) VisitExpr_list(ctx *sqlgrammar.Expr_listContext) inter } // VisitIn_list_expr is called when visiting a in_list_expr, return *tree.ExpressionBinaryComparison -func (v *KFSqliteVisitor) VisitIn_list_expr(ctx *sqlgrammar.In_list_exprContext) interface{} { +func (v *astBuilder) VisitIn_list_expr(ctx *sqlgrammar.In_list_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetElem()).(tree.Expression), Operator: tree.ComparisonOperatorIn, @@ -394,7 +417,7 @@ func (v *KFSqliteVisitor) VisitIn_list_expr(ctx *sqlgrammar.In_list_exprContext) } // VisitBetween_expr is called when visiting a between_expr, return *tree.ExpressionBetween -func (v *KFSqliteVisitor) VisitBetween_expr(ctx *sqlgrammar.Between_exprContext) interface{} { +func (v *astBuilder) VisitBetween_expr(ctx *sqlgrammar.Between_exprContext) interface{} { expr := &tree.ExpressionBetween{ Expression: v.Visit(ctx.GetElem()).(tree.Expression), Left: v.Visit(ctx.GetLow()).(tree.Expression), @@ -407,7 +430,7 @@ func (v *KFSqliteVisitor) VisitBetween_expr(ctx *sqlgrammar.Between_exprContext) } // VisitLike_expr is called when visiting a like_expr, return *tree.ExpressionStringCompare -func (v *KFSqliteVisitor) VisitLike_expr(ctx *sqlgrammar.Like_exprContext) interface{} { +func (v *astBuilder) VisitLike_expr(ctx *sqlgrammar.Like_exprContext) interface{} { expr := &tree.ExpressionStringCompare{ Left: v.Visit(ctx.GetElem()).(tree.Expression), Operator: tree.StringOperatorLike, @@ -423,7 +446,7 @@ func (v *KFSqliteVisitor) VisitLike_expr(ctx *sqlgrammar.Like_exprContext) inter } // VisitComparisonOperator is called when visiting a comparisonOpertor, return tree.ComparisonOperator -func (v *KFSqliteVisitor) VisitComparisonOperator(ctx *sqlgrammar.ComparisonOperatorContext) interface{} { +func (v *astBuilder) VisitComparisonOperator(ctx *sqlgrammar.ComparisonOperatorContext) interface{} { switch { case ctx.LT() != nil: return tree.ComparisonOperatorLessThan @@ -445,7 +468,7 @@ func (v *KFSqliteVisitor) VisitComparisonOperator(ctx *sqlgrammar.ComparisonOper } // VisitComparison_expr is called when visiting a comparison_expr, return *tree.ExpressionBinaryComparison -func (v *KFSqliteVisitor) VisitComparison_expr(ctx *sqlgrammar.Comparison_exprContext) interface{} { +func (v *astBuilder) VisitComparison_expr(ctx *sqlgrammar.Comparison_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetLeft()).(tree.Expression), Operator: v.Visit(ctx.ComparisonOperator()).(tree.ComparisonOperator), @@ -456,14 +479,14 @@ func (v *KFSqliteVisitor) VisitComparison_expr(ctx *sqlgrammar.Comparison_exprCo } // VisitBollean_value is called when visiting a boolean_value, return *tree.ExpressionLiteral -func (v *KFSqliteVisitor) VisitBoolean_value(ctx *sqlgrammar.Boolean_valueContext) interface{} { +func (v *astBuilder) VisitBoolean_value(ctx *sqlgrammar.Boolean_valueContext) interface{} { return &tree.ExpressionLiteral{ Value: ctx.GetText(), } } // VisitIs_expr is called when visiting a is_expr, return *tree.ExpressionIs -func (v *KFSqliteVisitor) VisitIs_expr(ctx *sqlgrammar.Is_exprContext) interface{} { +func (v *astBuilder) VisitIs_expr(ctx *sqlgrammar.Is_exprContext) interface{} { expr := &tree.ExpressionIs{ Left: v.Visit(ctx.Expr(0)).(tree.Expression), } @@ -486,7 +509,7 @@ func (v *KFSqliteVisitor) VisitIs_expr(ctx *sqlgrammar.Is_exprContext) interface } // VisitNull_expr is called when visiting a null_expr, return *tree.ExpressionIs -func (v *KFSqliteVisitor) VisitNull_expr(ctx *sqlgrammar.Null_exprContext) interface{} { +func (v *astBuilder) VisitNull_expr(ctx *sqlgrammar.Null_exprContext) interface{} { expr := &tree.ExpressionIs{ Left: v.Visit(ctx.Expr()).(tree.Expression), Right: &tree.ExpressionLiteral{Value: "NULL"}, @@ -498,7 +521,7 @@ func (v *KFSqliteVisitor) VisitNull_expr(ctx *sqlgrammar.Null_exprContext) inter } // VisitLogical_not_expr is called when visiting a logical_not_expr, return *tree.ExpressionUnary -func (v *KFSqliteVisitor) VisitLogical_not_expr(ctx *sqlgrammar.Logical_not_exprContext) interface{} { +func (v *astBuilder) VisitLogical_not_expr(ctx *sqlgrammar.Logical_not_exprContext) interface{} { return &tree.ExpressionUnary{ Operator: tree.UnaryOperatorNot, Operand: v.Visit(ctx.Expr()).(tree.Expression), @@ -506,7 +529,7 @@ func (v *KFSqliteVisitor) VisitLogical_not_expr(ctx *sqlgrammar.Logical_not_expr } // VisitLogical_binary_expr is called when visiting a logical_binary_expr, return *tree.ExpressionBinaryLogical -func (v *KFSqliteVisitor) VisitLogical_binary_expr(ctx *sqlgrammar.Logical_binary_exprContext) interface{} { +func (v *astBuilder) VisitLogical_binary_expr(ctx *sqlgrammar.Logical_binary_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetLeft()).(tree.Expression), Right: v.Visit(ctx.GetRight()).(tree.Expression), @@ -525,7 +548,7 @@ func (v *KFSqliteVisitor) VisitLogical_binary_expr(ctx *sqlgrammar.Logical_binar } // VisitValues_clause is called when visiting a values_clause, return [][]tree.Expression -func (v *KFSqliteVisitor) VisitValues_clause(ctx *sqlgrammar.Values_clauseContext) interface{} { +func (v *astBuilder) VisitValues_clause(ctx *sqlgrammar.Values_clauseContext) interface{} { if ctx == nil { return nil } @@ -544,7 +567,7 @@ func (v *KFSqliteVisitor) VisitValues_clause(ctx *sqlgrammar.Values_clauseContex } // VisitUpsert_clause is called when visiting a upsert_clause, return *tree.Upsert -func (v *KFSqliteVisitor) VisitUpsert_clause(ctx *sqlgrammar.Upsert_clauseContext) interface{} { +func (v *astBuilder) VisitUpsert_clause(ctx *sqlgrammar.Upsert_clauseContext) interface{} { clause := tree.Upsert{ Type: tree.UpsertTypeDoNothing, } @@ -554,7 +577,7 @@ func (v *KFSqliteVisitor) VisitUpsert_clause(ctx *sqlgrammar.Upsert_clauseContex allIndexedColumnCtx := ctx.AllIndexed_column() indexedColumns := make([]string, len(allIndexedColumnCtx)) for i, indexedColumnCtx := range allIndexedColumnCtx { - indexedColumns[i] = extractSQLName(indexedColumnCtx.Column_name().GetText()) + indexedColumns[i] = util.ExtractSQLName(indexedColumnCtx.Column_name().GetText()) } conflictTarget.IndexedColumns = indexedColumns @@ -587,12 +610,12 @@ func (v *KFSqliteVisitor) VisitUpsert_clause(ctx *sqlgrammar.Upsert_clauseContex } // VisitUpsert_update is called when visiting a upsert_update, return *tree.UpdateSetClause -func (v *KFSqliteVisitor) VisitUpsert_update(ctx *sqlgrammar.Upsert_updateContext) interface{} { +func (v *astBuilder) VisitUpsert_update(ctx *sqlgrammar.Upsert_updateContext) interface{} { clause := tree.UpdateSetClause{} if ctx.Column_name_list() != nil { clause.Columns = v.Visit(ctx.Column_name_list()).([]string) } else { - clause.Columns = []string{extractSQLName(ctx.Column_name().GetText())} + clause.Columns = []string{util.ExtractSQLName(ctx.Column_name().GetText())} } clause.Expression = v.Visit(ctx.Expr()).(tree.Expression) @@ -600,21 +623,21 @@ func (v *KFSqliteVisitor) VisitUpsert_update(ctx *sqlgrammar.Upsert_updateContex } // VisitColumn_name_list is called when visiting a column_name_list, return []string -func (v *KFSqliteVisitor) VisitColumn_name_list(ctx *sqlgrammar.Column_name_listContext) interface{} { +func (v *astBuilder) VisitColumn_name_list(ctx *sqlgrammar.Column_name_listContext) interface{} { names := make([]string, len(ctx.AllColumn_name())) for i, nameCtx := range ctx.AllColumn_name() { - names[i] = extractSQLName(nameCtx.GetText()) + names[i] = util.ExtractSQLName(nameCtx.GetText()) } return names } // VisitColumn_name is called when visiting a column_name, return string -func (v *KFSqliteVisitor) VisitColumn_name(ctx *sqlgrammar.Column_nameContext) interface{} { - return extractSQLName(ctx.GetText()) +func (v *astBuilder) VisitColumn_name(ctx *sqlgrammar.Column_nameContext) interface{} { + return util.ExtractSQLName(ctx.GetText()) } // VisitReturning_clause is called when visiting a returning_clause, return *tree.ReturningClause -func (v *KFSqliteVisitor) VisitReturning_clause(ctx *sqlgrammar.Returning_clauseContext) interface{} { +func (v *astBuilder) VisitReturning_clause(ctx *sqlgrammar.Returning_clauseContext) interface{} { clause := tree.ReturningClause{} clause.Returned = make([]*tree.ReturningClauseColumn, len(ctx.AllReturning_clause_result_column())) for i, columnCtx := range ctx.AllReturning_clause_result_column() { @@ -630,7 +653,7 @@ func (v *KFSqliteVisitor) VisitReturning_clause(ctx *sqlgrammar.Returning_clause } if columnCtx.Column_alias() != nil { - clause.Returned[i].Alias = extractSQLName(columnCtx.Column_alias().GetText()) + clause.Returned[i].Alias = util.ExtractSQLName(columnCtx.Column_alias().GetText()) } } @@ -638,13 +661,13 @@ func (v *KFSqliteVisitor) VisitReturning_clause(ctx *sqlgrammar.Returning_clause } // VisitUpdate_set_subclause is called when visiting a column_assign_subclause, return *tree.UpdateSetClause -func (v *KFSqliteVisitor) VisitUpdate_set_subclause(ctx *sqlgrammar.Update_set_subclauseContext) interface{} { +func (v *astBuilder) VisitUpdate_set_subclause(ctx *sqlgrammar.Update_set_subclauseContext) interface{} { result := tree.UpdateSetClause{} if ctx.Column_name_list() != nil { result.Columns = v.Visit(ctx.Column_name_list()).([]string) } else { - result.Columns = []string{extractSQLName(ctx.Column_name().GetText())} + result.Columns = []string{util.ExtractSQLName(ctx.Column_name().GetText())} } result.Expression = v.Visit(ctx.Expr()).(tree.Expression) @@ -652,20 +675,20 @@ func (v *KFSqliteVisitor) VisitUpdate_set_subclause(ctx *sqlgrammar.Update_set_s } // VisitQualified_table_name is called when visiting a qualified_table_name, return *tree.QualifiedTableName -func (v *KFSqliteVisitor) VisitQualified_table_name(ctx *sqlgrammar.Qualified_table_nameContext) interface{} { +func (v *astBuilder) VisitQualified_table_name(ctx *sqlgrammar.Qualified_table_nameContext) interface{} { result := tree.QualifiedTableName{} - result.TableName = extractSQLName(ctx.Table_name().GetText()) + result.TableName = util.ExtractSQLName(ctx.Table_name().GetText()) if ctx.Table_alias() != nil { - result.TableAlias = extractSQLName(ctx.Table_alias().GetText()) + result.TableAlias = util.ExtractSQLName(ctx.Table_alias().GetText()) } return &result } // VisitUpdate_stmt is called when visiting a update_stmt, return *tree.Update -func (v *KFSqliteVisitor) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interface{} { +func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interface{} { t := tree.Update{} var updateStmt tree.UpdateStmt @@ -707,7 +730,7 @@ func (v *KFSqliteVisitor) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) i return &t } -func (v *KFSqliteVisitor) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interface{} { +func (v *astBuilder) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interface{} { t := tree.Insert{} var insertStmt tree.InsertStmt @@ -716,16 +739,16 @@ func (v *KFSqliteVisitor) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) i } insertStmt.InsertType = getInsertType(ctx) - insertStmt.Table = extractSQLName(ctx.Table_name().GetText()) + insertStmt.Table = util.ExtractSQLName(ctx.Table_name().GetText()) if ctx.Table_alias() != nil { - insertStmt.TableAlias = extractSQLName(ctx.Table_alias().GetText()) + insertStmt.TableAlias = util.ExtractSQLName(ctx.Table_alias().GetText()) } allColumnNameCtx := ctx.AllColumn_name() if len(allColumnNameCtx) > 0 { insertStmt.Columns = make([]string, len(allColumnNameCtx)) for i, nc := range allColumnNameCtx { - insertStmt.Columns[i] = extractSQLName(nc.GetText()) + insertStmt.Columns[i] = util.ExtractSQLName(nc.GetText()) } } @@ -742,7 +765,7 @@ func (v *KFSqliteVisitor) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) i } // VisitCompound_operator is called when visiting a compound_operator, return *tree.CompoundOperator -func (v *KFSqliteVisitor) VisitCompound_operator(ctx *sqlgrammar.Compound_operatorContext) interface{} { +func (v *astBuilder) VisitCompound_operator(ctx *sqlgrammar.Compound_operatorContext) interface{} { switch { case ctx.UNION_() != nil: if ctx.ALL_() != nil { @@ -758,7 +781,7 @@ func (v *KFSqliteVisitor) VisitCompound_operator(ctx *sqlgrammar.Compound_operat } // VisitOrdering_term is called when visiting a ordering_term, return *tree.OrderingTerm -func (v *KFSqliteVisitor) VisitOrdering_term(ctx *sqlgrammar.Ordering_termContext) interface{} { +func (v *astBuilder) VisitOrdering_term(ctx *sqlgrammar.Ordering_termContext) interface{} { result := tree.OrderingTerm{} result.Expression = v.Visit(ctx.Expr()).(tree.Expression) @@ -782,7 +805,7 @@ func (v *KFSqliteVisitor) VisitOrdering_term(ctx *sqlgrammar.Ordering_termContex } // VisitOrder_by_stmt is called when visiting a order_by_stmt, return *tree.OrderBy -func (v *KFSqliteVisitor) VisitOrder_by_stmt(ctx *sqlgrammar.Order_by_stmtContext) interface{} { +func (v *astBuilder) VisitOrder_by_stmt(ctx *sqlgrammar.Order_by_stmtContext) interface{} { count := len(ctx.AllOrdering_term()) result := tree.OrderBy{OrderingTerms: make([]*tree.OrderingTerm, count)} @@ -794,11 +817,16 @@ func (v *KFSqliteVisitor) VisitOrder_by_stmt(ctx *sqlgrammar.Order_by_stmtContex } // VisitLimit_stmt is called when visiting a limit_stmt, return *tree.Limit -func (v *KFSqliteVisitor) VisitLimit_stmt(ctx *sqlgrammar.Limit_stmtContext) interface{} { +func (v *astBuilder) VisitLimit_stmt(ctx *sqlgrammar.Limit_stmtContext) interface{} { result := tree.Limit{ Expression: v.Visit(ctx.Expr(0)).(tree.Expression), } + // LIMIT row_count OFFSET offset; + // IS SAME AS + // LIMIT offset, row_count; + // TODO: in the tree we should just use one or the other, not both. + if ctx.OFFSET_() != nil { result.Offset = v.Visit(ctx.Expr(1)).(tree.Expression) } @@ -807,14 +835,14 @@ func (v *KFSqliteVisitor) VisitLimit_stmt(ctx *sqlgrammar.Limit_stmtContext) int } // VisitTable_or_subquery is called when visiting a table_or_subquery, return tree.TableOrSubquery -func (v *KFSqliteVisitor) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryContext) interface{} { +func (v *astBuilder) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryContext) interface{} { switch { case ctx.Table_name() != nil: t := tree.TableOrSubqueryTable{ - Name: extractSQLName(ctx.Table_name().GetText()), + Name: util.ExtractSQLName(ctx.Table_name().GetText()), } if ctx.Table_alias() != nil { - t.Alias = extractSQLName(ctx.Table_alias().GetText()) + t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) } return &t case ctx.Select_stmt_core() != nil: @@ -822,7 +850,7 @@ func (v *KFSqliteVisitor) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subque Select: v.Visit(ctx.Select_stmt_core()).(*tree.SelectStmt), } if ctx.Table_alias() != nil { - t.Alias = extractSQLName(ctx.Table_alias().GetText()) + t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) } return &t } @@ -830,7 +858,7 @@ func (v *KFSqliteVisitor) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subque } // VisitJoin_operator is called when visiting a join_operator, return *tree.JoinOperator -func (v *KFSqliteVisitor) VisitJoin_operator(ctx *sqlgrammar.Join_operatorContext) interface{} { +func (v *astBuilder) VisitJoin_operator(ctx *sqlgrammar.Join_operatorContext) interface{} { jp := tree.JoinOperator{ JoinType: tree.JoinTypeJoin, } @@ -857,7 +885,7 @@ func (v *KFSqliteVisitor) VisitJoin_operator(ctx *sqlgrammar.Join_operatorContex } // VisitJoin_clause is called when visiting a join_clause, return *tree.JoinClause -func (v *KFSqliteVisitor) VisitJoin_clause(ctx *sqlgrammar.Join_clauseContext) interface{} { +func (v *astBuilder) VisitJoin_clause(ctx *sqlgrammar.Join_clauseContext) interface{} { clause := tree.JoinClause{} // just table_or_subquery @@ -881,12 +909,12 @@ func (v *KFSqliteVisitor) VisitJoin_clause(ctx *sqlgrammar.Join_clauseContext) i } // VisitResult_column is called when visiting a result_column, return tree.ResultColumn -func (v *KFSqliteVisitor) VisitResult_column(ctx *sqlgrammar.Result_columnContext) interface{} { +func (v *astBuilder) VisitResult_column(ctx *sqlgrammar.Result_columnContext) interface{} { switch { // table_name need to be checked first case ctx.Table_name() != nil: return &tree.ResultColumnTable{ - TableName: extractSQLName(ctx.Table_name().GetText()), + TableName: util.ExtractSQLName(ctx.Table_name().GetText()), } case ctx.STAR() != nil: return &tree.ResultColumnStar{} @@ -895,7 +923,7 @@ func (v *KFSqliteVisitor) VisitResult_column(ctx *sqlgrammar.Result_columnContex Expression: v.Visit(ctx.Expr()).(tree.Expression), } if ctx.Column_alias() != nil { - r.Alias = extractSQLName(ctx.Column_alias().GetText()) + r.Alias = util.ExtractSQLName(ctx.Column_alias().GetText()) } return r } @@ -904,7 +932,7 @@ func (v *KFSqliteVisitor) VisitResult_column(ctx *sqlgrammar.Result_columnContex } // VisitDelete_stmt is called when visiting a delete_stmt, return *tree.Delete -func (v *KFSqliteVisitor) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) interface{} { +func (v *astBuilder) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) interface{} { t := tree.Delete{} if ctx.Common_table_stmt() != nil { @@ -927,7 +955,7 @@ func (v *KFSqliteVisitor) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) i } // VisitSelect_core is called when visiting a select_core, return *tree.SelectCore -func (v *KFSqliteVisitor) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interface{} { +func (v *astBuilder) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interface{} { t := tree.SelectCore{ SelectType: tree.SelectTypeAll, } @@ -999,7 +1027,7 @@ func (v *KFSqliteVisitor) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) i } // VisitSelect_stmt_core is called when visiting a select_stmt_core, return *tree.SelectStmt -func (v *KFSqliteVisitor) VisitSelect_stmt_core(ctx *sqlgrammar.Select_stmt_coreContext) interface{} { +func (v *astBuilder) VisitSelect_stmt_core(ctx *sqlgrammar.Select_stmt_coreContext) interface{} { t := tree.SelectStmt{} selectCores := make([]*tree.SelectCore, len(ctx.AllSelect_core())) @@ -1028,7 +1056,7 @@ func (v *KFSqliteVisitor) VisitSelect_stmt_core(ctx *sqlgrammar.Select_stmt_core } // VisitSelect_stmt is called when visiting a select_stmt, return *tree.Select -func (v *KFSqliteVisitor) VisitSelect_stmt(ctx *sqlgrammar.Select_stmtContext) interface{} { +func (v *astBuilder) VisitSelect_stmt(ctx *sqlgrammar.Select_stmtContext) interface{} { t := tree.Select{} if ctx.Common_table_stmt() != nil { @@ -1039,27 +1067,27 @@ func (v *KFSqliteVisitor) VisitSelect_stmt(ctx *sqlgrammar.Select_stmtContext) i return &t } -func (v *KFSqliteVisitor) VisitSql_stmt_list(ctx *sqlgrammar.Sql_stmt_listContext) interface{} { +func (v *astBuilder) VisitSql_stmt_list(ctx *sqlgrammar.Sql_stmt_listContext) interface{} { return v.VisitChildren(ctx) } -func (v *KFSqliteVisitor) VisitSql_stmt(ctx *sqlgrammar.Sql_stmtContext) interface{} { +func (v *astBuilder) VisitSql_stmt(ctx *sqlgrammar.Sql_stmtContext) interface{} { // Sql_stmtContext will only have one stmt - return v.VisitChildren(ctx).([]tree.Ast)[0] + return v.VisitChildren(ctx).([]tree.AstNode)[0] } // VisitStatements is called first by Visitor.Visit -func (v *KFSqliteVisitor) VisitStatements(ctx *sqlgrammar.StatementsContext) interface{} { +func (v *astBuilder) VisitStatements(ctx *sqlgrammar.StatementsContext) interface{} { // ParseContext will only have one Sql_stmt_listContext sqlStmtListContext := ctx.Sql_stmt_list(0) - return v.VisitChildren(sqlStmtListContext).([]tree.Ast) + return v.VisitChildren(sqlStmtListContext).([]tree.AstNode) } // Visit dispatch to the visit method of the ctx // e.g. if the tree is a ParseContext, then dispatch call VisitParse. // Overwrite is needed, // refer to https://github.com/antlr/antlr4/pull/1841#issuecomment-576791512 -func (v *KFSqliteVisitor) Visit(parseTree antlr.ParseTree) interface{} { +func (v *astBuilder) Visit(parseTree antlr.ParseTree) interface{} { if v.trace { fmt.Printf("visit tree: %v, %s\n", reflect.TypeOf(parseTree), parseTree.GetText()) } @@ -1070,8 +1098,8 @@ func (v *KFSqliteVisitor) Visit(parseTree antlr.ParseTree) interface{} { // Overwrite is needed, // refer to https://github.com/antlr/antlr4/pull/1841#issuecomment-576791512 // calling function need to convert the result to asts -func (v *KFSqliteVisitor) VisitChildren(node antlr.RuleNode) interface{} { - var result []tree.Ast +func (v *astBuilder) VisitChildren(node antlr.RuleNode) interface{} { + var result []tree.AstNode n := node.GetChildCount() for i := 0; i < n; i++ { child := node.GetChild(i) @@ -1082,39 +1110,16 @@ func (v *KFSqliteVisitor) VisitChildren(node antlr.RuleNode) interface{} { break } c := child.(antlr.ParseTree) - childResult := v.Visit(c).(tree.Ast) + childResult := v.Visit(c).(tree.AstNode) result = append(result, childResult) } return result } -func (v *KFSqliteVisitor) shouldVisitNextChild(node antlr.Tree, currentResult interface{}) bool { +func (v *astBuilder) shouldVisitNextChild(node antlr.Tree, currentResult interface{}) bool { if _, ok := node.(antlr.TerminalNode); ok { return false } return true } - -// extractSQLName remove surrounding lexical token(pair) of an identifier(name). -// Those tokens are: `"` and `[` `]` and "`". -// In sqlparser identifiers are used for: table name, table alias name, column name, -// column alias name, collation name, index name, function name. -func extractSQLName(name string) string { - // remove surrounding token pairs - if len(name) > 1 { - if name[0] == '"' && name[len(name)-1] == '"' { - name = name[1 : len(name)-1] - } - - if name[0] == '[' && name[len(name)-1] == ']' { - name = name[1 : len(name)-1] - } - - if name[0] == '`' && name[len(name)-1] == '`' { - name = name[1 : len(name)-1] - } - } - - return name -} diff --git a/parse/sql/ast_builder_test.go b/parse/sql/ast_builder_test.go new file mode 100644 index 000000000..bf2752f31 --- /dev/null +++ b/parse/sql/ast_builder_test.go @@ -0,0 +1,49 @@ +package sqlparser + +import ( + "testing" + + "github.com/antlr4-go/antlr/v4" + "github.com/stretchr/testify/assert" +) + +type mockParserRuleContext struct { + *antlr.BaseParserRuleContext +} + +type mockToken struct { + *antlr.CommonToken +} + +func (m mockToken) GetLine() int { + return 1 +} + +func (m mockToken) GetColumn() int { + return 2 +} + +func (m mockParserRuleContext) GetStart() antlr.Token { + return mockToken{} +} + +func (m mockParserRuleContext) GetStop() antlr.Token { + return mockToken{} +} + +func TestAstBuilder_getPos(t *testing.T) { + mockCtx := mockParserRuleContext{} + + ab := newAstBuilder() + pos := ab.getPos(mockCtx) + assert.Nil(t, pos) + + ab = newAstBuilder(astBuilderWithPos(true)) + pos = ab.getPos(mockCtx) + assert.NotNil(t, pos) + assert.Equal(t, 1, pos.StartLine) + assert.Equal(t, 2, pos.StartColumn) + assert.Equal(t, 1, pos.EndLine) + assert.Equal(t, 2, pos.EndColumn) + +} diff --git a/parse/sql/ast_traversaler.go b/parse/sql/ast_traversaler.go new file mode 100644 index 000000000..04173c692 --- /dev/null +++ b/parse/sql/ast_traversaler.go @@ -0,0 +1 @@ +package sqlparser diff --git a/parse/sql/parser.go b/parse/sql/parser.go index bca9db575..ea6ff8447 100644 --- a/parse/sql/parser.go +++ b/parse/sql/parser.go @@ -9,15 +9,16 @@ import ( "github.com/kwilteam/sql-grammar-go/sqlgrammar" ) -// Parse parses a raw sql string and returns a tree.Ast -func Parse(sql string) (ast tree.Ast, err error) { +// Parse parses a raw sql string and returns a tree.ParseNode +func Parse(sql string) (ast tree.AstNode, err error) { currentLine := 1 - return ParseSql(sql, currentLine, nil, false) + return ParseSql(sql, currentLine, nil, false, false) } -// ParseSql parses a single raw sql statement and returns tree.Ast -func ParseSql(sql string, currentLine int, errorListener *ErrorListener, trace bool) (ast tree.Ast, err error) { - var visitor *KFSqliteVisitor +// ParseSql parses a single raw sql statement and returns tree.ParseNode +func ParseSql(sql string, currentLine int, errorListener *ErrorListener, + trace bool, withPos bool) (ast tree.AstNode, err error) { + var visitor *astBuilder if errorListener == nil { errorListener = NewErrorListener() @@ -46,10 +47,10 @@ func ParseSql(sql string, currentLine int, errorListener *ErrorListener, trace b err = errorListener.Err() }() - visitor = NewKFSqliteVisitor(KFVisitorWithTrace(trace)) + visitor = newAstBuilder(astBuilderWithTrace(trace), astBuilderWithPos(withPos)) stmts := p.Statements() result := visitor.Visit(stmts) // since we only expect a single statement - return result.([]tree.Ast)[0], err + return result.([]tree.AstNode)[0], err } diff --git a/parse/sql/parser_test.go b/parse/sql/parser_test.go index f0f5007ca..6b357afc5 100644 --- a/parse/sql/parser_test.go +++ b/parse/sql/parser_test.go @@ -347,7 +347,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { tests := []struct { name string input string - expect tree.Ast + expect tree.AstNode }{ // with semicolon at the end {"with semicolon", "select *;", genSelectColumnStarTree()}, @@ -2162,7 +2162,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { tt.expect = nil }() - astTree, err := ParseSql(tt.input, 1, nil, *traceMode) + astTree, err := ParseSql(tt.input, 1, nil, *traceMode, false) if err != nil { t.Errorf("ParseRawSQL() got %s", err) return @@ -2171,7 +2171,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // use assert.Exactly? assert.EqualValues(t, tt.expect, astTree, "ParseRawSQL() got %+v, want %+v", astTree, tt.expect) - sql, err := astTree.ToSQL() + sql, err := tree.SafeToSQL(astTree) if err != nil { t.Errorf("ParseRawSQL() got %s", err) } @@ -2283,7 +2283,7 @@ func TestParseRawSQL_syntax_invalid(t *testing.T) { t.Run(tt.name, func(t *testing.T) { //eh := NewErrorHandler(1) //el := newSqliteErrorListener(eh) - _, err := ParseSql(tt.input, 1, nil, *traceMode) + _, err := ParseSql(tt.input, 1, nil, *traceMode, false) assert.Errorf(t, err, "Parser should complain abould invalid syntax") if !errors.Is(err, ErrInvalidSyntax) { @@ -2312,7 +2312,7 @@ func TestParseRawSQL_semantic_invalid(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _, err := ParseSql(tt.input, 1, nil, *traceMode) + _, err := ParseSql(tt.input, 1, nil, *traceMode, false) assert.Errorf(t, err, "Parser should complain abould invalid syntax") // should panic, which is caught by ParseRawSQL diff --git a/parse/sql/tree/CTE.go b/parse/sql/tree/CTE.go index 5ce206c0c..64ac514ca 100644 --- a/parse/sql/tree/CTE.go +++ b/parse/sql/tree/CTE.go @@ -5,15 +5,21 @@ import ( ) type CTE struct { + *node + Table string Columns []string Select *SelectStmt } -func (c *CTE) Accept(w Walker) error { +func (c *CTE) Accept(v AstVisitor) any { + return v.VisitCTE(c) +} + +func (c *CTE) Walk(w AstListener) error { return run( w.EnterCTE(c), - accept(w, c.Select), + walk(w, c.Select), w.ExitCTE(c), ) } diff --git a/parse/sql/tree/aggregate-funcs.go b/parse/sql/tree/aggregate-funcs.go index 77518c3a1..b5982b962 100644 --- a/parse/sql/tree/aggregate-funcs.go +++ b/parse/sql/tree/aggregate-funcs.go @@ -1,6 +1,8 @@ package tree -import sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" +import ( + sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" +) type distinctable interface { SQLFunction @@ -8,10 +10,20 @@ type distinctable interface { } type AggregateFunc struct { + *node + AnySQLFunction } -func (s *AggregateFunc) Accept(w Walker) error { +func (s *AggregateFunc) Accept(v AstVisitor) any { + return v.VisitAggregateFunc(s) +} + +func (s *AggregateFunc) ToSQL() string { + return s.ToString() +} + +func (s *AggregateFunc) Walk(w AstListener) error { return run( w.EnterAggregateFunc(s), w.ExitAggregateFunc(s), @@ -41,25 +53,40 @@ func (s *AggregateFunc) stringDistinct(exprs ...Expression) string { }) } -func (s *AggregateFunc) String(exprs ...Expression) string { +func (s *AggregateFunc) ToString(exprs ...Expression) string { if s.distinct { return s.stringDistinct(exprs...) } return s.string(exprs...) } -var ( - FunctionCOUNT = AggregateFunc{AnySQLFunction: AnySQLFunction{ - FunctionName: "count", - Min: 0, - Max: 1, - }, +func NewAggregateFunctionWithGetter(name string, min uint8, max uint8, distinct bool) SQLFunctionGetter { + return func(pos *Position) SQLFunction { + return &AggregateFunc{ + AnySQLFunction: AnySQLFunction{ + FunctionName: name, + Min: min, + Max: max, + distinct: distinct, + }, + } } +} - FunctionSUM = AggregateFunc{AnySQLFunction: AnySQLFunction{ - FunctionName: "sum", - Min: 1, - Max: 1, - }, - } +var ( + FunctionCOUNT = AggregateFunc{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "count", + Min: 0, + Max: 1, + }} + + FunctionSUM = AggregateFunc{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "sum", + Min: 1, + Max: 1, + }} + FunctionCOUNTGetter = NewAggregateFunctionWithGetter("count", 0, 1, false) + FunctionCOUNTDistinct = NewAggregateFunctionWithGetter("count", 0, 1, true) ) diff --git a/parse/sql/tree/aggregate-funcs_test.go b/parse/sql/tree/aggregate-funcs_test.go index e52ad2924..bc10a3fb9 100644 --- a/parse/sql/tree/aggregate-funcs_test.go +++ b/parse/sql/tree/aggregate-funcs_test.go @@ -8,7 +8,7 @@ import ( func TestAggregateFunc_String(t *testing.T) { type fields struct { - tree.AggregateFunc + *tree.AggregateFunc } type args struct { exprs []tree.Expression @@ -23,7 +23,7 @@ func TestAggregateFunc_String(t *testing.T) { { name: "count fails with no arguments", fields: fields{ - AggregateFunc: tree.FunctionCOUNT, + AggregateFunc: tree.FunctionCOUNTGetter(nil).(*tree.AggregateFunc), }, args: args{ exprs: []tree.Expression{ @@ -45,7 +45,7 @@ func TestAggregateFunc_String(t *testing.T) { s := tt.fields.AggregateFunc s.SetDistinct(true) - got := s.String(tt.args.exprs...) + got := s.ToString(tt.args.exprs...) if !compareIgnoringWhitespace(got, tt.want) { t.Errorf("AggregateFunc.String() = %v, want %v", got, tt.want) diff --git a/parse/sql/tree/ast.go b/parse/sql/tree/ast.go index d46e15166..bb2a38d0a 100644 --- a/parse/sql/tree/ast.go +++ b/parse/sql/tree/ast.go @@ -1,6 +1,24 @@ package tree -type Ast interface { - ToSQL() (string, error) - Accepter +// Node defines interface for all nodes. +type Node interface { + // Text returns the original text of the node. + Text() string + // SetText sets original text to the node. + SetText(string) + // Position returns the position of the node. + Position() *Position + // SetPosition sets position to the node. + SetPosition(*Position) +} + +// AstNode represents an AST node. +type AstNode interface { + Node + AstWalker + + // ToSQL converts the node to a SQL string. + ToSQL() string + // Accept accepts an AstVisitor to visit itself. + Accept(AstVisitor) any } diff --git a/parse/sql/tree/ast_listener.go b/parse/sql/tree/ast_listener.go new file mode 100644 index 000000000..aea28abd0 --- /dev/null +++ b/parse/sql/tree/ast_listener.go @@ -0,0 +1,1366 @@ +package tree + +// AstListener defines the interface for walking through the AstNode. +type AstListener interface { + EnterAggregateFunc(*AggregateFunc) error + ExitAggregateFunc(*AggregateFunc) error + EnterConflictTarget(*ConflictTarget) error + ExitConflictTarget(*ConflictTarget) error + EnterCTE(*CTE) error + ExitCTE(*CTE) error + EnterDelete(*Delete) error + ExitDelete(*Delete) error + EnterDeleteStmt(*DeleteStmt) error + ExitDeleteStmt(*DeleteStmt) error + EnterExpressionLiteral(*ExpressionLiteral) error + ExitExpressionLiteral(*ExpressionLiteral) error + EnterExpressionBindParameter(*ExpressionBindParameter) error + ExitExpressionBindParameter(*ExpressionBindParameter) error + EnterExpressionColumn(*ExpressionColumn) error + ExitExpressionColumn(*ExpressionColumn) error + EnterExpressionUnary(*ExpressionUnary) error + ExitExpressionUnary(*ExpressionUnary) error + EnterExpressionBinaryComparison(*ExpressionBinaryComparison) error + ExitExpressionBinaryComparison(*ExpressionBinaryComparison) error + EnterExpressionFunction(*ExpressionFunction) error + ExitExpressionFunction(*ExpressionFunction) error + EnterExpressionList(*ExpressionList) error + ExitExpressionList(*ExpressionList) error + EnterExpressionCollate(*ExpressionCollate) error + ExitExpressionCollate(*ExpressionCollate) error + EnterExpressionStringCompare(*ExpressionStringCompare) error + ExitExpressionStringCompare(*ExpressionStringCompare) error + EnterExpressionIs(*ExpressionIs) error + ExitExpressionIs(*ExpressionIs) error + EnterExpressionBetween(*ExpressionBetween) error + ExitExpressionBetween(*ExpressionBetween) error + EnterExpressionSelect(*ExpressionSelect) error + ExitExpressionSelect(*ExpressionSelect) error + EnterExpressionCase(*ExpressionCase) error + ExitExpressionCase(*ExpressionCase) error + EnterExpressionArithmetic(*ExpressionArithmetic) error + ExitExpressionArithmetic(*ExpressionArithmetic) error + EnterScalarFunc(*ScalarFunction) error + ExitScalarFunc(*ScalarFunction) error + EnterGroupBy(*GroupBy) error + ExitGroupBy(*GroupBy) error + EnterInsert(*Insert) error + ExitInsert(*Insert) error + EnterInsertStmt(*InsertStmt) error + ExitInsertStmt(*InsertStmt) error + EnterJoinClause(*JoinClause) error + ExitJoinClause(*JoinClause) error + EnterJoinPredicate(*JoinPredicate) error + ExitJoinPredicate(*JoinPredicate) error + EnterJoinOperator(*JoinOperator) error + ExitJoinOperator(*JoinOperator) error + EnterLimit(*Limit) error + ExitLimit(*Limit) error + EnterOrderBy(*OrderBy) error + ExitOrderBy(*OrderBy) error + EnterOrderingTerm(*OrderingTerm) error + ExitOrderingTerm(*OrderingTerm) error + EnterQualifiedTableName(*QualifiedTableName) error + ExitQualifiedTableName(*QualifiedTableName) error + EnterResultColumnStar(*ResultColumnStar) error + ExitResultColumnStar(*ResultColumnStar) error + EnterResultColumnExpression(*ResultColumnExpression) error + ExitResultColumnExpression(*ResultColumnExpression) error + EnterResultColumnTable(*ResultColumnTable) error + ExitResultColumnTable(*ResultColumnTable) error + EnterReturningClause(*ReturningClause) error + ExitReturningClause(*ReturningClause) error + EnterReturningClauseColumn(*ReturningClauseColumn) error + ExitReturningClauseColumn(*ReturningClauseColumn) error + EnterSelect(*Select) error + ExitSelect(*Select) error + EnterSelectCore(*SelectCore) error + ExitSelectCore(*SelectCore) error + EnterSelectStmt(*SelectStmt) error + ExitSelectStmt(*SelectStmt) error + EnterFromClause(*FromClause) error + ExitFromClause(*FromClause) error + EnterCompoundOperator(*CompoundOperator) error + ExitCompoundOperator(*CompoundOperator) error + EnterTableOrSubqueryTable(*TableOrSubqueryTable) error + ExitTableOrSubqueryTable(*TableOrSubqueryTable) error + EnterTableOrSubquerySelect(*TableOrSubquerySelect) error + ExitTableOrSubquerySelect(*TableOrSubquerySelect) error + EnterTableOrSubqueryList(*TableOrSubqueryList) error + ExitTableOrSubqueryList(*TableOrSubqueryList) error + EnterTableOrSubqueryJoin(*TableOrSubqueryJoin) error + ExitTableOrSubqueryJoin(*TableOrSubqueryJoin) error + EnterUpdateSetClause(*UpdateSetClause) error + ExitUpdateSetClause(*UpdateSetClause) error + EnterUpdate(*Update) error + ExitUpdate(*Update) error + EnterUpdateStmt(*UpdateStmt) error + ExitUpdateStmt(*UpdateStmt) error + EnterUpsert(*Upsert) error + ExitUpsert(*Upsert) error +} + +type BaseListener struct{} + +var _ AstListener = &BaseListener{} + +func NewBaseListener() AstListener { + return &BaseListener{} +} + +func (b *BaseListener) EnterAggregateFunc(p0 *AggregateFunc) error { + return nil +} + +func (b *BaseListener) ExitAggregateFunc(p0 *AggregateFunc) error { + return nil +} + +func (b *BaseListener) EnterCTE(p0 *CTE) error { + return nil +} + +func (b *BaseListener) ExitCTE(p0 *CTE) error { + return nil +} + +func (b *BaseListener) EnterCompoundOperator(p0 *CompoundOperator) error { + return nil +} + +func (b *BaseListener) ExitCompoundOperator(p0 *CompoundOperator) error { + return nil +} + +func (b *BaseListener) EnterConflictTarget(p0 *ConflictTarget) error { + return nil +} + +func (b *BaseListener) ExitConflictTarget(p0 *ConflictTarget) error { + return nil +} + +func (b *BaseListener) EnterDelete(p0 *Delete) error { + return nil +} + +func (b *BaseListener) ExitDelete(p0 *Delete) error { + return nil +} + +func (b *BaseListener) EnterDeleteStmt(p0 *DeleteStmt) error { + return nil +} + +func (b *BaseListener) ExitDeleteStmt(p0 *DeleteStmt) error { + return nil +} + +func (b *BaseListener) EnterExpressionArithmetic(p0 *ExpressionArithmetic) error { + return nil +} + +func (b *BaseListener) ExitExpressionArithmetic(p0 *ExpressionArithmetic) error { + return nil +} + +func (b *BaseListener) EnterExpressionBetween(p0 *ExpressionBetween) error { + return nil +} + +func (b *BaseListener) ExitExpressionBetween(p0 *ExpressionBetween) error { + return nil +} + +func (b *BaseListener) EnterExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { + return nil +} + +func (b *BaseListener) ExitExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { + return nil +} + +func (b *BaseListener) EnterExpressionBindParameter(p0 *ExpressionBindParameter) error { + return nil +} + +func (b *BaseListener) ExitExpressionBindParameter(p0 *ExpressionBindParameter) error { + return nil +} + +func (b *BaseListener) EnterExpressionCase(p0 *ExpressionCase) error { + return nil +} + +func (b *BaseListener) ExitExpressionCase(p0 *ExpressionCase) error { + return nil +} + +func (b *BaseListener) EnterExpressionCollate(p0 *ExpressionCollate) error { + return nil +} + +func (b *BaseListener) ExitExpressionCollate(p0 *ExpressionCollate) error { + return nil +} + +func (b *BaseListener) EnterExpressionColumn(p0 *ExpressionColumn) error { + return nil +} + +func (b *BaseListener) ExitExpressionColumn(p0 *ExpressionColumn) error { + return nil +} + +func (b *BaseListener) EnterExpressionFunction(p0 *ExpressionFunction) error { + return nil +} + +func (b *BaseListener) ExitExpressionFunction(p0 *ExpressionFunction) error { + return nil +} + +func (b *BaseListener) EnterExpressionIs(p0 *ExpressionIs) error { + return nil +} + +func (b *BaseListener) ExitExpressionIs(p0 *ExpressionIs) error { + return nil +} + +func (b *BaseListener) EnterExpressionList(p0 *ExpressionList) error { + return nil +} + +func (b *BaseListener) ExitExpressionList(p0 *ExpressionList) error { + return nil +} + +func (b *BaseListener) EnterExpressionLiteral(p0 *ExpressionLiteral) error { + return nil +} + +func (b *BaseListener) ExitExpressionLiteral(p0 *ExpressionLiteral) error { + return nil +} + +func (b *BaseListener) EnterExpressionSelect(p0 *ExpressionSelect) error { + return nil +} + +func (b *BaseListener) ExitExpressionSelect(p0 *ExpressionSelect) error { + return nil +} + +func (b *BaseListener) EnterExpressionStringCompare(p0 *ExpressionStringCompare) error { + return nil +} + +func (b *BaseListener) ExitExpressionStringCompare(p0 *ExpressionStringCompare) error { + return nil +} + +func (b *BaseListener) EnterExpressionUnary(p0 *ExpressionUnary) error { + return nil +} + +func (b *BaseListener) ExitExpressionUnary(p0 *ExpressionUnary) error { + return nil +} + +func (b *BaseListener) EnterFromClause(p0 *FromClause) error { + return nil +} + +func (b *BaseListener) ExitFromClause(p0 *FromClause) error { + return nil +} + +func (b *BaseListener) EnterGroupBy(p0 *GroupBy) error { + return nil +} + +func (b *BaseListener) ExitGroupBy(p0 *GroupBy) error { + return nil +} + +func (b *BaseListener) EnterInsert(p0 *Insert) error { + return nil +} + +func (b *BaseListener) ExitInsert(p0 *Insert) error { + return nil +} + +func (b *BaseListener) EnterInsertStmt(p0 *InsertStmt) error { + return nil +} + +func (b *BaseListener) ExitInsertStmt(p0 *InsertStmt) error { + return nil +} + +func (b *BaseListener) EnterJoinClause(p0 *JoinClause) error { + return nil +} + +func (b *BaseListener) ExitJoinClause(p0 *JoinClause) error { + return nil +} + +func (b *BaseListener) EnterJoinOperator(p0 *JoinOperator) error { + return nil +} + +func (b *BaseListener) ExitJoinOperator(p0 *JoinOperator) error { + return nil +} + +func (b *BaseListener) EnterJoinPredicate(p0 *JoinPredicate) error { + return nil +} + +func (b *BaseListener) ExitJoinPredicate(p0 *JoinPredicate) error { + return nil +} + +func (b *BaseListener) EnterLimit(p0 *Limit) error { + return nil +} + +func (b *BaseListener) ExitLimit(p0 *Limit) error { + return nil +} + +func (b *BaseListener) EnterOrderBy(p0 *OrderBy) error { + return nil +} + +func (b *BaseListener) ExitOrderBy(p0 *OrderBy) error { + return nil +} + +func (b *BaseListener) EnterOrderingTerm(p0 *OrderingTerm) error { + return nil +} + +func (b *BaseListener) ExitOrderingTerm(p0 *OrderingTerm) error { + return nil +} + +func (b *BaseListener) EnterQualifiedTableName(p0 *QualifiedTableName) error { + return nil +} + +func (b *BaseListener) ExitQualifiedTableName(p0 *QualifiedTableName) error { + return nil +} + +func (b *BaseListener) EnterResultColumnExpression(p0 *ResultColumnExpression) error { + return nil +} + +func (b *BaseListener) ExitResultColumnExpression(p0 *ResultColumnExpression) error { + return nil +} + +func (b *BaseListener) EnterResultColumnStar(p0 *ResultColumnStar) error { + return nil +} + +func (b *BaseListener) ExitResultColumnStar(p0 *ResultColumnStar) error { + return nil +} + +func (b *BaseListener) EnterResultColumnTable(p0 *ResultColumnTable) error { + return nil +} + +func (b *BaseListener) ExitResultColumnTable(p0 *ResultColumnTable) error { + return nil +} + +func (b *BaseListener) EnterReturningClause(p0 *ReturningClause) error { + return nil +} + +func (b *BaseListener) ExitReturningClause(p0 *ReturningClause) error { + return nil +} + +func (b *BaseListener) EnterReturningClauseColumn(p0 *ReturningClauseColumn) error { + return nil +} + +func (b *BaseListener) ExitReturningClauseColumn(p0 *ReturningClauseColumn) error { + return nil +} + +func (b *BaseListener) EnterScalarFunc(p0 *ScalarFunction) error { + return nil +} + +func (b *BaseListener) ExitScalarFunc(p0 *ScalarFunction) error { + return nil +} + +func (b *BaseListener) EnterSelect(p0 *Select) error { + return nil +} + +func (b *BaseListener) ExitSelect(p0 *Select) error { + return nil +} + +func (b *BaseListener) EnterSelectCore(p0 *SelectCore) error { + return nil +} + +func (b *BaseListener) ExitSelectCore(p0 *SelectCore) error { + return nil +} + +func (b *BaseListener) EnterSelectStmt(p0 *SelectStmt) error { + return nil +} + +func (b *BaseListener) ExitSelectStmt(p0 *SelectStmt) error { + return nil +} + +func (b *BaseListener) EnterTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { + return nil +} + +func (b *BaseListener) ExitTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { + return nil +} + +func (b *BaseListener) EnterTableOrSubqueryList(p0 *TableOrSubqueryList) error { + return nil +} + +func (b *BaseListener) ExitTableOrSubqueryList(p0 *TableOrSubqueryList) error { + return nil +} + +func (b *BaseListener) EnterTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { + return nil +} + +func (b *BaseListener) ExitTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { + return nil +} + +func (b *BaseListener) EnterTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { + return nil +} + +func (b *BaseListener) ExitTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { + return nil +} + +func (b *BaseListener) EnterUpdate(p0 *Update) error { + return nil +} + +func (b *BaseListener) ExitUpdate(p0 *Update) error { + return nil +} + +func (b *BaseListener) EnterUpdateSetClause(p0 *UpdateSetClause) error { + return nil +} + +func (b *BaseListener) ExitUpdateSetClause(p0 *UpdateSetClause) error { + return nil +} + +func (b *BaseListener) EnterUpdateStmt(p0 *UpdateStmt) error { + return nil +} + +func (b *BaseListener) ExitUpdateStmt(p0 *UpdateStmt) error { + return nil +} + +func (b *BaseListener) EnterUpsert(p0 *Upsert) error { + return nil +} + +func (b *BaseListener) ExitUpsert(p0 *Upsert) error { + return nil +} + +// ImplementedListener implements the AstListener interface. +// Unlike BaseListener, it holds the methods to be implemented +// as functions in a struct. This makes it easier to implement +// for small, one-off walkers. +type ImplementedListener struct { + FuncEnterAggregateFunc func(p0 *AggregateFunc) error + FuncExitAggregateFunc func(p0 *AggregateFunc) error + FuncEnterCTE func(p0 *CTE) error + FuncExitCTE func(p0 *CTE) error + FuncEnterCompoundOperator func(p0 *CompoundOperator) error + FuncExitCompoundOperator func(p0 *CompoundOperator) error + FuncEnterConflictTarget func(p0 *ConflictTarget) error + FuncExitConflictTarget func(p0 *ConflictTarget) error + FuncEnterDelete func(p0 *Delete) error + FuncExitDelete func(p0 *Delete) error + FuncEnterDeleteStmt func(p0 *DeleteStmt) error + FuncExitDeleteStmt func(p0 *DeleteStmt) error + FuncEnterExpressionArithmetic func(p0 *ExpressionArithmetic) error + FuncExitExpressionArithmetic func(p0 *ExpressionArithmetic) error + FuncEnterExpressionBetween func(p0 *ExpressionBetween) error + FuncExitExpressionBetween func(p0 *ExpressionBetween) error + FuncEnterExpressionBinaryComparison func(p0 *ExpressionBinaryComparison) error + FuncExitExpressionBinaryComparison func(p0 *ExpressionBinaryComparison) error + FuncEnterExpressionBindParameter func(p0 *ExpressionBindParameter) error + FuncExitExpressionBindParameter func(p0 *ExpressionBindParameter) error + FuncEnterExpressionCase func(p0 *ExpressionCase) error + FuncExitExpressionCase func(p0 *ExpressionCase) error + FuncEnterExpressionCollate func(p0 *ExpressionCollate) error + FuncExitExpressionCollate func(p0 *ExpressionCollate) error + FuncEnterExpressionColumn func(p0 *ExpressionColumn) error + FuncExitExpressionColumn func(p0 *ExpressionColumn) error + FuncEnterExpressionFunction func(p0 *ExpressionFunction) error + FuncExitExpressionFunction func(p0 *ExpressionFunction) error + FuncEnterExpressionIs func(p0 *ExpressionIs) error + FuncExitExpressionIs func(p0 *ExpressionIs) error + FuncEnterExpressionList func(p0 *ExpressionList) error + FuncExitExpressionList func(p0 *ExpressionList) error + FuncEnterExpressionLiteral func(p0 *ExpressionLiteral) error + FuncExitExpressionLiteral func(p0 *ExpressionLiteral) error + FuncEnterExpressionSelect func(p0 *ExpressionSelect) error + FuncExitExpressionSelect func(p0 *ExpressionSelect) error + FuncEnterExpressionStringCompare func(p0 *ExpressionStringCompare) error + FuncExitExpressionStringCompare func(p0 *ExpressionStringCompare) error + FuncEnterExpressionUnary func(p0 *ExpressionUnary) error + FuncExitExpressionUnary func(p0 *ExpressionUnary) error + FuncEnterFromClause func(p0 *FromClause) error + FuncExitFromClause func(p0 *FromClause) error + FuncEnterGroupBy func(p0 *GroupBy) error + FuncExitGroupBy func(p0 *GroupBy) error + FuncEnterInsert func(p0 *Insert) error + FuncExitInsert func(p0 *Insert) error + FuncEnterInsertStmt func(p0 *InsertStmt) error + FuncExitInsertStmt func(p0 *InsertStmt) error + FuncEnterJoinClause func(p0 *JoinClause) error + FuncExitJoinClause func(p0 *JoinClause) error + FuncEnterJoinOperator func(p0 *JoinOperator) error + FuncExitJoinOperator func(p0 *JoinOperator) error + FuncEnterJoinPredicate func(p0 *JoinPredicate) error + FuncExitJoinPredicate func(p0 *JoinPredicate) error + FuncEnterLimit func(p0 *Limit) error + FuncExitLimit func(p0 *Limit) error + FuncEnterOrderBy func(p0 *OrderBy) error + FuncExitOrderBy func(p0 *OrderBy) error + FuncEnterOrderingTerm func(p0 *OrderingTerm) error + FuncExitOrderingTerm func(p0 *OrderingTerm) error + FuncEnterQualifiedTableName func(p0 *QualifiedTableName) error + FuncExitQualifiedTableName func(p0 *QualifiedTableName) error + FuncEnterResultColumnExpression func(p0 *ResultColumnExpression) error + FuncExitResultColumnExpression func(p0 *ResultColumnExpression) error + FuncEnterResultColumnStar func(p0 *ResultColumnStar) error + FuncExitResultColumnStar func(p0 *ResultColumnStar) error + FuncEnterResultColumnTable func(p0 *ResultColumnTable) error + FuncExitResultColumnTable func(p0 *ResultColumnTable) error + FuncEnterReturningClause func(p0 *ReturningClause) error + FuncExitReturningClause func(p0 *ReturningClause) error + FuncEnterReturningClauseColumn func(p0 *ReturningClauseColumn) error + FuncExitReturningClauseColumn func(p0 *ReturningClauseColumn) error + FuncEnterScalarFunc func(p0 *ScalarFunction) error + FuncExitScalarFunc func(p0 *ScalarFunction) error + FuncEnterSelect func(p0 *Select) error + FuncExitSelect func(p0 *Select) error + FuncEnterSelectCore func(p0 *SelectCore) error + FuncExitSelectCore func(p0 *SelectCore) error + FuncEnterSelectStmt func(p0 *SelectStmt) error + FuncExitSelectStmt func(p0 *SelectStmt) error + FuncEnterTableOrSubqueryJoin func(p0 *TableOrSubqueryJoin) error + FuncExitTableOrSubqueryJoin func(p0 *TableOrSubqueryJoin) error + FuncEnterTableOrSubqueryList func(p0 *TableOrSubqueryList) error + FuncExitTableOrSubqueryList func(p0 *TableOrSubqueryList) error + FuncEnterTableOrSubquerySelect func(p0 *TableOrSubquerySelect) error + FuncExitTableOrSubquerySelect func(p0 *TableOrSubquerySelect) error + FuncEnterTableOrSubqueryTable func(p0 *TableOrSubqueryTable) error + FuncExitTableOrSubqueryTable func(p0 *TableOrSubqueryTable) error + FuncEnterUpdate func(p0 *Update) error + FuncExitUpdate func(p0 *Update) error + FuncEnterUpdateSetClause func(p0 *UpdateSetClause) error + FuncExitUpdateSetClause func(p0 *UpdateSetClause) error + FuncEnterUpdateStmt func(p0 *UpdateStmt) error + FuncExitUpdateStmt func(p0 *UpdateStmt) error + FuncEnterUpsert func(p0 *Upsert) error + FuncExitUpsert func(p0 *Upsert) error +} + +var _ AstListener = &ImplementedListener{} + +func (b *ImplementedListener) EnterAggregateFunc(p0 *AggregateFunc) error { + if b.FuncEnterAggregateFunc == nil { + return nil + } + + return b.FuncEnterAggregateFunc(p0) +} + +func (b *ImplementedListener) ExitAggregateFunc(p0 *AggregateFunc) error { + if b.FuncExitAggregateFunc == nil { + return nil + } + + return b.FuncExitAggregateFunc(p0) +} + +func (b *ImplementedListener) EnterCTE(p0 *CTE) error { + if b.FuncEnterCTE == nil { + return nil + } + + return b.FuncEnterCTE(p0) +} + +func (b *ImplementedListener) ExitCTE(p0 *CTE) error { + if b.FuncExitCTE == nil { + return nil + } + + return b.FuncExitCTE(p0) +} + +func (b *ImplementedListener) EnterCompoundOperator(p0 *CompoundOperator) error { + if b.FuncEnterCompoundOperator == nil { + return nil + } + + return b.FuncEnterCompoundOperator(p0) +} + +func (b *ImplementedListener) ExitCompoundOperator(p0 *CompoundOperator) error { + if b.FuncExitCompoundOperator == nil { + return nil + } + + return b.FuncExitCompoundOperator(p0) +} + +func (b *ImplementedListener) EnterConflictTarget(p0 *ConflictTarget) error { + if b.FuncEnterConflictTarget == nil { + return nil + } + + return b.FuncEnterConflictTarget(p0) +} + +func (b *ImplementedListener) ExitConflictTarget(p0 *ConflictTarget) error { + if b.FuncExitConflictTarget == nil { + return nil + } + + return b.FuncExitConflictTarget(p0) +} + +func (b *ImplementedListener) EnterDelete(p0 *Delete) error { + if b.FuncEnterDelete == nil { + return nil + } + + return b.FuncEnterDelete(p0) +} + +func (b *ImplementedListener) ExitDelete(p0 *Delete) error { + if b.FuncExitDelete == nil { + return nil + } + + return b.FuncExitDelete(p0) +} + +func (b *ImplementedListener) EnterDeleteStmt(p0 *DeleteStmt) error { + if b.FuncEnterDeleteStmt == nil { + return nil + } + + return b.FuncEnterDeleteStmt(p0) +} + +func (b *ImplementedListener) ExitDeleteStmt(p0 *DeleteStmt) error { + if b.FuncExitDeleteStmt == nil { + return nil + } + + return b.FuncExitDeleteStmt(p0) +} + +func (b *ImplementedListener) EnterExpressionArithmetic(p0 *ExpressionArithmetic) error { + if b.FuncEnterExpressionArithmetic == nil { + return nil + } + + return b.FuncEnterExpressionArithmetic(p0) +} + +func (b *ImplementedListener) ExitExpressionArithmetic(p0 *ExpressionArithmetic) error { + if b.FuncExitExpressionArithmetic == nil { + return nil + } + + return b.FuncExitExpressionArithmetic(p0) +} + +func (b *ImplementedListener) EnterExpressionBetween(p0 *ExpressionBetween) error { + if b.FuncEnterExpressionBetween == nil { + return nil + } + + return b.FuncEnterExpressionBetween(p0) +} + +func (b *ImplementedListener) ExitExpressionBetween(p0 *ExpressionBetween) error { + if b.FuncExitExpressionBetween == nil { + return nil + } + + return b.FuncExitExpressionBetween(p0) +} + +func (b *ImplementedListener) EnterExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { + if b.FuncEnterExpressionBinaryComparison == nil { + return nil + } + + return b.FuncEnterExpressionBinaryComparison(p0) +} + +func (b *ImplementedListener) ExitExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { + if b.FuncExitExpressionBinaryComparison == nil { + return nil + } + + return b.FuncExitExpressionBinaryComparison(p0) +} + +func (b *ImplementedListener) EnterExpressionBindParameter(p0 *ExpressionBindParameter) error { + if b.FuncEnterExpressionBindParameter == nil { + return nil + } + + return b.FuncEnterExpressionBindParameter(p0) +} + +func (b *ImplementedListener) ExitExpressionBindParameter(p0 *ExpressionBindParameter) error { + if b.FuncExitExpressionBindParameter == nil { + return nil + } + + return b.FuncExitExpressionBindParameter(p0) +} + +func (b *ImplementedListener) EnterExpressionCase(p0 *ExpressionCase) error { + if b.FuncEnterExpressionCase == nil { + return nil + } + + return b.FuncEnterExpressionCase(p0) +} + +func (b *ImplementedListener) ExitExpressionCase(p0 *ExpressionCase) error { + if b.FuncExitExpressionCase == nil { + return nil + } + + return b.FuncExitExpressionCase(p0) +} + +func (b *ImplementedListener) EnterExpressionCollate(p0 *ExpressionCollate) error { + if b.FuncEnterExpressionCollate == nil { + return nil + } + + return b.FuncEnterExpressionCollate(p0) +} + +func (b *ImplementedListener) ExitExpressionCollate(p0 *ExpressionCollate) error { + if b.FuncExitExpressionCollate == nil { + return nil + } + + return b.FuncExitExpressionCollate(p0) +} + +func (b *ImplementedListener) EnterExpressionColumn(p0 *ExpressionColumn) error { + if b.FuncEnterExpressionColumn == nil { + return nil + } + + return b.FuncEnterExpressionColumn(p0) +} + +func (b *ImplementedListener) ExitExpressionColumn(p0 *ExpressionColumn) error { + if b.FuncExitExpressionColumn == nil { + return nil + } + + return b.FuncExitExpressionColumn(p0) +} + +func (b *ImplementedListener) EnterExpressionFunction(p0 *ExpressionFunction) error { + if b.FuncEnterExpressionFunction == nil { + return nil + } + + return b.FuncEnterExpressionFunction(p0) +} + +func (b *ImplementedListener) ExitExpressionFunction(p0 *ExpressionFunction) error { + if b.FuncExitExpressionFunction == nil { + return nil + } + + return b.FuncExitExpressionFunction(p0) +} + +func (b *ImplementedListener) EnterExpressionIs(p0 *ExpressionIs) error { + if b.FuncEnterExpressionIs == nil { + return nil + } + + return b.FuncEnterExpressionIs(p0) +} + +func (b *ImplementedListener) ExitExpressionIs(p0 *ExpressionIs) error { + if b.FuncExitExpressionIs == nil { + return nil + } + + return b.FuncExitExpressionIs(p0) +} + +func (b *ImplementedListener) EnterExpressionList(p0 *ExpressionList) error { + if b.FuncEnterExpressionList == nil { + return nil + } + + return b.FuncEnterExpressionList(p0) +} + +func (b *ImplementedListener) ExitExpressionList(p0 *ExpressionList) error { + if b.FuncExitExpressionList == nil { + return nil + } + + return b.FuncExitExpressionList(p0) +} + +func (b *ImplementedListener) EnterExpressionLiteral(p0 *ExpressionLiteral) error { + if b.FuncEnterExpressionLiteral == nil { + return nil + } + + return b.FuncEnterExpressionLiteral(p0) +} + +func (b *ImplementedListener) ExitExpressionLiteral(p0 *ExpressionLiteral) error { + if b.FuncExitExpressionLiteral == nil { + return nil + } + + return b.FuncExitExpressionLiteral(p0) +} + +func (b *ImplementedListener) EnterExpressionSelect(p0 *ExpressionSelect) error { + if b.FuncEnterExpressionSelect == nil { + return nil + } + + return b.FuncEnterExpressionSelect(p0) +} + +func (b *ImplementedListener) ExitExpressionSelect(p0 *ExpressionSelect) error { + if b.FuncExitExpressionSelect == nil { + return nil + } + + return b.FuncExitExpressionSelect(p0) +} + +func (b *ImplementedListener) EnterExpressionStringCompare(p0 *ExpressionStringCompare) error { + if b.FuncEnterExpressionStringCompare == nil { + return nil + } + + return b.FuncEnterExpressionStringCompare(p0) +} + +func (b *ImplementedListener) ExitExpressionStringCompare(p0 *ExpressionStringCompare) error { + if b.FuncExitExpressionStringCompare == nil { + return nil + } + + return b.FuncExitExpressionStringCompare(p0) +} + +func (b *ImplementedListener) EnterExpressionUnary(p0 *ExpressionUnary) error { + if b.FuncEnterExpressionUnary == nil { + return nil + } + + return b.FuncEnterExpressionUnary(p0) +} + +func (b *ImplementedListener) ExitExpressionUnary(p0 *ExpressionUnary) error { + if b.FuncExitExpressionUnary == nil { + return nil + } + + return b.FuncExitExpressionUnary(p0) +} + +func (b *ImplementedListener) EnterFromClause(p0 *FromClause) error { + if b.FuncEnterFromClause == nil { + return nil + } + + return b.FuncEnterFromClause(p0) +} + +func (b *ImplementedListener) ExitFromClause(p0 *FromClause) error { + if b.FuncExitFromClause == nil { + return nil + } + + return b.FuncExitFromClause(p0) +} + +func (b *ImplementedListener) EnterGroupBy(p0 *GroupBy) error { + if b.FuncEnterGroupBy == nil { + return nil + } + + return b.FuncEnterGroupBy(p0) +} + +func (b *ImplementedListener) ExitGroupBy(p0 *GroupBy) error { + if b.FuncExitGroupBy == nil { + return nil + } + + return b.FuncExitGroupBy(p0) +} + +func (b *ImplementedListener) EnterInsert(p0 *Insert) error { + if b.FuncEnterInsert == nil { + return nil + } + + return b.FuncEnterInsert(p0) +} + +func (b *ImplementedListener) ExitInsert(p0 *Insert) error { + if b.FuncExitInsert == nil { + return nil + } + + return b.FuncExitInsert(p0) +} + +func (b *ImplementedListener) EnterInsertStmt(p0 *InsertStmt) error { + if b.FuncEnterInsertStmt == nil { + return nil + } + + return b.FuncEnterInsertStmt(p0) +} + +func (b *ImplementedListener) ExitInsertStmt(p0 *InsertStmt) error { + if b.FuncExitInsertStmt == nil { + return nil + } + + return b.FuncExitInsertStmt(p0) +} + +func (b *ImplementedListener) EnterJoinClause(p0 *JoinClause) error { + if b.FuncEnterJoinClause == nil { + return nil + } + + return b.FuncEnterJoinClause(p0) +} + +func (b *ImplementedListener) ExitJoinClause(p0 *JoinClause) error { + if b.FuncExitJoinClause == nil { + return nil + } + + return b.FuncExitJoinClause(p0) +} + +func (b *ImplementedListener) EnterJoinOperator(p0 *JoinOperator) error { + if b.FuncEnterJoinOperator == nil { + return nil + } + + return b.FuncEnterJoinOperator(p0) +} + +func (b *ImplementedListener) ExitJoinOperator(p0 *JoinOperator) error { + if b.FuncExitJoinOperator == nil { + return nil + } + + return b.FuncExitJoinOperator(p0) +} + +func (b *ImplementedListener) EnterJoinPredicate(p0 *JoinPredicate) error { + if b.FuncEnterJoinPredicate == nil { + return nil + } + + return b.FuncEnterJoinPredicate(p0) +} + +func (b *ImplementedListener) ExitJoinPredicate(p0 *JoinPredicate) error { + if b.FuncExitJoinPredicate == nil { + return nil + } + + return b.FuncExitJoinPredicate(p0) +} + +func (b *ImplementedListener) EnterLimit(p0 *Limit) error { + if b.FuncEnterLimit == nil { + return nil + } + + return b.FuncEnterLimit(p0) +} + +func (b *ImplementedListener) ExitLimit(p0 *Limit) error { + if b.FuncExitLimit == nil { + return nil + } + + return b.FuncExitLimit(p0) +} + +func (b *ImplementedListener) EnterOrderBy(p0 *OrderBy) error { + if b.FuncEnterOrderBy == nil { + return nil + } + + return b.FuncEnterOrderBy(p0) +} + +func (b *ImplementedListener) ExitOrderBy(p0 *OrderBy) error { + if b.FuncExitOrderBy == nil { + return nil + } + + return b.FuncExitOrderBy(p0) +} + +func (b *ImplementedListener) EnterOrderingTerm(p0 *OrderingTerm) error { + if b.FuncEnterOrderingTerm == nil { + return nil + } + + return b.FuncEnterOrderingTerm(p0) +} + +func (b *ImplementedListener) ExitOrderingTerm(p0 *OrderingTerm) error { + if b.FuncExitOrderingTerm == nil { + return nil + } + + return b.FuncExitOrderingTerm(p0) +} + +func (b *ImplementedListener) EnterQualifiedTableName(p0 *QualifiedTableName) error { + if b.FuncEnterQualifiedTableName == nil { + return nil + } + + return b.FuncEnterQualifiedTableName(p0) +} + +func (b *ImplementedListener) ExitQualifiedTableName(p0 *QualifiedTableName) error { + if b.FuncExitQualifiedTableName == nil { + return nil + } + + return b.FuncExitQualifiedTableName(p0) +} + +func (b *ImplementedListener) EnterResultColumnExpression(p0 *ResultColumnExpression) error { + if b.FuncEnterResultColumnExpression == nil { + return nil + } + + return b.FuncEnterResultColumnExpression(p0) +} + +func (b *ImplementedListener) ExitResultColumnExpression(p0 *ResultColumnExpression) error { + if b.FuncExitResultColumnExpression == nil { + return nil + } + + return b.FuncExitResultColumnExpression(p0) +} + +func (b *ImplementedListener) EnterResultColumnStar(p0 *ResultColumnStar) error { + if b.FuncEnterResultColumnStar == nil { + return nil + } + + return b.FuncEnterResultColumnStar(p0) +} + +func (b *ImplementedListener) ExitResultColumnStar(p0 *ResultColumnStar) error { + if b.FuncExitResultColumnStar == nil { + return nil + } + + return b.FuncExitResultColumnStar(p0) +} + +func (b *ImplementedListener) EnterResultColumnTable(p0 *ResultColumnTable) error { + if b.FuncEnterResultColumnTable == nil { + return nil + } + + return b.FuncEnterResultColumnTable(p0) +} + +func (b *ImplementedListener) ExitResultColumnTable(p0 *ResultColumnTable) error { + if b.FuncExitResultColumnTable == nil { + return nil + } + + return b.FuncExitResultColumnTable(p0) +} + +func (b *ImplementedListener) EnterReturningClause(p0 *ReturningClause) error { + if b.FuncEnterReturningClause == nil { + return nil + } + + return b.FuncEnterReturningClause(p0) +} + +func (b *ImplementedListener) ExitReturningClause(p0 *ReturningClause) error { + if b.FuncExitReturningClause == nil { + return nil + } + + return b.FuncExitReturningClause(p0) +} + +func (b *ImplementedListener) EnterReturningClauseColumn(p0 *ReturningClauseColumn) error { + if b.FuncEnterReturningClauseColumn == nil { + return nil + } + + return b.FuncEnterReturningClauseColumn(p0) +} + +func (b *ImplementedListener) ExitReturningClauseColumn(p0 *ReturningClauseColumn) error { + if b.FuncExitReturningClauseColumn == nil { + return nil + } + + return b.FuncExitReturningClauseColumn(p0) +} + +func (b *ImplementedListener) EnterScalarFunc(p0 *ScalarFunction) error { + if b.FuncEnterScalarFunc == nil { + return nil + } + + return b.FuncEnterScalarFunc(p0) +} + +func (b *ImplementedListener) ExitScalarFunc(p0 *ScalarFunction) error { + if b.FuncExitScalarFunc == nil { + return nil + } + + return b.FuncExitScalarFunc(p0) +} + +func (b *ImplementedListener) EnterSelect(p0 *Select) error { + if b.FuncEnterSelect == nil { + return nil + } + + return b.FuncEnterSelect(p0) +} + +func (b *ImplementedListener) ExitSelect(p0 *Select) error { + if b.FuncExitSelect == nil { + return nil + } + + return b.FuncExitSelect(p0) +} + +func (b *ImplementedListener) EnterSelectCore(p0 *SelectCore) error { + if b.FuncEnterSelectCore == nil { + return nil + } + + return b.FuncEnterSelectCore(p0) +} + +func (b *ImplementedListener) ExitSelectCore(p0 *SelectCore) error { + if b.FuncExitSelectCore == nil { + return nil + } + + return b.FuncExitSelectCore(p0) +} + +func (b *ImplementedListener) EnterSelectStmt(p0 *SelectStmt) error { + if b.FuncEnterSelectStmt == nil { + return nil + } + + return b.FuncEnterSelectStmt(p0) +} + +func (b *ImplementedListener) ExitSelectStmt(p0 *SelectStmt) error { + if b.FuncExitSelectStmt == nil { + return nil + } + + return b.FuncExitSelectStmt(p0) +} + +func (b *ImplementedListener) EnterTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { + if b.FuncEnterTableOrSubqueryJoin == nil { + return nil + } + + return b.FuncEnterTableOrSubqueryJoin(p0) +} + +func (b *ImplementedListener) ExitTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { + if b.FuncExitTableOrSubqueryJoin == nil { + return nil + } + + return b.FuncExitTableOrSubqueryJoin(p0) +} + +func (b *ImplementedListener) EnterTableOrSubqueryList(p0 *TableOrSubqueryList) error { + if b.FuncEnterTableOrSubqueryList == nil { + return nil + } + + return b.FuncEnterTableOrSubqueryList(p0) +} + +func (b *ImplementedListener) ExitTableOrSubqueryList(p0 *TableOrSubqueryList) error { + if b.FuncExitTableOrSubqueryList == nil { + return nil + } + + return b.FuncExitTableOrSubqueryList(p0) +} + +func (b *ImplementedListener) EnterTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { + if b.FuncEnterTableOrSubquerySelect == nil { + return nil + } + + return b.FuncEnterTableOrSubquerySelect(p0) +} + +func (b *ImplementedListener) ExitTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { + if b.FuncExitTableOrSubquerySelect == nil { + return nil + } + + return b.FuncExitTableOrSubquerySelect(p0) +} + +func (b *ImplementedListener) EnterTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { + if b.FuncEnterTableOrSubqueryTable == nil { + return nil + } + + return b.FuncEnterTableOrSubqueryTable(p0) +} + +func (b *ImplementedListener) ExitTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { + if b.FuncExitTableOrSubqueryTable == nil { + return nil + } + + return b.FuncExitTableOrSubqueryTable(p0) +} + +func (b *ImplementedListener) EnterUpdate(p0 *Update) error { + if b.FuncEnterUpdate == nil { + return nil + } + + return b.FuncEnterUpdate(p0) +} + +func (b *ImplementedListener) ExitUpdate(p0 *Update) error { + if b.FuncExitUpdate == nil { + return nil + } + + return b.FuncExitUpdate(p0) +} + +func (b *ImplementedListener) EnterUpdateSetClause(p0 *UpdateSetClause) error { + if b.FuncEnterUpdateSetClause == nil { + return nil + } + + return b.FuncEnterUpdateSetClause(p0) +} + +func (b *ImplementedListener) ExitUpdateSetClause(p0 *UpdateSetClause) error { + if b.FuncExitUpdateSetClause == nil { + return nil + } + + return b.FuncExitUpdateSetClause(p0) +} + +func (b *ImplementedListener) EnterUpdateStmt(p0 *UpdateStmt) error { + if b.FuncEnterUpdateStmt == nil { + return nil + } + + return b.FuncEnterUpdateStmt(p0) +} + +func (b *ImplementedListener) ExitUpdateStmt(p0 *UpdateStmt) error { + if b.FuncExitUpdateStmt == nil { + return nil + } + + return b.FuncExitUpdateStmt(p0) +} + +func (b *ImplementedListener) EnterUpsert(p0 *Upsert) error { + if b.FuncEnterUpsert == nil { + return nil + } + + return b.FuncEnterUpsert(p0) +} + +func (b *ImplementedListener) ExitUpsert(p0 *Upsert) error { + if b.FuncExitUpsert == nil { + return nil + } + + return b.FuncExitUpsert(p0) +} diff --git a/parse/sql/tree/ast_visitor.go b/parse/sql/tree/ast_visitor.go new file mode 100644 index 000000000..a3b3dcbbb --- /dev/null +++ b/parse/sql/tree/ast_visitor.go @@ -0,0 +1,269 @@ +package tree + +// AstVisitor defines visitor for AstNode. +type AstVisitor interface { + Visit(AstNode) interface{} + VisitAggregateFunc(*AggregateFunc) any + VisitConflictTarget(*ConflictTarget) any + VisitCompoundOperator(*CompoundOperator) any + VisitCTE(*CTE) any + VisitDelete(*Delete) any + VisitDeleteStmt(*DeleteStmt) any + VisitExpressionLiteral(*ExpressionLiteral) any + VisitExpressionBindParameter(*ExpressionBindParameter) any + VisitExpressionColumn(*ExpressionColumn) any + VisitExpressionUnary(*ExpressionUnary) any + VisitExpressionBinaryComparison(*ExpressionBinaryComparison) any + VisitExpressionFunction(*ExpressionFunction) any + VisitExpressionList(*ExpressionList) any + VisitExpressionCollate(*ExpressionCollate) any + VisitExpressionStringCompare(*ExpressionStringCompare) any + VisitExpressionIs(*ExpressionIs) any + VisitExpressionBetween(*ExpressionBetween) any + VisitExpressionSelect(*ExpressionSelect) any + VisitExpressionCase(*ExpressionCase) any + VisitExpressionArithmetic(*ExpressionArithmetic) any + VisitFromClause(*FromClause) any + VisitScalarFunc(*ScalarFunction) any + VisitGroupBy(*GroupBy) any + VisitInsert(*Insert) any + VisitInsertStmt(*InsertStmt) any + VisitJoinClause(*JoinClause) any + VisitJoinPredicate(*JoinPredicate) any + VisitJoinOperator(*JoinOperator) any + VisitLimit(*Limit) any + VisitOrderBy(*OrderBy) any + VisitOrderingTerm(*OrderingTerm) any + VisitQualifiedTableName(*QualifiedTableName) any + VisitResultColumnStar(*ResultColumnStar) any + VisitResultColumnExpression(*ResultColumnExpression) any + VisitResultColumnTable(*ResultColumnTable) any + VisitReturningClause(*ReturningClause) any + VisitReturningClauseColumn(*ReturningClauseColumn) any + VisitSelect(*Select) any + VisitSelectCore(*SelectCore) any + VisitSelectStmt(*SelectStmt) any + VisitTableOrSubquery(TableOrSubquery) any + VisitTableOrSubqueryTable(*TableOrSubqueryTable) any + VisitTableOrSubquerySelect(*TableOrSubquerySelect) any + VisitTableOrSubqueryList(*TableOrSubqueryList) any + VisitTableOrSubqueryJoin(*TableOrSubqueryJoin) any + VisitUpdateSetClause(*UpdateSetClause) any + VisitUpdate(*Update) any + VisitUpdateStmt(*UpdateStmt) any + VisitUpsert(*Upsert) any +} + +// BaseAstVisitor implements AstVisitor interface, it can be embedded in +// other structs to provide default implementation for all methods. +type BaseAstVisitor struct { +} + +func (v *BaseAstVisitor) Visit(node AstNode) interface{} { + // dispatch to the concrete visit method + return node.Accept(v) +} + +func (v *BaseAstVisitor) VisitAggregateFunc(node *AggregateFunc) any { + return nil +} + +func (v *BaseAstVisitor) VisitConflictTarget(node *ConflictTarget) any { + return nil +} + +func (v *BaseAstVisitor) VisitCompoundOperator(node *CompoundOperator) any { + return nil +} + +func (v *BaseAstVisitor) VisitCTE(node *CTE) any { + return nil +} + +func (v *BaseAstVisitor) VisitDelete(node *Delete) any { + return nil +} + +func (v *BaseAstVisitor) VisitDeleteStmt(node *DeleteStmt) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionLiteral(node *ExpressionLiteral) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionBindParameter(node *ExpressionBindParameter) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionColumn(node *ExpressionColumn) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionUnary(node *ExpressionUnary) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionBinaryComparison(node *ExpressionBinaryComparison) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionFunction(node *ExpressionFunction) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionList(node *ExpressionList) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionCollate(node *ExpressionCollate) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionStringCompare(node *ExpressionStringCompare) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionIs(node *ExpressionIs) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionBetween(node *ExpressionBetween) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionSelect(node *ExpressionSelect) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionCase(node *ExpressionCase) any { + return nil +} + +func (v *BaseAstVisitor) VisitExpressionArithmetic(node *ExpressionArithmetic) any { + return nil +} + +func (v *BaseAstVisitor) VisitScalarFunc(node *ScalarFunction) any { + return nil +} + +func (v *BaseAstVisitor) VisitGroupBy(node *GroupBy) any { + return nil +} + +func (v *BaseAstVisitor) VisitInsert(node *Insert) any { + return nil +} + +func (v *BaseAstVisitor) VisitInsertStmt(node *InsertStmt) any { + return nil +} + +func (v *BaseAstVisitor) VisitJoinClause(node *JoinClause) any { + return nil +} + +func (v *BaseAstVisitor) VisitJoinPredicate(node *JoinPredicate) any { + return nil +} + +func (v *BaseAstVisitor) VisitJoinOperator(node *JoinOperator) any { + return nil +} + +func (v *BaseAstVisitor) VisitLimit(node *Limit) any { + return nil +} + +func (v *BaseAstVisitor) VisitOrderBy(node *OrderBy) any { + return nil +} + +func (v *BaseAstVisitor) VisitOrderingTerm(node *OrderingTerm) any { + return nil +} + +func (v *BaseAstVisitor) VisitQualifiedTableName(node *QualifiedTableName) any { + return nil +} + +func (v *BaseAstVisitor) VisitResultColumnStar(node *ResultColumnStar) any { + return nil +} + +func (v *BaseAstVisitor) VisitResultColumnExpression(node *ResultColumnExpression) any { + return nil +} + +func (v *BaseAstVisitor) VisitResultColumnTable(node *ResultColumnTable) any { + return nil +} + +func (v *BaseAstVisitor) VisitReturningClause(node *ReturningClause) any { + return nil +} + +func (v *BaseAstVisitor) VisitReturningClauseColumn(node *ReturningClauseColumn) any { + return nil +} + +func (v *BaseAstVisitor) VisitSelect(node *Select) any { + return nil +} + +func (v *BaseAstVisitor) VisitSelectCore(node *SelectCore) any { + return nil +} + +func (v *BaseAstVisitor) VisitSelectStmt(node *SelectStmt) any { + return nil +} + +func (v *BaseAstVisitor) VisitFromClause(node *FromClause) any { + return nil +} + +func (v *BaseAstVisitor) VisitTableOrSubquery(node TableOrSubquery) any { + // TODO delete? + switch t := node.(type) { + case *TableOrSubqueryTable: + return v.Visit(t) + case *TableOrSubquerySelect: + return v.Visit(t) + default: + panic("unknown table or subquery type") + } +} + +func (v *BaseAstVisitor) VisitTableOrSubqueryTable(node *TableOrSubqueryTable) any { + return nil +} + +func (v *BaseAstVisitor) VisitTableOrSubquerySelect(node *TableOrSubquerySelect) any { + return nil +} + +func (v *BaseAstVisitor) VisitTableOrSubqueryList(node *TableOrSubqueryList) any { + return nil +} + +func (v *BaseAstVisitor) VisitTableOrSubqueryJoin(node *TableOrSubqueryJoin) any { + return nil +} + +func (v *BaseAstVisitor) VisitUpdateSetClause(node *UpdateSetClause) any { + return nil +} + +func (v *BaseAstVisitor) VisitUpdate(node *Update) any { + return nil +} + +func (v *BaseAstVisitor) VisitUpdateStmt(node *UpdateStmt) any { + return nil +} + +func (v *BaseAstVisitor) VisitUpsert(node *Upsert) any { + return nil +} diff --git a/parse/sql/tree/base.go b/parse/sql/tree/base.go new file mode 100644 index 000000000..7b42b00cf --- /dev/null +++ b/parse/sql/tree/base.go @@ -0,0 +1,31 @@ +package tree + +type Position struct { + StartLine int + EndLine int + StartColumn int + EndColumn int +} + +// node is the base struct implementing the Node interface. +// Node implementations should have this embedded. +type node struct { + text string + pos *Position +} + +func (n *node) SetText(text string) { + n.text = text +} + +func (n *node) Text() string { + return n.text +} + +func (n *node) Position() *Position { + return n.pos +} + +func (n *node) SetPosition(pos *Position) { + n.pos = pos +} diff --git a/parse/sql/tree/conflict-target.go b/parse/sql/tree/conflict-target.go index 6cc342852..c94b5a386 100644 --- a/parse/sql/tree/conflict-target.go +++ b/parse/sql/tree/conflict-target.go @@ -5,14 +5,20 @@ import ( ) type ConflictTarget struct { + node + IndexedColumns []string Where Expression } -func (c *ConflictTarget) Accept(w Walker) error { +func (c *ConflictTarget) Accept(v AstVisitor) any { + return v.VisitConflictTarget(c) +} + +func (c *ConflictTarget) Walk(w AstListener) error { return run( w.EnterConflictTarget(c), - accept(w, c.Where), + walk(w, c.Where), w.ExitConflictTarget(c), ) } diff --git a/parse/sql/tree/delete.go b/parse/sql/tree/delete.go index 32f645968..592ffa74d 100644 --- a/parse/sql/tree/delete.go +++ b/parse/sql/tree/delete.go @@ -1,37 +1,30 @@ package tree import ( - "fmt" - sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) type Delete struct { + node + CTE []*CTE DeleteStmt *DeleteStmt } -func (d *Delete) Accept(w Walker) error { +func (d *Delete) Accept(v AstVisitor) any { + return v.VisitDelete(d) +} + +func (d *Delete) Walk(w AstListener) error { return run( w.EnterDelete(d), - acceptMany(w, d.CTE), - accept(w, d.DeleteStmt), + walkMany(w, d.CTE), + walk(w, d.DeleteStmt), w.ExitDelete(d), ) } -func (d *Delete) ToSQL() (str string, err error) { - defer func() { - if r := recover(); r != nil { - err2, ok := r.(error) - if !ok { - err2 = fmt.Errorf("%v", r) - } - - err = err2 - } - }() - +func (d *Delete) ToSQL() string { stmt := sqlwriter.NewWriter() if len(d.CTE) > 0 { @@ -45,21 +38,27 @@ func (d *Delete) ToSQL() (str string, err error) { stmt.Token.Semicolon() - return stmt.String(), nil + return stmt.String() } type DeleteStmt struct { + node + QualifiedTableName *QualifiedTableName Where Expression Returning *ReturningClause } -func (d *DeleteStmt) Accept(w Walker) error { +func (d *DeleteStmt) Accept(v AstVisitor) any { + return v.VisitDeleteStmt(d) +} + +func (d *DeleteStmt) Walk(w AstListener) error { return run( w.EnterDeleteStmt(d), - accept(w, d.QualifiedTableName), - accept(w, d.Where), - accept(w, d.Returning), + walk(w, d.QualifiedTableName), + walk(w, d.Where), + walk(w, d.Returning), w.ExitDeleteStmt(d), ) } diff --git a/parse/sql/tree/delete_test.go b/parse/sql/tree/delete_test.go index e5e026f2b..2f420b2ab 100644 --- a/parse/sql/tree/delete_test.go +++ b/parse/sql/tree/delete_test.go @@ -50,7 +50,7 @@ func TestDelete_ToSQL(t *testing.T) { CTE: tt.fields.CTE, DeleteStmt: tt.fields.DeleteStmt, } - gotStr, err := d.ToSQL() + gotStr, err := tree.SafeToSQL(d) if (err != nil) != tt.wantErr { t.Errorf("Delete.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/parse/sql/tree/expression.go b/parse/sql/tree/expression.go index 02a92525d..d6c84ef08 100644 --- a/parse/sql/tree/expression.go +++ b/parse/sql/tree/expression.go @@ -11,7 +11,7 @@ import ( type Expression interface { isExpression() // private function to prevent external packages from implementing this interface ToSQL() string - Accept(w Walker) error + Walk(w AstListener) error joinable } @@ -27,20 +27,26 @@ func (e *expressionBase) ToSQL() string { panic("expressionBase: ToSQL() must be implemented by child") } -func (e *expressionBase) Accept(w Walker) error { - return fmt.Errorf("expressionBase: Accept() must be implemented by child") +func (e *expressionBase) Walk(w AstListener) error { + return fmt.Errorf("expressionBase: Walk() must be implemented by child") } type Wrapped bool type ExpressionLiteral struct { + node + expressionBase Wrapped Value string TypeCast TypeCastType } -func (e *ExpressionLiteral) Accept(w Walker) error { +func (e *ExpressionLiteral) Accept(v AstVisitor) any { + return v.VisitExpressionLiteral(e) +} + +func (e *ExpressionLiteral) Walk(w AstListener) error { return run( w.EnterExpressionLiteral(e), w.ExitExpressionLiteral(e), @@ -88,13 +94,19 @@ func validateIsNonStringLiteral(str string) { } type ExpressionBindParameter struct { + node + expressionBase Wrapped Parameter string TypeCast TypeCastType } -func (e *ExpressionBindParameter) Accept(w Walker) error { +func (e *ExpressionBindParameter) Accept(v AstVisitor) any { + return v.VisitExpressionBindParameter(e) +} + +func (e *ExpressionBindParameter) Walk(w AstListener) error { return run( w.EnterExpressionBindParameter(e), w.ExitExpressionBindParameter(e), @@ -121,6 +133,8 @@ func (e *ExpressionBindParameter) ToSQL() string { } type ExpressionColumn struct { + node + expressionBase Wrapped Table string @@ -128,7 +142,11 @@ type ExpressionColumn struct { TypeCast TypeCastType } -func (e *ExpressionColumn) Accept(w Walker) error { +func (e *ExpressionColumn) Accept(v AstVisitor) any { + return v.VisitExpressionColumn(e) +} + +func (e *ExpressionColumn) Walk(w AstListener) error { return run( w.EnterExpressionColumn(e), w.ExitExpressionColumn(e), @@ -157,6 +175,8 @@ func (e *ExpressionColumn) ToSQL() string { } type ExpressionUnary struct { + node + expressionBase Wrapped Operator UnaryOperator @@ -166,7 +186,11 @@ type ExpressionUnary struct { // NOTE: type cast only makes sense when wrapped, } -func (e *ExpressionUnary) Accept(w Walker) error { +func (e *ExpressionUnary) Accept(v AstVisitor) any { + return v.VisitExpressionUnary(e) +} + +func (e *ExpressionUnary) Walk(w AstListener) error { return run( w.EnterExpressionUnary(e), w.ExitExpressionUnary(e), @@ -191,6 +215,8 @@ func (e *ExpressionUnary) ToSQL() string { } type ExpressionBinaryComparison struct { + node + expressionBase Wrapped Left Expression @@ -201,11 +227,15 @@ type ExpressionBinaryComparison struct { // NOTE: type cast only makes sense when wrapped, } -func (e *ExpressionBinaryComparison) Accept(w Walker) error { +func (e *ExpressionBinaryComparison) Accept(v AstVisitor) any { + return v.VisitExpressionBinaryComparison(e) +} + +func (e *ExpressionBinaryComparison) Walk(w AstListener) error { return run( w.EnterExpressionBinaryComparison(e), - accept(w, e.Left), - accept(w, e.Right), + walk(w, e.Left), + walk(w, e.Right), w.ExitExpressionBinaryComparison(e), ) } @@ -229,6 +259,8 @@ func (e *ExpressionBinaryComparison) ToSQL() string { } type ExpressionFunction struct { + node + expressionBase Wrapped Function SQLFunction @@ -238,11 +270,15 @@ type ExpressionFunction struct { TypeCast TypeCastType } -func (e *ExpressionFunction) Accept(w Walker) error { +func (e *ExpressionFunction) Accept(v AstVisitor) any { + return v.VisitExpressionFunction(e) +} + +func (e *ExpressionFunction) Walk(w AstListener) error { return run( w.EnterExpressionFunction(e), - accept(w, e.Function), - acceptMany(w, e.Inputs), + walk(w, e.Function), + walkMany(w, e.Inputs), w.ExitExpressionFunction(e), ) } @@ -263,7 +299,7 @@ func (e *ExpressionFunction) ToSQL() string { } stringToWrite = exprFunc.stringDistinct(e.Inputs...) } else { - stringToWrite = e.Function.String(e.Inputs...) + stringToWrite = e.Function.ToString(e.Inputs...) } stmt.WriteString(stringToWrite) @@ -272,6 +308,8 @@ func (e *ExpressionFunction) ToSQL() string { } type ExpressionList struct { + node + expressionBase Wrapped Expressions []Expression @@ -279,10 +317,14 @@ type ExpressionList struct { TypeCast TypeCastType } -func (e *ExpressionList) Accept(w Walker) error { +func (e *ExpressionList) Accept(v AstVisitor) any { + return v.VisitExpressionList(e) +} + +func (e *ExpressionList) Walk(w AstListener) error { return run( w.EnterExpressionList(e), - acceptMany(w, e.Expressions), + walkMany(w, e.Expressions), w.ExitExpressionList(e), ) } @@ -306,6 +348,8 @@ func (e *ExpressionList) ToSQL() string { } type ExpressionCollate struct { + node + expressionBase Wrapped Expression Expression @@ -315,10 +359,14 @@ type ExpressionCollate struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionCollate) Accept(w Walker) error { +func (e *ExpressionCollate) Accept(v AstVisitor) any { + return v.VisitExpressionCollate(e) +} + +func (e *ExpressionCollate) Walk(w AstListener) error { return run( w.EnterExpressionCollate(e), - accept(w, e.Expression), + walk(w, e.Expression), w.ExitExpressionCollate(e), ) } @@ -348,6 +396,8 @@ func (e *ExpressionCollate) ToSQL() string { } type ExpressionStringCompare struct { + node + expressionBase Wrapped Left Expression @@ -359,12 +409,16 @@ type ExpressionStringCompare struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionStringCompare) Accept(w Walker) error { +func (e *ExpressionStringCompare) Accept(v AstVisitor) any { + return v.VisitExpressionStringCompare(e) +} + +func (e *ExpressionStringCompare) Walk(w AstListener) error { return run( w.EnterExpressionStringCompare(e), - accept(w, e.Left), - accept(w, e.Right), - accept(w, e.Escape), + walk(w, e.Left), + walk(w, e.Right), + walk(w, e.Escape), w.ExitExpressionStringCompare(e), ) } @@ -402,6 +456,8 @@ func (e *ExpressionStringCompare) ToSQL() string { } type ExpressionIs struct { + node + expressionBase Wrapped Left Expression @@ -413,11 +469,11 @@ type ExpressionIs struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionIs) Accept(w Walker) error { +func (e *ExpressionIs) Accept(w AstListener) error { return run( w.EnterExpressionIs(e), - accept(w, e.Left), - accept(w, e.Right), + walk(w, e.Left), + walk(w, e.Right), w.ExitExpressionIs(e), ) } @@ -452,6 +508,8 @@ func (e *ExpressionIs) ToSQL() string { } type ExpressionBetween struct { + node + expressionBase Wrapped Expression Expression @@ -463,12 +521,16 @@ type ExpressionBetween struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionBetween) Accept(w Walker) error { +func (e *ExpressionBetween) Accept(v AstVisitor) any { + return v.VisitExpressionBetween(e) +} + +func (e *ExpressionBetween) Walk(w AstListener) error { return run( w.EnterExpressionBetween(e), - accept(w, e.Expression), - accept(w, e.Left), - accept(w, e.Right), + walk(w, e.Expression), + walk(w, e.Left), + walk(w, e.Right), w.ExitExpressionBetween(e), ) } @@ -507,6 +569,8 @@ func (e *ExpressionBetween) ToSQL() string { } type ExpressionSelect struct { + node + expressionBase Wrapped IsNot bool @@ -517,10 +581,14 @@ type ExpressionSelect struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionSelect) Accept(w Walker) error { +func (e *ExpressionSelect) Accept(v AstVisitor) any { + return v.VisitExpressionSelect(e) +} + +func (e *ExpressionSelect) Walk(w AstListener) error { return run( w.EnterExpressionSelect(e), - accept(w, e.Select), + walk(w, e.Select), w.ExitExpressionSelect(e), ) } @@ -567,6 +635,8 @@ func (e *ExpressionSelect) check() { } type ExpressionCase struct { + node + expressionBase Wrapped CaseExpression Expression @@ -577,24 +647,28 @@ type ExpressionCase struct { // NOTE: type cast does not apply to the whole case expression } -func (e *ExpressionCase) Accept(w Walker) error { +func (e *ExpressionCase) Accept(v AstVisitor) any { + return v.VisitExpressionCase(e) +} + +func (e *ExpressionCase) Walk(w AstListener) error { return run( w.EnterExpressionCase(e), - accept(w, e.CaseExpression), + walk(w, e.CaseExpression), func() error { for _, whenThen := range e.WhenThenPairs { - err := accept(w, whenThen[0]) + err := walk(w, whenThen[0]) if err != nil { return err } - err = accept(w, whenThen[1]) + err = walk(w, whenThen[1]) if err != nil { return err } } return nil }(), - accept(w, e.ElseExpression), + walk(w, e.ElseExpression), w.ExitExpressionCase(e), ) } @@ -632,6 +706,8 @@ func (e *ExpressionCase) ToSQL() string { } type ExpressionArithmetic struct { + node + expressionBase Wrapped Left Expression @@ -642,11 +718,15 @@ type ExpressionArithmetic struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionArithmetic) Accept(w Walker) error { +func (e *ExpressionArithmetic) Accept(v AstVisitor) any { + return v.VisitExpressionArithmetic(e) +} + +func (e *ExpressionArithmetic) Walk(w AstListener) error { return run( w.EnterExpressionArithmetic(e), - accept(w, e.Left), - accept(w, e.Right), + walk(w, e.Left), + walk(w, e.Right), w.ExitExpressionArithmetic(e), ) } diff --git a/parse/sql/tree/expression_test.go b/parse/sql/tree/expression_test.go index 753814090..ca3c3574b 100644 --- a/parse/sql/tree/expression_test.go +++ b/parse/sql/tree/expression_test.go @@ -230,7 +230,7 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { { name: "expression abs function", fields: &tree.ExpressionFunction{ - Function: &tree.FunctionABS, + Function: tree.FunctionABSGetter(nil), Inputs: []tree.Expression{ &tree.ExpressionColumn{ Column: "foo", @@ -255,7 +255,7 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { { name: "expression abs function with multiple inputs", fields: &tree.ExpressionFunction{ - Function: &tree.FunctionABS, + Function: tree.FunctionABSGetter(nil), Inputs: []tree.Expression{ &tree.ExpressionColumn{ Column: "foo", diff --git a/parse/sql/tree/functions.go b/parse/sql/tree/functions.go index 45cdf3623..02b603aaf 100644 --- a/parse/sql/tree/functions.go +++ b/parse/sql/tree/functions.go @@ -17,9 +17,10 @@ type AnySQLFunction struct { // types of functions (like scalar, aggregate, window, etc) are extenstions of sqlFunction; this is an interface to accept any of them type SQLFunction interface { - Accepter + AstWalker + Name() string - String(...Expression) string + ToString(...Expression) string SetDistinct(bool) } @@ -64,7 +65,7 @@ func (s *AnySQLFunction) string(exprs ...Expression) string { }) } -func (s *AnySQLFunction) String(exprs ...Expression) string { +func (s *AnySQLFunction) ToString(exprs ...Expression) string { return s.string(exprs...) } @@ -76,46 +77,80 @@ func (s *AnySQLFunction) stringAll() string { } type ScalarFunction struct { + node + AnySQLFunction } -func (s *ScalarFunction) Accept(w Walker) error { +func (s *ScalarFunction) Accept(v AstVisitor) any { + return v.VisitScalarFunc(s) +} + +func (s *ScalarFunction) Walk(w AstListener) error { return run( w.EnterScalarFunc(s), w.ExitScalarFunc(s), ) } +func NewScalarFunctionWithGetter(name string, min uint8, max uint8, distinct bool) SQLFunctionGetter { + return func(pos *Position) SQLFunction { + return &ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: name, + Min: min, + Max: max, + distinct: distinct, + }, + } + } +} + +// SQLFunctionGetter is a function that returns a SQLFunction given a position +type SQLFunctionGetter func(pos *Position) SQLFunction + var ( - FunctionABS = ScalarFunction{AnySQLFunction{ - FunctionName: "abs", - Min: 1, - Max: 1, - }} - FunctionERROR = ScalarFunction{AnySQLFunction{ - FunctionName: "error", - Min: 1, - Max: 1, - }} - FunctionLENGTH = ScalarFunction{AnySQLFunction{ - FunctionName: "length", - Min: 1, - Max: 1, - }} - FunctionLOWER = ScalarFunction{AnySQLFunction{ - FunctionName: "lower", - Min: 1, - Max: 1, - }} - FunctionUPPER = ScalarFunction{AnySQLFunction{ - FunctionName: "upper", - Min: 1, - Max: 1, - }} - FunctionFORMAT = ScalarFunction{AnySQLFunction{ - FunctionName: "format", - Min: 1, - }} + FunctionABS = ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "abs", + Min: 1, + Max: 1, + }} + FunctionERROR = ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "error", + Min: 1, + Max: 1, + }} + FunctionLENGTH = ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "length", + Min: 1, + Max: 1, + }} + FunctionLOWER = ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "lower", + Min: 1, + Max: 1, + }} + FunctionUPPER = ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "upper", + Min: 1, + Max: 1, + }} + FunctionFORMAT = ScalarFunction{ + AnySQLFunction: AnySQLFunction{ + FunctionName: "format", + Min: 1, + }} + FunctionABSGetter = NewScalarFunctionWithGetter("abs", 1, 1, false) + FunctionFORMATGetter = NewScalarFunctionWithGetter("format", 1, 0, false) + FunctionErrorGetter = NewScalarFunctionWithGetter("error", 1, 1, false) + FunctionLengthGetter = NewScalarFunctionWithGetter("length", 1, 1, false) + FunctionLOWERGetter = NewScalarFunctionWithGetter("lower", 1, 1, false) + FunctionUPPERGetter = NewScalarFunctionWithGetter("upper", 1, 1, false) ) // SQLFunctions is a map of all functions of all types diff --git a/parse/sql/tree/functions_test.go b/parse/sql/tree/functions_test.go index 3bb3fbda0..f9446b321 100644 --- a/parse/sql/tree/functions_test.go +++ b/parse/sql/tree/functions_test.go @@ -100,7 +100,7 @@ func Test_sqlFunction_String(t *testing.T) { } }() } - got := s.String(tt.args.exprs...) + got := s.ToString(tt.args.exprs...) if tt.wantPanic { return } @@ -114,7 +114,7 @@ func Test_sqlFunction_String(t *testing.T) { func Test_ScalarFunction_String(t *testing.T) { type fields struct { - Function tree.ScalarFunction + Function *tree.ScalarFunction } type args struct { exprs []tree.Expression @@ -129,7 +129,7 @@ func Test_ScalarFunction_String(t *testing.T) { { name: "format function", fields: fields{ - Function: tree.FunctionFORMAT, + Function: tree.FunctionFORMATGetter(nil).(*tree.ScalarFunction), }, args: args{ exprs: []tree.Expression{ @@ -155,7 +155,7 @@ func Test_ScalarFunction_String(t *testing.T) { } }() } - got := s.String(tt.args.exprs...) + got := s.ToString(tt.args.exprs...) if tt.wantPanic { return } diff --git a/parse/sql/tree/group-by.go b/parse/sql/tree/group-by.go index e55f61712..a82220b33 100644 --- a/parse/sql/tree/group-by.go +++ b/parse/sql/tree/group-by.go @@ -5,15 +5,21 @@ import ( ) type GroupBy struct { + node + Expressions []Expression Having Expression } -func (g *GroupBy) Accept(w Walker) error { +func (g *GroupBy) Accept(v AstVisitor) any { + return v.VisitGroupBy(g) +} + +func (g *GroupBy) Walk(w AstListener) error { return run( w.EnterGroupBy(g), - acceptMany(w, g.Expressions), - accept(w, g.Having), + walkMany(w, g.Expressions), + walk(w, g.Having), w.ExitGroupBy(g), ) } diff --git a/parse/sql/tree/insert.go b/parse/sql/tree/insert.go index 8bff7457b..b44050275 100644 --- a/parse/sql/tree/insert.go +++ b/parse/sql/tree/insert.go @@ -7,31 +7,26 @@ import ( ) type Insert struct { + node + CTE []*CTE InsertStmt *InsertStmt } -func (ins *Insert) Accept(w Walker) error { +func (ins *Insert) Accept(v AstVisitor) any { + return v.VisitInsert(ins) +} + +func (ins *Insert) Walk(w AstListener) error { return run( w.EnterInsert(ins), - acceptMany(w, ins.CTE), - accept(w, ins.InsertStmt), + walkMany(w, ins.CTE), + walk(w, ins.InsertStmt), w.ExitInsert(ins), ) } -func (ins *Insert) ToSQL() (str string, err error) { - defer func() { - if r := recover(); r != nil { - err2, ok := r.(error) - if !ok { - err2 = fmt.Errorf("%v", r) - } - - err = err2 - } - }() - +func (ins *Insert) ToSQL() string { stmt := sqlwriter.NewWriter() if len(ins.CTE) > 0 { @@ -45,10 +40,12 @@ func (ins *Insert) ToSQL() (str string, err error) { stmt.Token.Semicolon() - return stmt.String(), nil + return stmt.String() } type InsertStmt struct { + node + schema string InsertType InsertType Table string @@ -59,20 +56,24 @@ type InsertStmt struct { ReturningClause *ReturningClause } -func (ins *InsertStmt) Accept(w Walker) error { +func (ins *InsertStmt) Accept(v AstVisitor) any { + return v.VisitInsertStmt(ins) +} + +func (ins *InsertStmt) Walk(w AstListener) error { return run( w.EnterInsertStmt(ins), func() error { for _, v := range ins.Values { - err := acceptMany(w, v) + err := walkMany(w, v) if err != nil { return err } } return nil }(), - accept(w, ins.Upsert), - accept(w, ins.ReturningClause), + walk(w, ins.Upsert), + walk(w, ins.ReturningClause), w.ExitInsertStmt(ins), ) } diff --git a/parse/sql/tree/insert_test.go b/parse/sql/tree/insert_test.go index 56ee1a711..8ddbe68fc 100644 --- a/parse/sql/tree/insert_test.go +++ b/parse/sql/tree/insert_test.go @@ -84,7 +84,7 @@ func TestInsert_ToSQL(t *testing.T) { ins.InsertStmt.SetSchema(tt.fields.Schema) } - gotStr, err := ins.ToSQL() + gotStr, err := tree.SafeToSQL(ins) if (err != nil) != tt.wantErr { t.Errorf("Insert.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/parse/sql/tree/join-clause.go b/parse/sql/tree/join-clause.go index 424f3ad0a..bb0503f7e 100644 --- a/parse/sql/tree/join-clause.go +++ b/parse/sql/tree/join-clause.go @@ -48,15 +48,21 @@ From the SQLite documentation: */ type JoinClause struct { + node + TableOrSubquery TableOrSubquery Joins []*JoinPredicate } -func (j *JoinClause) Accept(w Walker) error { +func (j *JoinClause) Accept(v AstVisitor) any { + return v.VisitJoinClause(j) +} + +func (j *JoinClause) Walk(w AstListener) error { return run( w.EnterJoinClause(j), - accept(w, j.TableOrSubquery), - acceptMany(w, j.Joins), + walk(w, j.TableOrSubquery), + walkMany(w, j.Joins), w.ExitJoinClause(j), ) } @@ -76,17 +82,19 @@ func (j *JoinClause) ToSQL() string { } type JoinPredicate struct { + node + JoinOperator *JoinOperator Table TableOrSubquery Constraint Expression } -func (j *JoinPredicate) Accept(w Walker) error { +func (j *JoinPredicate) Walk(w AstListener) error { return run( w.EnterJoinPredicate(j), - accept(w, j.JoinOperator), - accept(w, j.Table), - accept(w, j.Constraint), + walk(w, j.JoinOperator), + walk(w, j.Table), + walk(w, j.Constraint), w.ExitJoinPredicate(j), ) } @@ -115,11 +123,17 @@ func (j *JoinPredicate) ToSQL() string { } type JoinOperator struct { + node + JoinType JoinType Outer bool } -func (j *JoinOperator) Accept(w Walker) error { +func (j *JoinOperator) Accept(v AstVisitor) any { + return v.VisitJoinOperator(j) +} + +func (j *JoinOperator) Walk(w AstListener) error { return run( w.EnterJoinOperator(j), w.ExitJoinOperator(j), diff --git a/parse/sql/tree/limit.go b/parse/sql/tree/limit.go index c899ea754..8b5c99903 100644 --- a/parse/sql/tree/limit.go +++ b/parse/sql/tree/limit.go @@ -7,16 +7,22 @@ import ( // Limit is a LIMIT clause. // It takes an expression, and can optionally take either an offset or a second expression. type Limit struct { + node + Expression Expression Offset Expression } +func (l *Limit) Accept(v AstVisitor) any { + return v.VisitLimit(l) +} + // Accept implements the Visitor interface. -func (l *Limit) Accept(w Walker) error { +func (l *Limit) Walk(w AstListener) error { return run( w.EnterLimit(l), - accept(w, l.Expression), - accept(w, l.Offset), + walk(w, l.Expression), + walk(w, l.Offset), w.ExitLimit(l), ) } diff --git a/parse/sql/tree/order-by.go b/parse/sql/tree/order-by.go index 1f8dc8d4a..1263eff4c 100644 --- a/parse/sql/tree/order-by.go +++ b/parse/sql/tree/order-by.go @@ -8,13 +8,19 @@ import ( ) type OrderBy struct { + node + OrderingTerms []*OrderingTerm } -func (o *OrderBy) Accept(w Walker) error { +func (o *OrderBy) Accept(v AstVisitor) any { + return v.VisitOrderBy(o) +} + +func (o *OrderBy) Walk(w AstListener) error { return run( w.EnterOrderBy(o), - acceptMany(w, o.OrderingTerms), + walkMany(w, o.OrderingTerms), w.ExitOrderBy(o), ) } @@ -36,15 +42,21 @@ func (o *OrderBy) ToSQL() string { } type OrderingTerm struct { + node + Expression Expression OrderType OrderType NullOrdering NullOrderingType } -func (o *OrderingTerm) Accept(w Walker) error { +func (o *OrderingTerm) Accept(v AstVisitor) any { + return v.VisitOrderingTerm(o) +} + +func (o *OrderingTerm) Walk(w AstListener) error { return run( w.EnterOrderingTerm(o), - accept(w, o.Expression), + walk(w, o.Expression), w.ExitOrderingTerm(o), ) } diff --git a/parse/sql/tree/qualified-table-name.go b/parse/sql/tree/qualified-table-name.go index c763cfc4a..561a0d38a 100644 --- a/parse/sql/tree/qualified-table-name.go +++ b/parse/sql/tree/qualified-table-name.go @@ -3,12 +3,18 @@ package tree import sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" type QualifiedTableName struct { + node + schema string TableName string TableAlias string } -func (q *QualifiedTableName) Accept(w Walker) error { +func (q *QualifiedTableName) Accept(v AstVisitor) any { + return v.VisitQualifiedTableName(q) +} + +func (q *QualifiedTableName) Walk(w AstListener) error { return run( w.EnterQualifiedTableName(q), w.ExitQualifiedTableName(q), diff --git a/parse/sql/tree/result-column.go b/parse/sql/tree/result-column.go index 1a6c64e55..fed4f9b36 100644 --- a/parse/sql/tree/result-column.go +++ b/parse/sql/tree/result-column.go @@ -7,16 +7,22 @@ import ( type ResultColumn interface { resultColumn() ToSQL() string - Accept(w Walker) error + Walk(w AstListener) error } -type ResultColumnStar struct{} +type ResultColumnStar struct { + node +} + +func (r *ResultColumnStar) Accept(v AstVisitor) any { + return v.VisitResultColumnStar(r) +} func (r *ResultColumnStar) resultColumn() {} func (r *ResultColumnStar) ToSQL() string { return "*" } -func (r *ResultColumnStar) Accept(w Walker) error { +func (r *ResultColumnStar) Walk(w AstListener) error { return run( w.EnterResultColumnStar(r), w.ExitResultColumnStar(r), @@ -24,10 +30,16 @@ func (r *ResultColumnStar) Accept(w Walker) error { } type ResultColumnExpression struct { + node + Expression Expression Alias string } +func (r *ResultColumnExpression) Accept(v AstVisitor) any { + return v.VisitResultColumnExpression(r) +} + func (r *ResultColumnExpression) resultColumn() {} func (r *ResultColumnExpression) ToSQL() string { stmt := sqlwriter.NewWriter() @@ -38,18 +50,24 @@ func (r *ResultColumnExpression) ToSQL() string { } return stmt.String() } -func (r *ResultColumnExpression) Accept(w Walker) error { +func (r *ResultColumnExpression) Walk(w AstListener) error { return run( w.EnterResultColumnExpression(r), - accept(w, r.Expression), + walk(w, r.Expression), w.ExitResultColumnExpression(r), ) } type ResultColumnTable struct { + node + TableName string } +func (r *ResultColumnTable) Accept(v AstVisitor) any { + return v.VisitResultColumnTable(r) +} + func (r *ResultColumnTable) resultColumn() {} func (r *ResultColumnTable) ToSQL() string { stmt := sqlwriter.NewWriter() @@ -58,7 +76,7 @@ func (r *ResultColumnTable) ToSQL() string { stmt.Token.Asterisk() return stmt.String() } -func (r *ResultColumnTable) Accept(w Walker) error { +func (r *ResultColumnTable) Walk(w AstListener) error { return run( w.EnterResultColumnTable(r), w.ExitResultColumnTable(r), diff --git a/parse/sql/tree/returning-clause.go b/parse/sql/tree/returning-clause.go index e2e63e5c4..6a4b103a8 100644 --- a/parse/sql/tree/returning-clause.go +++ b/parse/sql/tree/returning-clause.go @@ -5,13 +5,19 @@ import ( ) type ReturningClause struct { + node + Returned []*ReturningClauseColumn } -func (r *ReturningClause) Accept(w Walker) error { +func (r *ReturningClause) Accept(v AstVisitor) any { + return v.VisitReturningClause(r) +} + +func (r *ReturningClause) Walk(w AstListener) error { return run( w.EnterReturningClause(r), - acceptMany(w, r.Returned), + walkMany(w, r.Returned), w.ExitReturningClause(r), ) } @@ -50,15 +56,21 @@ func (r *ReturningClause) check() { } type ReturningClauseColumn struct { + node + All bool Expression Expression Alias string } -func (r *ReturningClauseColumn) Accept(w Walker) error { +func (r *ReturningClauseColumn) Accept(v AstVisitor) any { + return v.VisitReturningClauseColumn(r) +} + +func (r *ReturningClauseColumn) Walk(w AstListener) error { return run( w.EnterReturningClauseColumn(r), - accept(w, r.Expression), + walk(w, r.Expression), w.ExitReturningClauseColumn(r), ) } diff --git a/parse/sql/tree/select.go b/parse/sql/tree/select.go index 4e67f7e22..6a555371d 100644 --- a/parse/sql/tree/select.go +++ b/parse/sql/tree/select.go @@ -7,31 +7,26 @@ import ( ) type Select struct { + node + CTE []*CTE SelectStmt *SelectStmt } -func (s *Select) Accept(w Walker) error { +func (s *Select) Accept(v AstVisitor) any { + return v.VisitSelect(s) +} + +func (s *Select) Walk(w AstListener) error { return run( w.EnterSelect(s), - acceptMany(w, s.CTE), - accept(w, s.SelectStmt), + walkMany(w, s.CTE), + walk(w, s.SelectStmt), w.ExitSelect(s), ) } -func (s *Select) ToSQL() (str string, err error) { - defer func() { - if r := recover(); r != nil { - err2, ok := r.(error) - if !ok { - err2 = fmt.Errorf("%v", r) - } - - err = err2 - } - }() - +func (s *Select) ToSQL() string { stmt := sqlwriter.NewWriter() if len(s.CTE) > 0 { @@ -45,21 +40,27 @@ func (s *Select) ToSQL() (str string, err error) { stmt.Token.Semicolon() - return stmt.String(), nil + return stmt.String() } type SelectStmt struct { + node + SelectCores []*SelectCore OrderBy *OrderBy Limit *Limit } -func (s *SelectStmt) Accept(w Walker) error { +func (s *SelectStmt) Accept(v AstVisitor) any { + return v.VisitSelectStmt(s) +} + +func (s *SelectStmt) Walk(w AstListener) error { return run( w.EnterSelectStmt(s), - acceptMany(w, s.SelectCores), - accept(w, s.OrderBy), - accept(w, s.Limit), + walkMany(w, s.SelectCores), + walk(w, s.OrderBy), + walk(w, s.Limit), w.ExitSelectStmt(s), ) } @@ -80,6 +81,8 @@ func (s *SelectStmt) ToSQL() (res string) { } type SelectCore struct { + node + SelectType SelectType Columns []ResultColumn From *FromClause @@ -88,14 +91,18 @@ type SelectCore struct { Compound *CompoundOperator } -func (s *SelectCore) Accept(w Walker) error { +func (s *SelectCore) Accept(v AstVisitor) any { + return v.VisitSelectCore(s) +} + +func (s *SelectCore) Walk(w AstListener) error { return run( w.EnterSelectCore(s), - acceptMany(w, s.Columns), - accept(w, s.From), - accept(w, s.Where), - accept(w, s.GroupBy), - accept(w, s.Compound), + walkMany(w, s.Columns), + walk(w, s.From), + walk(w, s.Where), + walk(w, s.GroupBy), + walk(w, s.Compound), w.ExitSelectCore(s), ) } @@ -153,13 +160,19 @@ func (s SelectType) Valid() error { } type FromClause struct { - JoinClause *JoinClause + node + + JoinClause *JoinClause // the relation +} + +func (f *FromClause) Accept(v AstVisitor) any { + return v.VisitFromClause(f) } -func (f *FromClause) Accept(w Walker) error { +func (f *FromClause) Walk(w AstListener) error { return run( w.EnterFromClause(f), - accept(w, f.JoinClause), + walk(w, f.JoinClause), w.ExitFromClause(f), ) } @@ -205,10 +218,20 @@ func (c *CompoundOperatorType) ToSQL() string { } type CompoundOperator struct { + node + Operator CompoundOperatorType } -func (c *CompoundOperator) Accept(w Walker) error { +func (c *CompoundOperator) Accept(v AstVisitor) any { + return v.VisitCompoundOperator(c) +} + +func (c *CompoundOperator) AcceptVisitor(v AstVisitor) any { + return v.VisitCompoundOperator(c) +} + +func (c *CompoundOperator) Walk(w AstListener) error { return run( w.EnterCompoundOperator(c), w.ExitCompoundOperator(c), diff --git a/parse/sql/tree/select_test.go b/parse/sql/tree/select_test.go index 6efe6acb6..fdc174f52 100644 --- a/parse/sql/tree/select_test.go +++ b/parse/sql/tree/select_test.go @@ -79,7 +79,7 @@ func TestSelect_ToSQL(t *testing.T) { CTE: tt.fields.CTE, SelectStmt: tt.fields.SelectStmt, } - gotStr, err := s.ToSQL() + gotStr, err := tree.SafeToSQL(s) if (err != nil) != tt.wantErr { t.Errorf("Select.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/parse/sql/tree/table-or-subquery.go b/parse/sql/tree/table-or-subquery.go index a0814913c..c803bad09 100644 --- a/parse/sql/tree/table-or-subquery.go +++ b/parse/sql/tree/table-or-subquery.go @@ -11,16 +11,22 @@ import ( type TableOrSubquery interface { ToSQL() string tableOrSubquery() - Accept(w Walker) error + Walk(w AstListener) error } type TableOrSubqueryTable struct { + node + schema string Name string Alias string } -func (t *TableOrSubqueryTable) Accept(w Walker) error { +func (t *TableOrSubqueryTable) Accept(v AstVisitor) any { + return v.VisitTableOrSubqueryTable(t) +} + +func (t *TableOrSubqueryTable) Walk(w AstListener) error { return run( w.EnterTableOrSubqueryTable(t), w.ExitTableOrSubqueryTable(t), @@ -62,14 +68,20 @@ func (t *TableOrSubqueryTable) SetSchema(schema string) { } type TableOrSubquerySelect struct { + node + Select *SelectStmt Alias string } -func (t *TableOrSubquerySelect) Accept(w Walker) error { +func (t *TableOrSubquerySelect) Accept(v AstVisitor) any { + return v.VisitTableOrSubquerySelect(t) +} + +func (t *TableOrSubquerySelect) Walk(w AstListener) error { return run( w.EnterTableOrSubquerySelect(t), - accept(w, t.Select), + walk(w, t.Select), w.ExitTableOrSubquerySelect(t), ) } @@ -97,13 +109,19 @@ func (t *TableOrSubquerySelect) ToSQL() string { func (t *TableOrSubquerySelect) tableOrSubquery() {} type TableOrSubqueryList struct { + node + TableOrSubqueries []TableOrSubquery } -func (t *TableOrSubqueryList) Accept(w Walker) error { +func (t *TableOrSubqueryList) Accept(v AstVisitor) any { + return v.VisitTableOrSubqueryList(t) +} + +func (t *TableOrSubqueryList) Walk(w AstListener) error { return run( w.EnterTableOrSubqueryList(t), - acceptMany(w, t.TableOrSubqueries), + walkMany(w, t.TableOrSubqueries), w.ExitTableOrSubqueryList(t), ) } @@ -124,13 +142,19 @@ func (t *TableOrSubqueryList) ToSQL() string { func (t *TableOrSubqueryList) tableOrSubquery() {} type TableOrSubqueryJoin struct { + node + JoinClause *JoinClause } -func (t *TableOrSubqueryJoin) Accept(w Walker) error { +func (t *TableOrSubqueryJoin) Accept(v AstVisitor) any { + return v.VisitTableOrSubqueryJoin(t) +} + +func (t *TableOrSubqueryJoin) Walk(w AstListener) error { return run( w.EnterTableOrSubqueryJoin(t), - accept(w, t.JoinClause), + walk(w, t.JoinClause), w.ExitTableOrSubqueryJoin(t), ) } diff --git a/parse/sql/tree/update-set-clause.go b/parse/sql/tree/update-set-clause.go index 05f174a62..7280e6478 100644 --- a/parse/sql/tree/update-set-clause.go +++ b/parse/sql/tree/update-set-clause.go @@ -8,14 +8,20 @@ import ( // This does NOT include the SET keyword. // e.g. column1 = expression, column2 = expression, ... type UpdateSetClause struct { + node + Columns []string Expression Expression } -func (u *UpdateSetClause) Accept(w Walker) error { +func (u *UpdateSetClause) Accept(v AstVisitor) any { + return v.VisitUpdateSetClause(u) +} + +func (u *UpdateSetClause) Walk(w AstListener) error { return run( w.EnterUpdateSetClause(u), - accept(w, u.Expression), + walk(w, u.Expression), w.ExitUpdateSetClause(u), ) } diff --git a/parse/sql/tree/update.go b/parse/sql/tree/update.go index 14eae6cb2..37909b43a 100644 --- a/parse/sql/tree/update.go +++ b/parse/sql/tree/update.go @@ -1,38 +1,31 @@ package tree import ( - "fmt" - sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) // Update Statement with CTEs type Update struct { + node + CTE []*CTE UpdateStmt *UpdateStmt } -func (u *Update) Accept(w Walker) error { +func (u *Update) Accept(v AstVisitor) any { + return v.VisitUpdate(u) +} + +func (u *Update) Walk(w AstListener) error { return run( w.EnterUpdate(u), - acceptMany(w, u.CTE), - accept(w, u.UpdateStmt), + walkMany(w, u.CTE), + walk(w, u.UpdateStmt), w.ExitUpdate(u), ) } -func (u *Update) ToSQL() (str string, err error) { - defer func() { - if r := recover(); r != nil { - err2, ok := r.(error) - if !ok { - err2 = fmt.Errorf("%v", r) - } - - err = err2 - } - }() - +func (u *Update) ToSQL() string { stmt := sqlwriter.NewWriter() if len(u.CTE) > 0 { @@ -46,12 +39,14 @@ func (u *Update) ToSQL() (str string, err error) { stmt.Token.Semicolon() - return stmt.String(), nil + return stmt.String() } // UpdateStmt is a statement that represents an UPDATE statement. // USE Update INSTEAD OF THIS type UpdateStmt struct { + node + QualifiedTableName *QualifiedTableName UpdateSetClause []*UpdateSetClause From *FromClause @@ -59,14 +54,18 @@ type UpdateStmt struct { Returning *ReturningClause } -func (u *UpdateStmt) Accept(w Walker) error { +func (u *UpdateStmt) Accept(v AstVisitor) any { + return v.VisitUpdateStmt(u) +} + +func (u *UpdateStmt) Walk(w AstListener) error { return run( w.EnterUpdateStmt(u), - accept(w, u.QualifiedTableName), - acceptMany(w, u.UpdateSetClause), - accept(w, u.From), - accept(w, u.Where), - accept(w, u.Returning), + walk(w, u.QualifiedTableName), + walkMany(w, u.UpdateSetClause), + walk(w, u.From), + walk(w, u.Where), + walk(w, u.Returning), w.ExitUpdateStmt(u), ) } diff --git a/parse/sql/tree/update_test.go b/parse/sql/tree/update_test.go index b85950b76..18117d272 100644 --- a/parse/sql/tree/update_test.go +++ b/parse/sql/tree/update_test.go @@ -83,7 +83,7 @@ func TestUpdate_ToSQL(t *testing.T) { CTE: tt.fields.CTE, UpdateStmt: tt.fields.Statement, } - gotStr, err := u.ToSQL() + gotStr, err := tree.SafeToSQL(u) if (err != nil) != tt.wantErr { t.Errorf("Update.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/parse/sql/tree/upsert.go b/parse/sql/tree/upsert.go index 939e83912..e6b87c656 100644 --- a/parse/sql/tree/upsert.go +++ b/parse/sql/tree/upsert.go @@ -23,18 +23,24 @@ func (u UpsertType) Valid() error { } type Upsert struct { + node + ConflictTarget *ConflictTarget Type UpsertType Updates []*UpdateSetClause Where Expression } -func (u *Upsert) Accept(w Walker) error { +func (u *Upsert) Accept(v AstVisitor) any { + return v.VisitUpsert(u) +} + +func (u *Upsert) Walk(w AstListener) error { return run( w.EnterUpsert(u), - accept(w, u.ConflictTarget), - acceptMany(w, u.Updates), - accept(w, u.Where), + walk(w, u.ConflictTarget), + walkMany(w, u.Updates), + walk(w, u.Where), w.ExitUpsert(u), ) } diff --git a/parse/sql/tree/utils.go b/parse/sql/tree/utils.go new file mode 100644 index 000000000..38537f92c --- /dev/null +++ b/parse/sql/tree/utils.go @@ -0,0 +1,18 @@ +package tree + +import "fmt" + +func SafeToSQL(node AstNode) (str string, err error) { + defer func() { + if r := recover(); r != nil { + err2, ok := r.(error) + if !ok { + err2 = fmt.Errorf("%v", r) + } + + err = err2 + } + }() + + return node.ToSQL(), nil +} diff --git a/parse/sql/tree/walker.go b/parse/sql/tree/walker.go index bad6f5f86..af71c1161 100644 --- a/parse/sql/tree/walker.go +++ b/parse/sql/tree/walker.go @@ -9,8 +9,10 @@ func run(errs ...error) error { return errors.Join(errs...) } -type Accepter interface { - Accept(Walker) error +// AstWalker represents an AST node that can be walked. +type AstWalker interface { + // Walk walks through itself using AstListener. + Walk(AstListener) error } func isNil(input interface{}) bool { @@ -26,17 +28,17 @@ func isNil(input interface{}) bool { } } -func accept(v Walker, a Accepter) error { +func walk(v AstListener, a AstWalker) error { if isNil(a) { return nil } - return a.Accept(v) + return a.Walk(v) } -func acceptMany[T Accepter](v Walker, as []T) error { +func walkMany[T AstWalker](v AstListener, as []T) error { for _, a := range as { - err := accept(v, a) + err := walk(v, a) if err != nil { return err } @@ -44,1369 +46,3 @@ func acceptMany[T Accepter](v Walker, as []T) error { return nil } - -type Walker interface { - EnterAggregateFunc(*AggregateFunc) error - ExitAggregateFunc(*AggregateFunc) error - EnterConflictTarget(*ConflictTarget) error - ExitConflictTarget(*ConflictTarget) error - EnterCTE(*CTE) error - ExitCTE(*CTE) error - EnterDelete(*Delete) error - ExitDelete(*Delete) error - EnterDeleteStmt(*DeleteStmt) error - ExitDeleteStmt(*DeleteStmt) error - EnterExpressionLiteral(*ExpressionLiteral) error - ExitExpressionLiteral(*ExpressionLiteral) error - EnterExpressionBindParameter(*ExpressionBindParameter) error - ExitExpressionBindParameter(*ExpressionBindParameter) error - EnterExpressionColumn(*ExpressionColumn) error - ExitExpressionColumn(*ExpressionColumn) error - EnterExpressionUnary(*ExpressionUnary) error - ExitExpressionUnary(*ExpressionUnary) error - EnterExpressionBinaryComparison(*ExpressionBinaryComparison) error - ExitExpressionBinaryComparison(*ExpressionBinaryComparison) error - EnterExpressionFunction(*ExpressionFunction) error - ExitExpressionFunction(*ExpressionFunction) error - EnterExpressionList(*ExpressionList) error - ExitExpressionList(*ExpressionList) error - EnterExpressionCollate(*ExpressionCollate) error - ExitExpressionCollate(*ExpressionCollate) error - EnterExpressionStringCompare(*ExpressionStringCompare) error - ExitExpressionStringCompare(*ExpressionStringCompare) error - EnterExpressionIs(*ExpressionIs) error - ExitExpressionIs(*ExpressionIs) error - EnterExpressionBetween(*ExpressionBetween) error - ExitExpressionBetween(*ExpressionBetween) error - EnterExpressionSelect(*ExpressionSelect) error - ExitExpressionSelect(*ExpressionSelect) error - EnterExpressionCase(*ExpressionCase) error - ExitExpressionCase(*ExpressionCase) error - EnterExpressionArithmetic(*ExpressionArithmetic) error - ExitExpressionArithmetic(*ExpressionArithmetic) error - EnterScalarFunc(*ScalarFunction) error - ExitScalarFunc(*ScalarFunction) error - EnterGroupBy(*GroupBy) error - ExitGroupBy(*GroupBy) error - EnterInsert(*Insert) error - ExitInsert(*Insert) error - EnterInsertStmt(*InsertStmt) error - ExitInsertStmt(*InsertStmt) error - EnterJoinClause(*JoinClause) error - ExitJoinClause(*JoinClause) error - EnterJoinPredicate(*JoinPredicate) error - ExitJoinPredicate(*JoinPredicate) error - EnterJoinOperator(*JoinOperator) error - ExitJoinOperator(*JoinOperator) error - EnterLimit(*Limit) error - ExitLimit(*Limit) error - EnterOrderBy(*OrderBy) error - ExitOrderBy(*OrderBy) error - EnterOrderingTerm(*OrderingTerm) error - ExitOrderingTerm(*OrderingTerm) error - EnterQualifiedTableName(*QualifiedTableName) error - ExitQualifiedTableName(*QualifiedTableName) error - EnterResultColumnStar(*ResultColumnStar) error - ExitResultColumnStar(*ResultColumnStar) error - EnterResultColumnExpression(*ResultColumnExpression) error - ExitResultColumnExpression(*ResultColumnExpression) error - EnterResultColumnTable(*ResultColumnTable) error - ExitResultColumnTable(*ResultColumnTable) error - EnterReturningClause(*ReturningClause) error - ExitReturningClause(*ReturningClause) error - EnterReturningClauseColumn(*ReturningClauseColumn) error - ExitReturningClauseColumn(*ReturningClauseColumn) error - EnterSelect(*Select) error - ExitSelect(*Select) error - EnterSelectCore(*SelectCore) error - ExitSelectCore(*SelectCore) error - EnterSelectStmt(*SelectStmt) error - ExitSelectStmt(*SelectStmt) error - EnterFromClause(*FromClause) error - ExitFromClause(*FromClause) error - EnterCompoundOperator(*CompoundOperator) error - ExitCompoundOperator(*CompoundOperator) error - EnterTableOrSubqueryTable(*TableOrSubqueryTable) error - ExitTableOrSubqueryTable(*TableOrSubqueryTable) error - EnterTableOrSubquerySelect(*TableOrSubquerySelect) error - ExitTableOrSubquerySelect(*TableOrSubquerySelect) error - EnterTableOrSubqueryList(*TableOrSubqueryList) error - ExitTableOrSubqueryList(*TableOrSubqueryList) error - EnterTableOrSubqueryJoin(*TableOrSubqueryJoin) error - ExitTableOrSubqueryJoin(*TableOrSubqueryJoin) error - EnterUpdateSetClause(*UpdateSetClause) error - ExitUpdateSetClause(*UpdateSetClause) error - EnterUpdate(*Update) error - ExitUpdate(*Update) error - EnterUpdateStmt(*UpdateStmt) error - ExitUpdateStmt(*UpdateStmt) error - EnterUpsert(*Upsert) error - ExitUpsert(*Upsert) error -} - -type BaseWalker struct{} - -var _ Walker = &BaseWalker{} - -func NewBaseWalker() Walker { - return &BaseWalker{} -} - -func (b *BaseWalker) EnterAggregateFunc(p0 *AggregateFunc) error { - return nil -} - -func (b *BaseWalker) ExitAggregateFunc(p0 *AggregateFunc) error { - return nil -} - -func (b *BaseWalker) EnterCTE(p0 *CTE) error { - return nil -} - -func (b *BaseWalker) ExitCTE(p0 *CTE) error { - return nil -} - -func (b *BaseWalker) EnterCompoundOperator(p0 *CompoundOperator) error { - return nil -} - -func (b *BaseWalker) ExitCompoundOperator(p0 *CompoundOperator) error { - return nil -} - -func (b *BaseWalker) EnterConflictTarget(p0 *ConflictTarget) error { - return nil -} - -func (b *BaseWalker) ExitConflictTarget(p0 *ConflictTarget) error { - return nil -} - -func (b *BaseWalker) EnterDelete(p0 *Delete) error { - return nil -} - -func (b *BaseWalker) ExitDelete(p0 *Delete) error { - return nil -} - -func (b *BaseWalker) EnterDeleteStmt(p0 *DeleteStmt) error { - return nil -} - -func (b *BaseWalker) ExitDeleteStmt(p0 *DeleteStmt) error { - return nil -} - -func (b *BaseWalker) EnterExpressionArithmetic(p0 *ExpressionArithmetic) error { - return nil -} - -func (b *BaseWalker) ExitExpressionArithmetic(p0 *ExpressionArithmetic) error { - return nil -} - -func (b *BaseWalker) EnterExpressionBetween(p0 *ExpressionBetween) error { - return nil -} - -func (b *BaseWalker) ExitExpressionBetween(p0 *ExpressionBetween) error { - return nil -} - -func (b *BaseWalker) EnterExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { - return nil -} - -func (b *BaseWalker) ExitExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { - return nil -} - -func (b *BaseWalker) EnterExpressionBindParameter(p0 *ExpressionBindParameter) error { - return nil -} - -func (b *BaseWalker) ExitExpressionBindParameter(p0 *ExpressionBindParameter) error { - return nil -} - -func (b *BaseWalker) EnterExpressionCase(p0 *ExpressionCase) error { - return nil -} - -func (b *BaseWalker) ExitExpressionCase(p0 *ExpressionCase) error { - return nil -} - -func (b *BaseWalker) EnterExpressionCollate(p0 *ExpressionCollate) error { - return nil -} - -func (b *BaseWalker) ExitExpressionCollate(p0 *ExpressionCollate) error { - return nil -} - -func (b *BaseWalker) EnterExpressionColumn(p0 *ExpressionColumn) error { - return nil -} - -func (b *BaseWalker) ExitExpressionColumn(p0 *ExpressionColumn) error { - return nil -} - -func (b *BaseWalker) EnterExpressionFunction(p0 *ExpressionFunction) error { - return nil -} - -func (b *BaseWalker) ExitExpressionFunction(p0 *ExpressionFunction) error { - return nil -} - -func (b *BaseWalker) EnterExpressionIs(p0 *ExpressionIs) error { - return nil -} - -func (b *BaseWalker) ExitExpressionIs(p0 *ExpressionIs) error { - return nil -} - -func (b *BaseWalker) EnterExpressionList(p0 *ExpressionList) error { - return nil -} - -func (b *BaseWalker) ExitExpressionList(p0 *ExpressionList) error { - return nil -} - -func (b *BaseWalker) EnterExpressionLiteral(p0 *ExpressionLiteral) error { - return nil -} - -func (b *BaseWalker) ExitExpressionLiteral(p0 *ExpressionLiteral) error { - return nil -} - -func (b *BaseWalker) EnterExpressionSelect(p0 *ExpressionSelect) error { - return nil -} - -func (b *BaseWalker) ExitExpressionSelect(p0 *ExpressionSelect) error { - return nil -} - -func (b *BaseWalker) EnterExpressionStringCompare(p0 *ExpressionStringCompare) error { - return nil -} - -func (b *BaseWalker) ExitExpressionStringCompare(p0 *ExpressionStringCompare) error { - return nil -} - -func (b *BaseWalker) EnterExpressionUnary(p0 *ExpressionUnary) error { - return nil -} - -func (b *BaseWalker) ExitExpressionUnary(p0 *ExpressionUnary) error { - return nil -} - -func (b *BaseWalker) EnterFromClause(p0 *FromClause) error { - return nil -} - -func (b *BaseWalker) ExitFromClause(p0 *FromClause) error { - return nil -} - -func (b *BaseWalker) EnterGroupBy(p0 *GroupBy) error { - return nil -} - -func (b *BaseWalker) ExitGroupBy(p0 *GroupBy) error { - return nil -} - -func (b *BaseWalker) EnterInsert(p0 *Insert) error { - return nil -} - -func (b *BaseWalker) ExitInsert(p0 *Insert) error { - return nil -} - -func (b *BaseWalker) EnterInsertStmt(p0 *InsertStmt) error { - return nil -} - -func (b *BaseWalker) ExitInsertStmt(p0 *InsertStmt) error { - return nil -} - -func (b *BaseWalker) EnterJoinClause(p0 *JoinClause) error { - return nil -} - -func (b *BaseWalker) ExitJoinClause(p0 *JoinClause) error { - return nil -} - -func (b *BaseWalker) EnterJoinOperator(p0 *JoinOperator) error { - return nil -} - -func (b *BaseWalker) ExitJoinOperator(p0 *JoinOperator) error { - return nil -} - -func (b *BaseWalker) EnterJoinPredicate(p0 *JoinPredicate) error { - return nil -} - -func (b *BaseWalker) ExitJoinPredicate(p0 *JoinPredicate) error { - return nil -} - -func (b *BaseWalker) EnterLimit(p0 *Limit) error { - return nil -} - -func (b *BaseWalker) ExitLimit(p0 *Limit) error { - return nil -} - -func (b *BaseWalker) EnterOrderBy(p0 *OrderBy) error { - return nil -} - -func (b *BaseWalker) ExitOrderBy(p0 *OrderBy) error { - return nil -} - -func (b *BaseWalker) EnterOrderingTerm(p0 *OrderingTerm) error { - return nil -} - -func (b *BaseWalker) ExitOrderingTerm(p0 *OrderingTerm) error { - return nil -} - -func (b *BaseWalker) EnterQualifiedTableName(p0 *QualifiedTableName) error { - return nil -} - -func (b *BaseWalker) ExitQualifiedTableName(p0 *QualifiedTableName) error { - return nil -} - -func (b *BaseWalker) EnterResultColumnExpression(p0 *ResultColumnExpression) error { - return nil -} - -func (b *BaseWalker) ExitResultColumnExpression(p0 *ResultColumnExpression) error { - return nil -} - -func (b *BaseWalker) EnterResultColumnStar(p0 *ResultColumnStar) error { - return nil -} - -func (b *BaseWalker) ExitResultColumnStar(p0 *ResultColumnStar) error { - return nil -} - -func (b *BaseWalker) EnterResultColumnTable(p0 *ResultColumnTable) error { - return nil -} - -func (b *BaseWalker) ExitResultColumnTable(p0 *ResultColumnTable) error { - return nil -} - -func (b *BaseWalker) EnterReturningClause(p0 *ReturningClause) error { - return nil -} - -func (b *BaseWalker) ExitReturningClause(p0 *ReturningClause) error { - return nil -} - -func (b *BaseWalker) EnterReturningClauseColumn(p0 *ReturningClauseColumn) error { - return nil -} - -func (b *BaseWalker) ExitReturningClauseColumn(p0 *ReturningClauseColumn) error { - return nil -} - -func (b *BaseWalker) EnterScalarFunc(p0 *ScalarFunction) error { - return nil -} - -func (b *BaseWalker) ExitScalarFunc(p0 *ScalarFunction) error { - return nil -} - -func (b *BaseWalker) EnterSelect(p0 *Select) error { - return nil -} - -func (b *BaseWalker) ExitSelect(p0 *Select) error { - return nil -} - -func (b *BaseWalker) EnterSelectCore(p0 *SelectCore) error { - return nil -} - -func (b *BaseWalker) ExitSelectCore(p0 *SelectCore) error { - return nil -} - -func (b *BaseWalker) EnterSelectStmt(p0 *SelectStmt) error { - return nil -} - -func (b *BaseWalker) ExitSelectStmt(p0 *SelectStmt) error { - return nil -} - -func (b *BaseWalker) EnterTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { - return nil -} - -func (b *BaseWalker) ExitTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { - return nil -} - -func (b *BaseWalker) EnterTableOrSubqueryList(p0 *TableOrSubqueryList) error { - return nil -} - -func (b *BaseWalker) ExitTableOrSubqueryList(p0 *TableOrSubqueryList) error { - return nil -} - -func (b *BaseWalker) EnterTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { - return nil -} - -func (b *BaseWalker) ExitTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { - return nil -} - -func (b *BaseWalker) EnterTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { - return nil -} - -func (b *BaseWalker) ExitTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { - return nil -} - -func (b *BaseWalker) EnterUpdate(p0 *Update) error { - return nil -} - -func (b *BaseWalker) ExitUpdate(p0 *Update) error { - return nil -} - -func (b *BaseWalker) EnterUpdateSetClause(p0 *UpdateSetClause) error { - return nil -} - -func (b *BaseWalker) ExitUpdateSetClause(p0 *UpdateSetClause) error { - return nil -} - -func (b *BaseWalker) EnterUpdateStmt(p0 *UpdateStmt) error { - return nil -} - -func (b *BaseWalker) ExitUpdateStmt(p0 *UpdateStmt) error { - return nil -} - -func (b *BaseWalker) EnterUpsert(p0 *Upsert) error { - return nil -} - -func (b *BaseWalker) ExitUpsert(p0 *Upsert) error { - return nil -} - -type BaseAccepter struct{} - -// ImplementedWalker implements the Walker interface. -// Unlike BaseWalker, it holds the methods to be implemented -// as functions in a struct. This makes it easier to implement -// for small, one-off walkers. -type ImplementedWalker struct { - FuncEnterAggregateFunc func(p0 *AggregateFunc) error - FuncExitAggregateFunc func(p0 *AggregateFunc) error - FuncEnterCTE func(p0 *CTE) error - FuncExitCTE func(p0 *CTE) error - FuncEnterCompoundOperator func(p0 *CompoundOperator) error - FuncExitCompoundOperator func(p0 *CompoundOperator) error - FuncEnterConflictTarget func(p0 *ConflictTarget) error - FuncExitConflictTarget func(p0 *ConflictTarget) error - FuncEnterDelete func(p0 *Delete) error - FuncExitDelete func(p0 *Delete) error - FuncEnterDeleteStmt func(p0 *DeleteStmt) error - FuncExitDeleteStmt func(p0 *DeleteStmt) error - FuncEnterExpressionArithmetic func(p0 *ExpressionArithmetic) error - FuncExitExpressionArithmetic func(p0 *ExpressionArithmetic) error - FuncEnterExpressionBetween func(p0 *ExpressionBetween) error - FuncExitExpressionBetween func(p0 *ExpressionBetween) error - FuncEnterExpressionBinaryComparison func(p0 *ExpressionBinaryComparison) error - FuncExitExpressionBinaryComparison func(p0 *ExpressionBinaryComparison) error - FuncEnterExpressionBindParameter func(p0 *ExpressionBindParameter) error - FuncExitExpressionBindParameter func(p0 *ExpressionBindParameter) error - FuncEnterExpressionCase func(p0 *ExpressionCase) error - FuncExitExpressionCase func(p0 *ExpressionCase) error - FuncEnterExpressionCollate func(p0 *ExpressionCollate) error - FuncExitExpressionCollate func(p0 *ExpressionCollate) error - FuncEnterExpressionColumn func(p0 *ExpressionColumn) error - FuncExitExpressionColumn func(p0 *ExpressionColumn) error - FuncEnterExpressionFunction func(p0 *ExpressionFunction) error - FuncExitExpressionFunction func(p0 *ExpressionFunction) error - FuncEnterExpressionIs func(p0 *ExpressionIs) error - FuncExitExpressionIs func(p0 *ExpressionIs) error - FuncEnterExpressionList func(p0 *ExpressionList) error - FuncExitExpressionList func(p0 *ExpressionList) error - FuncEnterExpressionLiteral func(p0 *ExpressionLiteral) error - FuncExitExpressionLiteral func(p0 *ExpressionLiteral) error - FuncEnterExpressionSelect func(p0 *ExpressionSelect) error - FuncExitExpressionSelect func(p0 *ExpressionSelect) error - FuncEnterExpressionStringCompare func(p0 *ExpressionStringCompare) error - FuncExitExpressionStringCompare func(p0 *ExpressionStringCompare) error - FuncEnterExpressionUnary func(p0 *ExpressionUnary) error - FuncExitExpressionUnary func(p0 *ExpressionUnary) error - FuncEnterFromClause func(p0 *FromClause) error - FuncExitFromClause func(p0 *FromClause) error - FuncEnterGroupBy func(p0 *GroupBy) error - FuncExitGroupBy func(p0 *GroupBy) error - FuncEnterInsert func(p0 *Insert) error - FuncExitInsert func(p0 *Insert) error - FuncEnterInsertStmt func(p0 *InsertStmt) error - FuncExitInsertStmt func(p0 *InsertStmt) error - FuncEnterJoinClause func(p0 *JoinClause) error - FuncExitJoinClause func(p0 *JoinClause) error - FuncEnterJoinOperator func(p0 *JoinOperator) error - FuncExitJoinOperator func(p0 *JoinOperator) error - FuncEnterJoinPredicate func(p0 *JoinPredicate) error - FuncExitJoinPredicate func(p0 *JoinPredicate) error - FuncEnterLimit func(p0 *Limit) error - FuncExitLimit func(p0 *Limit) error - FuncEnterOrderBy func(p0 *OrderBy) error - FuncExitOrderBy func(p0 *OrderBy) error - FuncEnterOrderingTerm func(p0 *OrderingTerm) error - FuncExitOrderingTerm func(p0 *OrderingTerm) error - FuncEnterQualifiedTableName func(p0 *QualifiedTableName) error - FuncExitQualifiedTableName func(p0 *QualifiedTableName) error - FuncEnterResultColumnExpression func(p0 *ResultColumnExpression) error - FuncExitResultColumnExpression func(p0 *ResultColumnExpression) error - FuncEnterResultColumnStar func(p0 *ResultColumnStar) error - FuncExitResultColumnStar func(p0 *ResultColumnStar) error - FuncEnterResultColumnTable func(p0 *ResultColumnTable) error - FuncExitResultColumnTable func(p0 *ResultColumnTable) error - FuncEnterReturningClause func(p0 *ReturningClause) error - FuncExitReturningClause func(p0 *ReturningClause) error - FuncEnterReturningClauseColumn func(p0 *ReturningClauseColumn) error - FuncExitReturningClauseColumn func(p0 *ReturningClauseColumn) error - FuncEnterScalarFunc func(p0 *ScalarFunction) error - FuncExitScalarFunc func(p0 *ScalarFunction) error - FuncEnterSelect func(p0 *Select) error - FuncExitSelect func(p0 *Select) error - FuncEnterSelectCore func(p0 *SelectCore) error - FuncExitSelectCore func(p0 *SelectCore) error - FuncEnterSelectStmt func(p0 *SelectStmt) error - FuncExitSelectStmt func(p0 *SelectStmt) error - FuncEnterTableOrSubqueryJoin func(p0 *TableOrSubqueryJoin) error - FuncExitTableOrSubqueryJoin func(p0 *TableOrSubqueryJoin) error - FuncEnterTableOrSubqueryList func(p0 *TableOrSubqueryList) error - FuncExitTableOrSubqueryList func(p0 *TableOrSubqueryList) error - FuncEnterTableOrSubquerySelect func(p0 *TableOrSubquerySelect) error - FuncExitTableOrSubquerySelect func(p0 *TableOrSubquerySelect) error - FuncEnterTableOrSubqueryTable func(p0 *TableOrSubqueryTable) error - FuncExitTableOrSubqueryTable func(p0 *TableOrSubqueryTable) error - FuncEnterUpdate func(p0 *Update) error - FuncExitUpdate func(p0 *Update) error - FuncEnterUpdateSetClause func(p0 *UpdateSetClause) error - FuncExitUpdateSetClause func(p0 *UpdateSetClause) error - FuncEnterUpdateStmt func(p0 *UpdateStmt) error - FuncExitUpdateStmt func(p0 *UpdateStmt) error - FuncEnterUpsert func(p0 *Upsert) error - FuncExitUpsert func(p0 *Upsert) error -} - -var _ Walker = &ImplementedWalker{} - -func (b *ImplementedWalker) EnterAggregateFunc(p0 *AggregateFunc) error { - if b.FuncEnterAggregateFunc == nil { - return nil - } - - return b.FuncEnterAggregateFunc(p0) -} - -func (b *ImplementedWalker) ExitAggregateFunc(p0 *AggregateFunc) error { - if b.FuncExitAggregateFunc == nil { - return nil - } - - return b.FuncExitAggregateFunc(p0) -} - -func (b *ImplementedWalker) EnterCTE(p0 *CTE) error { - if b.FuncEnterCTE == nil { - return nil - } - - return b.FuncEnterCTE(p0) -} - -func (b *ImplementedWalker) ExitCTE(p0 *CTE) error { - if b.FuncExitCTE == nil { - return nil - } - - return b.FuncExitCTE(p0) -} - -func (b *ImplementedWalker) EnterCompoundOperator(p0 *CompoundOperator) error { - if b.FuncEnterCompoundOperator == nil { - return nil - } - - return b.FuncEnterCompoundOperator(p0) -} - -func (b *ImplementedWalker) ExitCompoundOperator(p0 *CompoundOperator) error { - if b.FuncExitCompoundOperator == nil { - return nil - } - - return b.FuncExitCompoundOperator(p0) -} - -func (b *ImplementedWalker) EnterConflictTarget(p0 *ConflictTarget) error { - if b.FuncEnterConflictTarget == nil { - return nil - } - - return b.FuncEnterConflictTarget(p0) -} - -func (b *ImplementedWalker) ExitConflictTarget(p0 *ConflictTarget) error { - if b.FuncExitConflictTarget == nil { - return nil - } - - return b.FuncExitConflictTarget(p0) -} - -func (b *ImplementedWalker) EnterDelete(p0 *Delete) error { - if b.FuncEnterDelete == nil { - return nil - } - - return b.FuncEnterDelete(p0) -} - -func (b *ImplementedWalker) ExitDelete(p0 *Delete) error { - if b.FuncExitDelete == nil { - return nil - } - - return b.FuncExitDelete(p0) -} - -func (b *ImplementedWalker) EnterDeleteStmt(p0 *DeleteStmt) error { - if b.FuncEnterDeleteStmt == nil { - return nil - } - - return b.FuncEnterDeleteStmt(p0) -} - -func (b *ImplementedWalker) ExitDeleteStmt(p0 *DeleteStmt) error { - if b.FuncExitDeleteStmt == nil { - return nil - } - - return b.FuncExitDeleteStmt(p0) -} - -func (b *ImplementedWalker) EnterExpressionArithmetic(p0 *ExpressionArithmetic) error { - if b.FuncEnterExpressionArithmetic == nil { - return nil - } - - return b.FuncEnterExpressionArithmetic(p0) -} - -func (b *ImplementedWalker) ExitExpressionArithmetic(p0 *ExpressionArithmetic) error { - if b.FuncExitExpressionArithmetic == nil { - return nil - } - - return b.FuncExitExpressionArithmetic(p0) -} - -func (b *ImplementedWalker) EnterExpressionBetween(p0 *ExpressionBetween) error { - if b.FuncEnterExpressionBetween == nil { - return nil - } - - return b.FuncEnterExpressionBetween(p0) -} - -func (b *ImplementedWalker) ExitExpressionBetween(p0 *ExpressionBetween) error { - if b.FuncExitExpressionBetween == nil { - return nil - } - - return b.FuncExitExpressionBetween(p0) -} - -func (b *ImplementedWalker) EnterExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { - if b.FuncEnterExpressionBinaryComparison == nil { - return nil - } - - return b.FuncEnterExpressionBinaryComparison(p0) -} - -func (b *ImplementedWalker) ExitExpressionBinaryComparison(p0 *ExpressionBinaryComparison) error { - if b.FuncExitExpressionBinaryComparison == nil { - return nil - } - - return b.FuncExitExpressionBinaryComparison(p0) -} - -func (b *ImplementedWalker) EnterExpressionBindParameter(p0 *ExpressionBindParameter) error { - if b.FuncEnterExpressionBindParameter == nil { - return nil - } - - return b.FuncEnterExpressionBindParameter(p0) -} - -func (b *ImplementedWalker) ExitExpressionBindParameter(p0 *ExpressionBindParameter) error { - if b.FuncExitExpressionBindParameter == nil { - return nil - } - - return b.FuncExitExpressionBindParameter(p0) -} - -func (b *ImplementedWalker) EnterExpressionCase(p0 *ExpressionCase) error { - if b.FuncEnterExpressionCase == nil { - return nil - } - - return b.FuncEnterExpressionCase(p0) -} - -func (b *ImplementedWalker) ExitExpressionCase(p0 *ExpressionCase) error { - if b.FuncExitExpressionCase == nil { - return nil - } - - return b.FuncExitExpressionCase(p0) -} - -func (b *ImplementedWalker) EnterExpressionCollate(p0 *ExpressionCollate) error { - if b.FuncEnterExpressionCollate == nil { - return nil - } - - return b.FuncEnterExpressionCollate(p0) -} - -func (b *ImplementedWalker) ExitExpressionCollate(p0 *ExpressionCollate) error { - if b.FuncExitExpressionCollate == nil { - return nil - } - - return b.FuncExitExpressionCollate(p0) -} - -func (b *ImplementedWalker) EnterExpressionColumn(p0 *ExpressionColumn) error { - if b.FuncEnterExpressionColumn == nil { - return nil - } - - return b.FuncEnterExpressionColumn(p0) -} - -func (b *ImplementedWalker) ExitExpressionColumn(p0 *ExpressionColumn) error { - if b.FuncExitExpressionColumn == nil { - return nil - } - - return b.FuncExitExpressionColumn(p0) -} - -func (b *ImplementedWalker) EnterExpressionFunction(p0 *ExpressionFunction) error { - if b.FuncEnterExpressionFunction == nil { - return nil - } - - return b.FuncEnterExpressionFunction(p0) -} - -func (b *ImplementedWalker) ExitExpressionFunction(p0 *ExpressionFunction) error { - if b.FuncExitExpressionFunction == nil { - return nil - } - - return b.FuncExitExpressionFunction(p0) -} - -func (b *ImplementedWalker) EnterExpressionIs(p0 *ExpressionIs) error { - if b.FuncEnterExpressionIs == nil { - return nil - } - - return b.FuncEnterExpressionIs(p0) -} - -func (b *ImplementedWalker) ExitExpressionIs(p0 *ExpressionIs) error { - if b.FuncExitExpressionIs == nil { - return nil - } - - return b.FuncExitExpressionIs(p0) -} - -func (b *ImplementedWalker) EnterExpressionList(p0 *ExpressionList) error { - if b.FuncEnterExpressionList == nil { - return nil - } - - return b.FuncEnterExpressionList(p0) -} - -func (b *ImplementedWalker) ExitExpressionList(p0 *ExpressionList) error { - if b.FuncExitExpressionList == nil { - return nil - } - - return b.FuncExitExpressionList(p0) -} - -func (b *ImplementedWalker) EnterExpressionLiteral(p0 *ExpressionLiteral) error { - if b.FuncEnterExpressionLiteral == nil { - return nil - } - - return b.FuncEnterExpressionLiteral(p0) -} - -func (b *ImplementedWalker) ExitExpressionLiteral(p0 *ExpressionLiteral) error { - if b.FuncExitExpressionLiteral == nil { - return nil - } - - return b.FuncExitExpressionLiteral(p0) -} - -func (b *ImplementedWalker) EnterExpressionSelect(p0 *ExpressionSelect) error { - if b.FuncEnterExpressionSelect == nil { - return nil - } - - return b.FuncEnterExpressionSelect(p0) -} - -func (b *ImplementedWalker) ExitExpressionSelect(p0 *ExpressionSelect) error { - if b.FuncExitExpressionSelect == nil { - return nil - } - - return b.FuncExitExpressionSelect(p0) -} - -func (b *ImplementedWalker) EnterExpressionStringCompare(p0 *ExpressionStringCompare) error { - if b.FuncEnterExpressionStringCompare == nil { - return nil - } - - return b.FuncEnterExpressionStringCompare(p0) -} - -func (b *ImplementedWalker) ExitExpressionStringCompare(p0 *ExpressionStringCompare) error { - if b.FuncExitExpressionStringCompare == nil { - return nil - } - - return b.FuncExitExpressionStringCompare(p0) -} - -func (b *ImplementedWalker) EnterExpressionUnary(p0 *ExpressionUnary) error { - if b.FuncEnterExpressionUnary == nil { - return nil - } - - return b.FuncEnterExpressionUnary(p0) -} - -func (b *ImplementedWalker) ExitExpressionUnary(p0 *ExpressionUnary) error { - if b.FuncExitExpressionUnary == nil { - return nil - } - - return b.FuncExitExpressionUnary(p0) -} - -func (b *ImplementedWalker) EnterFromClause(p0 *FromClause) error { - if b.FuncEnterFromClause == nil { - return nil - } - - return b.FuncEnterFromClause(p0) -} - -func (b *ImplementedWalker) ExitFromClause(p0 *FromClause) error { - if b.FuncExitFromClause == nil { - return nil - } - - return b.FuncExitFromClause(p0) -} - -func (b *ImplementedWalker) EnterGroupBy(p0 *GroupBy) error { - if b.FuncEnterGroupBy == nil { - return nil - } - - return b.FuncEnterGroupBy(p0) -} - -func (b *ImplementedWalker) ExitGroupBy(p0 *GroupBy) error { - if b.FuncExitGroupBy == nil { - return nil - } - - return b.FuncExitGroupBy(p0) -} - -func (b *ImplementedWalker) EnterInsert(p0 *Insert) error { - if b.FuncEnterInsert == nil { - return nil - } - - return b.FuncEnterInsert(p0) -} - -func (b *ImplementedWalker) ExitInsert(p0 *Insert) error { - if b.FuncExitInsert == nil { - return nil - } - - return b.FuncExitInsert(p0) -} - -func (b *ImplementedWalker) EnterInsertStmt(p0 *InsertStmt) error { - if b.FuncEnterInsertStmt == nil { - return nil - } - - return b.FuncEnterInsertStmt(p0) -} - -func (b *ImplementedWalker) ExitInsertStmt(p0 *InsertStmt) error { - if b.FuncExitInsertStmt == nil { - return nil - } - - return b.FuncExitInsertStmt(p0) -} - -func (b *ImplementedWalker) EnterJoinClause(p0 *JoinClause) error { - if b.FuncEnterJoinClause == nil { - return nil - } - - return b.FuncEnterJoinClause(p0) -} - -func (b *ImplementedWalker) ExitJoinClause(p0 *JoinClause) error { - if b.FuncExitJoinClause == nil { - return nil - } - - return b.FuncExitJoinClause(p0) -} - -func (b *ImplementedWalker) EnterJoinOperator(p0 *JoinOperator) error { - if b.FuncEnterJoinOperator == nil { - return nil - } - - return b.FuncEnterJoinOperator(p0) -} - -func (b *ImplementedWalker) ExitJoinOperator(p0 *JoinOperator) error { - if b.FuncExitJoinOperator == nil { - return nil - } - - return b.FuncExitJoinOperator(p0) -} - -func (b *ImplementedWalker) EnterJoinPredicate(p0 *JoinPredicate) error { - if b.FuncEnterJoinPredicate == nil { - return nil - } - - return b.FuncEnterJoinPredicate(p0) -} - -func (b *ImplementedWalker) ExitJoinPredicate(p0 *JoinPredicate) error { - if b.FuncExitJoinPredicate == nil { - return nil - } - - return b.FuncExitJoinPredicate(p0) -} - -func (b *ImplementedWalker) EnterLimit(p0 *Limit) error { - if b.FuncEnterLimit == nil { - return nil - } - - return b.FuncEnterLimit(p0) -} - -func (b *ImplementedWalker) ExitLimit(p0 *Limit) error { - if b.FuncExitLimit == nil { - return nil - } - - return b.FuncExitLimit(p0) -} - -func (b *ImplementedWalker) EnterOrderBy(p0 *OrderBy) error { - if b.FuncEnterOrderBy == nil { - return nil - } - - return b.FuncEnterOrderBy(p0) -} - -func (b *ImplementedWalker) ExitOrderBy(p0 *OrderBy) error { - if b.FuncExitOrderBy == nil { - return nil - } - - return b.FuncExitOrderBy(p0) -} - -func (b *ImplementedWalker) EnterOrderingTerm(p0 *OrderingTerm) error { - if b.FuncEnterOrderingTerm == nil { - return nil - } - - return b.FuncEnterOrderingTerm(p0) -} - -func (b *ImplementedWalker) ExitOrderingTerm(p0 *OrderingTerm) error { - if b.FuncExitOrderingTerm == nil { - return nil - } - - return b.FuncExitOrderingTerm(p0) -} - -func (b *ImplementedWalker) EnterQualifiedTableName(p0 *QualifiedTableName) error { - if b.FuncEnterQualifiedTableName == nil { - return nil - } - - return b.FuncEnterQualifiedTableName(p0) -} - -func (b *ImplementedWalker) ExitQualifiedTableName(p0 *QualifiedTableName) error { - if b.FuncExitQualifiedTableName == nil { - return nil - } - - return b.FuncExitQualifiedTableName(p0) -} - -func (b *ImplementedWalker) EnterResultColumnExpression(p0 *ResultColumnExpression) error { - if b.FuncEnterResultColumnExpression == nil { - return nil - } - - return b.FuncEnterResultColumnExpression(p0) -} - -func (b *ImplementedWalker) ExitResultColumnExpression(p0 *ResultColumnExpression) error { - if b.FuncExitResultColumnExpression == nil { - return nil - } - - return b.FuncExitResultColumnExpression(p0) -} - -func (b *ImplementedWalker) EnterResultColumnStar(p0 *ResultColumnStar) error { - if b.FuncEnterResultColumnStar == nil { - return nil - } - - return b.FuncEnterResultColumnStar(p0) -} - -func (b *ImplementedWalker) ExitResultColumnStar(p0 *ResultColumnStar) error { - if b.FuncExitResultColumnStar == nil { - return nil - } - - return b.FuncExitResultColumnStar(p0) -} - -func (b *ImplementedWalker) EnterResultColumnTable(p0 *ResultColumnTable) error { - if b.FuncEnterResultColumnTable == nil { - return nil - } - - return b.FuncEnterResultColumnTable(p0) -} - -func (b *ImplementedWalker) ExitResultColumnTable(p0 *ResultColumnTable) error { - if b.FuncExitResultColumnTable == nil { - return nil - } - - return b.FuncExitResultColumnTable(p0) -} - -func (b *ImplementedWalker) EnterReturningClause(p0 *ReturningClause) error { - if b.FuncEnterReturningClause == nil { - return nil - } - - return b.FuncEnterReturningClause(p0) -} - -func (b *ImplementedWalker) ExitReturningClause(p0 *ReturningClause) error { - if b.FuncExitReturningClause == nil { - return nil - } - - return b.FuncExitReturningClause(p0) -} - -func (b *ImplementedWalker) EnterReturningClauseColumn(p0 *ReturningClauseColumn) error { - if b.FuncEnterReturningClauseColumn == nil { - return nil - } - - return b.FuncEnterReturningClauseColumn(p0) -} - -func (b *ImplementedWalker) ExitReturningClauseColumn(p0 *ReturningClauseColumn) error { - if b.FuncExitReturningClauseColumn == nil { - return nil - } - - return b.FuncExitReturningClauseColumn(p0) -} - -func (b *ImplementedWalker) EnterScalarFunc(p0 *ScalarFunction) error { - if b.FuncEnterScalarFunc == nil { - return nil - } - - return b.FuncEnterScalarFunc(p0) -} - -func (b *ImplementedWalker) ExitScalarFunc(p0 *ScalarFunction) error { - if b.FuncExitScalarFunc == nil { - return nil - } - - return b.FuncExitScalarFunc(p0) -} - -func (b *ImplementedWalker) EnterSelect(p0 *Select) error { - if b.FuncEnterSelect == nil { - return nil - } - - return b.FuncEnterSelect(p0) -} - -func (b *ImplementedWalker) ExitSelect(p0 *Select) error { - if b.FuncExitSelect == nil { - return nil - } - - return b.FuncExitSelect(p0) -} - -func (b *ImplementedWalker) EnterSelectCore(p0 *SelectCore) error { - if b.FuncEnterSelectCore == nil { - return nil - } - - return b.FuncEnterSelectCore(p0) -} - -func (b *ImplementedWalker) ExitSelectCore(p0 *SelectCore) error { - if b.FuncExitSelectCore == nil { - return nil - } - - return b.FuncExitSelectCore(p0) -} - -func (b *ImplementedWalker) EnterSelectStmt(p0 *SelectStmt) error { - if b.FuncEnterSelectStmt == nil { - return nil - } - - return b.FuncEnterSelectStmt(p0) -} - -func (b *ImplementedWalker) ExitSelectStmt(p0 *SelectStmt) error { - if b.FuncExitSelectStmt == nil { - return nil - } - - return b.FuncExitSelectStmt(p0) -} - -func (b *ImplementedWalker) EnterTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { - if b.FuncEnterTableOrSubqueryJoin == nil { - return nil - } - - return b.FuncEnterTableOrSubqueryJoin(p0) -} - -func (b *ImplementedWalker) ExitTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { - if b.FuncExitTableOrSubqueryJoin == nil { - return nil - } - - return b.FuncExitTableOrSubqueryJoin(p0) -} - -func (b *ImplementedWalker) EnterTableOrSubqueryList(p0 *TableOrSubqueryList) error { - if b.FuncEnterTableOrSubqueryList == nil { - return nil - } - - return b.FuncEnterTableOrSubqueryList(p0) -} - -func (b *ImplementedWalker) ExitTableOrSubqueryList(p0 *TableOrSubqueryList) error { - if b.FuncExitTableOrSubqueryList == nil { - return nil - } - - return b.FuncExitTableOrSubqueryList(p0) -} - -func (b *ImplementedWalker) EnterTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { - if b.FuncEnterTableOrSubquerySelect == nil { - return nil - } - - return b.FuncEnterTableOrSubquerySelect(p0) -} - -func (b *ImplementedWalker) ExitTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { - if b.FuncExitTableOrSubquerySelect == nil { - return nil - } - - return b.FuncExitTableOrSubquerySelect(p0) -} - -func (b *ImplementedWalker) EnterTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { - if b.FuncEnterTableOrSubqueryTable == nil { - return nil - } - - return b.FuncEnterTableOrSubqueryTable(p0) -} - -func (b *ImplementedWalker) ExitTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { - if b.FuncExitTableOrSubqueryTable == nil { - return nil - } - - return b.FuncExitTableOrSubqueryTable(p0) -} - -func (b *ImplementedWalker) EnterUpdate(p0 *Update) error { - if b.FuncEnterUpdate == nil { - return nil - } - - return b.FuncEnterUpdate(p0) -} - -func (b *ImplementedWalker) ExitUpdate(p0 *Update) error { - if b.FuncExitUpdate == nil { - return nil - } - - return b.FuncExitUpdate(p0) -} - -func (b *ImplementedWalker) EnterUpdateSetClause(p0 *UpdateSetClause) error { - if b.FuncEnterUpdateSetClause == nil { - return nil - } - - return b.FuncEnterUpdateSetClause(p0) -} - -func (b *ImplementedWalker) ExitUpdateSetClause(p0 *UpdateSetClause) error { - if b.FuncExitUpdateSetClause == nil { - return nil - } - - return b.FuncExitUpdateSetClause(p0) -} - -func (b *ImplementedWalker) EnterUpdateStmt(p0 *UpdateStmt) error { - if b.FuncEnterUpdateStmt == nil { - return nil - } - - return b.FuncEnterUpdateStmt(p0) -} - -func (b *ImplementedWalker) ExitUpdateStmt(p0 *UpdateStmt) error { - if b.FuncExitUpdateStmt == nil { - return nil - } - - return b.FuncExitUpdateStmt(p0) -} - -func (b *ImplementedWalker) EnterUpsert(p0 *Upsert) error { - if b.FuncEnterUpsert == nil { - return nil - } - - return b.FuncEnterUpsert(p0) -} - -func (b *ImplementedWalker) ExitUpsert(p0 *Upsert) error { - if b.FuncExitUpsert == nil { - return nil - } - - return b.FuncExitUpsert(p0) -} From 8dddb759d7d6f1e786a94a913969dee1faa70e0d Mon Sep 17 00:00:00 2001 From: Yaiba <4yaiba@gmail.com> Date: Wed, 13 Mar 2024 15:33:18 -0500 Subject: [PATCH 2/7] parse: tree.Relation insteadof TableOrSubquery+JoinClause --- go.mod | 5 +- go.sum | 6 +- .../sqlanalyzer/attributes/select_core.go | 4 +- internal/engine/sqlanalyzer/clean/walker.go | 19 +- internal/engine/sqlanalyzer/order/order.go | 6 +- internal/engine/sqlanalyzer/schema/walker.go | 2 +- internal/engine/sqlanalyzer/utils/utils.go | 14 +- .../engine/sqlanalyzer/utils/utils_test.go | 14 +- parse/action/parser_test.go | 52 ++-- parse/sql/ast_builder.go | 98 +++---- parse/sql/ast_traversaler.go | 1 - parse/sql/parser_test.go | 209 +++++++-------- parse/sql/tree/CTE_test.go | 12 +- parse/sql/tree/README.md | 93 +++++-- parse/sql/tree/ast_listener.go | 240 ++++++++--------- parse/sql/tree/ast_visitor.go | 32 +-- parse/sql/tree/expression_test.go | 16 +- parse/sql/tree/join-clause_test.go | 166 ------------ parse/sql/tree/{join-clause.go => join.go} | 37 +-- parse/sql/tree/limit.go | 1 - parse/sql/tree/relation.go | 145 ++++++++++ parse/sql/tree/relation_test.go | 253 ++++++++++++++++++ parse/sql/tree/result-column.go | 4 + parse/sql/tree/select.go | 6 +- parse/sql/tree/select_test.go | 6 +- parse/sql/tree/table-or-subquery.go | 177 ------------ parse/sql/tree/table-or-subquery_test.go | 165 ------------ parse/sql/tree/update_test.go | 6 +- test/go.mod | 6 +- test/go.sum | 8 +- 30 files changed, 800 insertions(+), 1003 deletions(-) delete mode 100644 parse/sql/ast_traversaler.go delete mode 100644 parse/sql/tree/join-clause_test.go rename parse/sql/tree/{join-clause.go => join.go} (89%) create mode 100644 parse/sql/tree/relation.go create mode 100644 parse/sql/tree/relation_test.go delete mode 100644 parse/sql/tree/table-or-subquery.go delete mode 100644 parse/sql/tree/table-or-subquery_test.go diff --git a/go.mod b/go.mod index 65d72f9f7..36dc80415 100644 --- a/go.mod +++ b/go.mod @@ -19,9 +19,9 @@ require ( github.com/jackc/pglogrepl v0.0.0-20231111135425-1627ab1b5780 github.com/jackc/pgx/v5 v5.5.2 github.com/jpillora/backoff v1.0.0 - github.com/kwilteam/kuneiform v0.5.1-0.20240322160357-eb097d520367 + github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a github.com/kwilteam/kwil-db/core v0.1.0 - github.com/kwilteam/kwil-db/parse v0.1.1 + github.com/kwilteam/kwil-db/parse v0.1.2 github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 github.com/manifoldco/promptui v0.9.0 github.com/mitchellh/mapstructure v1.5.0 @@ -44,7 +44,6 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/antihax/optional v1.0.0 // indirect - github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect diff --git a/go.sum b/go.sum index 019bf8c9d..fdb0db4c4 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,6 @@ github.com/alexliesenfeld/health v0.6.0 h1:HRBTCgybNSe4lqGEk7nU82c3bjwh9W+3b46W6 github.com/alexliesenfeld/health v0.6.0/go.mod h1:N4NDIeQtlWumG+6z1ne1v62eQxktz5ylEgGgH9emdMw= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -276,8 +274,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/kuneiform v0.5.1-0.20240322160357-eb097d520367 h1:YXtzTYSEpfZuFCZL8O0GDrl9bvvo+9z1jbprQz/FfV4= -github.com/kwilteam/kuneiform v0.5.1-0.20240322160357-eb097d520367/go.mod h1:UdBmsFaV+APgQ7VBcjasH0WLRkK0gNzsrWL7ggtuTg4= +github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7jB33zFgCXxqCwea12LcPUiNmpghLTfU9Eg= +github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 h1:YiPBu0pOeYOtOVfwKQqdWB07SUef9LvngF4bVFD+x34= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7/go.mod h1:+BrFrV+3qcdYIfptqjwatE5gT19azuRHJzw77wMPY8c= github.com/kwilteam/sql-grammar-go v0.1.0 h1:rSS7DER9PWVDmFwNyoInG5oXrn+E9UrZkjref84L4Qk= diff --git a/internal/engine/sqlanalyzer/attributes/select_core.go b/internal/engine/sqlanalyzer/attributes/select_core.go index 76d93548b..9c3faf149 100644 --- a/internal/engine/sqlanalyzer/attributes/select_core.go +++ b/internal/engine/sqlanalyzer/attributes/select_core.go @@ -215,8 +215,8 @@ func (s *selectCoreAnalyzer) ExitSelectCore(node *tree.SelectCore) error { return nil } -// EnterTableOrSubqueryTable adds the table to the list of used tables. -func (s *selectCoreAnalyzer) EnterTableOrSubqueryTable(node *tree.TableOrSubqueryTable) error { +// EnterRelationTable adds the table to the list of used tables. +func (s *selectCoreAnalyzer) EnterRelationTable(node *tree.RelationTable) error { tbl, err := findTable(s.schemaTables, node.Name) if err != nil { return err diff --git a/internal/engine/sqlanalyzer/clean/walker.go b/internal/engine/sqlanalyzer/clean/walker.go index c6fd97146..378c5b644 100644 --- a/internal/engine/sqlanalyzer/clean/walker.go +++ b/internal/engine/sqlanalyzer/clean/walker.go @@ -188,7 +188,7 @@ func (s *StatementCleaner) EnterInsertStmt(node *tree.InsertStmt) (err error) { } // EnterJoinClause does nothing -func (s *StatementCleaner) EnterJoinClause(node *tree.JoinClause) (err error) { +func (s *StatementCleaner) EnterRelation(node tree.Relation) (err error) { return nil } @@ -320,8 +320,8 @@ func (s *StatementCleaner) EnterCompoundOperator(node *tree.CompoundOperator) (e return wrapErr(ErrInvalidCompoundOperator, node.Operator.Valid()) } -// EnterTableOrSubquery checks the table name and alias -func (s *StatementCleaner) EnterTableOrSubqueryTable(node *tree.TableOrSubqueryTable) (err error) { +// EnterRelationTable checks the table name and alias +func (s *StatementCleaner) EnterRelationTable(node *tree.RelationTable) (err error) { node.Name, err = cleanIdentifier(node.Name) if err != nil { return wrapErr(ErrInvalidIdentifier, err) @@ -337,8 +337,8 @@ func (s *StatementCleaner) EnterTableOrSubqueryTable(node *tree.TableOrSubqueryT return nil } -// EnterTableOrSubquerySelect checks the alias -func (s *StatementCleaner) EnterTableOrSubquerySelect(node *tree.TableOrSubquerySelect) (err error) { +// EnterRelationSubquery checks the alias +func (s *StatementCleaner) EnterRelationSubquery(node *tree.RelationSubquery) (err error) { if node.Alias != "" { node.Alias, err = cleanIdentifier(node.Alias) if err != nil { @@ -349,13 +349,8 @@ func (s *StatementCleaner) EnterTableOrSubquerySelect(node *tree.TableOrSubquery return nil } -// EnterTableOrSubqueryList does nothing -func (s *StatementCleaner) EnterTableOrSubqueryList(node *tree.TableOrSubqueryList) (err error) { - return nil -} - -// EnterTableOrSubqueryJoin does nothing -func (s *StatementCleaner) EnterTableOrSubqueryJoin(node *tree.TableOrSubqueryJoin) (err error) { +// EnterRelationJoin does nothing +func (s *StatementCleaner) EnterRelationJoin(node *tree.RelationJoin) (err error) { return nil } diff --git a/internal/engine/sqlanalyzer/order/order.go b/internal/engine/sqlanalyzer/order/order.go index 23d7a9208..e9855049d 100644 --- a/internal/engine/sqlanalyzer/order/order.go +++ b/internal/engine/sqlanalyzer/order/order.go @@ -50,8 +50,8 @@ func (o *orderingWalker) EnterCTE(node *tree.CTE) error { return nil } -// Register TableOrSubquerySelects as tables, so that we can order them. -func (o *orderingWalker) EnterTableOrSubquerySelect(node *tree.TableOrSubquerySelect) error { +// Register RelationSubquerys as tables, so that we can order them. +func (o *orderingWalker) EnterRelationSubquery(node *tree.RelationSubquery) error { if node.Select == nil { return fmt.Errorf("subquery select is nil") } @@ -159,7 +159,7 @@ func orderSimpleStatement(stmt *tree.SelectCore, tables []*common.Table) ([]*tre // we will now get a list of all tables that are renamed to the used aliases // this allows us to search for them by their alias, and not their real name. - usedTables, err := utils.GetUsedTables(stmt.From.JoinClause) + usedTables, err := utils.GetUsedTables(stmt.From.Relation) if err != nil { return nil, fmt.Errorf("error getting used tables: %w", err) } diff --git a/internal/engine/sqlanalyzer/schema/walker.go b/internal/engine/sqlanalyzer/schema/walker.go index 3afdee2d6..5e1ad1f52 100644 --- a/internal/engine/sqlanalyzer/schema/walker.go +++ b/internal/engine/sqlanalyzer/schema/walker.go @@ -44,7 +44,7 @@ func (w *SchemaWalker) EnterQualifiedTableName(q *tree.QualifiedTableName) error return nil } -func (w *SchemaWalker) EnterTableOrSubqueryTable(t *tree.TableOrSubqueryTable) error { +func (w *SchemaWalker) EnterRelationTable(t *tree.RelationTable) error { w.set(t.Name, t) return nil } diff --git a/internal/engine/sqlanalyzer/utils/utils.go b/internal/engine/sqlanalyzer/utils/utils.go index 5558f7e66..99a780255 100644 --- a/internal/engine/sqlanalyzer/utils/utils.go +++ b/internal/engine/sqlanalyzer/utils/utils.go @@ -35,8 +35,8 @@ func IsLiteral(literal string) (common.DataType, error) { // GetUsedTables returns the tables that are used or joined in a Join Clause. // It will search across the base table as well as all joined predicates. // It will properly scope tables used in subqueries, and not include them in the result. -func GetUsedTables(join *tree.JoinClause) ([]*tree.TableOrSubqueryTable, error) { - tables := make([]*tree.TableOrSubqueryTable, 0) +func GetUsedTables(join tree.Relation) ([]*tree.RelationTable, error) { + tables := make([]*tree.RelationTable, 0) depth := 0 // depth tracks if we are in a subquery or not err := join.Walk(&tree.ImplementedListener{ @@ -49,31 +49,31 @@ func GetUsedTables(join *tree.JoinClause) ([]*tree.TableOrSubqueryTable, error) depth-- return nil }, - FuncEnterTableOrSubqueryTable: func(p0 *tree.TableOrSubqueryTable) error { + FuncEnterRelationTable: func(p0 *tree.RelationTable) error { if depth != 0 { return nil } - tables = append(tables, &tree.TableOrSubqueryTable{ + tables = append(tables, &tree.RelationTable{ Name: p0.Name, Alias: p0.Alias, }) return nil }, - FuncEnterTableOrSubquerySelect: func(p0 *tree.TableOrSubquerySelect) error { + FuncEnterRelationSubquery: func(p0 *tree.RelationSubquery) error { if depth != 0 { return nil } depth++ // we add depth since we do not want to index extra information from the subquery // simply call the name and alias the alias of the subquery - tables = append(tables, &tree.TableOrSubqueryTable{ + tables = append(tables, &tree.RelationTable{ Name: p0.Alias, Alias: p0.Alias, }) return nil }, - FuncExitTableOrSubquerySelect: func(p0 *tree.TableOrSubquerySelect) error { + FuncExitRelationSubquery: func(p0 *tree.RelationSubquery) error { depth-- return nil }, diff --git a/internal/engine/sqlanalyzer/utils/utils_test.go b/internal/engine/sqlanalyzer/utils/utils_test.go index 3381b5ee3..3ed4978e4 100644 --- a/internal/engine/sqlanalyzer/utils/utils_test.go +++ b/internal/engine/sqlanalyzer/utils/utils_test.go @@ -14,7 +14,7 @@ func Test_JoinSearch(t *testing.T) { type testcase struct { name string stmt string // must be a select statement - tables []*tree.TableOrSubqueryTable + tables []*tree.RelationTable } tests := []testcase{ @@ -52,7 +52,7 @@ func Test_JoinSearch(t *testing.T) { require.True(t, ok) require.Equal(t, len(topSelect.SelectStmt.SelectCores), 1) - tbls, err := utils.GetUsedTables(topSelect.SelectStmt.SelectCores[0].From.JoinClause) + tbls, err := utils.GetUsedTables(topSelect.SelectStmt.SelectCores[0].From.Relation) require.NoError(t, err) require.EqualValues(t, tt.tables, tbls) @@ -60,9 +60,9 @@ func Test_JoinSearch(t *testing.T) { } } -func tbls(tables ...string) []*tree.TableOrSubqueryTable { +func tbls(tables ...string) []*tree.RelationTable { // should either be "tablename" OR "tablename alias" - tbls := make([]*tree.TableOrSubqueryTable, len(tables)) + tbls := make([]*tree.RelationTable, len(tables)) for i, t := range tables { split := strings.Split(t, " ") switch len(split) { @@ -79,9 +79,9 @@ func tbls(tables ...string) []*tree.TableOrSubqueryTable { } // if alias is empty, the table name is used as the alias -func tbl(name string, alias ...string) *tree.TableOrSubqueryTable { +func tbl(name string, alias ...string) *tree.RelationTable { if len(alias) == 0 { - return &tree.TableOrSubqueryTable{ + return &tree.RelationTable{ Name: name, } } @@ -89,7 +89,7 @@ func tbl(name string, alias ...string) *tree.TableOrSubqueryTable { panic("too many aliases") } - return &tree.TableOrSubqueryTable{ + return &tree.RelationTable{ Name: name, Alias: alias[0], } diff --git a/parse/action/parser_test.go b/parse/action/parser_test.go index a124f7b85..cb5e4e1b4 100644 --- a/parse/action/parser_test.go +++ b/parse/action/parser_test.go @@ -61,19 +61,19 @@ func TestParseActionStmt(t *testing.T) { Operator: tree.LogicalOperatorAnd, Right: &tree.ExpressionBindParameter{Parameter: "$c"}, }, - //&tree.ExpressionFunction{ - // Function: tree.FunctionAddressGetter(nil), - // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - //}, - //&tree.ExpressionFunction{ - // Function: tree.FunctionAddressGetter(nil), - // Inputs: []tree.Expression{ - // &tree.ExpressionFunction{ - // Function: tree.FunctionUPPERGetter(nil), - // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - // }, - // }, - //}, + &tree.ExpressionFunction{ + Function: &tree.FunctionABS, + Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + }, + &tree.ExpressionFunction{ + Function: &tree.FunctionABS, + Inputs: []tree.Expression{ + &tree.ExpressionFunction{ + Function: &tree.FunctionUPPER, + Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + }, + }, + }, }, }, }, @@ -122,19 +122,19 @@ func TestParseActionStmt(t *testing.T) { Operator: tree.LogicalOperatorAnd, Right: &tree.ExpressionBindParameter{Parameter: "$c"}, }, - //&tree.ExpressionFunction{ - // Function: tree.FunctionAddressGetter(nil), - // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - //}, - //&tree.ExpressionFunction{ - // Function: tree.FunctionAddressGetter(nil), - // Inputs: []tree.Expression{ - // &tree.ExpressionFunction{ - // Function: tree.FunctionUPPERGetter(nil), - // Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, - // }, - // }, - //}, + &tree.ExpressionFunction{ + Function: &tree.FunctionABS, + Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + }, + &tree.ExpressionFunction{ + Function: &tree.FunctionABS, + Inputs: []tree.Expression{ + &tree.ExpressionFunction{ + Function: &tree.FunctionUPPER, + Inputs: []tree.Expression{&tree.ExpressionBindParameter{Parameter: "$c"}}, + }, + }, + }, }, }, }, diff --git a/parse/sql/ast_builder.go b/parse/sql/ast_builder.go index 250307aa5..75fbcb952 100644 --- a/parse/sql/ast_builder.go +++ b/parse/sql/ast_builder.go @@ -704,18 +704,9 @@ func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interf } if ctx.FROM_() != nil { - fromClause := tree.FromClause{ - JoinClause: &tree.JoinClause{}, + updateStmt.From = &tree.FromClause{ + Relation: v.Visit(ctx.Relation()).(tree.Relation), } - - if ctx.Join_clause() != nil { - fromClause.JoinClause = v.Visit(ctx.Join_clause()).(*tree.JoinClause) - } else { - // table_or_subquery - fromClause.JoinClause.TableOrSubquery = v.Visit(ctx.Table_or_subquery()).(tree.TableOrSubquery) - } - - updateStmt.From = &fromClause } if ctx.WHERE_() != nil { @@ -838,7 +829,7 @@ func (v *astBuilder) VisitLimit_stmt(ctx *sqlgrammar.Limit_stmtContext) interfac func (v *astBuilder) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryContext) interface{} { switch { case ctx.Table_name() != nil: - t := tree.TableOrSubqueryTable{ + t := tree.RelationTable{ Name: util.ExtractSQLName(ctx.Table_name().GetText()), } if ctx.Table_alias() != nil { @@ -846,15 +837,16 @@ func (v *astBuilder) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryCon } return &t case ctx.Select_stmt_core() != nil: - t := tree.TableOrSubquerySelect{ + t := tree.RelationSubquery{ Select: v.Visit(ctx.Select_stmt_core()).(*tree.SelectStmt), } if ctx.Table_alias() != nil { t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) } return &t + default: + panic("unsupported table_or_subquery type") } - return nil } // VisitJoin_operator is called when visiting a join_operator, return *tree.JoinOperator @@ -884,28 +876,13 @@ func (v *astBuilder) VisitJoin_operator(ctx *sqlgrammar.Join_operatorContext) in return &jp } -// VisitJoin_clause is called when visiting a join_clause, return *tree.JoinClause -func (v *astBuilder) VisitJoin_clause(ctx *sqlgrammar.Join_clauseContext) interface{} { - clause := tree.JoinClause{} - - // just table_or_subquery - clause.TableOrSubquery = v.Visit(ctx.Table_or_subquery(0)).(tree.TableOrSubquery) - if len(ctx.AllTable_or_subquery()) == 1 { - return &clause - } - - // with joins - joins := make([]*tree.JoinPredicate, len(ctx.AllJoin_operator())) - for i, subCtx := range ctx.AllJoin_operator() { - jp := tree.JoinPredicate{} - jp.JoinOperator = v.Visit(subCtx).(*tree.JoinOperator) - jp.Table = v.Visit(ctx.Table_or_subquery(i + 1)).(tree.TableOrSubquery) - jp.Constraint = v.Visit(ctx.Join_constraint(i).Expr()).(tree.Expression) - joins[i] = &jp - } - clause.Joins = joins - - return &clause +// VisitJoin_relation is called when visiting a join_relation, return *tree.JoinPredicate +func (v *astBuilder) VisitJoin_relation(ctx *sqlgrammar.Join_relationContext) interface{} { + jp := tree.JoinPredicate{} + jp.JoinOperator = v.Visit(ctx.Join_operator()).(*tree.JoinOperator) + jp.Table = v.Visit(ctx.GetRight_relation()).(tree.Relation) + jp.Constraint = v.Visit(ctx.Join_constraint().Expr()).(tree.Expression) + return &jp } // VisitResult_column is called when visiting a result_column, return tree.ResultColumn @@ -972,34 +949,9 @@ func (v *astBuilder) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interf } if ctx.FROM_() != nil { - fromClause := tree.FromClause{ - JoinClause: &tree.JoinClause{}, - } - - if ctx.Join_clause() != nil { - fromClause.JoinClause = v.Visit(ctx.Join_clause()).(*tree.JoinClause) - } else { - // table_or_subquery - fromClause.JoinClause.TableOrSubquery = v.Visit(ctx.Table_or_subquery()).(tree.TableOrSubquery) - - // with comma(cartesian) join - //if len(ctx.AllTable_or_subquery()) == 1 { - // fromClause.JoinClause.TableOrSubquery = v.Visit(ctx.Table_or_subquery(0)).(tree.TableOrSubquery) - //} else { - // //tos := make([]tree.TableOrSubquery, len(ctx.AllTable_or_subquery())) - // // - // //for i, tableOrSubqueryCtx := range ctx.AllTable_or_subquery() { - // // tos[i] = v.Visit(tableOrSubqueryCtx).(tree.TableOrSubquery) - // //} - // // - // //fromClause.JoinClause.TableOrSubquery = &tree.TableOrSubqueryList{ - // // TableOrSubqueries: tos, - // //} - // panic("not support comma(cartesian) join") - //} + t.From = &tree.FromClause{ + Relation: v.Visit(ctx.Relation()).(tree.Relation), } - - t.From = &fromClause } if ctx.GetWhereExpr() != nil { @@ -1026,6 +978,26 @@ func (v *astBuilder) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interf return &t } +// VisitRelation is called when visiting a relation, return tree.Relation +func (v *astBuilder) VisitRelation(ctx *sqlgrammar.RelationContext) interface{} { + left := v.Visit(ctx.Table_or_subquery()).(tree.Relation) + + if len(ctx.AllJoin_relation()) > 0 { + rel := tree.RelationJoin{ + Relation: left, + Joins: make([]*tree.JoinPredicate, len(ctx.AllJoin_relation())), + } + // join relations + for i, joinRelationCtx := range ctx.AllJoin_relation() { + rel.Joins[i] = v.Visit(joinRelationCtx).(*tree.JoinPredicate) + } + return &rel + } else { + // table or subquery relation + return left + } +} + // VisitSelect_stmt_core is called when visiting a select_stmt_core, return *tree.SelectStmt func (v *astBuilder) VisitSelect_stmt_core(ctx *sqlgrammar.Select_stmt_coreContext) interface{} { t := tree.SelectStmt{} diff --git a/parse/sql/ast_traversaler.go b/parse/sql/ast_traversaler.go deleted file mode 100644 index 04173c692..000000000 --- a/parse/sql/ast_traversaler.go +++ /dev/null @@ -1 +0,0 @@ -package sqlparser diff --git a/parse/sql/parser_test.go b/parse/sql/parser_test.go index 6b357afc5..799e0b7eb 100644 --- a/parse/sql/parser_test.go +++ b/parse/sql/parser_test.go @@ -307,14 +307,14 @@ func genSimpleJoinSelectTree(joinOP *tree.JoinOperator, t1, t1Column, t2, t2Colu Columns: []tree.ResultColumn{ &tree.ResultColumnStar{}, }, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ Name: t1, }, Joins: []*tree.JoinPredicate{ { JoinOperator: joinOP, - Table: &tree.TableOrSubqueryTable{Name: t2}, + Table: &tree.RelationTable{Name: t2}, Constraint: &tree.ExpressionBinaryComparison{ Operator: tree.ComparisonOperatorEqual, Left: &tree.ExpressionColumn{Table: t1, Column: t1Column}, @@ -395,11 +395,9 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { SelectType: tree.SelectTypeAll, Columns: columnStar, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - Alias: "tt", - }, + Relation: &tree.RelationTable{ + Name: "t1", + Alias: "tt", }, }, }, @@ -415,11 +413,9 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { SelectType: tree.SelectTypeAll, Columns: columnStar, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubquerySelect{ - Select: genSelectColumnLiteralTree("1").SelectStmt, - Alias: "tt", - }, + Relation: &tree.RelationSubquery{ + Select: genSelectColumnLiteralTree("1").SelectStmt, + Alias: "tt", }, }, }, @@ -435,15 +431,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { SelectType: tree.SelectTypeAll, Columns: columnStar, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{Name: "t1", Alias: "tt"}, + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{Name: "t1", Alias: "tt"}, Joins: []*tree.JoinPredicate{ { JoinOperator: &tree.JoinOperator{ JoinType: tree.JoinTypeJoin, Outer: false, }, - Table: &tree.TableOrSubqueryTable{Name: "t2", Alias: "ttt"}, + Table: &tree.RelationTable{Name: "t2", Alias: "ttt"}, Constraint: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{ Table: "tt", @@ -1438,11 +1434,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, }}}, @@ -1454,11 +1449,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, }}}, @@ -1469,11 +1463,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeDistinct, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, }}}, @@ -1484,11 +1477,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "c1"}, Operator: tree.ComparisonOperatorEqual, @@ -1504,11 +1496,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "c1"}, @@ -1532,11 +1523,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "c1"}, @@ -1560,11 +1550,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, GroupBy: &tree.GroupBy{ Expressions: []tree.Expression{ &tree.ExpressionColumn{Column: "c1"}, @@ -1580,11 +1569,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, GroupBy: &tree.GroupBy{ Expressions: []tree.Expression{ &tree.ExpressionColumn{Column: "c1"}, @@ -1601,11 +1589,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, OrderBy: &tree.OrderBy{ @@ -1624,11 +1611,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, OrderBy: &tree.OrderBy{ @@ -1651,11 +1637,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, Limit: &tree.Limit{Expression: genLiteralExpression("1")}, @@ -1667,11 +1652,10 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ + From: &tree.FromClause{ + Relation: &tree.RelationTable{ Name: "t1", - }, - }}, + }}, }, }, Limit: &tree.Limit{ @@ -1722,36 +1706,37 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeJoin, - }, - Table: &tree.TableOrSubqueryTable{Name: "t2"}, - Constraint: &tree.ExpressionBinaryComparison{ - Operator: tree.ComparisonOperatorEqual, - Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, - Right: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, - }, + From: &tree.FromClause{ + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "t1", }, - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeLeft, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeJoin, + }, + Table: &tree.RelationTable{Name: "t2"}, + Constraint: &tree.ExpressionBinaryComparison{ + Operator: tree.ComparisonOperatorEqual, + Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, + Right: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, + }, }, - Table: &tree.TableOrSubqueryTable{Name: "t3"}, - Constraint: &tree.ExpressionBinaryComparison{ - Operator: tree.ComparisonOperatorEqual, - Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, - Right: &tree.ExpressionColumn{Table: "t3", Column: "c1"}, + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeLeft, + }, + Table: &tree.RelationTable{Name: "t3"}, + Constraint: &tree.ExpressionBinaryComparison{ + Operator: tree.ComparisonOperatorEqual, + Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, + Right: &tree.ExpressionColumn{Table: "t3", Column: "c1"}, + }, }, }, }, }, - }, }, }, }}}, @@ -1809,9 +1794,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Expression: genLiteralExpression("1"), }, }, - From: &tree.FromClause{JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{Name: "t2"}, - }}, + From: &tree.FromClause{Relation: &tree.RelationTable{Name: "t2"}}, }, }, }, @@ -1826,14 +1809,14 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{Name: "t2"}, + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{Name: "t2"}, Joins: []*tree.JoinPredicate{ { JoinOperator: &tree.JoinOperator{ JoinType: tree.JoinTypeJoin, }, - Table: &tree.TableOrSubqueryTable{Name: "t3"}, + Table: &tree.RelationTable{Name: "t3"}, Constraint: &tree.ExpressionBinaryComparison{ Operator: tree.ComparisonOperatorEqual, Left: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, @@ -1962,10 +1945,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { SelectType: tree.SelectTypeAll, Columns: columnStar, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - }, + Relation: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -1981,11 +1962,9 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { SelectType: tree.SelectTypeAll, Columns: columnStar, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - Alias: "t", - }, + Relation: &tree.RelationTable{ + Name: "t1", + Alias: "t", }, }, }, @@ -2007,10 +1986,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - }, + Relation: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -2033,10 +2010,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Alias: "col", }, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - }, + Relation: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -2062,10 +2037,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - }, + Relation: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -2140,10 +2113,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "t1", - }, + Relation: &tree.RelationTable{ + Name: "t1", }, }, }, diff --git a/parse/sql/tree/CTE_test.go b/parse/sql/tree/CTE_test.go index f1de6bf0d..d294b95a5 100644 --- a/parse/sql/tree/CTE_test.go +++ b/parse/sql/tree/CTE_test.go @@ -28,10 +28,8 @@ func TestCTE_ToSQL(t *testing.T) { { SelectType: tree.SelectTypeAll, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, + Relation: &tree.RelationTable{ + Name: "foo", }, }, }, @@ -76,10 +74,8 @@ var mockCTE = &tree.CTE{ SelectCores: []*tree.SelectCore{ { From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, + Relation: &tree.RelationTable{ + Name: "foo", }, }, }, diff --git a/parse/sql/tree/README.md b/parse/sql/tree/README.md index dedab51ef..934b027ef 100644 --- a/parse/sql/tree/README.md +++ b/parse/sql/tree/README.md @@ -268,13 +268,64 @@ INSERT OR REPLACE /*End InsertType*/ INTO users (username, age) VALUES ('satoshi', 42) ``` -#### JoinClause +#### Relation +A Relation is used to specify the table(s) that should be used in a SELECT statement. +It can be a table, a subquery, or joined tables. -A join clause is used to specify the table(s) that should be used in a SELECT statement. Despite the name, it is not actually necessary to specify a JOIN in the JoinClause; the name has been left to maintain compatibility with SQLite's syntax (which functions the same). +#### RelationTable + +A RelationTable is used to specify a table that should be used in a SELECT statement. + +```go +type RelationTable struct { + Name string + Alias string +} + +``` + +_In SQL:_ + +```sql +SELECT * +# Start of RelationTable +FROM users AS u +# End of RelationTable +WHERE username = 'satoshi'; +``` + +#### RelationSubquery + +A RelationSubquery is used to specify a subquery that should be used in a SELECT statement. ```go -type JoinClause struct { - TableOrSubquery TableOrSubquery +type RelationSubquery struct { + Select *SelectStmt + Alias string +} +``` + +_In SQL:_ + +```sql +SELECT * +# Start of RelationSubquery +FROM ( + SELECT * + FROM users + WHERE age > 18 +) AS u +# End of RelationSubquery +WHERE username = 'satoshi'; +``` + +#### RelationJoin + +A RelationJoin is used to specify joined tables that should be used in a SELECT statement. + +```go +type RelationJoin struct { + Relation Relation Joins []*JoinPredicate } ``` @@ -283,7 +334,7 @@ _In SQL:_ ```sql SELECT p.title, p.content -# Start of JoinClause +# Start of RelationJoin FROM posts AS p INNER JOIN users as u ON p.author_id = u.id @@ -297,7 +348,7 @@ A join predicate contains the type of join, the subject / target table of the jo ```go type JoinPredicate struct { JoinOperator *JoinOperator - Table TableOrSubquery + Table Relation Constraint Expression } ``` @@ -468,7 +519,7 @@ type QualifiedTableName struct { _In SQL:_ ```sql -DELETE FROM +DELETE FROM # Start of qualified table name comments INDEXED BY comment_index # End of qualified table name @@ -577,11 +628,12 @@ const ( #### FromClause -The FROM clause is a wrapper around JoinClause. The differentiation is necessary to make future features easier to implement. +The FROM clause is a wrapper around Relation. The differentiation is necessary to make future features easier to +implement. ```go type FromClause struct { - JoinClause *JoinClause + Relation Relation } ``` @@ -640,27 +692,26 @@ const ( ) ``` -#### TableOrSubquery +#### Relation -The table or subquery clause is used to specify a value that can be either a table or a subquery clause. There are several different types, which are displayed below: +The Relation is used to specify a value that can be either a table or a subquery or a join clause. There are several +different types, +which are displayed below: ```go -type TableOrSubqueryTable struct { +type RelationTable struct { Name string Alias string } -type TableOrSubquerySelect struct { +type RelationSubquery struct { Select *SelectStmt Alias string } -type TableOrSubqueryList struct { - TableOrSubqueries []TableOrSubquery -} - -type TableOrSubqueryJoin struct { - JoinClause *JoinClause +type RelationJoin struct { + Relation Relation + Joins []*JoinPredicate } ``` @@ -668,9 +719,9 @@ _In SQL:_ ```sql SELECT u.username, COUNT(f.follower_id) -# Start TableOrSubquery +# Start FROM users AS u -# End TableOrSubquery +# End LEFT JOIN followers AS f ON u.id = f.followed_id GROUP BY f.followed_id, u.id diff --git a/parse/sql/tree/ast_listener.go b/parse/sql/tree/ast_listener.go index aea28abd0..0d3423488 100644 --- a/parse/sql/tree/ast_listener.go +++ b/parse/sql/tree/ast_listener.go @@ -48,8 +48,6 @@ type AstListener interface { ExitInsert(*Insert) error EnterInsertStmt(*InsertStmt) error ExitInsertStmt(*InsertStmt) error - EnterJoinClause(*JoinClause) error - ExitJoinClause(*JoinClause) error EnterJoinPredicate(*JoinPredicate) error ExitJoinPredicate(*JoinPredicate) error EnterJoinOperator(*JoinOperator) error @@ -62,6 +60,14 @@ type AstListener interface { ExitOrderingTerm(*OrderingTerm) error EnterQualifiedTableName(*QualifiedTableName) error ExitQualifiedTableName(*QualifiedTableName) error + EnterRelation(Relation) error + ExitRelation(Relation) error + EnterRelationTable(*RelationTable) error + ExitRelationTable(*RelationTable) error + EnterRelationSubquery(*RelationSubquery) error + ExitRelationSubquery(*RelationSubquery) error + EnterRelationJoin(*RelationJoin) error + ExitRelationJoin(*RelationJoin) error EnterResultColumnStar(*ResultColumnStar) error ExitResultColumnStar(*ResultColumnStar) error EnterResultColumnExpression(*ResultColumnExpression) error @@ -82,14 +88,6 @@ type AstListener interface { ExitFromClause(*FromClause) error EnterCompoundOperator(*CompoundOperator) error ExitCompoundOperator(*CompoundOperator) error - EnterTableOrSubqueryTable(*TableOrSubqueryTable) error - ExitTableOrSubqueryTable(*TableOrSubqueryTable) error - EnterTableOrSubquerySelect(*TableOrSubquerySelect) error - ExitTableOrSubquerySelect(*TableOrSubquerySelect) error - EnterTableOrSubqueryList(*TableOrSubqueryList) error - ExitTableOrSubqueryList(*TableOrSubqueryList) error - EnterTableOrSubqueryJoin(*TableOrSubqueryJoin) error - ExitTableOrSubqueryJoin(*TableOrSubqueryJoin) error EnterUpdateSetClause(*UpdateSetClause) error ExitUpdateSetClause(*UpdateSetClause) error EnterUpdate(*Update) error @@ -300,14 +298,6 @@ func (b *BaseListener) ExitInsertStmt(p0 *InsertStmt) error { return nil } -func (b *BaseListener) EnterJoinClause(p0 *JoinClause) error { - return nil -} - -func (b *BaseListener) ExitJoinClause(p0 *JoinClause) error { - return nil -} - func (b *BaseListener) EnterJoinOperator(p0 *JoinOperator) error { return nil } @@ -356,107 +346,107 @@ func (b *BaseListener) ExitQualifiedTableName(p0 *QualifiedTableName) error { return nil } -func (b *BaseListener) EnterResultColumnExpression(p0 *ResultColumnExpression) error { +func (b *BaseListener) EnterRelation(p0 Relation) error { return nil } -func (b *BaseListener) ExitResultColumnExpression(p0 *ResultColumnExpression) error { +func (b *BaseListener) ExitRelation(p0 Relation) error { return nil } -func (b *BaseListener) EnterResultColumnStar(p0 *ResultColumnStar) error { +func (b *BaseListener) EnterRelationJoin(p0 *RelationJoin) error { return nil } -func (b *BaseListener) ExitResultColumnStar(p0 *ResultColumnStar) error { +func (b *BaseListener) ExitRelationJoin(p0 *RelationJoin) error { return nil } -func (b *BaseListener) EnterResultColumnTable(p0 *ResultColumnTable) error { +func (b *BaseListener) EnterRelationSubquery(p0 *RelationSubquery) error { return nil } -func (b *BaseListener) ExitResultColumnTable(p0 *ResultColumnTable) error { +func (b *BaseListener) ExitRelationSubquery(p0 *RelationSubquery) error { return nil } -func (b *BaseListener) EnterReturningClause(p0 *ReturningClause) error { +func (b *BaseListener) EnterRelationTable(p0 *RelationTable) error { return nil } -func (b *BaseListener) ExitReturningClause(p0 *ReturningClause) error { +func (b *BaseListener) ExitRelationTable(p0 *RelationTable) error { return nil } -func (b *BaseListener) EnterReturningClauseColumn(p0 *ReturningClauseColumn) error { +func (b *BaseListener) EnterResultColumnExpression(p0 *ResultColumnExpression) error { return nil } -func (b *BaseListener) ExitReturningClauseColumn(p0 *ReturningClauseColumn) error { +func (b *BaseListener) ExitResultColumnExpression(p0 *ResultColumnExpression) error { return nil } -func (b *BaseListener) EnterScalarFunc(p0 *ScalarFunction) error { +func (b *BaseListener) EnterResultColumnStar(p0 *ResultColumnStar) error { return nil } -func (b *BaseListener) ExitScalarFunc(p0 *ScalarFunction) error { +func (b *BaseListener) ExitResultColumnStar(p0 *ResultColumnStar) error { return nil } -func (b *BaseListener) EnterSelect(p0 *Select) error { +func (b *BaseListener) EnterResultColumnTable(p0 *ResultColumnTable) error { return nil } -func (b *BaseListener) ExitSelect(p0 *Select) error { +func (b *BaseListener) ExitResultColumnTable(p0 *ResultColumnTable) error { return nil } -func (b *BaseListener) EnterSelectCore(p0 *SelectCore) error { +func (b *BaseListener) EnterReturningClause(p0 *ReturningClause) error { return nil } -func (b *BaseListener) ExitSelectCore(p0 *SelectCore) error { +func (b *BaseListener) ExitReturningClause(p0 *ReturningClause) error { return nil } -func (b *BaseListener) EnterSelectStmt(p0 *SelectStmt) error { +func (b *BaseListener) EnterReturningClauseColumn(p0 *ReturningClauseColumn) error { return nil } -func (b *BaseListener) ExitSelectStmt(p0 *SelectStmt) error { +func (b *BaseListener) ExitReturningClauseColumn(p0 *ReturningClauseColumn) error { return nil } -func (b *BaseListener) EnterTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { +func (b *BaseListener) EnterScalarFunc(p0 *ScalarFunction) error { return nil } -func (b *BaseListener) ExitTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { +func (b *BaseListener) ExitScalarFunc(p0 *ScalarFunction) error { return nil } -func (b *BaseListener) EnterTableOrSubqueryList(p0 *TableOrSubqueryList) error { +func (b *BaseListener) EnterSelect(p0 *Select) error { return nil } -func (b *BaseListener) ExitTableOrSubqueryList(p0 *TableOrSubqueryList) error { +func (b *BaseListener) ExitSelect(p0 *Select) error { return nil } -func (b *BaseListener) EnterTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { +func (b *BaseListener) EnterSelectCore(p0 *SelectCore) error { return nil } -func (b *BaseListener) ExitTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { +func (b *BaseListener) ExitSelectCore(p0 *SelectCore) error { return nil } -func (b *BaseListener) EnterTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { +func (b *BaseListener) EnterSelectStmt(p0 *SelectStmt) error { return nil } -func (b *BaseListener) ExitTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { +func (b *BaseListener) ExitSelectStmt(p0 *SelectStmt) error { return nil } @@ -545,8 +535,6 @@ type ImplementedListener struct { FuncExitInsert func(p0 *Insert) error FuncEnterInsertStmt func(p0 *InsertStmt) error FuncExitInsertStmt func(p0 *InsertStmt) error - FuncEnterJoinClause func(p0 *JoinClause) error - FuncExitJoinClause func(p0 *JoinClause) error FuncEnterJoinOperator func(p0 *JoinOperator) error FuncExitJoinOperator func(p0 *JoinOperator) error FuncEnterJoinPredicate func(p0 *JoinPredicate) error @@ -559,6 +547,14 @@ type ImplementedListener struct { FuncExitOrderingTerm func(p0 *OrderingTerm) error FuncEnterQualifiedTableName func(p0 *QualifiedTableName) error FuncExitQualifiedTableName func(p0 *QualifiedTableName) error + FuncEnterRelation func(p0 Relation) error + FuncExitRelation func(p0 Relation) error + FuncEnterRelationJoin func(p0 *RelationJoin) error + FuncExitRelationJoin func(p0 *RelationJoin) error + FuncEnterRelationSubquery func(p0 *RelationSubquery) error + FuncExitRelationSubquery func(p0 *RelationSubquery) error + FuncEnterRelationTable func(p0 *RelationTable) error + FuncExitRelationTable func(p0 *RelationTable) error FuncEnterResultColumnExpression func(p0 *ResultColumnExpression) error FuncExitResultColumnExpression func(p0 *ResultColumnExpression) error FuncEnterResultColumnStar func(p0 *ResultColumnStar) error @@ -577,14 +573,6 @@ type ImplementedListener struct { FuncExitSelectCore func(p0 *SelectCore) error FuncEnterSelectStmt func(p0 *SelectStmt) error FuncExitSelectStmt func(p0 *SelectStmt) error - FuncEnterTableOrSubqueryJoin func(p0 *TableOrSubqueryJoin) error - FuncExitTableOrSubqueryJoin func(p0 *TableOrSubqueryJoin) error - FuncEnterTableOrSubqueryList func(p0 *TableOrSubqueryList) error - FuncExitTableOrSubqueryList func(p0 *TableOrSubqueryList) error - FuncEnterTableOrSubquerySelect func(p0 *TableOrSubquerySelect) error - FuncExitTableOrSubquerySelect func(p0 *TableOrSubquerySelect) error - FuncEnterTableOrSubqueryTable func(p0 *TableOrSubqueryTable) error - FuncExitTableOrSubqueryTable func(p0 *TableOrSubqueryTable) error FuncEnterUpdate func(p0 *Update) error FuncExitUpdate func(p0 *Update) error FuncEnterUpdateSetClause func(p0 *UpdateSetClause) error @@ -981,22 +969,6 @@ func (b *ImplementedListener) ExitInsertStmt(p0 *InsertStmt) error { return b.FuncExitInsertStmt(p0) } -func (b *ImplementedListener) EnterJoinClause(p0 *JoinClause) error { - if b.FuncEnterJoinClause == nil { - return nil - } - - return b.FuncEnterJoinClause(p0) -} - -func (b *ImplementedListener) ExitJoinClause(p0 *JoinClause) error { - if b.FuncExitJoinClause == nil { - return nil - } - - return b.FuncExitJoinClause(p0) -} - func (b *ImplementedListener) EnterJoinOperator(p0 *JoinOperator) error { if b.FuncEnterJoinOperator == nil { return nil @@ -1093,6 +1065,70 @@ func (b *ImplementedListener) ExitQualifiedTableName(p0 *QualifiedTableName) err return b.FuncExitQualifiedTableName(p0) } +func (b *ImplementedListener) EnterRelation(p0 Relation) error { + if b.FuncEnterRelation == nil { + return nil + } + + return b.FuncEnterRelation(p0) +} + +func (b *ImplementedListener) ExitRelation(p0 Relation) error { + if b.FuncExitRelation == nil { + return nil + } + + return b.FuncExitRelation(p0) +} + +func (b *ImplementedListener) EnterRelationJoin(p0 *RelationJoin) error { + if b.FuncEnterRelationJoin == nil { + return nil + } + + return b.FuncEnterRelationJoin(p0) +} + +func (b *ImplementedListener) ExitRelationJoin(p0 *RelationJoin) error { + if b.FuncExitRelationJoin == nil { + return nil + } + + return b.FuncExitRelationJoin(p0) +} + +func (b *ImplementedListener) EnterRelationSubquery(p0 *RelationSubquery) error { + if b.FuncEnterRelationSubquery == nil { + return nil + } + + return b.FuncEnterRelationSubquery(p0) +} + +func (b *ImplementedListener) ExitRelationSubquery(p0 *RelationSubquery) error { + if b.FuncExitRelationSubquery == nil { + return nil + } + + return b.FuncExitRelationSubquery(p0) +} + +func (b *ImplementedListener) EnterRelationTable(p0 *RelationTable) error { + if b.FuncEnterRelationTable == nil { + return nil + } + + return b.FuncEnterRelationTable(p0) +} + +func (b *ImplementedListener) ExitRelationTable(p0 *RelationTable) error { + if b.FuncExitRelationTable == nil { + return nil + } + + return b.FuncExitRelationTable(p0) +} + func (b *ImplementedListener) EnterResultColumnExpression(p0 *ResultColumnExpression) error { if b.FuncEnterResultColumnExpression == nil { return nil @@ -1237,70 +1273,6 @@ func (b *ImplementedListener) ExitSelectStmt(p0 *SelectStmt) error { return b.FuncExitSelectStmt(p0) } -func (b *ImplementedListener) EnterTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { - if b.FuncEnterTableOrSubqueryJoin == nil { - return nil - } - - return b.FuncEnterTableOrSubqueryJoin(p0) -} - -func (b *ImplementedListener) ExitTableOrSubqueryJoin(p0 *TableOrSubqueryJoin) error { - if b.FuncExitTableOrSubqueryJoin == nil { - return nil - } - - return b.FuncExitTableOrSubqueryJoin(p0) -} - -func (b *ImplementedListener) EnterTableOrSubqueryList(p0 *TableOrSubqueryList) error { - if b.FuncEnterTableOrSubqueryList == nil { - return nil - } - - return b.FuncEnterTableOrSubqueryList(p0) -} - -func (b *ImplementedListener) ExitTableOrSubqueryList(p0 *TableOrSubqueryList) error { - if b.FuncExitTableOrSubqueryList == nil { - return nil - } - - return b.FuncExitTableOrSubqueryList(p0) -} - -func (b *ImplementedListener) EnterTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { - if b.FuncEnterTableOrSubquerySelect == nil { - return nil - } - - return b.FuncEnterTableOrSubquerySelect(p0) -} - -func (b *ImplementedListener) ExitTableOrSubquerySelect(p0 *TableOrSubquerySelect) error { - if b.FuncExitTableOrSubquerySelect == nil { - return nil - } - - return b.FuncExitTableOrSubquerySelect(p0) -} - -func (b *ImplementedListener) EnterTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { - if b.FuncEnterTableOrSubqueryTable == nil { - return nil - } - - return b.FuncEnterTableOrSubqueryTable(p0) -} - -func (b *ImplementedListener) ExitTableOrSubqueryTable(p0 *TableOrSubqueryTable) error { - if b.FuncExitTableOrSubqueryTable == nil { - return nil - } - - return b.FuncExitTableOrSubqueryTable(p0) -} - func (b *ImplementedListener) EnterUpdate(p0 *Update) error { if b.FuncEnterUpdate == nil { return nil diff --git a/parse/sql/tree/ast_visitor.go b/parse/sql/tree/ast_visitor.go index a3b3dcbbb..c7ba321b8 100644 --- a/parse/sql/tree/ast_visitor.go +++ b/parse/sql/tree/ast_visitor.go @@ -28,13 +28,16 @@ type AstVisitor interface { VisitGroupBy(*GroupBy) any VisitInsert(*Insert) any VisitInsertStmt(*InsertStmt) any - VisitJoinClause(*JoinClause) any VisitJoinPredicate(*JoinPredicate) any VisitJoinOperator(*JoinOperator) any VisitLimit(*Limit) any VisitOrderBy(*OrderBy) any VisitOrderingTerm(*OrderingTerm) any VisitQualifiedTableName(*QualifiedTableName) any + VisitRelation(Relation) any + VisitRelationTable(*RelationTable) any + VisitRelationSubquery(*RelationSubquery) any + VisitRelationJoin(*RelationJoin) any VisitResultColumnStar(*ResultColumnStar) any VisitResultColumnExpression(*ResultColumnExpression) any VisitResultColumnTable(*ResultColumnTable) any @@ -43,11 +46,6 @@ type AstVisitor interface { VisitSelect(*Select) any VisitSelectCore(*SelectCore) any VisitSelectStmt(*SelectStmt) any - VisitTableOrSubquery(TableOrSubquery) any - VisitTableOrSubqueryTable(*TableOrSubqueryTable) any - VisitTableOrSubquerySelect(*TableOrSubquerySelect) any - VisitTableOrSubqueryList(*TableOrSubqueryList) any - VisitTableOrSubqueryJoin(*TableOrSubqueryJoin) any VisitUpdateSetClause(*UpdateSetClause) any VisitUpdate(*Update) any VisitUpdateStmt(*UpdateStmt) any @@ -160,10 +158,6 @@ func (v *BaseAstVisitor) VisitInsertStmt(node *InsertStmt) any { return nil } -func (v *BaseAstVisitor) VisitJoinClause(node *JoinClause) any { - return nil -} - func (v *BaseAstVisitor) VisitJoinPredicate(node *JoinPredicate) any { return nil } @@ -224,31 +218,29 @@ func (v *BaseAstVisitor) VisitFromClause(node *FromClause) any { return nil } -func (v *BaseAstVisitor) VisitTableOrSubquery(node TableOrSubquery) any { +func (v *BaseAstVisitor) VisitRelation(node Relation) any { // TODO delete? switch t := node.(type) { - case *TableOrSubqueryTable: + case *RelationTable: + return v.Visit(t) + case *RelationSubquery: return v.Visit(t) - case *TableOrSubquerySelect: + case *RelationJoin: return v.Visit(t) default: panic("unknown table or subquery type") } } -func (v *BaseAstVisitor) VisitTableOrSubqueryTable(node *TableOrSubqueryTable) any { - return nil -} - -func (v *BaseAstVisitor) VisitTableOrSubquerySelect(node *TableOrSubquerySelect) any { +func (v *BaseAstVisitor) VisitRelationTable(node *RelationTable) any { return nil } -func (v *BaseAstVisitor) VisitTableOrSubqueryList(node *TableOrSubqueryList) any { +func (v *BaseAstVisitor) VisitRelationSubquery(node *RelationSubquery) any { return nil } -func (v *BaseAstVisitor) VisitTableOrSubqueryJoin(node *TableOrSubqueryJoin) any { +func (v *BaseAstVisitor) VisitRelationJoin(node *RelationJoin) any { return nil } diff --git a/parse/sql/tree/expression_test.go b/parse/sql/tree/expression_test.go index ca3c3574b..a1949cf75 100644 --- a/parse/sql/tree/expression_test.go +++ b/parse/sql/tree/expression_test.go @@ -663,11 +663,9 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { { SelectType: tree.SelectTypeAll, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - Alias: "f", - }, + Relation: &tree.RelationTable{ + Name: "foo", + Alias: "f", }, }, Where: &tree.ExpressionBinaryComparison{ @@ -696,11 +694,9 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { { SelectType: tree.SelectTypeAll, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - Alias: "f", - }, + Relation: &tree.RelationTable{ + Name: "foo", + Alias: "f", }, }, Where: &tree.ExpressionBinaryComparison{ diff --git a/parse/sql/tree/join-clause_test.go b/parse/sql/tree/join-clause_test.go deleted file mode 100644 index 8c5967f16..000000000 --- a/parse/sql/tree/join-clause_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package tree_test - -import ( - "testing" - - "github.com/kwilteam/kwil-db/parse/sql/tree" -) - -func TestJoinClause_ToSQL(t *testing.T) { - type fields struct { - TableOrSubquery tree.TableOrSubquery - Joins []*tree.JoinPredicate - } - tests := []struct { - name string - fields fields - want string - wantPanic bool - }{ - { - name: "join clause with one join predicate", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "table1", - Alias: "t1", - }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeInner, - }, - Table: &tree.TableOrSubqueryTable{ - Name: "table2", - Alias: "t2", - }, - Constraint: &tree.ExpressionBinaryComparison{ - Left: &tree.ExpressionColumn{ - Table: "t1", - Column: "col1", - }, - Operator: tree.ComparisonOperatorEqual, - Right: &tree.ExpressionColumn{ - Table: "t2", - Column: "col2", - }, - }, - }, - }, - }, - want: `"table1" AS "t1" INNER JOIN "table2" AS "t2" ON "t1"."col1" = "t2"."col2"`, - }, - { - name: "join clause with greater than one join predicate", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "table1", - Alias: "t1", - }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeInner, - }, - Table: &tree.TableOrSubqueryTable{ - Name: "table2", - Alias: "t2", - }, - Constraint: &tree.ExpressionBinaryComparison{ - Left: &tree.ExpressionColumn{ - Table: "t1", - Column: "col1", - }, - Operator: tree.ComparisonOperatorGreaterThan, - Right: &tree.ExpressionColumn{ - Table: "t2", - Column: "col2", - }, - }, - }, - }, - }, - wantPanic: true, - }, - { - name: "join clause with one side of the join operator not containing a column", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "table1", - Alias: "t1", - }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeInner, - }, - Table: &tree.TableOrSubqueryTable{ - Name: "table2", - Alias: "t2", - }, - Constraint: &tree.ExpressionBinaryComparison{ - Left: &tree.ExpressionColumn{ - Table: "t1", - Column: "col1", - }, - Operator: tree.ComparisonOperatorEqual, - Right: &tree.ExpressionLiteral{ - Value: "'value'", - }, - }, - }, - }, - }, - wantPanic: true, - }, - { - name: "join clause with only 1 column as the condition", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "table1", - Alias: "t1", - }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeInner, - }, - Table: &tree.TableOrSubqueryTable{ - Name: "table2", - Alias: "t2", - }, - Constraint: &tree.ExpressionColumn{ - Table: "t1", - Column: "col1", - }, - }, - }, - }, - wantPanic: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - j := &tree.JoinClause{ - TableOrSubquery: tt.fields.TableOrSubquery, - Joins: tt.fields.Joins, - } - - if tt.wantPanic { - defer func() { - if r := recover(); r == nil { - t.Errorf("JoinClause.ToSQL() should have panicked") - } - }() - } - - got := j.ToSQL() - if tt.wantPanic { - return - } - - if !compareIgnoringWhitespace(got, tt.want) { - t.Errorf("JoinClause.ToSQL() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/parse/sql/tree/join-clause.go b/parse/sql/tree/join.go similarity index 89% rename from parse/sql/tree/join-clause.go rename to parse/sql/tree/join.go index bb0503f7e..0f3436806 100644 --- a/parse/sql/tree/join-clause.go +++ b/parse/sql/tree/join.go @@ -6,6 +6,7 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) +// TODO: update this docs to reflect the current state of the code /* From the SQLite documentation: If the join-operator is "CROSS JOIN", "INNER JOIN", "JOIN" or a comma (",") and there is no ON or USING clause, @@ -47,45 +48,11 @@ From the SQLite documentation: In other words, the FROM clause (A join-op-1 B join-op-2 C) is computed as ((A join-op-1 B) join-op-2 C). */ -type JoinClause struct { - node - - TableOrSubquery TableOrSubquery - Joins []*JoinPredicate -} - -func (j *JoinClause) Accept(v AstVisitor) any { - return v.VisitJoinClause(j) -} - -func (j *JoinClause) Walk(w AstListener) error { - return run( - w.EnterJoinClause(j), - walk(w, j.TableOrSubquery), - walkMany(w, j.Joins), - w.ExitJoinClause(j), - ) -} - -func (j *JoinClause) ToSQL() string { - if j.TableOrSubquery == nil { - panic("join table or subquery cannot be nil") - } - - stmt := sqlwriter.NewWriter() - stmt.WriteString(j.TableOrSubquery.ToSQL()) - for _, join := range j.Joins { - stmt.WriteString(join.ToSQL()) - } - - return stmt.String() -} - type JoinPredicate struct { node JoinOperator *JoinOperator - Table TableOrSubquery + Table Relation Constraint Expression } diff --git a/parse/sql/tree/limit.go b/parse/sql/tree/limit.go index 8b5c99903..0d8742b5b 100644 --- a/parse/sql/tree/limit.go +++ b/parse/sql/tree/limit.go @@ -17,7 +17,6 @@ func (l *Limit) Accept(v AstVisitor) any { return v.VisitLimit(l) } -// Accept implements the Visitor interface. func (l *Limit) Walk(w AstListener) error { return run( w.EnterLimit(l), diff --git a/parse/sql/tree/relation.go b/parse/sql/tree/relation.go new file mode 100644 index 000000000..9aa891c6b --- /dev/null +++ b/parse/sql/tree/relation.go @@ -0,0 +1,145 @@ +package tree + +import ( + sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" +) + +// Relation is one of: +// - RelationTable +// - RelationSubquery +// - RelationJoin +type Relation interface { + AstNode + + relation() +} + +type RelationTable struct { + node + + schema string + Name string + Alias string +} + +func (t *RelationTable) Accept(v AstVisitor) any { + return v.VisitRelationTable(t) +} + +func (t *RelationTable) Walk(w AstListener) error { + return run( + w.EnterRelationTable(t), + w.ExitRelationTable(t), + ) +} + +func (t *RelationTable) ToSQL() string { + if t.Name == "" { + panic("table name is empty") + } + + stmt := sqlwriter.NewWriter() + + if t.schema != "" { + stmt.Token.Space() + stmt.WriteIdentNoSpace(t.schema) + stmt.Token.Period() + stmt.WriteIdentNoSpace(t.Name) + stmt.Token.Space() + } else { + stmt.WriteIdentNoSpace(t.Name) + } + + if t.Alias != "" { + stmt.Token.As() + stmt.WriteIdentNoSpace(t.Alias) + + } + + return stmt.String() +} +func (t *RelationTable) relation() {} + +// SetSchema sets the schema of the table. +// It should not be called by the parser, and is meant to be called +// by processes after parsing. +func (t *RelationTable) SetSchema(schema string) { + t.schema = schema +} + +type RelationSubquery struct { + node + + Select *SelectStmt + Alias string +} + +func (t *RelationSubquery) Accept(v AstVisitor) any { + return v.VisitRelationSubquery(t) +} + +func (t *RelationSubquery) Walk(w AstListener) error { + return run( + w.EnterRelationSubquery(t), + walk(w, t.Select), + w.ExitRelationSubquery(t), + ) +} + +func (t *RelationSubquery) ToSQL() string { + if t.Select == nil { + panic("select is nil") + } + + stmt := sqlwriter.NewWriter() + stmt.Token.Lparen() + + selectString := t.Select.ToSQL() + stmt.WriteString(selectString) + stmt.Token.Rparen() + + if t.Alias != "" { + stmt.Token.As() + stmt.WriteIdent(t.Alias) + + } + + return stmt.String() +} +func (t *RelationSubquery) relation() {} + +type RelationJoin struct { + node + + Relation Relation + Joins []*JoinPredicate +} + +func (t *RelationJoin) Accept(v AstVisitor) any { + return v.VisitRelationJoin(t) +} + +func (t *RelationJoin) Walk(w AstListener) error { + return run( + w.EnterRelationJoin(t), + walk(w, t.Relation), + walkMany(w, t.Joins), + w.ExitRelationJoin(t), + ) +} + +func (t *RelationJoin) relation() {} + +func (t *RelationJoin) ToSQL() string { + if t.Relation == nil { + panic("join table or subquery cannot be nil") + } + + stmt := sqlwriter.NewWriter() + stmt.WriteString(t.Relation.ToSQL()) + for _, join := range t.Joins { + stmt.WriteString(join.ToSQL()) + } + + return stmt.String() +} diff --git a/parse/sql/tree/relation_test.go b/parse/sql/tree/relation_test.go new file mode 100644 index 000000000..6d3bba875 --- /dev/null +++ b/parse/sql/tree/relation_test.go @@ -0,0 +1,253 @@ +package tree_test + +import ( + "testing" + + "github.com/kwilteam/kwil-db/parse/sql/tree" +) + +func TestRelation_ToSQL(t *testing.T) { + type fields struct { + Relation tree.Relation + Schema string // optional, only for RelationTable + } + tests := []struct { + name string + fields fields + want string + wantPanic bool + }{ + { + name: "valid table", + fields: fields{ + Relation: &tree.RelationTable{ + Name: "foo", + Alias: "f", + }, + }, + want: `"foo" AS "f"`, + }, + { + name: "no table name", + fields: fields{ + Relation: &tree.RelationTable{ + Alias: "f", + }, + }, + wantPanic: true, + }, + { + name: "subquery", + fields: fields{ + Relation: &tree.RelationSubquery{ + Select: &tree.SelectStmt{ + SelectCores: []*tree.SelectCore{ + { + SelectType: tree.SelectTypeAll, + From: &tree.FromClause{ + Relation: &tree.RelationTable{ + Name: "foo", + }, + }, + }, + }, + }, + }, + }, + want: `(SELECT * FROM "foo")`, + }, + { + name: "join", + fields: fields{ + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "foo", + }, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeLeft, + Outer: true, + }, + Table: &tree.RelationTable{ + Name: "bar", + }, + Constraint: &tree.ExpressionBinaryComparison{ + Left: &tree.ExpressionColumn{Column: "foo"}, + Operator: tree.ComparisonOperatorEqual, + Right: &tree.ExpressionColumn{Column: "bar"}, + }, + }, + }, + }, + }, + want: `"foo" LEFT OUTER JOIN "bar" ON "foo" = "bar"`, + }, + { + name: "join clause with one join predicate", + fields: fields{ + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "table1", + Alias: "t1", + }, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeInner, + }, + Table: &tree.RelationTable{ + Name: "table2", + Alias: "t2", + }, + Constraint: &tree.ExpressionBinaryComparison{ + Left: &tree.ExpressionColumn{ + Table: "t1", + Column: "col1", + }, + Operator: tree.ComparisonOperatorEqual, + Right: &tree.ExpressionColumn{ + Table: "t2", + Column: "col2", + }, + }, + }, + }, + }, + }, + want: `"table1" AS "t1" INNER JOIN "table2" AS "t2" ON "t1"."col1" = "t2"."col2"`, + }, + { + name: "join clause with greater than one join predicate", + fields: fields{ + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "table1", + Alias: "t1", + }, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeInner, + }, + Table: &tree.RelationTable{ + Name: "table2", + Alias: "t2", + }, + Constraint: &tree.ExpressionBinaryComparison{ + Left: &tree.ExpressionColumn{ + Table: "t1", + Column: "col1", + }, + Operator: tree.ComparisonOperatorGreaterThan, + Right: &tree.ExpressionColumn{ + Table: "t2", + Column: "col2", + }, + }, + }, + }, + }, + }, + wantPanic: true, + }, + { + name: "join clause with one side of the join operator not containing a column", + fields: fields{ + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "table1", + Alias: "t1", + }, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeInner, + }, + Table: &tree.RelationTable{ + Name: "table2", + Alias: "t2", + }, + Constraint: &tree.ExpressionBinaryComparison{ + Left: &tree.ExpressionColumn{ + Table: "t1", + Column: "col1", + }, + Operator: tree.ComparisonOperatorEqual, + Right: &tree.ExpressionLiteral{ + Value: "'value'", + }, + }, + }, + }, + }, + }, + wantPanic: true, + }, + { + name: "join clause with only 1 column as the condition", + fields: fields{ + Relation: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "table1", + Alias: "t1", + }, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeInner, + }, + Table: &tree.RelationTable{ + Name: "table2", + Alias: "t2", + }, + Constraint: &tree.ExpressionColumn{ + Table: "t1", + Column: "col1", + }, + }, + }, + }, + }, + wantPanic: true, + }, + { + name: "schema namespace", + fields: fields{ + Relation: &tree.RelationTable{ + Name: "foo", + Alias: "f", + }, + Schema: "baz", + }, + want: `"baz"."foo" AS "f"`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.wantPanic { + defer func() { + if r := recover(); r == nil { + t.Errorf("Relation.ToSQL() should have panicked") + } + }() + } + + tr := tt.fields.Relation + + if tt.fields.Schema != "" { + trt := tr.(*tree.RelationTable) + trt.SetSchema(tt.fields.Schema) + } + + got := tr.ToSQL() + if tt.wantPanic { + return + } + + if !compareIgnoringWhitespace(got, tt.want) { + t.Errorf("Relation.ToSQL() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/parse/sql/tree/result-column.go b/parse/sql/tree/result-column.go index fed4f9b36..e86880d55 100644 --- a/parse/sql/tree/result-column.go +++ b/parse/sql/tree/result-column.go @@ -10,6 +10,7 @@ type ResultColumn interface { Walk(w AstListener) error } +// ResultColumnStar represents a wildcard column, i.e. `*`. type ResultColumnStar struct { node } @@ -29,6 +30,7 @@ func (r *ResultColumnStar) Walk(w AstListener) error { ) } +// ResultColumnExpression represents a result column with an expression and an optional alias. type ResultColumnExpression struct { node @@ -58,6 +60,8 @@ func (r *ResultColumnExpression) Walk(w AstListener) error { ) } +// ResultColumnTable represents a table name with a star, i.e. `table.*`. +// Or qualified star? type ResultColumnTable struct { node diff --git a/parse/sql/tree/select.go b/parse/sql/tree/select.go index 6a555371d..e52470af5 100644 --- a/parse/sql/tree/select.go +++ b/parse/sql/tree/select.go @@ -162,7 +162,7 @@ func (s SelectType) Valid() error { type FromClause struct { node - JoinClause *JoinClause // the relation + Relation Relation } func (f *FromClause) Accept(v AstVisitor) any { @@ -172,7 +172,7 @@ func (f *FromClause) Accept(v AstVisitor) any { func (f *FromClause) Walk(w AstListener) error { return run( w.EnterFromClause(f), - walk(w, f.JoinClause), + walk(w, f.Relation), w.ExitFromClause(f), ) } @@ -180,7 +180,7 @@ func (f *FromClause) Walk(w AstListener) error { func (f *FromClause) ToSQL() string { stmt := sqlwriter.NewWriter() stmt.Token.From() - stmt.WriteString(f.JoinClause.ToSQL()) + stmt.WriteString(f.Relation.ToSQL()) return stmt.String() } diff --git a/parse/sql/tree/select_test.go b/parse/sql/tree/select_test.go index fdc174f52..5a5af2a17 100644 --- a/parse/sql/tree/select_test.go +++ b/parse/sql/tree/select_test.go @@ -31,10 +31,8 @@ func TestSelect_ToSQL(t *testing.T) { &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "bar"}}, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, + Relation: &tree.RelationTable{ + Name: "foo", }, }, Where: &tree.ExpressionBinaryComparison{ diff --git a/parse/sql/tree/table-or-subquery.go b/parse/sql/tree/table-or-subquery.go deleted file mode 100644 index c803bad09..000000000 --- a/parse/sql/tree/table-or-subquery.go +++ /dev/null @@ -1,177 +0,0 @@ -package tree - -import ( - sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" -) - -// TableOrSubquery is any of: -// - TableOrSubqueryTable -// - TableOrSubquerySelect -// - TableOrSubqueryList -type TableOrSubquery interface { - ToSQL() string - tableOrSubquery() - Walk(w AstListener) error -} - -type TableOrSubqueryTable struct { - node - - schema string - Name string - Alias string -} - -func (t *TableOrSubqueryTable) Accept(v AstVisitor) any { - return v.VisitTableOrSubqueryTable(t) -} - -func (t *TableOrSubqueryTable) Walk(w AstListener) error { - return run( - w.EnterTableOrSubqueryTable(t), - w.ExitTableOrSubqueryTable(t), - ) -} - -func (t *TableOrSubqueryTable) ToSQL() string { - if t.Name == "" { - panic("table name is empty") - } - - stmt := sqlwriter.NewWriter() - - if t.schema != "" { - stmt.Token.Space() - stmt.WriteIdentNoSpace(t.schema) - stmt.Token.Period() - stmt.WriteIdentNoSpace(t.Name) - stmt.Token.Space() - } else { - stmt.WriteIdentNoSpace(t.Name) - } - - if t.Alias != "" { - stmt.Token.As() - stmt.WriteIdentNoSpace(t.Alias) - - } - - return stmt.String() -} -func (t *TableOrSubqueryTable) tableOrSubquery() {} - -// SetSchema sets the schema of the table. -// It should not be called by the parser, and is meant to be called -// by processes after parsing. -func (t *TableOrSubqueryTable) SetSchema(schema string) { - t.schema = schema -} - -type TableOrSubquerySelect struct { - node - - Select *SelectStmt - Alias string -} - -func (t *TableOrSubquerySelect) Accept(v AstVisitor) any { - return v.VisitTableOrSubquerySelect(t) -} - -func (t *TableOrSubquerySelect) Walk(w AstListener) error { - return run( - w.EnterTableOrSubquerySelect(t), - walk(w, t.Select), - w.ExitTableOrSubquerySelect(t), - ) -} - -func (t *TableOrSubquerySelect) ToSQL() string { - if t.Select == nil { - panic("select is nil") - } - - stmt := sqlwriter.NewWriter() - stmt.Token.Lparen() - - selectString := t.Select.ToSQL() - stmt.WriteString(selectString) - stmt.Token.Rparen() - - if t.Alias != "" { - stmt.Token.As() - stmt.WriteIdent(t.Alias) - - } - - return stmt.String() -} -func (t *TableOrSubquerySelect) tableOrSubquery() {} - -type TableOrSubqueryList struct { - node - - TableOrSubqueries []TableOrSubquery -} - -func (t *TableOrSubqueryList) Accept(v AstVisitor) any { - return v.VisitTableOrSubqueryList(t) -} - -func (t *TableOrSubqueryList) Walk(w AstListener) error { - return run( - w.EnterTableOrSubqueryList(t), - walkMany(w, t.TableOrSubqueries), - w.ExitTableOrSubqueryList(t), - ) -} - -func (t *TableOrSubqueryList) ToSQL() string { - if len(t.TableOrSubqueries) == 0 { - panic("table or subquery list is empty") - } - - stmt := sqlwriter.NewWriter() - - stmt.WriteParenList(len(t.TableOrSubqueries), func(i int) { - stmt.WriteString(t.TableOrSubqueries[i].ToSQL()) - }) - - return stmt.String() -} -func (t *TableOrSubqueryList) tableOrSubquery() {} - -type TableOrSubqueryJoin struct { - node - - JoinClause *JoinClause -} - -func (t *TableOrSubqueryJoin) Accept(v AstVisitor) any { - return v.VisitTableOrSubqueryJoin(t) -} - -func (t *TableOrSubqueryJoin) Walk(w AstListener) error { - return run( - w.EnterTableOrSubqueryJoin(t), - walk(w, t.JoinClause), - w.ExitTableOrSubqueryJoin(t), - ) -} - -func (t *TableOrSubqueryJoin) tableOrSubquery() {} - -func (t *TableOrSubqueryJoin) ToSQL() string { - - if t.JoinClause == nil { - panic("join clause is nil") - } - - stmt := sqlwriter.NewWriter() - stmt.Token.Lparen() - stmt.WriteString(t.JoinClause.ToSQL()) - stmt.Token.Rparen() - - return stmt.String() - -} diff --git a/parse/sql/tree/table-or-subquery_test.go b/parse/sql/tree/table-or-subquery_test.go deleted file mode 100644 index c7194ac8b..000000000 --- a/parse/sql/tree/table-or-subquery_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package tree_test - -import ( - "testing" - - "github.com/kwilteam/kwil-db/parse/sql/tree" -) - -func TestTableOrSubqueryTable_ToSQL(t *testing.T) { - type fields struct { - TableOrSubquery tree.TableOrSubquery - Schema string // optional, only for TableOrSubqueryTable - } - tests := []struct { - name string - fields fields - want string - wantPanic bool - }{ - { - name: "valid table", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - Alias: "f", - }, - }, - want: `"foo" AS "f"`, - }, - { - name: "no table name", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Alias: "f", - }, - }, - wantPanic: true, - }, - { - name: "subquery", - fields: fields{ - TableOrSubquery: &tree.TableOrSubquerySelect{ - Select: &tree.SelectStmt{ - SelectCores: []*tree.SelectCore{ - { - SelectType: tree.SelectTypeAll, - From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, - }, - }, - }, - }, - }, - }, - }, - want: `(SELECT * FROM "foo")`, - }, - { - name: "list", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryList{ - TableOrSubqueries: []tree.TableOrSubquery{ - &tree.TableOrSubqueryTable{ - Name: "foo", - }, - &tree.TableOrSubquerySelect{ - Select: &tree.SelectStmt{ - SelectCores: []*tree.SelectCore{ - { - SelectType: tree.SelectTypeAll, - From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - want: `("foo", (SELECT * FROM "foo"))`, - }, - { - name: "empty list", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryList{}, - }, - wantPanic: true, - }, - { - name: "join", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryJoin{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeLeft, - Outer: true, - }, - Table: &tree.TableOrSubqueryTable{ - Name: "bar", - }, - Constraint: &tree.ExpressionBinaryComparison{ - Left: &tree.ExpressionColumn{Column: "foo"}, - Operator: tree.ComparisonOperatorEqual, - Right: &tree.ExpressionColumn{Column: "bar"}, - }, - }, - }, - }, - }, - }, - want: `("foo" LEFT OUTER JOIN "bar" ON "foo" = "bar")`, - }, - { - name: "schema namespace", - fields: fields{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - Alias: "f", - }, - Schema: "baz", - }, - want: `"baz"."foo" AS "f"`, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if tt.wantPanic { - defer func() { - if r := recover(); r == nil { - t.Errorf("TableOrSubquery.ToSQL() should have panicked") - } - }() - } - - tr := tt.fields.TableOrSubquery - - if tt.fields.Schema != "" { - trt := tr.(*tree.TableOrSubqueryTable) - trt.SetSchema(tt.fields.Schema) - } - - got := tr.ToSQL() - if tt.wantPanic { - return - } - - if !compareIgnoringWhitespace(got, tt.want) { - t.Errorf("TableOrSubquery.ToSQL() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/parse/sql/tree/update_test.go b/parse/sql/tree/update_test.go index 18117d272..172d2b340 100644 --- a/parse/sql/tree/update_test.go +++ b/parse/sql/tree/update_test.go @@ -43,10 +43,8 @@ func TestUpdate_ToSQL(t *testing.T) { &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "bar"}}, }, From: &tree.FromClause{ - JoinClause: &tree.JoinClause{ - TableOrSubquery: &tree.TableOrSubqueryTable{ - Name: "foo", - }, + Relation: &tree.RelationTable{ + Name: "foo", }, }, }, diff --git a/test/go.mod b/test/go.mod index ff6131339..7eea82f00 100644 --- a/test/go.mod +++ b/test/go.mod @@ -16,7 +16,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/drhodes/golorem v0.0.0-20220328165741-da82e5b29246 github.com/ethereum/go-ethereum v1.13.8 - github.com/kwilteam/kuneiform v0.6.0 + github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a github.com/kwilteam/kwil-db v0.7.0-beta.0.20240301172606-26b70b87eba0 github.com/kwilteam/kwil-db/core v0.1.0 github.com/stretchr/testify v1.8.4 @@ -136,8 +136,8 @@ require ( github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/kwilteam/action-grammar-go v0.1.1 // indirect - github.com/kwilteam/kwil-db/parse v0.1.1 // indirect - github.com/kwilteam/sql-grammar-go v0.1.0 // indirect + github.com/kwilteam/kwil-db/parse v0.1.2 // indirect + github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect diff --git a/test/go.sum b/test/go.sum index de1efb31c..9f082a534 100644 --- a/test/go.sum +++ b/test/go.sum @@ -474,10 +474,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/kuneiform v0.6.0 h1:Y8VWrJN1cl9idqX+LBSQd+c3m/JjDDRInBSKq3i27NY= -github.com/kwilteam/kuneiform v0.6.0/go.mod h1:b3Ce6falEDBQ0xgLpa/hjFjUQoD8aFEg96yewS/3wzg= -github.com/kwilteam/sql-grammar-go v0.1.0 h1:rSS7DER9PWVDmFwNyoInG5oXrn+E9UrZkjref84L4Qk= -github.com/kwilteam/sql-grammar-go v0.1.0/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= +github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7jB33zFgCXxqCwea12LcPUiNmpghLTfU9Eg= +github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7 h1:YTuzZjTRE8r9FzIdSpAn9xaTkz8ANyuJpF8LxTO39Us= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= From 4a0e2165e016e2356a5a0ccedd8d24de353bed53 Mon Sep 17 00:00:00 2001 From: Yaiba <4yaiba@gmail.com> Date: Fri, 22 Mar 2024 14:57:01 -0500 Subject: [PATCH 3/7] parse: change statement structure --- go.mod | 2 +- go.sum | 4 +- internal/engine/execution/procedure.go | 4 +- .../attributes/select_core_test.go | 6 +- internal/engine/sqlanalyzer/clean/clean.go | 2 +- internal/engine/sqlanalyzer/clean/walker.go | 19 +- .../engine/sqlanalyzer/mutative/walker.go | 6 +- internal/engine/sqlanalyzer/order/order.go | 12 +- .../sqlanalyzer/parameters/visitor_test.go | 6 +- internal/engine/sqlanalyzer/schema/walker.go | 2 +- .../engine/sqlanalyzer/schema/walker_test.go | 6 +- .../engine/sqlanalyzer/utils/utils_test.go | 8 +- parse/go.mod | 2 +- parse/go.sum | 4 +- parse/sql/ast_builder.go | 106 +-- parse/sql/parser.go | 14 +- parse/sql/parser_test.go | 671 +++++++++--------- parse/sql/tree/CTE.go | 2 +- parse/sql/tree/CTE_test.go | 18 +- parse/sql/tree/ast.go | 19 + parse/sql/tree/ast_listener.go | 200 +++--- parse/sql/tree/ast_visitor.go | 48 +- parse/sql/tree/delete.go | 40 +- parse/sql/tree/delete_test.go | 14 +- parse/sql/tree/expression.go | 17 +- parse/sql/tree/expression_test.go | 20 +- parse/sql/tree/insert.go | 42 +- parse/sql/tree/insert_test.go | 20 +- parse/sql/tree/relation.go | 4 +- parse/sql/tree/relation_test.go | 8 +- parse/sql/tree/result-column.go | 6 - parse/sql/tree/select.go | 66 +- parse/sql/tree/select_test.go | 20 +- parse/sql/tree/update.go | 46 +- parse/sql/tree/update_test.go | 22 +- test/go.mod | 2 +- test/go.sum | 4 +- 37 files changed, 702 insertions(+), 790 deletions(-) diff --git a/go.mod b/go.mod index 36dc80415..5adcc4600 100644 --- a/go.mod +++ b/go.mod @@ -93,7 +93,7 @@ require ( github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/kwilteam/action-grammar-go v0.1.1 // indirect - github.com/kwilteam/sql-grammar-go v0.1.0 // indirect + github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect diff --git a/go.sum b/go.sum index fdb0db4c4..14a4e6507 100644 --- a/go.sum +++ b/go.sum @@ -278,8 +278,8 @@ github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7j github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 h1:YiPBu0pOeYOtOVfwKQqdWB07SUef9LvngF4bVFD+x34= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7/go.mod h1:+BrFrV+3qcdYIfptqjwatE5gT19azuRHJzw77wMPY8c= -github.com/kwilteam/sql-grammar-go v0.1.0 h1:rSS7DER9PWVDmFwNyoInG5oXrn+E9UrZkjref84L4Qk= -github.com/kwilteam/sql-grammar-go v0.1.0/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e h1:N7/8ZzPZ5QopHx1ZfPluA5nFNPqbc+LDpuyblptFlWk= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= diff --git a/internal/engine/execution/procedure.go b/internal/engine/execution/procedure.go index 96e41ca18..6d3402cdb 100644 --- a/internal/engine/execution/procedure.go +++ b/internal/engine/execution/procedure.go @@ -471,8 +471,8 @@ func makeExecutables(exprs []tree.Expression) ([]evaluatable, error) { // statements This query needs to be run in "simple" execution mode // rather than "extended" execution mode, which asks the database for // OID (placeholder types) that it can't know since there's no FOR table. - selectTree := &tree.Select{ - SelectStmt: &tree.SelectStmt{ + selectTree := &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, diff --git a/internal/engine/sqlanalyzer/attributes/select_core_test.go b/internal/engine/sqlanalyzer/attributes/select_core_test.go index 2c051f8d3..6c61605d5 100644 --- a/internal/engine/sqlanalyzer/attributes/select_core_test.go +++ b/internal/engine/sqlanalyzer/attributes/select_core_test.go @@ -178,18 +178,18 @@ func TestGetSelectCoreRelationAttributes(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ast, err := sqlparser.Parse(tt.stmt) + stmt, err := sqlparser.Parse(tt.stmt) if err != nil { t.Errorf("GetSelectCoreRelationAttributes() error = %v", err) return } - selectStmt, okj := ast.(*tree.Select) + selectStmt, okj := stmt.(*tree.SelectStmt) if !okj { t.Errorf("test case %s is not a select statement", tt.name) return } - got, err := attributes.GetSelectCoreRelationAttributes(selectStmt.SelectStmt.SelectCores[0], tt.tables) + got, err := attributes.GetSelectCoreRelationAttributes(selectStmt.Stmt.SelectCores[0], tt.tables) if (err != nil) != tt.wantErr { t.Errorf("GetSelectCoreRelationAttributes() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/internal/engine/sqlanalyzer/clean/clean.go b/internal/engine/sqlanalyzer/clean/clean.go index 16a19490a..b97bdcc78 100644 --- a/internal/engine/sqlanalyzer/clean/clean.go +++ b/internal/engine/sqlanalyzer/clean/clean.go @@ -7,7 +7,7 @@ The walker in this package implements all the tree.Walker methods, even if it doesn't do anything. This is to ensure that if we need to add more cleaning / validation rules, we know that we've covered all the nodes. -For example, EnterDelete does nothing, but if we later set a limit on the amount of +For example, EnterDeleteStmt does nothing, but if we later set a limit on the amount of CTEs allowed, then we would add it there. */ package clean diff --git a/internal/engine/sqlanalyzer/clean/walker.go b/internal/engine/sqlanalyzer/clean/walker.go index 378c5b644..f0359bc81 100644 --- a/internal/engine/sqlanalyzer/clean/walker.go +++ b/internal/engine/sqlanalyzer/clean/walker.go @@ -43,12 +43,12 @@ func (s *StatementCleaner) EnterCTE(node *tree.CTE) (err error) { } // EnterDelete does nothing -func (s *StatementCleaner) EnterDelete(node *tree.Delete) (err error) { +func (s *StatementCleaner) EnterDeleteStmt(node *tree.DeleteStmt) (err error) { return nil } // EnterDeleteStmt does nothing -func (s *StatementCleaner) EnterDeleteStmt(node *tree.DeleteStmt) (err error) { +func (s *StatementCleaner) EnterDeleteCore(node *tree.DeleteCore) (err error) { return nil } @@ -160,12 +160,12 @@ func (s *StatementCleaner) EnterGroupBy(node *tree.GroupBy) (err error) { } // EnterInsert does nothing -func (s *StatementCleaner) EnterInsert(node *tree.Insert) (err error) { +func (s *StatementCleaner) EnterInsertStmt(node *tree.InsertStmt) (err error) { return nil } // EnterInsertStmt cleans the insert type, table, table alias, and columns -func (s *StatementCleaner) EnterInsertStmt(node *tree.InsertStmt) (err error) { +func (s *StatementCleaner) EnterInsertCore(node *tree.InsertCore) (err error) { err = node.InsertType.Valid() if err != nil { return wrapErr(ErrInvalidInsertType, err) @@ -290,7 +290,7 @@ func (s *StatementCleaner) EnterReturningClauseColumn(node *tree.ReturningClause } // EnterSelect does nothing -func (s *StatementCleaner) EnterSelect(node *tree.Select) (err error) { +func (s *StatementCleaner) EnterSelectStmt(node *tree.SelectStmt) (err error) { return nil } @@ -300,7 +300,7 @@ func (s *StatementCleaner) EnterSelectCore(node *tree.SelectCore) (err error) { } // EnterSelectStmt checks that, for each SelectCore besides the last, a compound operator is provided -func (s *StatementCleaner) EnterSelectStmt(node *tree.SelectStmt) (err error) { +func (s *StatementCleaner) EnterSelectStmtNoCte(node *tree.SelectStmtNoCte) (err error) { for _, core := range node.SelectCores[:len(node.SelectCores)-1] { if core.Compound == nil { return wrapErr(ErrInvalidCompoundOperator, errors.New("compound operator must be provided for all SelectCores except the last")) @@ -310,11 +310,6 @@ func (s *StatementCleaner) EnterSelectStmt(node *tree.SelectStmt) (err error) { return nil } -// EnterFromClause does nothing -func (s *StatementCleaner) EnterFromClause(node *tree.FromClause) (err error) { - return nil -} - // EnterCompoundOperator validates the compound operator func (s *StatementCleaner) EnterCompoundOperator(node *tree.CompoundOperator) (err error) { return wrapErr(ErrInvalidCompoundOperator, node.Operator.Valid()) @@ -367,7 +362,7 @@ func (s *StatementCleaner) EnterUpdateSetClause(node *tree.UpdateSetClause) (err } // EnterUpdate does nothing -func (s *StatementCleaner) EnterUpdate(node *tree.Update) (err error) { +func (s *StatementCleaner) EnterUpdateStmt(node *tree.UpdateStmt) (err error) { return nil } diff --git a/internal/engine/sqlanalyzer/mutative/walker.go b/internal/engine/sqlanalyzer/mutative/walker.go index e57ba349c..5ffa9bb87 100644 --- a/internal/engine/sqlanalyzer/mutative/walker.go +++ b/internal/engine/sqlanalyzer/mutative/walker.go @@ -14,17 +14,17 @@ type MutativityWalker struct { tree.AstListener } -func (m *MutativityWalker) EnterDeleteStmt(node *tree.DeleteStmt) error { +func (m *MutativityWalker) EnterDeleteCore(node *tree.DeleteCore) error { m.Mutative = true return nil } -func (m *MutativityWalker) EnterInsertStmt(node *tree.InsertStmt) error { +func (m *MutativityWalker) EnterInsertCore(node *tree.InsertCore) error { m.Mutative = true return nil } -func (m *MutativityWalker) EnterUpdateStmt(node *tree.UpdateStmt) error { +func (m *MutativityWalker) EnterUpdateCore(node *tree.UpdateCore) error { m.Mutative = true return nil } diff --git a/internal/engine/sqlanalyzer/order/order.go b/internal/engine/sqlanalyzer/order/order.go index e9855049d..25deed3f2 100644 --- a/internal/engine/sqlanalyzer/order/order.go +++ b/internal/engine/sqlanalyzer/order/order.go @@ -81,7 +81,7 @@ func (o *orderingWalker) EnterRelationSubquery(node *tree.RelationSubquery) erro } // put this on exit so we can search the whole statement for used tables -func (o *orderingWalker) ExitSelectStmt(node *tree.SelectStmt) error { +func (o *orderingWalker) ExitSelectStmtNoCte(node *tree.SelectStmtNoCte) error { var terms []*tree.OrderingTerm var err error switch len(node.SelectCores) { @@ -159,7 +159,7 @@ func orderSimpleStatement(stmt *tree.SelectCore, tables []*common.Table) ([]*tre // we will now get a list of all tables that are renamed to the used aliases // this allows us to search for them by their alias, and not their real name. - usedTables, err := utils.GetUsedTables(stmt.From.Relation) + usedTables, err := utils.GetUsedTables(stmt.From) if err != nil { return nil, fmt.Errorf("error getting used tables: %w", err) } @@ -252,11 +252,11 @@ func containsAggregateFunc(ret tree.ResultColumn) (bool, error) { } return nil }, - FuncEnterSelectStmt: func(p0 *tree.SelectStmt) error { + FuncEnterSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { depth++ return nil }, - FuncExitSelectStmt: func(p0 *tree.SelectStmt) error { + FuncExitSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { depth-- return nil }, @@ -316,11 +316,11 @@ func containsGroupBy(stmt *tree.SelectCore) (bool, error) { } return nil }, - FuncEnterSelectStmt: func(p0 *tree.SelectStmt) error { + FuncEnterSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { depth++ return nil }, - FuncExitSelectStmt: func(p0 *tree.SelectStmt) error { + FuncExitSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { depth-- return nil }, diff --git a/internal/engine/sqlanalyzer/parameters/visitor_test.go b/internal/engine/sqlanalyzer/parameters/visitor_test.go index a57b17f71..9c9f0b56b 100644 --- a/internal/engine/sqlanalyzer/parameters/visitor_test.go +++ b/internal/engine/sqlanalyzer/parameters/visitor_test.go @@ -55,14 +55,14 @@ func Test_NumberedParameters(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ast, err := sqlparser.Parse(tt.stmt) + stmt, err := sqlparser.Parse(tt.stmt) if err != nil { t.Errorf("Parameters() = %v, want %v", err, tt.wantParams) } v := parameters.NewParametersWalker() - if err := ast.Walk(v); err != nil { + if err := stmt.Walk(v); err != nil { t.Errorf("Parameters() = %v, want %v", err, tt.wantParams) } @@ -78,7 +78,7 @@ func Test_NumberedParameters(t *testing.T) { } } - str, err := tree.SafeToSQL(ast) + str, err := tree.SafeToSQL(stmt) if err != nil { t.Errorf("Parameters() = %v, want %v", err, tt.wantParams) } diff --git a/internal/engine/sqlanalyzer/schema/walker.go b/internal/engine/sqlanalyzer/schema/walker.go index 5e1ad1f52..e245b6bbc 100644 --- a/internal/engine/sqlanalyzer/schema/walker.go +++ b/internal/engine/sqlanalyzer/schema/walker.go @@ -34,7 +34,7 @@ func (s *SchemaWalker) set(table string, st settable) { st.SetSchema(s.schema) } -func (w *SchemaWalker) EnterInsertStmt(stmt *tree.InsertStmt) error { +func (w *SchemaWalker) EnterInsertCore(stmt *tree.InsertCore) error { w.set(stmt.Table, stmt) return nil } diff --git a/internal/engine/sqlanalyzer/schema/walker_test.go b/internal/engine/sqlanalyzer/schema/walker_test.go index 1acba6817..ac277c521 100644 --- a/internal/engine/sqlanalyzer/schema/walker_test.go +++ b/internal/engine/sqlanalyzer/schema/walker_test.go @@ -56,15 +56,15 @@ func Test_PGSchemas(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ast, err := sqlparser.Parse(tt.stmt) + stmt, err := sqlparser.Parse(tt.stmt) require.NoError(t, err) w := schema.NewSchemaWalker(tt.schema) - err = ast.Walk(w) + err = stmt.Walk(w) require.NoError(t, err) - got, err := tree.SafeToSQL(ast) + got, err := tree.SafeToSQL(stmt) require.NoError(t, err) require.Equal(t, removeWhitespace(tt.want), removeWhitespace(got)) diff --git a/internal/engine/sqlanalyzer/utils/utils_test.go b/internal/engine/sqlanalyzer/utils/utils_test.go index 3ed4978e4..bff5e80dd 100644 --- a/internal/engine/sqlanalyzer/utils/utils_test.go +++ b/internal/engine/sqlanalyzer/utils/utils_test.go @@ -45,14 +45,14 @@ func Test_JoinSearch(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ast, err := sqlparser.Parse(tt.stmt) + stmt, err := sqlparser.Parse(tt.stmt) require.NoError(t, err) - topSelect, ok := ast.(*tree.Select) + topSelect, ok := stmt.(*tree.SelectStmt) require.True(t, ok) - require.Equal(t, len(topSelect.SelectStmt.SelectCores), 1) + require.Equal(t, len(topSelect.Stmt.SelectCores), 1) - tbls, err := utils.GetUsedTables(topSelect.SelectStmt.SelectCores[0].From.Relation) + tbls, err := utils.GetUsedTables(topSelect.Stmt.SelectCores[0].From) require.NoError(t, err) require.EqualValues(t, tt.tables, tbls) diff --git a/parse/go.mod b/parse/go.mod index 23716bade..85f79906d 100644 --- a/parse/go.mod +++ b/parse/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/antlr4-go/antlr/v4 v4.13.0 github.com/kwilteam/action-grammar-go v0.1.1 - github.com/kwilteam/sql-grammar-go v0.1.0 + github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e github.com/pganalyze/pg_query_go/v5 v5.1.0 // This is only for unit testing github.com/stretchr/testify v1.8.4 ) diff --git a/parse/go.sum b/parse/go.sum index ead01b8d2..3e0b7ef98 100644 --- a/parse/go.sum +++ b/parse/go.sum @@ -16,8 +16,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/sql-grammar-go v0.1.0 h1:rSS7DER9PWVDmFwNyoInG5oXrn+E9UrZkjref84L4Qk= -github.com/kwilteam/sql-grammar-go v0.1.0/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e h1:N7/8ZzPZ5QopHx1ZfPluA5nFNPqbc+LDpuyblptFlWk= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/pganalyze/pg_query_go/v5 v5.1.0 h1:MlxQqHZnvA3cbRQYyIrjxEjzo560P6MyTgtlaf3pmXg= github.com/pganalyze/pg_query_go/v5 v5.1.0/go.mod h1:FsglvxidZsVN+Ltw3Ai6nTgPVcK2BPukH3jCDEqc1Ug= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/parse/sql/ast_builder.go b/parse/sql/ast_builder.go index 75fbcb952..dc4c997ba 100644 --- a/parse/sql/ast_builder.go +++ b/parse/sql/ast_builder.go @@ -73,8 +73,7 @@ func (v *astBuilder) VisitCommon_table_expression(ctx *sqlgrammar.Common_table_e } } - selectStmtCoreCtx := ctx.Select_stmt_core() - cte.Select = v.Visit(selectStmtCoreCtx).(*tree.SelectStmt) + cte.Select = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) return &cte } @@ -93,7 +92,7 @@ func (v *astBuilder) VisitCommon_table_stmt(ctx *sqlgrammar.Common_table_stmtCon return ctes } -func getInsertType(ctx *sqlgrammar.Insert_stmtContext) tree.InsertType { +func getInsertType(ctx *sqlgrammar.Insert_coreContext) tree.InsertType { return tree.InsertTypeInsert } @@ -273,12 +272,12 @@ func (v *astBuilder) VisitParenthesized_expr(ctx *sqlgrammar.Parenthesized_exprC } func (v *astBuilder) VisitSubquery(ctx *sqlgrammar.SubqueryContext) interface{} { - return v.Visit(ctx.Select_stmt_core()).(*tree.SelectStmt) + return v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) } // VisitSubquery_expr is called when visiting a subquery_expr, return *tree.ExpressionSelect func (v *astBuilder) VisitSubquery_expr(ctx *sqlgrammar.Subquery_exprContext) interface{} { - stmt := v.Visit(ctx.Subquery()).(*tree.SelectStmt) + stmt := v.Visit(ctx.Subquery()).(*tree.SelectStmtNoCte) expr := &tree.ExpressionSelect{ Select: stmt, } @@ -388,7 +387,7 @@ func (v *astBuilder) VisitIn_subquery_expr(ctx *sqlgrammar.In_subquery_exprConte if ctx.NOT_() != nil { expr.Operator = tree.ComparisonOperatorNotIn } - sub := v.Visit(ctx.Subquery()).(*tree.SelectStmt) + sub := v.Visit(ctx.Subquery()).(*tree.SelectStmtNoCte) expr.Right = &tree.ExpressionSelect{Select: sub} return expr } @@ -687,14 +686,9 @@ func (v *astBuilder) VisitQualified_table_name(ctx *sqlgrammar.Qualified_table_n return &result } -// VisitUpdate_stmt is called when visiting a update_stmt, return *tree.Update -func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interface{} { - t := tree.Update{} - var updateStmt tree.UpdateStmt - - if ctx.Common_table_stmt() != nil { - t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) - } +// VisitUpdate_core is called when visiting a update_core, return *tree.UpdateCore +func (v *astBuilder) VisitUpdate_core(ctx *sqlgrammar.Update_coreContext) interface{} { + var updateStmt tree.UpdateCore updateStmt.QualifiedTableName = v.Visit(ctx.Qualified_table_name()).(*tree.QualifiedTableName) @@ -704,9 +698,7 @@ func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interf } if ctx.FROM_() != nil { - updateStmt.From = &tree.FromClause{ - Relation: v.Visit(ctx.Relation()).(tree.Relation), - } + updateStmt.From = v.Visit(ctx.Relation()).(tree.Relation) } if ctx.WHERE_() != nil { @@ -717,18 +709,24 @@ func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interf updateStmt.Returning = v.Visit(ctx.Returning_clause()).(*tree.ReturningClause) } - t.UpdateStmt = &updateStmt - return &t + return &updateStmt } -func (v *astBuilder) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interface{} { - t := tree.Insert{} - var insertStmt tree.InsertStmt +// VisitUpdate_stmt is called when visiting a update_stmt, return *tree.UpdateStmt +func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interface{} { + t := tree.UpdateStmt{} if ctx.Common_table_stmt() != nil { t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) } + t.Core = v.Visit(ctx.Update_core()).(*tree.UpdateCore) + return &t +} + +func (v *astBuilder) VisitInsert_core(ctx *sqlgrammar.Insert_coreContext) interface{} { + var insertStmt tree.InsertCore + insertStmt.InsertType = getInsertType(ctx) insertStmt.Table = util.ExtractSQLName(ctx.Table_name().GetText()) if ctx.Table_alias() != nil { @@ -751,7 +749,17 @@ func (v *astBuilder) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interf insertStmt.ReturningClause = v.Visit(ctx.Returning_clause()).(*tree.ReturningClause) } - t.InsertStmt = &insertStmt + return &insertStmt +} + +func (v *astBuilder) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interface{} { + t := tree.InsertStmt{} + + if ctx.Common_table_stmt() != nil { + t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) + } + + t.Core = v.Visit(ctx.Insert_core()).(*tree.InsertCore) return &t } @@ -836,9 +844,9 @@ func (v *astBuilder) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryCon t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) } return &t - case ctx.Select_stmt_core() != nil: + case ctx.Select_stmt_no_cte() != nil: t := tree.RelationSubquery{ - Select: v.Visit(ctx.Select_stmt_core()).(*tree.SelectStmt), + Select: v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte), } if ctx.Table_alias() != nil { t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) @@ -908,26 +916,30 @@ func (v *astBuilder) VisitResult_column(ctx *sqlgrammar.Result_columnContext) in return nil } -// VisitDelete_stmt is called when visiting a delete_stmt, return *tree.Delete -func (v *astBuilder) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) interface{} { - t := tree.Delete{} - - if ctx.Common_table_stmt() != nil { - t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) - } - - stmt := tree.DeleteStmt{} - stmt.QualifiedTableName = v.Visit(ctx.Qualified_table_name()).(*tree.QualifiedTableName) +func (v *astBuilder) VisitDelete_core(ctx *sqlgrammar.Delete_coreContext) interface{} { + var deleteStmt tree.DeleteCore + deleteStmt.QualifiedTableName = v.Visit(ctx.Qualified_table_name()).(*tree.QualifiedTableName) if ctx.WHERE_() != nil { - stmt.Where = v.Visit(ctx.Expr()).(tree.Expression) + deleteStmt.Where = v.Visit(ctx.Expr()).(tree.Expression) } if ctx.Returning_clause() != nil { - stmt.Returning = v.Visit(ctx.Returning_clause()).(*tree.ReturningClause) + deleteStmt.Returning = v.Visit(ctx.Returning_clause()).(*tree.ReturningClause) } - t.DeleteStmt = &stmt + return &deleteStmt +} + +// VisitDelete_stmt is called when visiting a delete_stmt, return *tree.DeleteStmt +func (v *astBuilder) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) interface{} { + t := tree.DeleteStmt{} + + if ctx.Common_table_stmt() != nil { + t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) + } + + t.Core = v.Visit(ctx.Delete_core()).(*tree.DeleteCore) return &t } @@ -949,9 +961,7 @@ func (v *astBuilder) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interf } if ctx.FROM_() != nil { - t.From = &tree.FromClause{ - Relation: v.Visit(ctx.Relation()).(tree.Relation), - } + t.From = v.Visit(ctx.Relation()).(tree.Relation) } if ctx.GetWhereExpr() != nil { @@ -998,9 +1008,9 @@ func (v *astBuilder) VisitRelation(ctx *sqlgrammar.RelationContext) interface{} } } -// VisitSelect_stmt_core is called when visiting a select_stmt_core, return *tree.SelectStmt -func (v *astBuilder) VisitSelect_stmt_core(ctx *sqlgrammar.Select_stmt_coreContext) interface{} { - t := tree.SelectStmt{} +// VisitSelect_stmt_no_cte is called when visiting a select_stmt_core, return *tree.SelectStmtNoCte +func (v *astBuilder) VisitSelect_stmt_no_cte(ctx *sqlgrammar.Select_stmt_no_cteContext) interface{} { + t := tree.SelectStmtNoCte{} selectCores := make([]*tree.SelectCore, len(ctx.AllSelect_core())) // first select_core @@ -1027,15 +1037,15 @@ func (v *astBuilder) VisitSelect_stmt_core(ctx *sqlgrammar.Select_stmt_coreConte return &t } -// VisitSelect_stmt is called when visiting a select_stmt, return *tree.Select +// VisitSelect_stmt is called when visiting a select_stmt, return *tree.SelectStmt func (v *astBuilder) VisitSelect_stmt(ctx *sqlgrammar.Select_stmtContext) interface{} { - t := tree.Select{} + t := tree.SelectStmt{} if ctx.Common_table_stmt() != nil { t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) } - t.SelectStmt = v.Visit(ctx.Select_stmt_core()).(*tree.SelectStmt) + t.Stmt = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) return &t } @@ -1048,7 +1058,7 @@ func (v *astBuilder) VisitSql_stmt(ctx *sqlgrammar.Sql_stmtContext) interface{} return v.VisitChildren(ctx).([]tree.AstNode)[0] } -// VisitStatements is called first by Visitor.Visit +// VisitStatements is called when visiting a statements, return []tree.AstNode func (v *astBuilder) VisitStatements(ctx *sqlgrammar.StatementsContext) interface{} { // ParseContext will only have one Sql_stmt_listContext sqlStmtListContext := ctx.Sql_stmt_list(0) diff --git a/parse/sql/parser.go b/parse/sql/parser.go index ea6ff8447..d4f94a381 100644 --- a/parse/sql/parser.go +++ b/parse/sql/parser.go @@ -9,15 +9,15 @@ import ( "github.com/kwilteam/sql-grammar-go/sqlgrammar" ) -// Parse parses a raw sql string and returns a tree.ParseNode -func Parse(sql string) (ast tree.AstNode, err error) { +// Parse parses a raw sql string and returns a tree.Statement +func Parse(sql string) (ast tree.Statement, err error) { currentLine := 1 return ParseSql(sql, currentLine, nil, false, false) } -// ParseSql parses a single raw sql statement and returns tree.ParseNode +// ParseSql parses a single raw sql statement and returns tree.Statement func ParseSql(sql string, currentLine int, errorListener *ErrorListener, - trace bool, withPos bool) (ast tree.AstNode, err error) { + trace bool, withPos bool) (ast tree.Statement, err error) { var visitor *astBuilder if errorListener == nil { @@ -48,9 +48,7 @@ func ParseSql(sql string, currentLine int, errorListener *ErrorListener, }() visitor = newAstBuilder(astBuilderWithTrace(trace), astBuilderWithPos(withPos)) - - stmts := p.Statements() - result := visitor.Visit(stmts) + stmts := p.Statements().Accept(visitor).([]tree.AstNode) // since we only expect a single statement - return result.([]tree.AstNode)[0], err + return stmts[0].(tree.Statement), err } diff --git a/parse/sql/parser_test.go b/parse/sql/parser_test.go index 799e0b7eb..96343f5ed 100644 --- a/parse/sql/parser_test.go +++ b/parse/sql/parser_test.go @@ -33,9 +33,9 @@ func getResultColumnExprs(values ...string) []tree.ResultColumn { return t } -func genSelectUnaryExprTree(op tree.UnaryOperator, value string) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSelectUnaryExprTree(op tree.UnaryOperator, value string) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -53,9 +53,9 @@ func genSelectUnaryExprTree(op tree.UnaryOperator, value string) *tree.Select { } } -func genSelectColumnLiteralTree(value string) *tree.Select { - t := tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSelectColumnLiteralTree(value string) *tree.SelectStmt { + t := tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -70,9 +70,9 @@ func genSelectColumnLiteralTree(value string) *tree.Select { return &t } -func genSelectColumnStarTree() *tree.Select { - t := tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSelectColumnStarTree() *tree.SelectStmt { + t := tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -85,9 +85,9 @@ func genSelectColumnStarTree() *tree.Select { return &t } -func genSelectColumnTableTree(table string) *tree.Select { - t := tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSelectColumnTableTree(table string) *tree.SelectStmt { + t := tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -100,9 +100,9 @@ func genSelectColumnTableTree(table string) *tree.Select { return &t } -func genSimpleCompoundSelectTree(op tree.CompoundOperatorType) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleCompoundSelectTree(op tree.CompoundOperatorType) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -118,9 +118,9 @@ func genSimpleCompoundSelectTree(op tree.CompoundOperatorType) *tree.Select { } } -func genSimpleCollateSelectTree(collateType tree.CollationType, value string) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleCollateSelectTree(collateType tree.CollationType, value string) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -138,9 +138,9 @@ func genSimpleCollateSelectTree(collateType tree.CollationType, value string) *t } } -func genSimpleBinaryCompareSelectTree(op tree.BinaryOperator, leftValue, rightValue string) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleBinaryCompareSelectTree(op tree.BinaryOperator, leftValue, rightValue string) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -159,9 +159,9 @@ func genSimpleBinaryCompareSelectTree(op tree.BinaryOperator, leftValue, rightVa } } -func genSimplyArithmeticSelectTree(op tree.ArithmeticOperator, leftValue, rightValue string) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimplyArithmeticSelectTree(op tree.ArithmeticOperator, leftValue, rightValue string) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -180,13 +180,13 @@ func genSimplyArithmeticSelectTree(op tree.ArithmeticOperator, leftValue, rightV } } -func genSimpleStringCompareSelectTree(op tree.StringOperator, leftValue, rightValue, escape string) *tree.Select { +func genSimpleStringCompareSelectTree(op tree.StringOperator, leftValue, rightValue, escape string) *tree.SelectStmt { escapeExpr := tree.Expression(&tree.ExpressionLiteral{Value: escape}) if escape == "" { escapeExpr = nil } - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -209,13 +209,13 @@ func genSimpleStringCompareSelectTree(op tree.StringOperator, leftValue, rightVa func genSimpleCTETree(table, value string) *tree.CTE { return &tree.CTE{ Table: table, - Select: genSelectColumnLiteralTree(value).SelectStmt, + Select: genSelectColumnLiteralTree(value).Stmt, } } -func genSimpleExprNullSelectTree(value string, not bool) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleExprNullSelectTree(value string, not bool) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -235,9 +235,9 @@ func genSimpleExprNullSelectTree(value string, not bool) *tree.Select { } } -func genSimpleExprIsSelectTree(left string, right string, not bool) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleExprIsSelectTree(left string, right string, not bool) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -257,9 +257,9 @@ func genSimpleExprIsSelectTree(left string, right string, not bool) *tree.Select } } -func genSimpleFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -277,9 +277,9 @@ func genSimpleFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) } } -func genDistinctFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genDistinctFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -298,16 +298,16 @@ func genDistinctFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression } } -func genSimpleJoinSelectTree(joinOP *tree.JoinOperator, t1, t1Column, t2, t2Column string) *tree.Select { - return &tree.Select{ - SelectStmt: &tree.SelectStmt{ +func genSimpleJoinSelectTree(joinOP *tree.JoinOperator, t1, t1Column, t2, t2Column string) *tree.SelectStmt { + return &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ &tree.ResultColumnStar{}, }, - From: &tree.FromClause{Relation: &tree.RelationJoin{ + From: &tree.RelationJoin{ Relation: &tree.RelationTable{ Name: t1, }, @@ -322,16 +322,16 @@ func genSimpleJoinSelectTree(joinOP *tree.JoinOperator, t1, t1Column, t2, t2Colu }, }, }, - }}, + }, }, }, }, } } -func genSimpleUpdateTree(qt *tree.QualifiedTableName, column, value string) *tree.Update { - return &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ +func genSimpleUpdateTree(qt *tree.QualifiedTableName, column, value string) *tree.UpdateStmt { + return &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: qt, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -353,21 +353,21 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"with semicolon", "select *;", genSelectColumnStarTree()}, // common table stmt {"cte", "with t as (select 1) select *", - &tree.Select{ - CTE: []*tree.CTE{genSimpleCTETree("t", "1")}, - SelectStmt: genSelectColumnStarTree().SelectStmt, + &tree.SelectStmt{ + CTE: []*tree.CTE{genSimpleCTETree("t", "1")}, + Stmt: genSelectColumnStarTree().Stmt, }, }, {"cte with column", "with t(c1,c2) as (select 1) select *", - &tree.Select{ + &tree.SelectStmt{ CTE: []*tree.CTE{ { Table: "t", Columns: []string{"c1", "c2"}, - Select: genSelectColumnLiteralTree("1").SelectStmt, + Select: genSelectColumnLiteralTree("1").Stmt, }, }, - SelectStmt: genSelectColumnStarTree().SelectStmt, + Stmt: genSelectColumnStarTree().Stmt, }, }, //// compound operator @@ -388,17 +388,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"table.*", "select t.*", genSelectColumnTableTree("t")}, //// table or subquery {"table or subquery", "select * from t1 as tt", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - Alias: "tt", - }, + From: &tree.RelationTable{ + Name: "t1", + Alias: "tt", }, }, }, @@ -406,17 +404,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"table or subquery nest select", "select * from (select 1) as tt", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationSubquery{ - Select: genSelectColumnLiteralTree("1").SelectStmt, - Alias: "tt", - }, + From: &tree.RelationSubquery{ + Select: genSelectColumnLiteralTree("1").Stmt, + Alias: "tt", }, }, }, @@ -424,32 +420,30 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"table or subquery join", "select * from t1 as tt join t2 as ttt on tt.a = ttt.a", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationJoin{ - Relation: &tree.RelationTable{Name: "t1", Alias: "tt"}, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeJoin, - Outer: false, + From: &tree.RelationJoin{ + Relation: &tree.RelationTable{Name: "t1", Alias: "tt"}, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeJoin, + Outer: false, + }, + Table: &tree.RelationTable{Name: "t2", Alias: "ttt"}, + Constraint: &tree.ExpressionBinaryComparison{ + Left: &tree.ExpressionColumn{ + Table: "tt", + Column: "a", }, - Table: &tree.RelationTable{Name: "t2", Alias: "ttt"}, - Constraint: &tree.ExpressionBinaryComparison{ - Left: &tree.ExpressionColumn{ - Table: "tt", - Column: "a", - }, - Operator: tree.ComparisonOperatorEqual, - Right: &tree.ExpressionColumn{ - Table: "ttt", - Column: "a", - }, + Operator: tree.ComparisonOperatorEqual, + Right: &tree.ExpressionColumn{ + Table: "ttt", + Column: "a", }, }, }, @@ -469,8 +463,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"false", "select false", genSelectColumnLiteralTree("false")}, // bind parameter {"expr bind parameter $", "select $a", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -485,8 +479,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"expr bind parameter @", "select @a", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -501,8 +495,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"expr names", "select t1.c1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -521,8 +515,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"expr unary op +", "select +1", genSelectUnaryExprTree(tree.UnaryOperatorPlus, "1")}, {"expr unary op -", "select -1", genSelectUnaryExprTree(tree.UnaryOperatorMinus, "1")}, {"expr unary op - twice, right associative", "select - -1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -545,8 +539,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { //{"expr unary op ~", "select ~1", genSelectUnaryExprTree(tree.UnaryOperatorBitNot, "1")}, {"expr unary op not", "select not 1", genSelectUnaryExprTree(tree.UnaryOperatorNot, "1")}, {"expr unary op not twice, right associative", "select not not true", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -607,8 +601,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { genSimpleBinaryCompareSelectTree(tree.LogicalOperatorOr, "1", "2")}, // in {"expr binary op in", "select 1 in (1,2)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -632,8 +626,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr binary op not in", "select 1 not in (1,2)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -657,8 +651,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr binary op in with select", "select 1 in (select 1)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -668,7 +662,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Left: genLiteralExpression("1"), Operator: tree.ComparisonOperatorIn, Right: &tree.ExpressionSelect{ - Select: genSelectColumnLiteralTree("1").SelectStmt, + Select: genSelectColumnLiteralTree("1").Stmt, }, }, }, @@ -679,8 +673,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr binary op not in with select", "select 1 not in (select 1)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -690,7 +684,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Left: genLiteralExpression("1"), Operator: tree.ComparisonOperatorNotIn, Right: &tree.ExpressionSelect{ - Select: genSelectColumnLiteralTree("1").SelectStmt, + Select: genSelectColumnLiteralTree("1").Stmt, }, }, }, @@ -735,8 +729,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // expr list {"expr list", "select (1,2)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -757,8 +751,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, // expr precedence {"expr precedence 1", "select -1 > 2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -780,8 +774,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr precedence 2", "SELECT NOT (-1 = 1) AND 1 notnull OR 3 < 2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -823,8 +817,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr precedence 3", "SELECT NOT (-1 = 1) AND (1 notnull OR 3 < 2)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -867,8 +861,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr precedence 4", "select not 3 + 4 * 5 - 2 = 2 + -1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -921,8 +915,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"expr is not", "select true is not true", genSimpleExprIsSelectTree("true", "true", true)}, {"expr is distinct from", "select 1 is distinct from 2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -941,8 +935,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr is not distinct from", "select 1 is not distinct from 2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -963,8 +957,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, // between {"expr between", "select 1 between 2 and 3", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -983,8 +977,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr not between", "select 1 not between 2 and 3", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1005,8 +999,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, // {"expr exists", "select (select 1)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1015,7 +1009,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Expression: &tree.ExpressionSelect{ IsNot: false, IsExists: false, - Select: genSelectColumnLiteralTree("1").SelectStmt, + Select: genSelectColumnLiteralTree("1").Stmt, }, }, }, @@ -1025,8 +1019,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr exists", "select exists (select 1)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1035,7 +1029,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Expression: &tree.ExpressionSelect{ IsNot: false, IsExists: true, - Select: genSelectColumnLiteralTree("1").SelectStmt, + Select: genSelectColumnLiteralTree("1").Stmt, }, }, }, @@ -1045,8 +1039,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr not exists", "select not exists (select 1)", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1055,7 +1049,7 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Expression: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: genSelectColumnLiteralTree("1").SelectStmt, + Select: genSelectColumnLiteralTree("1").Stmt, }, }, }, @@ -1066,8 +1060,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, // case {"expr case", "select case when 1 then 2 end", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1089,8 +1083,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr case else", "select case when 1 then 2 else 3 end", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1113,8 +1107,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr case multi when", "select case when 1 then 2 when 3 then 4 end", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1140,8 +1134,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"expr case expr", "select case 1 when 2 then 3 end", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1165,15 +1159,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, //// insert stmt {"insert", "insert into t1 values (1)", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", InsertType: tree.InsertTypeInsert, Values: [][]tree.Expression{{genLiteralExpression("1")}}, }}}, {"insert with columns", "insert into t1 (a,b) values (1,2)", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1184,8 +1178,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}}, {"insert with columns with table alias", "insert into t1 as t (a,b) values (1,2)", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", TableAlias: "t", Columns: []string{"a", "b"}, @@ -1197,8 +1191,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}}, {"insert with columns with bind parameter", "insert into t1 (a,b) values ($a, $b)", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1209,9 +1203,9 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}}, {"insert with cte", "with t as (select 1) insert into t1 (a,b) values (1,2)", - &tree.Insert{ + &tree.InsertStmt{ CTE: []*tree.CTE{genSimpleCTETree("t", "1")}, - InsertStmt: &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1219,8 +1213,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {genLiteralExpression("1"), genLiteralExpression("2")}, }}}}, {"insert with returning", "insert into t1 (a,b) values (1,2) returning a as c", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1238,8 +1232,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}}, {"insert with returning literal", "insert into t1 (a,b) values (1,2) returning 1", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1254,8 +1248,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}}, {"insert with returning *", "insert into t1 (a,b) values (1,2) returning *", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1270,8 +1264,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}}, {"insert with values upsert without target do nothing", "insert into t1 (a,b) values (1,2) on conflict do nothing", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1283,8 +1277,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with target without where do nothing", "insert into t1 (a,b) values (1,2) on conflict (c1,c2) do nothing", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1299,8 +1293,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with target and where do nothing", "insert into t1 (a,b) values (1,2) on conflict(c1,c2) where 1 do nothing", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1316,8 +1310,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with update column name", "insert into t1 (a,b) values (1,2) on conflict do update set b=1", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1333,8 +1327,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with update multi column name", "insert into t1 (a,b) values (1,2) on conflict do update set b=1,c=2", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1356,8 +1350,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with update column name list", "insert into t1 (a,b) values (1,2) on conflict do update set (b,c)=(1,2)", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1379,8 +1373,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with update multi column name list", "insert into t1 (a,b) values (1,2) on conflict do update set (b,c)=(1,2), (d,e)=(3,4)", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1410,8 +1404,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, {"insert with values upsert with update and where", "insert into t1 (a,b) values (1,2) on conflict do update set b=1 where 1", - &tree.Insert{ - InsertStmt: &tree.InsertStmt{ + &tree.InsertStmt{ + Core: &tree.InsertCore{ Table: "t1", Columns: []string{"a", "b"}, InsertType: tree.InsertTypeInsert, @@ -1428,59 +1422,55 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}}, //// select {"select *", "select * from t1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, }}}, {"select with cte", "with t as (select 1) select * from t1", - &tree.Select{ + &tree.SelectStmt{ CTE: []*tree.CTE{genSimpleCTETree("t", "1")}, - SelectStmt: &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, }}}, {"select distinct", "select distinct * from t1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeDistinct, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, }}}, {"select with where", "select * from t1 where c1=1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "c1"}, Operator: tree.ComparisonOperatorEqual, @@ -1490,16 +1480,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"select with where and", "select * from t1 where c1=1 and c2=2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "c1"}, @@ -1517,16 +1506,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"select with where or", "select * from t1 where c1=1 or c2=2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "c1"}, @@ -1544,16 +1532,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"select with group by", "select * from t1 group by c1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, GroupBy: &tree.GroupBy{ Expressions: []tree.Expression{ &tree.ExpressionColumn{Column: "c1"}, @@ -1563,16 +1550,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"select with group by and having", "select * from t1 group by c1 having 1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, GroupBy: &tree.GroupBy{ Expressions: []tree.Expression{ &tree.ExpressionColumn{Column: "c1"}, @@ -1583,16 +1569,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"select with order by", "select * from t1 order by c1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, OrderBy: &tree.OrderBy{ @@ -1605,16 +1590,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with order by all", "select * from t1 order by c1 collate nocase asc nulls first", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, OrderBy: &tree.OrderBy{ @@ -1631,31 +1615,29 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }}}, {"select with limit", "select * from t1 limit 1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, Limit: &tree.Limit{Expression: genLiteralExpression("1")}, }}}, {"select with limit offset", "select * from t1 limit 1 offset 2", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }}, + From: &tree.RelationTable{ + Name: "t1", + }, }, }, Limit: &tree.Limit{ @@ -1700,39 +1682,37 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { JoinType: tree.JoinTypeInner, }, "t1", "c1", "t2", "c1")}, {"join multi", "select * from t1 join t2 on t1.c1=t2.c1 left join t3 on t1.c1=t3.c1", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationJoin{ - Relation: &tree.RelationTable{ - Name: "t1", + From: &tree.RelationJoin{ + Relation: &tree.RelationTable{ + Name: "t1", + }, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeJoin, + }, + Table: &tree.RelationTable{Name: "t2"}, + Constraint: &tree.ExpressionBinaryComparison{ + Operator: tree.ComparisonOperatorEqual, + Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, + Right: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, + }, }, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeJoin, - }, - Table: &tree.RelationTable{Name: "t2"}, - Constraint: &tree.ExpressionBinaryComparison{ - Operator: tree.ComparisonOperatorEqual, - Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, - Right: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, - }, + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeLeft, }, - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeLeft, - }, - Table: &tree.RelationTable{Name: "t3"}, - Constraint: &tree.ExpressionBinaryComparison{ - Operator: tree.ComparisonOperatorEqual, - Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, - Right: &tree.ExpressionColumn{Table: "t3", Column: "c1"}, - }, + Table: &tree.RelationTable{Name: "t3"}, + Constraint: &tree.ExpressionBinaryComparison{ + Operator: tree.ComparisonOperatorEqual, + Left: &tree.ExpressionColumn{Table: "t1", Column: "c1"}, + Right: &tree.ExpressionColumn{Table: "t3", Column: "c1"}, }, }, }, @@ -1750,8 +1730,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { TableAlias: "t", }, "c1", "1")}, {"update with multi set", "update t1 set c1=1, c2=2", - &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ + &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1767,8 +1747,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"update with column list set", "update t1 set (c1, c2)=(1,2)", - &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ + &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1785,8 +1765,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"update from table", "update t1 set c1=1 from t2", - &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ + &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1794,13 +1774,13 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Expression: genLiteralExpression("1"), }, }, - From: &tree.FromClause{Relation: &tree.RelationTable{Name: "t2"}}, + From: &tree.RelationTable{Name: "t2"}, }, }, }, {"update from join", "update t1 set c1=1 from t2 join t3 on t2.c1=t3.c1", - &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ + &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1808,20 +1788,18 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { Expression: genLiteralExpression("1"), }, }, - From: &tree.FromClause{ - Relation: &tree.RelationJoin{ - Relation: &tree.RelationTable{Name: "t2"}, - Joins: []*tree.JoinPredicate{ - { - JoinOperator: &tree.JoinOperator{ - JoinType: tree.JoinTypeJoin, - }, - Table: &tree.RelationTable{Name: "t3"}, - Constraint: &tree.ExpressionBinaryComparison{ - Operator: tree.ComparisonOperatorEqual, - Left: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, - Right: &tree.ExpressionColumn{Table: "t3", Column: "c1"}, - }, + From: &tree.RelationJoin{ + Relation: &tree.RelationTable{Name: "t2"}, + Joins: []*tree.JoinPredicate{ + { + JoinOperator: &tree.JoinOperator{ + JoinType: tree.JoinTypeJoin, + }, + Table: &tree.RelationTable{Name: "t3"}, + Constraint: &tree.ExpressionBinaryComparison{ + Operator: tree.ComparisonOperatorEqual, + Left: &tree.ExpressionColumn{Table: "t2", Column: "c1"}, + Right: &tree.ExpressionColumn{Table: "t3", Column: "c1"}, }, }, }, @@ -1830,8 +1808,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"update where", "update t1 set c1=1 where c2=1", - &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ + &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1848,8 +1826,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"update returning", "update t1 set c1=1 returning *", - &tree.Update{ - UpdateStmt: &tree.UpdateStmt{ + &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1868,11 +1846,11 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"update with cte", "with t as (select 1) update t1 set c1=1", - &tree.Update{ + &tree.UpdateStmt{ CTE: []*tree.CTE{ genSimpleCTETree("t", "1"), }, - UpdateStmt: &tree.UpdateStmt{ + Core: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{TableName: "t1"}, UpdateSetClause: []*tree.UpdateSetClause{ { @@ -1886,8 +1864,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { //// delete {"delete all", "delete from t1", - &tree.Delete{ - DeleteStmt: &tree.DeleteStmt{ + &tree.DeleteStmt{ + Core: &tree.DeleteCore{ QualifiedTableName: &tree.QualifiedTableName{ TableName: "t1", }, @@ -1895,8 +1873,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"delete with where", "delete from t1 where c1='1'", - &tree.Delete{ - DeleteStmt: &tree.DeleteStmt{ + &tree.DeleteStmt{ + Core: &tree.DeleteCore{ QualifiedTableName: &tree.QualifiedTableName{ TableName: "t1", }, @@ -1909,8 +1887,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"delete with returning", "delete from t1 returning *", - &tree.Delete{ - DeleteStmt: &tree.DeleteStmt{ + &tree.DeleteStmt{ + Core: &tree.DeleteCore{ QualifiedTableName: &tree.QualifiedTableName{ TableName: "t1", }, @@ -1925,11 +1903,11 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"delete with cte", "with t as (select 1) delete from t1", - &tree.Delete{ + &tree.DeleteStmt{ CTE: []*tree.CTE{ genSimpleCTETree("t", "1"), }, - DeleteStmt: &tree.DeleteStmt{ + Core: &tree.DeleteCore{ QualifiedTableName: &tree.QualifiedTableName{ TableName: "t1", }, @@ -1938,16 +1916,14 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, //// identifier quotes, `"` and `[]` and "`" {"table name with double quote", `select * from "t1"`, - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }, + From: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -1955,17 +1931,15 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"table name alias with double quote", `select * from "t1" as "t"`, - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, Columns: columnStar, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - Alias: "t", - }, + From: &tree.RelationTable{ + Name: "t1", + Alias: "t", }, }, }, @@ -1973,8 +1947,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"column name with bracket quote", `select [col1] from "t1"`, - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -1985,10 +1959,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, }, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }, + From: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -1996,8 +1968,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"column name alias with bracket quote", `select [col1] as [col] from t1`, - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -2009,10 +1981,9 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, Alias: "col", }, - }, From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }, + }, + From: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -2020,8 +1991,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, {"collation name with back tick quote", "select `col1` COLLATE `nocase` from `t1`; ", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -2036,10 +2007,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, }, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }, + From: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -2053,8 +2022,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"type cast", "select 1::int as x, @caller::text, t1.c1::text, (t1.c2::int * 3)::int, " + "(t1.c3 isnull)::int, abs(2)::int from t1;", - &tree.Select{ - SelectStmt: &tree.SelectStmt{ + &tree.SelectStmt{ + Stmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -2112,10 +2081,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, }, }, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "t1", - }, + From: &tree.RelationTable{ + Name: "t1", }, }, }, @@ -2133,16 +2100,16 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { tt.expect = nil }() - astTree, err := ParseSql(tt.input, 1, nil, *traceMode, false) + stmt, err := ParseSql(tt.input, 1, nil, *traceMode, false) if err != nil { t.Errorf("ParseRawSQL() got %s", err) return } // use assert.Exactly? - assert.EqualValues(t, tt.expect, astTree, "ParseRawSQL() got %+v, want %+v", astTree, tt.expect) + assert.EqualValues(t, tt.expect, stmt, "ParseRawSQL() got %+v, want %+v", stmt, tt.expect) - sql, err := tree.SafeToSQL(astTree) + sql, err := tree.SafeToSQL(stmt) if err != nil { t.Errorf("ParseRawSQL() got %s", err) } diff --git a/parse/sql/tree/CTE.go b/parse/sql/tree/CTE.go index 64ac514ca..7532cb5be 100644 --- a/parse/sql/tree/CTE.go +++ b/parse/sql/tree/CTE.go @@ -9,7 +9,7 @@ type CTE struct { Table string Columns []string - Select *SelectStmt + Select *SelectStmtNoCte } func (c *CTE) Accept(v AstVisitor) any { diff --git a/parse/sql/tree/CTE_test.go b/parse/sql/tree/CTE_test.go index d294b95a5..003ad7e95 100644 --- a/parse/sql/tree/CTE_test.go +++ b/parse/sql/tree/CTE_test.go @@ -10,7 +10,7 @@ func TestCTE_ToSQL(t *testing.T) { type fields struct { Table string Columns []string - Select *tree.SelectStmt + Select *tree.SelectStmtNoCte } tests := []struct { name string @@ -23,14 +23,12 @@ func TestCTE_ToSQL(t *testing.T) { fields: fields{ Table: "foo", Columns: []string{"bar", "baz"}, - Select: &tree.SelectStmt{ + Select: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - }, + From: &tree.RelationTable{ + Name: "foo", }, }, }, @@ -70,13 +68,11 @@ func TestCTE_ToSQL(t *testing.T) { var mockCTE = &tree.CTE{ Table: "foo", Columns: []string{"bar", "baz"}, - Select: &tree.SelectStmt{ + Select: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - }, + From: &tree.RelationTable{ + Name: "foo", }, }, }, diff --git a/parse/sql/tree/ast.go b/parse/sql/tree/ast.go index bb2a38d0a..6dd403cad 100644 --- a/parse/sql/tree/ast.go +++ b/parse/sql/tree/ast.go @@ -22,3 +22,22 @@ type AstNode interface { // Accept accepts an AstVisitor to visit itself. Accept(AstVisitor) any } + +type Statement interface { + AstNode + + statement() +} + +type Expression interface { + AstNode + + expression() // private function to prevent external packages from implementing this interface + joinable +} + +type ResultColumn interface { + AstNode + + resultColumn() +} diff --git a/parse/sql/tree/ast_listener.go b/parse/sql/tree/ast_listener.go index 0d3423488..24dba449a 100644 --- a/parse/sql/tree/ast_listener.go +++ b/parse/sql/tree/ast_listener.go @@ -8,10 +8,10 @@ type AstListener interface { ExitConflictTarget(*ConflictTarget) error EnterCTE(*CTE) error ExitCTE(*CTE) error - EnterDelete(*Delete) error - ExitDelete(*Delete) error EnterDeleteStmt(*DeleteStmt) error ExitDeleteStmt(*DeleteStmt) error + EnterDeleteCore(*DeleteCore) error + ExitDeleteCore(*DeleteCore) error EnterExpressionLiteral(*ExpressionLiteral) error ExitExpressionLiteral(*ExpressionLiteral) error EnterExpressionBindParameter(*ExpressionBindParameter) error @@ -44,10 +44,10 @@ type AstListener interface { ExitScalarFunc(*ScalarFunction) error EnterGroupBy(*GroupBy) error ExitGroupBy(*GroupBy) error - EnterInsert(*Insert) error - ExitInsert(*Insert) error EnterInsertStmt(*InsertStmt) error ExitInsertStmt(*InsertStmt) error + EnterInsertCore(*InsertCore) error + ExitInsertCore(*InsertCore) error EnterJoinPredicate(*JoinPredicate) error ExitJoinPredicate(*JoinPredicate) error EnterJoinOperator(*JoinOperator) error @@ -78,22 +78,20 @@ type AstListener interface { ExitReturningClause(*ReturningClause) error EnterReturningClauseColumn(*ReturningClauseColumn) error ExitReturningClauseColumn(*ReturningClauseColumn) error - EnterSelect(*Select) error - ExitSelect(*Select) error - EnterSelectCore(*SelectCore) error - ExitSelectCore(*SelectCore) error EnterSelectStmt(*SelectStmt) error ExitSelectStmt(*SelectStmt) error - EnterFromClause(*FromClause) error - ExitFromClause(*FromClause) error + EnterSelectCore(*SelectCore) error + ExitSelectCore(*SelectCore) error + EnterSelectStmtNoCte(*SelectStmtNoCte) error + ExitSelectStmtNoCte(*SelectStmtNoCte) error EnterCompoundOperator(*CompoundOperator) error ExitCompoundOperator(*CompoundOperator) error EnterUpdateSetClause(*UpdateSetClause) error ExitUpdateSetClause(*UpdateSetClause) error - EnterUpdate(*Update) error - ExitUpdate(*Update) error EnterUpdateStmt(*UpdateStmt) error ExitUpdateStmt(*UpdateStmt) error + EnterUpdateCore(*UpdateCore) error + ExitUpdateCore(*UpdateCore) error EnterUpsert(*Upsert) error ExitUpsert(*Upsert) error } @@ -138,19 +136,19 @@ func (b *BaseListener) ExitConflictTarget(p0 *ConflictTarget) error { return nil } -func (b *BaseListener) EnterDelete(p0 *Delete) error { +func (b *BaseListener) EnterDeleteStmt(p0 *DeleteStmt) error { return nil } -func (b *BaseListener) ExitDelete(p0 *Delete) error { +func (b *BaseListener) ExitDeleteStmt(p0 *DeleteStmt) error { return nil } -func (b *BaseListener) EnterDeleteStmt(p0 *DeleteStmt) error { +func (b *BaseListener) EnterDeleteCore(p0 *DeleteCore) error { return nil } -func (b *BaseListener) ExitDeleteStmt(p0 *DeleteStmt) error { +func (b *BaseListener) ExitDeleteCore(p0 *DeleteCore) error { return nil } @@ -266,14 +264,6 @@ func (b *BaseListener) ExitExpressionUnary(p0 *ExpressionUnary) error { return nil } -func (b *BaseListener) EnterFromClause(p0 *FromClause) error { - return nil -} - -func (b *BaseListener) ExitFromClause(p0 *FromClause) error { - return nil -} - func (b *BaseListener) EnterGroupBy(p0 *GroupBy) error { return nil } @@ -282,19 +272,19 @@ func (b *BaseListener) ExitGroupBy(p0 *GroupBy) error { return nil } -func (b *BaseListener) EnterInsert(p0 *Insert) error { +func (b *BaseListener) EnterInsertStmt(p0 *InsertStmt) error { return nil } -func (b *BaseListener) ExitInsert(p0 *Insert) error { +func (b *BaseListener) ExitInsertStmt(p0 *InsertStmt) error { return nil } -func (b *BaseListener) EnterInsertStmt(p0 *InsertStmt) error { +func (b *BaseListener) EnterInsertCore(p0 *InsertCore) error { return nil } -func (b *BaseListener) ExitInsertStmt(p0 *InsertStmt) error { +func (b *BaseListener) ExitInsertCore(p0 *InsertCore) error { return nil } @@ -426,11 +416,11 @@ func (b *BaseListener) ExitScalarFunc(p0 *ScalarFunction) error { return nil } -func (b *BaseListener) EnterSelect(p0 *Select) error { +func (b *BaseListener) EnterSelectStmt(p0 *SelectStmt) error { return nil } -func (b *BaseListener) ExitSelect(p0 *Select) error { +func (b *BaseListener) ExitSelectStmt(p0 *SelectStmt) error { return nil } @@ -442,19 +432,19 @@ func (b *BaseListener) ExitSelectCore(p0 *SelectCore) error { return nil } -func (b *BaseListener) EnterSelectStmt(p0 *SelectStmt) error { +func (b *BaseListener) EnterSelectStmtNoCte(p0 *SelectStmtNoCte) error { return nil } -func (b *BaseListener) ExitSelectStmt(p0 *SelectStmt) error { +func (b *BaseListener) ExitSelectStmtNoCte(p0 *SelectStmtNoCte) error { return nil } -func (b *BaseListener) EnterUpdate(p0 *Update) error { +func (b *BaseListener) EnterUpdateStmt(p0 *UpdateStmt) error { return nil } -func (b *BaseListener) ExitUpdate(p0 *Update) error { +func (b *BaseListener) ExitUpdateStmt(p0 *UpdateStmt) error { return nil } @@ -466,11 +456,11 @@ func (b *BaseListener) ExitUpdateSetClause(p0 *UpdateSetClause) error { return nil } -func (b *BaseListener) EnterUpdateStmt(p0 *UpdateStmt) error { +func (b *BaseListener) EnterUpdateCore(p0 *UpdateCore) error { return nil } -func (b *BaseListener) ExitUpdateStmt(p0 *UpdateStmt) error { +func (b *BaseListener) ExitUpdateCore(p0 *UpdateCore) error { return nil } @@ -495,10 +485,10 @@ type ImplementedListener struct { FuncExitCompoundOperator func(p0 *CompoundOperator) error FuncEnterConflictTarget func(p0 *ConflictTarget) error FuncExitConflictTarget func(p0 *ConflictTarget) error - FuncEnterDelete func(p0 *Delete) error - FuncExitDelete func(p0 *Delete) error FuncEnterDeleteStmt func(p0 *DeleteStmt) error FuncExitDeleteStmt func(p0 *DeleteStmt) error + FuncEnterDeleteCore func(p0 *DeleteCore) error + FuncExitDeleteCore func(p0 *DeleteCore) error FuncEnterExpressionArithmetic func(p0 *ExpressionArithmetic) error FuncExitExpressionArithmetic func(p0 *ExpressionArithmetic) error FuncEnterExpressionBetween func(p0 *ExpressionBetween) error @@ -527,14 +517,12 @@ type ImplementedListener struct { FuncExitExpressionStringCompare func(p0 *ExpressionStringCompare) error FuncEnterExpressionUnary func(p0 *ExpressionUnary) error FuncExitExpressionUnary func(p0 *ExpressionUnary) error - FuncEnterFromClause func(p0 *FromClause) error - FuncExitFromClause func(p0 *FromClause) error FuncEnterGroupBy func(p0 *GroupBy) error FuncExitGroupBy func(p0 *GroupBy) error - FuncEnterInsert func(p0 *Insert) error - FuncExitInsert func(p0 *Insert) error FuncEnterInsertStmt func(p0 *InsertStmt) error FuncExitInsertStmt func(p0 *InsertStmt) error + FuncEnterInsertCore func(p0 *InsertCore) error + FuncExitInsertCore func(p0 *InsertCore) error FuncEnterJoinOperator func(p0 *JoinOperator) error FuncExitJoinOperator func(p0 *JoinOperator) error FuncEnterJoinPredicate func(p0 *JoinPredicate) error @@ -567,18 +555,18 @@ type ImplementedListener struct { FuncExitReturningClauseColumn func(p0 *ReturningClauseColumn) error FuncEnterScalarFunc func(p0 *ScalarFunction) error FuncExitScalarFunc func(p0 *ScalarFunction) error - FuncEnterSelect func(p0 *Select) error - FuncExitSelect func(p0 *Select) error - FuncEnterSelectCore func(p0 *SelectCore) error - FuncExitSelectCore func(p0 *SelectCore) error FuncEnterSelectStmt func(p0 *SelectStmt) error FuncExitSelectStmt func(p0 *SelectStmt) error - FuncEnterUpdate func(p0 *Update) error - FuncExitUpdate func(p0 *Update) error - FuncEnterUpdateSetClause func(p0 *UpdateSetClause) error - FuncExitUpdateSetClause func(p0 *UpdateSetClause) error + FuncEnterSelectCore func(p0 *SelectCore) error + FuncExitSelectCore func(p0 *SelectCore) error + FuncEnterSelectStmtNoCte func(p0 *SelectStmtNoCte) error + FuncExitSelectStmtNoCte func(p0 *SelectStmtNoCte) error FuncEnterUpdateStmt func(p0 *UpdateStmt) error FuncExitUpdateStmt func(p0 *UpdateStmt) error + FuncEnterUpdateSetClause func(p0 *UpdateSetClause) error + FuncExitUpdateSetClause func(p0 *UpdateSetClause) error + FuncEnterUpdateCore func(p0 *UpdateCore) error + FuncExitUpdateCore func(p0 *UpdateCore) error FuncEnterUpsert func(p0 *Upsert) error FuncExitUpsert func(p0 *Upsert) error } @@ -649,36 +637,36 @@ func (b *ImplementedListener) ExitConflictTarget(p0 *ConflictTarget) error { return b.FuncExitConflictTarget(p0) } -func (b *ImplementedListener) EnterDelete(p0 *Delete) error { - if b.FuncEnterDelete == nil { +func (b *ImplementedListener) EnterDeleteStmt(p0 *DeleteStmt) error { + if b.FuncEnterDeleteStmt == nil { return nil } - return b.FuncEnterDelete(p0) + return b.FuncEnterDeleteStmt(p0) } -func (b *ImplementedListener) ExitDelete(p0 *Delete) error { - if b.FuncExitDelete == nil { +func (b *ImplementedListener) ExitDeleteStmt(p0 *DeleteStmt) error { + if b.FuncExitDeleteStmt == nil { return nil } - return b.FuncExitDelete(p0) + return b.FuncExitDeleteStmt(p0) } -func (b *ImplementedListener) EnterDeleteStmt(p0 *DeleteStmt) error { - if b.FuncEnterDeleteStmt == nil { +func (b *ImplementedListener) EnterDeleteCore(p0 *DeleteCore) error { + if b.FuncEnterDeleteCore == nil { return nil } - return b.FuncEnterDeleteStmt(p0) + return b.FuncEnterDeleteCore(p0) } -func (b *ImplementedListener) ExitDeleteStmt(p0 *DeleteStmt) error { - if b.FuncExitDeleteStmt == nil { +func (b *ImplementedListener) ExitDeleteCore(p0 *DeleteCore) error { + if b.FuncExitDeleteCore == nil { return nil } - return b.FuncExitDeleteStmt(p0) + return b.FuncExitDeleteCore(p0) } func (b *ImplementedListener) EnterExpressionArithmetic(p0 *ExpressionArithmetic) error { @@ -905,22 +893,6 @@ func (b *ImplementedListener) ExitExpressionUnary(p0 *ExpressionUnary) error { return b.FuncExitExpressionUnary(p0) } -func (b *ImplementedListener) EnterFromClause(p0 *FromClause) error { - if b.FuncEnterFromClause == nil { - return nil - } - - return b.FuncEnterFromClause(p0) -} - -func (b *ImplementedListener) ExitFromClause(p0 *FromClause) error { - if b.FuncExitFromClause == nil { - return nil - } - - return b.FuncExitFromClause(p0) -} - func (b *ImplementedListener) EnterGroupBy(p0 *GroupBy) error { if b.FuncEnterGroupBy == nil { return nil @@ -937,36 +909,36 @@ func (b *ImplementedListener) ExitGroupBy(p0 *GroupBy) error { return b.FuncExitGroupBy(p0) } -func (b *ImplementedListener) EnterInsert(p0 *Insert) error { - if b.FuncEnterInsert == nil { +func (b *ImplementedListener) EnterInsertStmt(p0 *InsertStmt) error { + if b.FuncEnterInsertStmt == nil { return nil } - return b.FuncEnterInsert(p0) + return b.FuncEnterInsertStmt(p0) } -func (b *ImplementedListener) ExitInsert(p0 *Insert) error { - if b.FuncExitInsert == nil { +func (b *ImplementedListener) ExitInsertStmt(p0 *InsertStmt) error { + if b.FuncExitInsertStmt == nil { return nil } - return b.FuncExitInsert(p0) + return b.FuncExitInsertStmt(p0) } -func (b *ImplementedListener) EnterInsertStmt(p0 *InsertStmt) error { - if b.FuncEnterInsertStmt == nil { +func (b *ImplementedListener) EnterInsertCore(p0 *InsertCore) error { + if b.FuncEnterInsertCore == nil { return nil } - return b.FuncEnterInsertStmt(p0) + return b.FuncEnterInsertCore(p0) } -func (b *ImplementedListener) ExitInsertStmt(p0 *InsertStmt) error { - if b.FuncExitInsertStmt == nil { +func (b *ImplementedListener) ExitInsertCore(p0 *InsertCore) error { + if b.FuncExitInsertCore == nil { return nil } - return b.FuncExitInsertStmt(p0) + return b.FuncExitInsertCore(p0) } func (b *ImplementedListener) EnterJoinOperator(p0 *JoinOperator) error { @@ -1225,20 +1197,20 @@ func (b *ImplementedListener) ExitScalarFunc(p0 *ScalarFunction) error { return b.FuncExitScalarFunc(p0) } -func (b *ImplementedListener) EnterSelect(p0 *Select) error { - if b.FuncEnterSelect == nil { +func (b *ImplementedListener) EnterSelectStmt(p0 *SelectStmt) error { + if b.FuncEnterSelectStmt == nil { return nil } - return b.FuncEnterSelect(p0) + return b.FuncEnterSelectStmt(p0) } -func (b *ImplementedListener) ExitSelect(p0 *Select) error { - if b.FuncExitSelect == nil { +func (b *ImplementedListener) ExitSelectStmt(p0 *SelectStmt) error { + if b.FuncExitSelectStmt == nil { return nil } - return b.FuncExitSelect(p0) + return b.FuncExitSelectStmt(p0) } func (b *ImplementedListener) EnterSelectCore(p0 *SelectCore) error { @@ -1257,36 +1229,36 @@ func (b *ImplementedListener) ExitSelectCore(p0 *SelectCore) error { return b.FuncExitSelectCore(p0) } -func (b *ImplementedListener) EnterSelectStmt(p0 *SelectStmt) error { - if b.FuncEnterSelectStmt == nil { +func (b *ImplementedListener) EnterSelectStmtNoCte(p0 *SelectStmtNoCte) error { + if b.FuncEnterSelectStmtNoCte == nil { return nil } - return b.FuncEnterSelectStmt(p0) + return b.FuncEnterSelectStmtNoCte(p0) } -func (b *ImplementedListener) ExitSelectStmt(p0 *SelectStmt) error { - if b.FuncExitSelectStmt == nil { +func (b *ImplementedListener) ExitSelectStmtNoCte(p0 *SelectStmtNoCte) error { + if b.FuncExitSelectStmtNoCte == nil { return nil } - return b.FuncExitSelectStmt(p0) + return b.FuncExitSelectStmtNoCte(p0) } -func (b *ImplementedListener) EnterUpdate(p0 *Update) error { - if b.FuncEnterUpdate == nil { +func (b *ImplementedListener) EnterUpdateStmt(p0 *UpdateStmt) error { + if b.FuncEnterUpdateStmt == nil { return nil } - return b.FuncEnterUpdate(p0) + return b.FuncEnterUpdateStmt(p0) } -func (b *ImplementedListener) ExitUpdate(p0 *Update) error { - if b.FuncExitUpdate == nil { +func (b *ImplementedListener) ExitUpdateStmt(p0 *UpdateStmt) error { + if b.FuncExitUpdateStmt == nil { return nil } - return b.FuncExitUpdate(p0) + return b.FuncExitUpdateStmt(p0) } func (b *ImplementedListener) EnterUpdateSetClause(p0 *UpdateSetClause) error { @@ -1305,20 +1277,20 @@ func (b *ImplementedListener) ExitUpdateSetClause(p0 *UpdateSetClause) error { return b.FuncExitUpdateSetClause(p0) } -func (b *ImplementedListener) EnterUpdateStmt(p0 *UpdateStmt) error { - if b.FuncEnterUpdateStmt == nil { +func (b *ImplementedListener) EnterUpdateCore(p0 *UpdateCore) error { + if b.FuncEnterUpdateCore == nil { return nil } - return b.FuncEnterUpdateStmt(p0) + return b.FuncEnterUpdateCore(p0) } -func (b *ImplementedListener) ExitUpdateStmt(p0 *UpdateStmt) error { - if b.FuncExitUpdateStmt == nil { +func (b *ImplementedListener) ExitUpdateCore(p0 *UpdateCore) error { + if b.FuncExitUpdateCore == nil { return nil } - return b.FuncExitUpdateStmt(p0) + return b.FuncExitUpdateCore(p0) } func (b *ImplementedListener) EnterUpsert(p0 *Upsert) error { diff --git a/parse/sql/tree/ast_visitor.go b/parse/sql/tree/ast_visitor.go index c7ba321b8..5b7e37ce4 100644 --- a/parse/sql/tree/ast_visitor.go +++ b/parse/sql/tree/ast_visitor.go @@ -7,8 +7,9 @@ type AstVisitor interface { VisitConflictTarget(*ConflictTarget) any VisitCompoundOperator(*CompoundOperator) any VisitCTE(*CTE) any - VisitDelete(*Delete) any VisitDeleteStmt(*DeleteStmt) any + VisitDeleteCore(*DeleteCore) any + VisitExpression(Expression) any VisitExpressionLiteral(*ExpressionLiteral) any VisitExpressionBindParameter(*ExpressionBindParameter) any VisitExpressionColumn(*ExpressionColumn) any @@ -23,11 +24,10 @@ type AstVisitor interface { VisitExpressionSelect(*ExpressionSelect) any VisitExpressionCase(*ExpressionCase) any VisitExpressionArithmetic(*ExpressionArithmetic) any - VisitFromClause(*FromClause) any VisitScalarFunc(*ScalarFunction) any VisitGroupBy(*GroupBy) any - VisitInsert(*Insert) any VisitInsertStmt(*InsertStmt) any + VisitInsertCore(*InsertCore) any VisitJoinPredicate(*JoinPredicate) any VisitJoinOperator(*JoinOperator) any VisitLimit(*Limit) any @@ -43,12 +43,12 @@ type AstVisitor interface { VisitResultColumnTable(*ResultColumnTable) any VisitReturningClause(*ReturningClause) any VisitReturningClauseColumn(*ReturningClauseColumn) any - VisitSelect(*Select) any - VisitSelectCore(*SelectCore) any VisitSelectStmt(*SelectStmt) any + VisitSelectCore(*SelectCore) any + VisitSelectNoCte(*SelectStmtNoCte) any VisitUpdateSetClause(*UpdateSetClause) any - VisitUpdate(*Update) any VisitUpdateStmt(*UpdateStmt) any + VisitUpdateCore(*UpdateCore) any VisitUpsert(*Upsert) any } @@ -78,14 +78,18 @@ func (v *BaseAstVisitor) VisitCTE(node *CTE) any { return nil } -func (v *BaseAstVisitor) VisitDelete(node *Delete) any { +func (v *BaseAstVisitor) VisitDeleteStmt(node *DeleteStmt) any { return nil } -func (v *BaseAstVisitor) VisitDeleteStmt(node *DeleteStmt) any { +func (v *BaseAstVisitor) VisitDeleteCore(node *DeleteCore) any { return nil } +func (v *BaseAstVisitor) VisitExpression(node Expression) any { + return v.Visit(node) +} + func (v *BaseAstVisitor) VisitExpressionLiteral(node *ExpressionLiteral) any { return nil } @@ -150,11 +154,11 @@ func (v *BaseAstVisitor) VisitGroupBy(node *GroupBy) any { return nil } -func (v *BaseAstVisitor) VisitInsert(node *Insert) any { +func (v *BaseAstVisitor) VisitInsertStmt(node *InsertStmt) any { return nil } -func (v *BaseAstVisitor) VisitInsertStmt(node *InsertStmt) any { +func (v *BaseAstVisitor) VisitInsertCore(node *InsertCore) any { return nil } @@ -202,7 +206,7 @@ func (v *BaseAstVisitor) VisitReturningClauseColumn(node *ReturningClauseColumn) return nil } -func (v *BaseAstVisitor) VisitSelect(node *Select) any { +func (v *BaseAstVisitor) VisitSelectStmt(node *SelectStmt) any { return nil } @@ -210,26 +214,12 @@ func (v *BaseAstVisitor) VisitSelectCore(node *SelectCore) any { return nil } -func (v *BaseAstVisitor) VisitSelectStmt(node *SelectStmt) any { - return nil -} - -func (v *BaseAstVisitor) VisitFromClause(node *FromClause) any { +func (v *BaseAstVisitor) VisitSelectNoCte(node *SelectStmtNoCte) any { return nil } func (v *BaseAstVisitor) VisitRelation(node Relation) any { - // TODO delete? - switch t := node.(type) { - case *RelationTable: - return v.Visit(t) - case *RelationSubquery: - return v.Visit(t) - case *RelationJoin: - return v.Visit(t) - default: - panic("unknown table or subquery type") - } + return v.Visit(node) } func (v *BaseAstVisitor) VisitRelationTable(node *RelationTable) any { @@ -248,11 +238,11 @@ func (v *BaseAstVisitor) VisitUpdateSetClause(node *UpdateSetClause) any { return nil } -func (v *BaseAstVisitor) VisitUpdate(node *Update) any { +func (v *BaseAstVisitor) VisitUpdateStmt(node *UpdateStmt) any { return nil } -func (v *BaseAstVisitor) VisitUpdateStmt(node *UpdateStmt) any { +func (v *BaseAstVisitor) VisitUpdateCore(node *UpdateCore) any { return nil } diff --git a/parse/sql/tree/delete.go b/parse/sql/tree/delete.go index 592ffa74d..dd0290f33 100644 --- a/parse/sql/tree/delete.go +++ b/parse/sql/tree/delete.go @@ -4,27 +4,27 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) -type Delete struct { +type DeleteStmt struct { node - CTE []*CTE - DeleteStmt *DeleteStmt + CTE []*CTE + Core *DeleteCore } -func (d *Delete) Accept(v AstVisitor) any { - return v.VisitDelete(d) +func (d *DeleteStmt) Accept(v AstVisitor) any { + return v.VisitDeleteStmt(d) } -func (d *Delete) Walk(w AstListener) error { +func (d *DeleteStmt) Walk(w AstListener) error { return run( - w.EnterDelete(d), + w.EnterDeleteStmt(d), walkMany(w, d.CTE), - walk(w, d.DeleteStmt), - w.ExitDelete(d), + walk(w, d.Core), + w.ExitDeleteStmt(d), ) } -func (d *Delete) ToSQL() string { +func (d *DeleteStmt) ToSQL() string { stmt := sqlwriter.NewWriter() if len(d.CTE) > 0 { @@ -34,14 +34,16 @@ func (d *Delete) ToSQL() string { }) } - stmt.WriteString(d.DeleteStmt.ToSQL()) + stmt.WriteString(d.Core.ToSQL()) stmt.Token.Semicolon() return stmt.String() } -type DeleteStmt struct { +func (d *DeleteStmt) statement() {} + +type DeleteCore struct { node QualifiedTableName *QualifiedTableName @@ -49,21 +51,21 @@ type DeleteStmt struct { Returning *ReturningClause } -func (d *DeleteStmt) Accept(v AstVisitor) any { - return v.VisitDeleteStmt(d) +func (d *DeleteCore) Accept(v AstVisitor) any { + return v.VisitDeleteCore(d) } -func (d *DeleteStmt) Walk(w AstListener) error { +func (d *DeleteCore) Walk(w AstListener) error { return run( - w.EnterDeleteStmt(d), + w.EnterDeleteCore(d), walk(w, d.QualifiedTableName), walk(w, d.Where), walk(w, d.Returning), - w.ExitDeleteStmt(d), + w.ExitDeleteCore(d), ) } -func (d *DeleteStmt) ToSQL() string { +func (d *DeleteCore) ToSQL() string { d.check() stmt := sqlwriter.NewWriter() @@ -80,7 +82,7 @@ func (d *DeleteStmt) ToSQL() string { return stmt.String() } -func (d *DeleteStmt) check() { +func (d *DeleteCore) check() { if d.QualifiedTableName == nil { panic("qualified table name is nil") } diff --git a/parse/sql/tree/delete_test.go b/parse/sql/tree/delete_test.go index 2f420b2ab..4551174cc 100644 --- a/parse/sql/tree/delete_test.go +++ b/parse/sql/tree/delete_test.go @@ -9,7 +9,7 @@ import ( func TestDelete_ToSQL(t *testing.T) { type fields struct { CTE []*tree.CTE - DeleteStmt *tree.DeleteStmt + DeleteStmt *tree.DeleteCore } tests := []struct { name string @@ -23,7 +23,7 @@ func TestDelete_ToSQL(t *testing.T) { CTE: []*tree.CTE{ mockCTE, }, - DeleteStmt: &tree.DeleteStmt{ + DeleteStmt: &tree.DeleteCore{ QualifiedTableName: &tree.QualifiedTableName{ TableName: "foo", }, @@ -46,17 +46,17 @@ func TestDelete_ToSQL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - d := &tree.Delete{ - CTE: tt.fields.CTE, - DeleteStmt: tt.fields.DeleteStmt, + d := &tree.DeleteStmt{ + CTE: tt.fields.CTE, + Core: tt.fields.DeleteStmt, } gotStr, err := tree.SafeToSQL(d) if (err != nil) != tt.wantErr { - t.Errorf("Delete.ToSQL() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("DeleteStmt.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return } if !compareIgnoringWhitespace(gotStr, tt.wantStr) { - t.Errorf("Delete.ToSQL() = %v, want %v", gotStr, tt.wantStr) + t.Errorf("DeleteStmt.ToSQL() = %v, want %v", gotStr, tt.wantStr) } }) } diff --git a/parse/sql/tree/expression.go b/parse/sql/tree/expression.go index d6c84ef08..d5e8c34c0 100644 --- a/parse/sql/tree/expression.go +++ b/parse/sql/tree/expression.go @@ -8,16 +8,9 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) -type Expression interface { - isExpression() // private function to prevent external packages from implementing this interface - ToSQL() string - Walk(w AstListener) error - joinable -} - type expressionBase struct{} -func (e *expressionBase) isExpression() {} +func (e *expressionBase) expression() {} func (e *expressionBase) joinable() joinableStatus { return joinableStatusInvalid @@ -469,7 +462,11 @@ type ExpressionIs struct { // NOTE: type cast only makes sense when wrapped } -func (e *ExpressionIs) Accept(w AstListener) error { +func (e *ExpressionIs) Accept(v AstVisitor) any { + return v.VisitExpressionIs(e) +} + +func (e *ExpressionIs) Walk(w AstListener) error { return run( w.EnterExpressionIs(e), walk(w, e.Left), @@ -575,7 +572,7 @@ type ExpressionSelect struct { Wrapped IsNot bool IsExists bool - Select *SelectStmt + Select *SelectStmtNoCte TypeCast TypeCastType // NOTE: type cast only makes sense when wrapped diff --git a/parse/sql/tree/expression_test.go b/parse/sql/tree/expression_test.go index a1949cf75..15bb6a361 100644 --- a/parse/sql/tree/expression_test.go +++ b/parse/sql/tree/expression_test.go @@ -658,15 +658,13 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { fields: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: &tree.SelectStmt{ + Select: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - Alias: "f", - }, + From: &tree.RelationTable{ + Name: "foo", + Alias: "f", }, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{ @@ -689,15 +687,13 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { fields: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: &tree.SelectStmt{ + Select: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - Alias: "f", - }, + From: &tree.RelationTable{ + Name: "foo", + Alias: "f", }, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{ diff --git a/parse/sql/tree/insert.go b/parse/sql/tree/insert.go index b44050275..7186be141 100644 --- a/parse/sql/tree/insert.go +++ b/parse/sql/tree/insert.go @@ -6,27 +6,27 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) -type Insert struct { +type InsertStmt struct { node - CTE []*CTE - InsertStmt *InsertStmt + CTE []*CTE + Core *InsertCore } -func (ins *Insert) Accept(v AstVisitor) any { - return v.VisitInsert(ins) +func (ins *InsertStmt) Accept(v AstVisitor) any { + return v.VisitInsertStmt(ins) } -func (ins *Insert) Walk(w AstListener) error { +func (ins *InsertStmt) Walk(w AstListener) error { return run( - w.EnterInsert(ins), + w.EnterInsertStmt(ins), walkMany(w, ins.CTE), - walk(w, ins.InsertStmt), - w.ExitInsert(ins), + walk(w, ins.Core), + w.ExitInsertStmt(ins), ) } -func (ins *Insert) ToSQL() string { +func (ins *InsertStmt) ToSQL() string { stmt := sqlwriter.NewWriter() if len(ins.CTE) > 0 { @@ -36,14 +36,16 @@ func (ins *Insert) ToSQL() string { }) } - stmt.WriteString(ins.InsertStmt.ToSQL()) + stmt.WriteString(ins.Core.ToSQL()) stmt.Token.Semicolon() return stmt.String() } -type InsertStmt struct { +func (ins *InsertStmt) statement() {} + +type InsertCore struct { node schema string @@ -56,13 +58,13 @@ type InsertStmt struct { ReturningClause *ReturningClause } -func (ins *InsertStmt) Accept(v AstVisitor) any { - return v.VisitInsertStmt(ins) +func (ins *InsertCore) Accept(v AstVisitor) any { + return v.VisitInsertCore(ins) } -func (ins *InsertStmt) Walk(w AstListener) error { +func (ins *InsertCore) Walk(w AstListener) error { return run( - w.EnterInsertStmt(ins), + w.EnterInsertCore(ins), func() error { for _, v := range ins.Values { err := walkMany(w, v) @@ -74,14 +76,14 @@ func (ins *InsertStmt) Walk(w AstListener) error { }(), walk(w, ins.Upsert), walk(w, ins.ReturningClause), - w.ExitInsertStmt(ins), + w.ExitInsertCore(ins), ) } // SetSchema sets the schema of the table. // It should not be called by the parser, and is meant to be called // by processes after parsing. -func (ins *InsertStmt) SetSchema(schema string) { +func (ins *InsertCore) SetSchema(schema string) { ins.schema = schema } @@ -109,7 +111,7 @@ func (i *InsertType) String() string { } } -func (ins *InsertStmt) ToSQL() string { +func (ins *InsertCore) ToSQL() string { ins.check() stmt := sqlwriter.NewWriter() @@ -158,7 +160,7 @@ func (ins *InsertStmt) ToSQL() string { return stmt.String() } -func (ins *InsertStmt) check() { +func (ins *InsertCore) check() { if ins.Table == "" { panic("InsertStatement: table name is empty") } diff --git a/parse/sql/tree/insert_test.go b/parse/sql/tree/insert_test.go index 8ddbe68fc..2fc417469 100644 --- a/parse/sql/tree/insert_test.go +++ b/parse/sql/tree/insert_test.go @@ -9,7 +9,7 @@ import ( func TestInsert_ToSQL(t *testing.T) { type fields struct { CTE []*tree.CTE - InsertStmt *tree.InsertStmt + InsertStmt *tree.InsertCore Schema string } tests := []struct { @@ -24,7 +24,7 @@ func TestInsert_ToSQL(t *testing.T) { CTE: []*tree.CTE{ mockCTE, }, - InsertStmt: &tree.InsertStmt{ + InsertStmt: &tree.InsertCore{ InsertType: tree.InsertTypeInsert, Table: "foo", Columns: []string{"bar", "baz"}, @@ -58,7 +58,7 @@ func TestInsert_ToSQL(t *testing.T) { { name: "insert to namespaced", fields: fields{ - InsertStmt: &tree.InsertStmt{ + InsertStmt: &tree.InsertCore{ InsertType: tree.InsertTypeInsert, Table: "bar", Columns: []string{"baz"}, @@ -75,22 +75,22 @@ func TestInsert_ToSQL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ins := &tree.Insert{ - CTE: tt.fields.CTE, - InsertStmt: tt.fields.InsertStmt, + ins := &tree.InsertStmt{ + CTE: tt.fields.CTE, + Core: tt.fields.InsertStmt, } if tt.fields.Schema != "" { - ins.InsertStmt.SetSchema(tt.fields.Schema) + ins.Core.SetSchema(tt.fields.Schema) } gotStr, err := tree.SafeToSQL(ins) if (err != nil) != tt.wantErr { - t.Errorf("Insert.ToSQL() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("InsertStmt.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return } if !compareIgnoringWhitespace(gotStr, tt.wantStr) { - t.Errorf("Insert.ToSQL() = %v, want %v", gotStr, tt.wantStr) + t.Errorf("InsertStmt.ToSQL() = %v, want %v", gotStr, tt.wantStr) } }) } @@ -219,7 +219,7 @@ func TestInsertStatement_ToSql(t *testing.T) { }() } - i := &tree.InsertStmt{ + i := &tree.InsertCore{ InsertType: tt.fields.InsertType, Table: tt.fields.Table, TableAlias: tt.fields.TableAlias, diff --git a/parse/sql/tree/relation.go b/parse/sql/tree/relation.go index 9aa891c6b..e38ae66a5 100644 --- a/parse/sql/tree/relation.go +++ b/parse/sql/tree/relation.go @@ -70,7 +70,7 @@ func (t *RelationTable) SetSchema(schema string) { type RelationSubquery struct { node - Select *SelectStmt + Select *SelectStmtNoCte Alias string } @@ -92,6 +92,7 @@ func (t *RelationSubquery) ToSQL() string { } stmt := sqlwriter.NewWriter() + stmt.Token.Lparen() selectString := t.Select.ToSQL() @@ -136,6 +137,7 @@ func (t *RelationJoin) ToSQL() string { } stmt := sqlwriter.NewWriter() + stmt.WriteString(t.Relation.ToSQL()) for _, join := range t.Joins { stmt.WriteString(join.ToSQL()) diff --git a/parse/sql/tree/relation_test.go b/parse/sql/tree/relation_test.go index 6d3bba875..71c9734e0 100644 --- a/parse/sql/tree/relation_test.go +++ b/parse/sql/tree/relation_test.go @@ -40,14 +40,12 @@ func TestRelation_ToSQL(t *testing.T) { name: "subquery", fields: fields{ Relation: &tree.RelationSubquery{ - Select: &tree.SelectStmt{ + Select: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - }, + From: &tree.RelationTable{ + Name: "foo", }, }, }, diff --git a/parse/sql/tree/result-column.go b/parse/sql/tree/result-column.go index e86880d55..764a1c241 100644 --- a/parse/sql/tree/result-column.go +++ b/parse/sql/tree/result-column.go @@ -4,12 +4,6 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) -type ResultColumn interface { - resultColumn() - ToSQL() string - Walk(w AstListener) error -} - // ResultColumnStar represents a wildcard column, i.e. `*`. type ResultColumnStar struct { node diff --git a/parse/sql/tree/select.go b/parse/sql/tree/select.go index e52470af5..ef17bfff9 100644 --- a/parse/sql/tree/select.go +++ b/parse/sql/tree/select.go @@ -6,27 +6,27 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) -type Select struct { +type SelectStmt struct { node - CTE []*CTE - SelectStmt *SelectStmt + CTE []*CTE + Stmt *SelectStmtNoCte } -func (s *Select) Accept(v AstVisitor) any { - return v.VisitSelect(s) +func (s *SelectStmt) Accept(v AstVisitor) any { + return v.VisitSelectStmt(s) } -func (s *Select) Walk(w AstListener) error { +func (s *SelectStmt) Walk(w AstListener) error { return run( - w.EnterSelect(s), + w.EnterSelectStmt(s), walkMany(w, s.CTE), - walk(w, s.SelectStmt), - w.ExitSelect(s), + walk(w, s.Stmt), + w.ExitSelectStmt(s), ) } -func (s *Select) ToSQL() string { +func (s *SelectStmt) ToSQL() string { stmt := sqlwriter.NewWriter() if len(s.CTE) > 0 { @@ -36,14 +36,16 @@ func (s *Select) ToSQL() string { }) } - stmt.WriteString(s.SelectStmt.ToSQL()) + stmt.WriteString(s.Stmt.ToSQL()) stmt.Token.Semicolon() return stmt.String() } -type SelectStmt struct { +func (s *SelectStmt) statement() {} + +type SelectStmtNoCte struct { node SelectCores []*SelectCore @@ -51,21 +53,21 @@ type SelectStmt struct { Limit *Limit } -func (s *SelectStmt) Accept(v AstVisitor) any { - return v.VisitSelectStmt(s) +func (s *SelectStmtNoCte) Accept(v AstVisitor) any { + return v.VisitSelectNoCte(s) } -func (s *SelectStmt) Walk(w AstListener) error { +func (s *SelectStmtNoCte) Walk(w AstListener) error { return run( - w.EnterSelectStmt(s), + w.EnterSelectStmtNoCte(s), walkMany(w, s.SelectCores), walk(w, s.OrderBy), walk(w, s.Limit), - w.ExitSelectStmt(s), + w.ExitSelectStmtNoCte(s), ) } -func (s *SelectStmt) ToSQL() (res string) { +func (s *SelectStmtNoCte) ToSQL() (res string) { stmt := sqlwriter.NewWriter() for _, core := range s.SelectCores { stmt.WriteString(core.ToSQL()) @@ -85,7 +87,7 @@ type SelectCore struct { SelectType SelectType Columns []ResultColumn - From *FromClause + From Relation Where Expression GroupBy *GroupBy Compound *CompoundOperator @@ -131,6 +133,7 @@ func (s *SelectCore) ToSQL() string { } if s.From != nil { + stmt.Token.From() stmt.WriteString(s.From.ToSQL()) } if s.Where != nil { @@ -159,31 +162,6 @@ func (s SelectType) Valid() error { } } -type FromClause struct { - node - - Relation Relation -} - -func (f *FromClause) Accept(v AstVisitor) any { - return v.VisitFromClause(f) -} - -func (f *FromClause) Walk(w AstListener) error { - return run( - w.EnterFromClause(f), - walk(w, f.Relation), - w.ExitFromClause(f), - ) -} - -func (f *FromClause) ToSQL() string { - stmt := sqlwriter.NewWriter() - stmt.Token.From() - stmt.WriteString(f.Relation.ToSQL()) - return stmt.String() -} - type CompoundOperatorType uint8 const ( diff --git a/parse/sql/tree/select_test.go b/parse/sql/tree/select_test.go index 5a5af2a17..ed67f2426 100644 --- a/parse/sql/tree/select_test.go +++ b/parse/sql/tree/select_test.go @@ -9,7 +9,7 @@ import ( func TestSelect_ToSQL(t *testing.T) { type fields struct { CTE []*tree.CTE - SelectStmt *tree.SelectStmt + SelectStmt *tree.SelectStmtNoCte } tests := []struct { name string @@ -23,17 +23,15 @@ func TestSelect_ToSQL(t *testing.T) { CTE: []*tree.CTE{ mockCTE, }, - SelectStmt: &tree.SelectStmt{ + SelectStmt: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{{ SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "foo"}}, &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "bar"}}, }, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - }, + From: &tree.RelationTable{ + Name: "foo", }, Where: &tree.ExpressionBinaryComparison{ Left: &tree.ExpressionColumn{Column: "foo"}, @@ -73,17 +71,17 @@ func TestSelect_ToSQL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - s := &tree.Select{ - CTE: tt.fields.CTE, - SelectStmt: tt.fields.SelectStmt, + s := &tree.SelectStmt{ + CTE: tt.fields.CTE, + Stmt: tt.fields.SelectStmt, } gotStr, err := tree.SafeToSQL(s) if (err != nil) != tt.wantErr { - t.Errorf("Select.ToSQL() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("SelectStmt.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return } if !compareIgnoringWhitespace(gotStr, tt.wantStr) { - t.Errorf("Select.ToSQL() = %v, want %v", gotStr, tt.wantStr) + t.Errorf("SelectStmt.ToSQL() = %v, want %v", gotStr, tt.wantStr) } }) } diff --git a/parse/sql/tree/update.go b/parse/sql/tree/update.go index 37909b43a..a758fd5fe 100644 --- a/parse/sql/tree/update.go +++ b/parse/sql/tree/update.go @@ -4,28 +4,27 @@ import ( sqlwriter "github.com/kwilteam/kwil-db/parse/sql/tree/sql-writer" ) -// Update Statement with CTEs -type Update struct { +type UpdateStmt struct { node - CTE []*CTE - UpdateStmt *UpdateStmt + CTE []*CTE + Core *UpdateCore } -func (u *Update) Accept(v AstVisitor) any { - return v.VisitUpdate(u) +func (u *UpdateStmt) Accept(v AstVisitor) any { + return v.VisitUpdateStmt(u) } -func (u *Update) Walk(w AstListener) error { +func (u *UpdateStmt) Walk(w AstListener) error { return run( - w.EnterUpdate(u), + w.EnterUpdateStmt(u), walkMany(w, u.CTE), - walk(w, u.UpdateStmt), - w.ExitUpdate(u), + walk(w, u.Core), + w.ExitUpdateStmt(u), ) } -func (u *Update) ToSQL() string { +func (u *UpdateStmt) ToSQL() string { stmt := sqlwriter.NewWriter() if len(u.CTE) > 0 { @@ -35,42 +34,42 @@ func (u *Update) ToSQL() string { }) } - stmt.WriteString(u.UpdateStmt.ToSQL()) + stmt.WriteString(u.Core.ToSQL()) stmt.Token.Semicolon() return stmt.String() } -// UpdateStmt is a statement that represents an UPDATE statement. -// USE Update INSTEAD OF THIS -type UpdateStmt struct { +func (u *UpdateStmt) statement() {} + +type UpdateCore struct { node QualifiedTableName *QualifiedTableName UpdateSetClause []*UpdateSetClause - From *FromClause + From Relation Where Expression Returning *ReturningClause } -func (u *UpdateStmt) Accept(v AstVisitor) any { - return v.VisitUpdateStmt(u) +func (u *UpdateCore) Accept(v AstVisitor) any { + return v.VisitUpdateCore(u) } -func (u *UpdateStmt) Walk(w AstListener) error { +func (u *UpdateCore) Walk(w AstListener) error { return run( - w.EnterUpdateStmt(u), + w.EnterUpdateCore(u), walk(w, u.QualifiedTableName), walkMany(w, u.UpdateSetClause), walk(w, u.From), walk(w, u.Where), walk(w, u.Returning), - w.ExitUpdateStmt(u), + w.ExitUpdateCore(u), ) } -func (u *UpdateStmt) ToSQL() string { +func (u *UpdateCore) ToSQL() string { u.check() stmt := sqlwriter.NewWriter() @@ -82,6 +81,7 @@ func (u *UpdateStmt) ToSQL() string { }) if u.From != nil { + stmt.Token.From() stmt.WriteString(u.From.ToSQL()) } @@ -97,7 +97,7 @@ func (u *UpdateStmt) ToSQL() string { return stmt.String() } -func (u *UpdateStmt) check() { +func (u *UpdateCore) check() { if u.QualifiedTableName == nil { panic("qualified table name is required") } diff --git a/parse/sql/tree/update_test.go b/parse/sql/tree/update_test.go index 172d2b340..04830127b 100644 --- a/parse/sql/tree/update_test.go +++ b/parse/sql/tree/update_test.go @@ -9,7 +9,7 @@ import ( func TestUpdate_ToSQL(t *testing.T) { type fields struct { CTE []*tree.CTE - Statement *tree.UpdateStmt + Statement *tree.UpdateCore } tests := []struct { name string @@ -23,7 +23,7 @@ func TestUpdate_ToSQL(t *testing.T) { CTE: []*tree.CTE{ mockCTE, }, - Statement: &tree.UpdateStmt{ + Statement: &tree.UpdateCore{ QualifiedTableName: &tree.QualifiedTableName{ TableName: "foo", TableAlias: "f", @@ -34,7 +34,7 @@ func TestUpdate_ToSQL(t *testing.T) { Expression: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: &tree.SelectStmt{ + Select: &tree.SelectStmtNoCte{ SelectCores: []*tree.SelectCore{ { SelectType: tree.SelectTypeAll, @@ -42,10 +42,8 @@ func TestUpdate_ToSQL(t *testing.T) { &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "foo"}}, &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "bar"}}, }, - From: &tree.FromClause{ - Relation: &tree.RelationTable{ - Name: "foo", - }, + From: &tree.RelationTable{ + Name: "foo", }, }, }, @@ -77,17 +75,17 @@ func TestUpdate_ToSQL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - u := &tree.Update{ - CTE: tt.fields.CTE, - UpdateStmt: tt.fields.Statement, + u := &tree.UpdateStmt{ + CTE: tt.fields.CTE, + Core: tt.fields.Statement, } gotStr, err := tree.SafeToSQL(u) if (err != nil) != tt.wantErr { - t.Errorf("Update.ToSQL() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("UpdateStmt.ToSQL() error = %v, wantErr %v", err, tt.wantErr) return } if !compareIgnoringWhitespace(gotStr, tt.wantStr) { - t.Errorf("Update.ToSQL() = %v, want %v", gotStr, tt.wantStr) + t.Errorf("UpdateStmt.ToSQL() = %v, want %v", gotStr, tt.wantStr) } }) } diff --git a/test/go.mod b/test/go.mod index 7eea82f00..ce313d0a8 100644 --- a/test/go.mod +++ b/test/go.mod @@ -137,7 +137,7 @@ require ( github.com/klauspost/compress v1.17.0 // indirect github.com/kwilteam/action-grammar-go v0.1.1 // indirect github.com/kwilteam/kwil-db/parse v0.1.2 // indirect - github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7 // indirect + github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect diff --git a/test/go.sum b/test/go.sum index 9f082a534..c9401e828 100644 --- a/test/go.sum +++ b/test/go.sum @@ -476,8 +476,8 @@ github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4Exm github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7jB33zFgCXxqCwea12LcPUiNmpghLTfU9Eg= github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7 h1:YTuzZjTRE8r9FzIdSpAn9xaTkz8ANyuJpF8LxTO39Us= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e h1:N7/8ZzPZ5QopHx1ZfPluA5nFNPqbc+LDpuyblptFlWk= +github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= From c1fc6d1922636bbdbab4a96324149e8185a5d109 Mon Sep 17 00:00:00 2001 From: Yaiba <4yaiba@gmail.com> Date: Mon, 25 Mar 2024 11:13:21 -0500 Subject: [PATCH 4/7] parse: move sql-grammar-go in kwil-db --- .gitmodules | 3 + Taskfile-antlr.yml | 13 + Taskfile.yml | 1 + go.mod | 1 - go.sum | 2 - parse/go.mod | 1 - parse/go.sum | 2 - parse/sql/antlr-grammar | 1 + parse/sql/ast_builder.go | 130 +- parse/sql/grammar/SQLLexer.interp | 304 + parse/sql/grammar/SQLLexer.tokens | 182 + parse/sql/grammar/SQLParser.interp | 259 + parse/sql/grammar/SQLParser.tokens | 182 + parse/sql/grammar/sql_lexer.go | 570 + parse/sql/grammar/sql_parser.go | 13022 ++++++++++++++++++ parse/sql/grammar/sqlparser_base_visitor.go | 316 + parse/sql/grammar/sqlparser_visitor.go | 240 + parse/sql/parser.go | 6 +- test/go.mod | 1 - test/go.sum | 2 - 20 files changed, 15161 insertions(+), 77 deletions(-) create mode 100644 Taskfile-antlr.yml create mode 160000 parse/sql/antlr-grammar create mode 100644 parse/sql/grammar/SQLLexer.interp create mode 100644 parse/sql/grammar/SQLLexer.tokens create mode 100644 parse/sql/grammar/SQLParser.interp create mode 100644 parse/sql/grammar/SQLParser.tokens create mode 100644 parse/sql/grammar/sql_lexer.go create mode 100644 parse/sql/grammar/sql_parser.go create mode 100644 parse/sql/grammar/sqlparser_base_visitor.go create mode 100644 parse/sql/grammar/sqlparser_visitor.go diff --git a/.gitmodules b/.gitmodules index 9d29f90e6..b31e44f91 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "proto"] path = proto url = https://github.com/kwilteam/proto +[submodule "parse/sql/antlr-grammar"] + path = parse/sql/antlr-grammar + url = https://github.com/kwilteam/sql-grammar diff --git a/Taskfile-antlr.yml b/Taskfile-antlr.yml new file mode 100644 index 000000000..584fb811f --- /dev/null +++ b/Taskfile-antlr.yml @@ -0,0 +1,13 @@ +version: '3' + +tasks: + sql: + desc: Generate sql grammar go code. + cmds: + - rm -rf parse/sql/grammar/* + - rm -rf parse/sql/antlr-grammar/{gen,.antlr}/* + - cd parse/sql/antlr-grammar/ && ./generate.sh Go grammar ../grammar + sources: + - parse/sql/antlr-grammar/*.g4 + generates: + - parse/sql/grammar/*.{go,interp,tokens} \ No newline at end of file diff --git a/Taskfile.yml b/Taskfile.yml index 130a6f4a6..534a579ca 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -2,6 +2,7 @@ version: "3" includes: pb: ./Taskfile-pb.yml + antlr: ./Taskfile-antlr.yml tasks: default: diff --git a/go.mod b/go.mod index 5adcc4600..8fa4b651b 100644 --- a/go.mod +++ b/go.mod @@ -93,7 +93,6 @@ require ( github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/kwilteam/action-grammar-go v0.1.1 // indirect - github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect diff --git a/go.sum b/go.sum index 14a4e6507..c1984246d 100644 --- a/go.sum +++ b/go.sum @@ -278,8 +278,6 @@ github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7j github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 h1:YiPBu0pOeYOtOVfwKQqdWB07SUef9LvngF4bVFD+x34= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7/go.mod h1:+BrFrV+3qcdYIfptqjwatE5gT19azuRHJzw77wMPY8c= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e h1:N7/8ZzPZ5QopHx1ZfPluA5nFNPqbc+LDpuyblptFlWk= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= diff --git a/parse/go.mod b/parse/go.mod index 85f79906d..61192bc2f 100644 --- a/parse/go.mod +++ b/parse/go.mod @@ -5,7 +5,6 @@ go 1.21 require ( github.com/antlr4-go/antlr/v4 v4.13.0 github.com/kwilteam/action-grammar-go v0.1.1 - github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e github.com/pganalyze/pg_query_go/v5 v5.1.0 // This is only for unit testing github.com/stretchr/testify v1.8.4 ) diff --git a/parse/go.sum b/parse/go.sum index 3e0b7ef98..a796940bc 100644 --- a/parse/go.sum +++ b/parse/go.sum @@ -16,8 +16,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e h1:N7/8ZzPZ5QopHx1ZfPluA5nFNPqbc+LDpuyblptFlWk= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/pganalyze/pg_query_go/v5 v5.1.0 h1:MlxQqHZnvA3cbRQYyIrjxEjzo560P6MyTgtlaf3pmXg= github.com/pganalyze/pg_query_go/v5 v5.1.0/go.mod h1:FsglvxidZsVN+Ltw3Ai6nTgPVcK2BPukH3jCDEqc1Ug= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/parse/sql/antlr-grammar b/parse/sql/antlr-grammar new file mode 160000 index 000000000..3247c0966 --- /dev/null +++ b/parse/sql/antlr-grammar @@ -0,0 +1 @@ +Subproject commit 3247c09666d40ab25b12f6d7c9d026511c8f6f50 diff --git a/parse/sql/ast_builder.go b/parse/sql/ast_builder.go index dc4c997ba..6eaecbcef 100644 --- a/parse/sql/ast_builder.go +++ b/parse/sql/ast_builder.go @@ -8,13 +8,13 @@ import ( "github.com/antlr4-go/antlr/v4" "github.com/kwilteam/kwil-db/parse/internal/util" + "github.com/kwilteam/kwil-db/parse/sql/grammar" "github.com/kwilteam/kwil-db/parse/sql/tree" - "github.com/kwilteam/sql-grammar-go/sqlgrammar" ) // astBuilder is a visitor that visits Antlr parsed tree and builds sql AST. type astBuilder struct { - *sqlgrammar.BaseSQLParserVisitor + *grammar.BaseSQLParserVisitor trace bool trackPos bool @@ -34,7 +34,7 @@ func astBuilderWithPos(on bool) astBuilderOption { } } -var _ sqlgrammar.SQLParserVisitor = &astBuilder{} +var _ grammar.SQLParserVisitor = &astBuilder{} func newAstBuilder(opts ...astBuilderOption) *astBuilder { k := &astBuilder{} @@ -60,7 +60,7 @@ func (v *astBuilder) getPos(ctx antlr.ParserRuleContext) *tree.Position { } // VisitCommon_table_expression is called when visiting a common_table_expression, return *tree.CTE -func (v *astBuilder) VisitCommon_table_expression(ctx *sqlgrammar.Common_table_expressionContext) interface{} { +func (v *astBuilder) VisitCommon_table_expression(ctx *grammar.Common_table_expressionContext) interface{} { cte := tree.CTE{} // cte_table_name @@ -78,7 +78,7 @@ func (v *astBuilder) VisitCommon_table_expression(ctx *sqlgrammar.Common_table_e } // VisitCommon_table_stmt is called when visiting a common_table_stmt, return []*tree.CTE. -func (v *astBuilder) VisitCommon_table_stmt(ctx *sqlgrammar.Common_table_stmtContext) interface{} { +func (v *astBuilder) VisitCommon_table_stmt(ctx *grammar.Common_table_stmtContext) interface{} { if ctx == nil { return nil } @@ -92,19 +92,19 @@ func (v *astBuilder) VisitCommon_table_stmt(ctx *sqlgrammar.Common_table_stmtCon return ctes } -func getInsertType(ctx *sqlgrammar.Insert_coreContext) tree.InsertType { +func getInsertType(ctx *grammar.Insert_coreContext) tree.InsertType { return tree.InsertTypeInsert } // NOTE: VisitExpr() is dispatched in various VisitXXX_expr methods. // Calling `v.Visit(ctx.Expr()).(tree.Expression)` will dispatch to the correct // VisitXXX_expr method. -// func (v *KFSqliteVisitor) VisitExpr(ctx *sqlgrammar.ExprContext) interface{} { +// func (v *KFSqliteVisitor) VisitExpr(ctx *grammar.ExprContext) interface{} { // //return v.visitExpr(ctx) // } // VisitType_cast is called when visiting a type_cast, return tree.TypeCastType -func (v *astBuilder) VisitType_cast(ctx *sqlgrammar.Type_castContext) interface{} { +func (v *astBuilder) VisitType_cast(ctx *grammar.Type_castContext) interface{} { if ctx != nil { typeCastRaw := ctx.Cast_type().GetText() if typeCastRaw[0] == '`' || typeCastRaw[0] == '"' || typeCastRaw[0] == '[' { @@ -128,7 +128,7 @@ func (v *astBuilder) VisitType_cast(ctx *sqlgrammar.Type_castContext) interface{ } // VisitLiteral is called when visiting a literal, return *tree.ExpressionLiteral -func (v *astBuilder) VisitLiteral(ctx *sqlgrammar.LiteralContext) interface{} { +func (v *astBuilder) VisitLiteral(ctx *grammar.LiteralContext) interface{} { // all literal values are string text := ctx.GetText() if strings.EqualFold(text, "null") { @@ -138,7 +138,7 @@ func (v *astBuilder) VisitLiteral(ctx *sqlgrammar.LiteralContext) interface{} { } // VisitLiteral_expr is called when visiting a literal_expr, return *tree.ExpressionLiteral -func (v *astBuilder) VisitLiteral_expr(ctx *sqlgrammar.Literal_exprContext) interface{} { +func (v *astBuilder) VisitLiteral_expr(ctx *grammar.Literal_exprContext) interface{} { // all literal values are string expr := &tree.ExpressionLiteral{ Value: v.Visit(ctx.Literal()).(string), @@ -150,7 +150,7 @@ func (v *astBuilder) VisitLiteral_expr(ctx *sqlgrammar.Literal_exprContext) inte } // VisitVariable_expr is called when visiting a variable_expr, return *tree.ExpressionBindParameter -func (v *astBuilder) VisitVariable_expr(ctx *sqlgrammar.Variable_exprContext) interface{} { +func (v *astBuilder) VisitVariable_expr(ctx *grammar.Variable_exprContext) interface{} { expr := &tree.ExpressionBindParameter{ Parameter: ctx.Variable().GetText(), } @@ -162,7 +162,7 @@ func (v *astBuilder) VisitVariable_expr(ctx *sqlgrammar.Variable_exprContext) in // VisitColumn_ref is called when visiting a column_ref, return *tree.ExpressionColumn, without // type cast info. -func (v *astBuilder) VisitColumn_ref(ctx *sqlgrammar.Column_refContext) interface{} { +func (v *astBuilder) VisitColumn_ref(ctx *grammar.Column_refContext) interface{} { expr := &tree.ExpressionColumn{} if ctx.Table_name() != nil { expr.Table = util.ExtractSQLName(ctx.Table_name().GetText()) @@ -172,7 +172,7 @@ func (v *astBuilder) VisitColumn_ref(ctx *sqlgrammar.Column_refContext) interfac } // VisitColumn_expr is called when visiting a column_expr, return *tree.ExpressionColumn -func (v *astBuilder) VisitColumn_expr(ctx *sqlgrammar.Column_exprContext) interface{} { +func (v *astBuilder) VisitColumn_expr(ctx *grammar.Column_exprContext) interface{} { expr := v.Visit(ctx.Column_ref()).(*tree.ExpressionColumn) if ctx.Type_cast() != nil { expr.TypeCast = v.Visit(ctx.Type_cast()).(tree.TypeCastType) @@ -181,7 +181,7 @@ func (v *astBuilder) VisitColumn_expr(ctx *sqlgrammar.Column_exprContext) interf } // VistUnary_expr is called when visiting a unary_expr, return *tree.ExpressionUnary -func (v *astBuilder) VisitUnary_expr(ctx *sqlgrammar.Unary_exprContext) interface{} { +func (v *astBuilder) VisitUnary_expr(ctx *grammar.Unary_exprContext) interface{} { expr := &tree.ExpressionUnary{} switch { case ctx.MINUS() != nil: @@ -207,7 +207,7 @@ func (v *astBuilder) getCollateType(collationName string) tree.CollationType { } // VisitCollate_expr is called when visiting a collate_expr, return *tree.ExpressionCollate -func (v *astBuilder) VisitCollate_expr(ctx *sqlgrammar.Collate_exprContext) interface{} { +func (v *astBuilder) VisitCollate_expr(ctx *grammar.Collate_exprContext) interface{} { expr := v.Visit(ctx.Expr()).(tree.Expression) collationName := util.ExtractSQLName(ctx.Collation_name().GetText()) return &tree.ExpressionCollate{ @@ -217,7 +217,7 @@ func (v *astBuilder) VisitCollate_expr(ctx *sqlgrammar.Collate_exprContext) inte } // VisitParenthesized_expr is called when visiting a parenthesized_expr, return *tree.Expression -func (v *astBuilder) VisitParenthesized_expr(ctx *sqlgrammar.Parenthesized_exprContext) interface{} { +func (v *astBuilder) VisitParenthesized_expr(ctx *grammar.Parenthesized_exprContext) interface{} { var typeCast tree.TypeCastType if ctx.Type_cast() != nil { typeCast = v.Visit(ctx.Type_cast()).(tree.TypeCastType) @@ -271,12 +271,12 @@ func (v *astBuilder) VisitParenthesized_expr(ctx *sqlgrammar.Parenthesized_exprC return expr } -func (v *astBuilder) VisitSubquery(ctx *sqlgrammar.SubqueryContext) interface{} { +func (v *astBuilder) VisitSubquery(ctx *grammar.SubqueryContext) interface{} { return v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) } // VisitSubquery_expr is called when visiting a subquery_expr, return *tree.ExpressionSelect -func (v *astBuilder) VisitSubquery_expr(ctx *sqlgrammar.Subquery_exprContext) interface{} { +func (v *astBuilder) VisitSubquery_expr(ctx *grammar.Subquery_exprContext) interface{} { stmt := v.Visit(ctx.Subquery()).(*tree.SelectStmtNoCte) expr := &tree.ExpressionSelect{ Select: stmt, @@ -291,7 +291,7 @@ func (v *astBuilder) VisitSubquery_expr(ctx *sqlgrammar.Subquery_exprContext) in } // VisitWhen_clause is called when visiting a when_clause, return [2]*tree.Expression -func (v *astBuilder) VisitWhen_clause(ctx *sqlgrammar.When_clauseContext) interface{} { +func (v *astBuilder) VisitWhen_clause(ctx *grammar.When_clauseContext) interface{} { var when = [2]tree.Expression{} when[0] = v.Visit(ctx.GetCondition()).(tree.Expression) when[1] = v.Visit(ctx.GetResult()).(tree.Expression) @@ -299,7 +299,7 @@ func (v *astBuilder) VisitWhen_clause(ctx *sqlgrammar.When_clauseContext) interf } // VisitCase_expr is called when visiting a case_expr, return *tree.ExpressionCase -func (v *astBuilder) VisitCase_expr(ctx *sqlgrammar.Case_exprContext) interface{} { +func (v *astBuilder) VisitCase_expr(ctx *grammar.Case_exprContext) interface{} { expr := &tree.ExpressionCase{} if ctx.GetCase_clause() != nil { expr.CaseExpression = v.Visit(ctx.GetCase_clause()).(tree.Expression) @@ -317,7 +317,7 @@ func (v *astBuilder) VisitCase_expr(ctx *sqlgrammar.Case_exprContext) interface{ } // VisitFunction_call is called when visiting a function_call, return *tree.ExpressionFunction -func (v *astBuilder) VisitFunction_call(ctx *sqlgrammar.Function_callContext) interface{} { +func (v *astBuilder) VisitFunction_call(ctx *grammar.Function_callContext) interface{} { expr := &tree.ExpressionFunction{ Inputs: make([]tree.Expression, len(ctx.AllExpr())), } @@ -341,7 +341,7 @@ func (v *astBuilder) VisitFunction_call(ctx *sqlgrammar.Function_callContext) in } // VisitFunction_expr is called when visiting a function_expr, return *tree.ExpressionFunction -func (v *astBuilder) VisitFunction_expr(ctx *sqlgrammar.Function_exprContext) interface{} { +func (v *astBuilder) VisitFunction_expr(ctx *grammar.Function_exprContext) interface{} { expr := v.Visit(ctx.Function_call()).(*tree.ExpressionFunction) if ctx.Type_cast() != nil { expr.TypeCast = v.Visit(ctx.Type_cast()).(tree.TypeCastType) @@ -350,12 +350,12 @@ func (v *astBuilder) VisitFunction_expr(ctx *sqlgrammar.Function_exprContext) in } // VisitExpr_list_expr is called when visiting a expr_list_expr, return *tree.ExpressionList -func (v *astBuilder) VisitExpr_list_expr(ctx *sqlgrammar.Expr_list_exprContext) interface{} { +func (v *astBuilder) VisitExpr_list_expr(ctx *grammar.Expr_list_exprContext) interface{} { return v.Visit(ctx.Expr_list()).(*tree.ExpressionList) } // VisitArithmetic_expr is called when visiting a arithmetic_expr, return *tree.ExpressionArithmetic -func (v *astBuilder) VisitArithmetic_expr(ctx *sqlgrammar.Arithmetic_exprContext) interface{} { +func (v *astBuilder) VisitArithmetic_expr(ctx *grammar.Arithmetic_exprContext) interface{} { expr := &tree.ExpressionArithmetic{} expr.Left = v.Visit(ctx.GetLeft()).(tree.Expression) expr.Right = v.Visit(ctx.GetRight()).(tree.Expression) @@ -379,7 +379,7 @@ func (v *astBuilder) VisitArithmetic_expr(ctx *sqlgrammar.Arithmetic_exprContext } // VisitIn_subquery_expr is called when visiting a in_suquery_expr, return *tree.ExpressionBinaryComparison -func (v *astBuilder) VisitIn_subquery_expr(ctx *sqlgrammar.In_subquery_exprContext) interface{} { +func (v *astBuilder) VisitIn_subquery_expr(ctx *grammar.In_subquery_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetElem()).(tree.Expression), Operator: tree.ComparisonOperatorIn, @@ -393,7 +393,7 @@ func (v *astBuilder) VisitIn_subquery_expr(ctx *sqlgrammar.In_subquery_exprConte } // VisitExpr_list is called when visiting a expr_list, return *tree.ExpressionList -func (v *astBuilder) VisitExpr_list(ctx *sqlgrammar.Expr_listContext) interface{} { +func (v *astBuilder) VisitExpr_list(ctx *grammar.Expr_listContext) interface{} { exprCount := len(ctx.AllExpr()) exprs := make([]tree.Expression, exprCount) for i, exprCtx := range ctx.AllExpr() { @@ -403,7 +403,7 @@ func (v *astBuilder) VisitExpr_list(ctx *sqlgrammar.Expr_listContext) interface{ } // VisitIn_list_expr is called when visiting a in_list_expr, return *tree.ExpressionBinaryComparison -func (v *astBuilder) VisitIn_list_expr(ctx *sqlgrammar.In_list_exprContext) interface{} { +func (v *astBuilder) VisitIn_list_expr(ctx *grammar.In_list_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetElem()).(tree.Expression), Operator: tree.ComparisonOperatorIn, @@ -416,7 +416,7 @@ func (v *astBuilder) VisitIn_list_expr(ctx *sqlgrammar.In_list_exprContext) inte } // VisitBetween_expr is called when visiting a between_expr, return *tree.ExpressionBetween -func (v *astBuilder) VisitBetween_expr(ctx *sqlgrammar.Between_exprContext) interface{} { +func (v *astBuilder) VisitBetween_expr(ctx *grammar.Between_exprContext) interface{} { expr := &tree.ExpressionBetween{ Expression: v.Visit(ctx.GetElem()).(tree.Expression), Left: v.Visit(ctx.GetLow()).(tree.Expression), @@ -429,7 +429,7 @@ func (v *astBuilder) VisitBetween_expr(ctx *sqlgrammar.Between_exprContext) inte } // VisitLike_expr is called when visiting a like_expr, return *tree.ExpressionStringCompare -func (v *astBuilder) VisitLike_expr(ctx *sqlgrammar.Like_exprContext) interface{} { +func (v *astBuilder) VisitLike_expr(ctx *grammar.Like_exprContext) interface{} { expr := &tree.ExpressionStringCompare{ Left: v.Visit(ctx.GetElem()).(tree.Expression), Operator: tree.StringOperatorLike, @@ -445,7 +445,7 @@ func (v *astBuilder) VisitLike_expr(ctx *sqlgrammar.Like_exprContext) interface{ } // VisitComparisonOperator is called when visiting a comparisonOpertor, return tree.ComparisonOperator -func (v *astBuilder) VisitComparisonOperator(ctx *sqlgrammar.ComparisonOperatorContext) interface{} { +func (v *astBuilder) VisitComparisonOperator(ctx *grammar.ComparisonOperatorContext) interface{} { switch { case ctx.LT() != nil: return tree.ComparisonOperatorLessThan @@ -467,7 +467,7 @@ func (v *astBuilder) VisitComparisonOperator(ctx *sqlgrammar.ComparisonOperatorC } // VisitComparison_expr is called when visiting a comparison_expr, return *tree.ExpressionBinaryComparison -func (v *astBuilder) VisitComparison_expr(ctx *sqlgrammar.Comparison_exprContext) interface{} { +func (v *astBuilder) VisitComparison_expr(ctx *grammar.Comparison_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetLeft()).(tree.Expression), Operator: v.Visit(ctx.ComparisonOperator()).(tree.ComparisonOperator), @@ -478,14 +478,14 @@ func (v *astBuilder) VisitComparison_expr(ctx *sqlgrammar.Comparison_exprContext } // VisitBollean_value is called when visiting a boolean_value, return *tree.ExpressionLiteral -func (v *astBuilder) VisitBoolean_value(ctx *sqlgrammar.Boolean_valueContext) interface{} { +func (v *astBuilder) VisitBoolean_value(ctx *grammar.Boolean_valueContext) interface{} { return &tree.ExpressionLiteral{ Value: ctx.GetText(), } } // VisitIs_expr is called when visiting a is_expr, return *tree.ExpressionIs -func (v *astBuilder) VisitIs_expr(ctx *sqlgrammar.Is_exprContext) interface{} { +func (v *astBuilder) VisitIs_expr(ctx *grammar.Is_exprContext) interface{} { expr := &tree.ExpressionIs{ Left: v.Visit(ctx.Expr(0)).(tree.Expression), } @@ -508,7 +508,7 @@ func (v *astBuilder) VisitIs_expr(ctx *sqlgrammar.Is_exprContext) interface{} { } // VisitNull_expr is called when visiting a null_expr, return *tree.ExpressionIs -func (v *astBuilder) VisitNull_expr(ctx *sqlgrammar.Null_exprContext) interface{} { +func (v *astBuilder) VisitNull_expr(ctx *grammar.Null_exprContext) interface{} { expr := &tree.ExpressionIs{ Left: v.Visit(ctx.Expr()).(tree.Expression), Right: &tree.ExpressionLiteral{Value: "NULL"}, @@ -520,7 +520,7 @@ func (v *astBuilder) VisitNull_expr(ctx *sqlgrammar.Null_exprContext) interface{ } // VisitLogical_not_expr is called when visiting a logical_not_expr, return *tree.ExpressionUnary -func (v *astBuilder) VisitLogical_not_expr(ctx *sqlgrammar.Logical_not_exprContext) interface{} { +func (v *astBuilder) VisitLogical_not_expr(ctx *grammar.Logical_not_exprContext) interface{} { return &tree.ExpressionUnary{ Operator: tree.UnaryOperatorNot, Operand: v.Visit(ctx.Expr()).(tree.Expression), @@ -528,7 +528,7 @@ func (v *astBuilder) VisitLogical_not_expr(ctx *sqlgrammar.Logical_not_exprConte } // VisitLogical_binary_expr is called when visiting a logical_binary_expr, return *tree.ExpressionBinaryLogical -func (v *astBuilder) VisitLogical_binary_expr(ctx *sqlgrammar.Logical_binary_exprContext) interface{} { +func (v *astBuilder) VisitLogical_binary_expr(ctx *grammar.Logical_binary_exprContext) interface{} { expr := &tree.ExpressionBinaryComparison{ Left: v.Visit(ctx.GetLeft()).(tree.Expression), Right: v.Visit(ctx.GetRight()).(tree.Expression), @@ -547,7 +547,7 @@ func (v *astBuilder) VisitLogical_binary_expr(ctx *sqlgrammar.Logical_binary_exp } // VisitValues_clause is called when visiting a values_clause, return [][]tree.Expression -func (v *astBuilder) VisitValues_clause(ctx *sqlgrammar.Values_clauseContext) interface{} { +func (v *astBuilder) VisitValues_clause(ctx *grammar.Values_clauseContext) interface{} { if ctx == nil { return nil } @@ -566,7 +566,7 @@ func (v *astBuilder) VisitValues_clause(ctx *sqlgrammar.Values_clauseContext) in } // VisitUpsert_clause is called when visiting a upsert_clause, return *tree.Upsert -func (v *astBuilder) VisitUpsert_clause(ctx *sqlgrammar.Upsert_clauseContext) interface{} { +func (v *astBuilder) VisitUpsert_clause(ctx *grammar.Upsert_clauseContext) interface{} { clause := tree.Upsert{ Type: tree.UpsertTypeDoNothing, } @@ -609,7 +609,7 @@ func (v *astBuilder) VisitUpsert_clause(ctx *sqlgrammar.Upsert_clauseContext) in } // VisitUpsert_update is called when visiting a upsert_update, return *tree.UpdateSetClause -func (v *astBuilder) VisitUpsert_update(ctx *sqlgrammar.Upsert_updateContext) interface{} { +func (v *astBuilder) VisitUpsert_update(ctx *grammar.Upsert_updateContext) interface{} { clause := tree.UpdateSetClause{} if ctx.Column_name_list() != nil { clause.Columns = v.Visit(ctx.Column_name_list()).([]string) @@ -622,7 +622,7 @@ func (v *astBuilder) VisitUpsert_update(ctx *sqlgrammar.Upsert_updateContext) in } // VisitColumn_name_list is called when visiting a column_name_list, return []string -func (v *astBuilder) VisitColumn_name_list(ctx *sqlgrammar.Column_name_listContext) interface{} { +func (v *astBuilder) VisitColumn_name_list(ctx *grammar.Column_name_listContext) interface{} { names := make([]string, len(ctx.AllColumn_name())) for i, nameCtx := range ctx.AllColumn_name() { names[i] = util.ExtractSQLName(nameCtx.GetText()) @@ -631,12 +631,12 @@ func (v *astBuilder) VisitColumn_name_list(ctx *sqlgrammar.Column_name_listConte } // VisitColumn_name is called when visiting a column_name, return string -func (v *astBuilder) VisitColumn_name(ctx *sqlgrammar.Column_nameContext) interface{} { +func (v *astBuilder) VisitColumn_name(ctx *grammar.Column_nameContext) interface{} { return util.ExtractSQLName(ctx.GetText()) } // VisitReturning_clause is called when visiting a returning_clause, return *tree.ReturningClause -func (v *astBuilder) VisitReturning_clause(ctx *sqlgrammar.Returning_clauseContext) interface{} { +func (v *astBuilder) VisitReturning_clause(ctx *grammar.Returning_clauseContext) interface{} { clause := tree.ReturningClause{} clause.Returned = make([]*tree.ReturningClauseColumn, len(ctx.AllReturning_clause_result_column())) for i, columnCtx := range ctx.AllReturning_clause_result_column() { @@ -660,7 +660,7 @@ func (v *astBuilder) VisitReturning_clause(ctx *sqlgrammar.Returning_clauseConte } // VisitUpdate_set_subclause is called when visiting a column_assign_subclause, return *tree.UpdateSetClause -func (v *astBuilder) VisitUpdate_set_subclause(ctx *sqlgrammar.Update_set_subclauseContext) interface{} { +func (v *astBuilder) VisitUpdate_set_subclause(ctx *grammar.Update_set_subclauseContext) interface{} { result := tree.UpdateSetClause{} if ctx.Column_name_list() != nil { @@ -674,7 +674,7 @@ func (v *astBuilder) VisitUpdate_set_subclause(ctx *sqlgrammar.Update_set_subcla } // VisitQualified_table_name is called when visiting a qualified_table_name, return *tree.QualifiedTableName -func (v *astBuilder) VisitQualified_table_name(ctx *sqlgrammar.Qualified_table_nameContext) interface{} { +func (v *astBuilder) VisitQualified_table_name(ctx *grammar.Qualified_table_nameContext) interface{} { result := tree.QualifiedTableName{} result.TableName = util.ExtractSQLName(ctx.Table_name().GetText()) @@ -687,7 +687,7 @@ func (v *astBuilder) VisitQualified_table_name(ctx *sqlgrammar.Qualified_table_n } // VisitUpdate_core is called when visiting a update_core, return *tree.UpdateCore -func (v *astBuilder) VisitUpdate_core(ctx *sqlgrammar.Update_coreContext) interface{} { +func (v *astBuilder) VisitUpdate_core(ctx *grammar.Update_coreContext) interface{} { var updateStmt tree.UpdateCore updateStmt.QualifiedTableName = v.Visit(ctx.Qualified_table_name()).(*tree.QualifiedTableName) @@ -713,7 +713,7 @@ func (v *astBuilder) VisitUpdate_core(ctx *sqlgrammar.Update_coreContext) interf } // VisitUpdate_stmt is called when visiting a update_stmt, return *tree.UpdateStmt -func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interface{} { +func (v *astBuilder) VisitUpdate_stmt(ctx *grammar.Update_stmtContext) interface{} { t := tree.UpdateStmt{} if ctx.Common_table_stmt() != nil { @@ -724,7 +724,7 @@ func (v *astBuilder) VisitUpdate_stmt(ctx *sqlgrammar.Update_stmtContext) interf return &t } -func (v *astBuilder) VisitInsert_core(ctx *sqlgrammar.Insert_coreContext) interface{} { +func (v *astBuilder) VisitInsert_core(ctx *grammar.Insert_coreContext) interface{} { var insertStmt tree.InsertCore insertStmt.InsertType = getInsertType(ctx) @@ -752,7 +752,7 @@ func (v *astBuilder) VisitInsert_core(ctx *sqlgrammar.Insert_coreContext) interf return &insertStmt } -func (v *astBuilder) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interface{} { +func (v *astBuilder) VisitInsert_stmt(ctx *grammar.Insert_stmtContext) interface{} { t := tree.InsertStmt{} if ctx.Common_table_stmt() != nil { @@ -764,7 +764,7 @@ func (v *astBuilder) VisitInsert_stmt(ctx *sqlgrammar.Insert_stmtContext) interf } // VisitCompound_operator is called when visiting a compound_operator, return *tree.CompoundOperator -func (v *astBuilder) VisitCompound_operator(ctx *sqlgrammar.Compound_operatorContext) interface{} { +func (v *astBuilder) VisitCompound_operator(ctx *grammar.Compound_operatorContext) interface{} { switch { case ctx.UNION_() != nil: if ctx.ALL_() != nil { @@ -780,7 +780,7 @@ func (v *astBuilder) VisitCompound_operator(ctx *sqlgrammar.Compound_operatorCon } // VisitOrdering_term is called when visiting a ordering_term, return *tree.OrderingTerm -func (v *astBuilder) VisitOrdering_term(ctx *sqlgrammar.Ordering_termContext) interface{} { +func (v *astBuilder) VisitOrdering_term(ctx *grammar.Ordering_termContext) interface{} { result := tree.OrderingTerm{} result.Expression = v.Visit(ctx.Expr()).(tree.Expression) @@ -804,7 +804,7 @@ func (v *astBuilder) VisitOrdering_term(ctx *sqlgrammar.Ordering_termContext) in } // VisitOrder_by_stmt is called when visiting a order_by_stmt, return *tree.OrderBy -func (v *astBuilder) VisitOrder_by_stmt(ctx *sqlgrammar.Order_by_stmtContext) interface{} { +func (v *astBuilder) VisitOrder_by_stmt(ctx *grammar.Order_by_stmtContext) interface{} { count := len(ctx.AllOrdering_term()) result := tree.OrderBy{OrderingTerms: make([]*tree.OrderingTerm, count)} @@ -816,7 +816,7 @@ func (v *astBuilder) VisitOrder_by_stmt(ctx *sqlgrammar.Order_by_stmtContext) in } // VisitLimit_stmt is called when visiting a limit_stmt, return *tree.Limit -func (v *astBuilder) VisitLimit_stmt(ctx *sqlgrammar.Limit_stmtContext) interface{} { +func (v *astBuilder) VisitLimit_stmt(ctx *grammar.Limit_stmtContext) interface{} { result := tree.Limit{ Expression: v.Visit(ctx.Expr(0)).(tree.Expression), } @@ -834,7 +834,7 @@ func (v *astBuilder) VisitLimit_stmt(ctx *sqlgrammar.Limit_stmtContext) interfac } // VisitTable_or_subquery is called when visiting a table_or_subquery, return tree.TableOrSubquery -func (v *astBuilder) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryContext) interface{} { +func (v *astBuilder) VisitTable_or_subquery(ctx *grammar.Table_or_subqueryContext) interface{} { switch { case ctx.Table_name() != nil: t := tree.RelationTable{ @@ -858,7 +858,7 @@ func (v *astBuilder) VisitTable_or_subquery(ctx *sqlgrammar.Table_or_subqueryCon } // VisitJoin_operator is called when visiting a join_operator, return *tree.JoinOperator -func (v *astBuilder) VisitJoin_operator(ctx *sqlgrammar.Join_operatorContext) interface{} { +func (v *astBuilder) VisitJoin_operator(ctx *grammar.Join_operatorContext) interface{} { jp := tree.JoinOperator{ JoinType: tree.JoinTypeJoin, } @@ -885,7 +885,7 @@ func (v *astBuilder) VisitJoin_operator(ctx *sqlgrammar.Join_operatorContext) in } // VisitJoin_relation is called when visiting a join_relation, return *tree.JoinPredicate -func (v *astBuilder) VisitJoin_relation(ctx *sqlgrammar.Join_relationContext) interface{} { +func (v *astBuilder) VisitJoin_relation(ctx *grammar.Join_relationContext) interface{} { jp := tree.JoinPredicate{} jp.JoinOperator = v.Visit(ctx.Join_operator()).(*tree.JoinOperator) jp.Table = v.Visit(ctx.GetRight_relation()).(tree.Relation) @@ -894,7 +894,7 @@ func (v *astBuilder) VisitJoin_relation(ctx *sqlgrammar.Join_relationContext) in } // VisitResult_column is called when visiting a result_column, return tree.ResultColumn -func (v *astBuilder) VisitResult_column(ctx *sqlgrammar.Result_columnContext) interface{} { +func (v *astBuilder) VisitResult_column(ctx *grammar.Result_columnContext) interface{} { switch { // table_name need to be checked first case ctx.Table_name() != nil: @@ -916,7 +916,7 @@ func (v *astBuilder) VisitResult_column(ctx *sqlgrammar.Result_columnContext) in return nil } -func (v *astBuilder) VisitDelete_core(ctx *sqlgrammar.Delete_coreContext) interface{} { +func (v *astBuilder) VisitDelete_core(ctx *grammar.Delete_coreContext) interface{} { var deleteStmt tree.DeleteCore deleteStmt.QualifiedTableName = v.Visit(ctx.Qualified_table_name()).(*tree.QualifiedTableName) @@ -932,7 +932,7 @@ func (v *astBuilder) VisitDelete_core(ctx *sqlgrammar.Delete_coreContext) interf } // VisitDelete_stmt is called when visiting a delete_stmt, return *tree.DeleteStmt -func (v *astBuilder) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) interface{} { +func (v *astBuilder) VisitDelete_stmt(ctx *grammar.Delete_stmtContext) interface{} { t := tree.DeleteStmt{} if ctx.Common_table_stmt() != nil { @@ -944,7 +944,7 @@ func (v *astBuilder) VisitDelete_stmt(ctx *sqlgrammar.Delete_stmtContext) interf } // VisitSelect_core is called when visiting a select_core, return *tree.SelectCore -func (v *astBuilder) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interface{} { +func (v *astBuilder) VisitSelect_core(ctx *grammar.Select_coreContext) interface{} { t := tree.SelectCore{ SelectType: tree.SelectTypeAll, } @@ -989,7 +989,7 @@ func (v *astBuilder) VisitSelect_core(ctx *sqlgrammar.Select_coreContext) interf } // VisitRelation is called when visiting a relation, return tree.Relation -func (v *astBuilder) VisitRelation(ctx *sqlgrammar.RelationContext) interface{} { +func (v *astBuilder) VisitRelation(ctx *grammar.RelationContext) interface{} { left := v.Visit(ctx.Table_or_subquery()).(tree.Relation) if len(ctx.AllJoin_relation()) > 0 { @@ -1009,7 +1009,7 @@ func (v *astBuilder) VisitRelation(ctx *sqlgrammar.RelationContext) interface{} } // VisitSelect_stmt_no_cte is called when visiting a select_stmt_core, return *tree.SelectStmtNoCte -func (v *astBuilder) VisitSelect_stmt_no_cte(ctx *sqlgrammar.Select_stmt_no_cteContext) interface{} { +func (v *astBuilder) VisitSelect_stmt_no_cte(ctx *grammar.Select_stmt_no_cteContext) interface{} { t := tree.SelectStmtNoCte{} selectCores := make([]*tree.SelectCore, len(ctx.AllSelect_core())) @@ -1038,7 +1038,7 @@ func (v *astBuilder) VisitSelect_stmt_no_cte(ctx *sqlgrammar.Select_stmt_no_cteC } // VisitSelect_stmt is called when visiting a select_stmt, return *tree.SelectStmt -func (v *astBuilder) VisitSelect_stmt(ctx *sqlgrammar.Select_stmtContext) interface{} { +func (v *astBuilder) VisitSelect_stmt(ctx *grammar.Select_stmtContext) interface{} { t := tree.SelectStmt{} if ctx.Common_table_stmt() != nil { @@ -1049,17 +1049,17 @@ func (v *astBuilder) VisitSelect_stmt(ctx *sqlgrammar.Select_stmtContext) interf return &t } -func (v *astBuilder) VisitSql_stmt_list(ctx *sqlgrammar.Sql_stmt_listContext) interface{} { +func (v *astBuilder) VisitSql_stmt_list(ctx *grammar.Sql_stmt_listContext) interface{} { return v.VisitChildren(ctx) } -func (v *astBuilder) VisitSql_stmt(ctx *sqlgrammar.Sql_stmtContext) interface{} { +func (v *astBuilder) VisitSql_stmt(ctx *grammar.Sql_stmtContext) interface{} { // Sql_stmtContext will only have one stmt return v.VisitChildren(ctx).([]tree.AstNode)[0] } // VisitStatements is called when visiting a statements, return []tree.AstNode -func (v *astBuilder) VisitStatements(ctx *sqlgrammar.StatementsContext) interface{} { +func (v *astBuilder) VisitStatements(ctx *grammar.StatementsContext) interface{} { // ParseContext will only have one Sql_stmt_listContext sqlStmtListContext := ctx.Sql_stmt_list(0) return v.VisitChildren(sqlStmtListContext).([]tree.AstNode) diff --git a/parse/sql/grammar/SQLLexer.interp b/parse/sql/grammar/SQLLexer.interp new file mode 100644 index 000000000..ff9add691 --- /dev/null +++ b/parse/sql/grammar/SQLLexer.interp @@ -0,0 +1,304 @@ +token literal names: +null +';' +'.' +'(' +')' +',' +'=' +'*' +'+' +'-' +'/' +'%' +'<' +'<=' +'>' +'>=' +'!=' +'<>' +'::' +'ADD' +'ALL' +'AND' +'ASC' +'AS' +'BETWEEN' +'BY' +'CASE' +'COLLATE' +'COMMIT' +'CONFLICT' +'CREATE' +'CROSS' +'DEFAULT' +'DELETE' +'DESC' +'DISTINCT' +'DO' +'ELSE' +'END' +'ESCAPE' +'EXCEPT' +'EXISTS' +'FALSE' +'FILTER' +'FIRST' +'FROM' +'FULL' +'GROUPS' +'GROUP' +'HAVING' +'INNER' +'INSERT' +'INTERSECT' +'INTO' +'IN' +'ISNULL' +'IS' +'JOIN' +'LAST' +'LEFT' +'LIKE' +'LIMIT' +'NOTHING' +'NOTNULL' +'NOT' +'NULLS' +'NULL' +'OFFSET' +'OF' +'ON' +'ORDER' +'OR' +'OUTER' +'RAISE' +'REPLACE' +'RETURNING' +'RIGHT' +'SELECT' +'SET' +'THEN' +'TRUE' +'UNION' +'UPDATE' +'USING' +'VALUES' +'WHEN' +'WHERE' +'WITH' +null +null +null +null +null +null +null +null + +token symbolic names: +null +SCOL +DOT +OPEN_PAR +CLOSE_PAR +COMMA +ASSIGN +STAR +PLUS +MINUS +DIV +MOD +LT +LT_EQ +GT +GT_EQ +NOT_EQ1 +NOT_EQ2 +TYPE_CAST +ADD_ +ALL_ +AND_ +ASC_ +AS_ +BETWEEN_ +BY_ +CASE_ +COLLATE_ +COMMIT_ +CONFLICT_ +CREATE_ +CROSS_ +DEFAULT_ +DELETE_ +DESC_ +DISTINCT_ +DO_ +ELSE_ +END_ +ESCAPE_ +EXCEPT_ +EXISTS_ +FALSE_ +FILTER_ +FIRST_ +FROM_ +FULL_ +GROUPS_ +GROUP_ +HAVING_ +INNER_ +INSERT_ +INTERSECT_ +INTO_ +IN_ +ISNULL_ +IS_ +JOIN_ +LAST_ +LEFT_ +LIKE_ +LIMIT_ +NOTHING_ +NOTNULL_ +NOT_ +NULLS_ +NULL_ +OFFSET_ +OF_ +ON_ +ORDER_ +OR_ +OUTER_ +RAISE_ +REPLACE_ +RETURNING_ +RIGHT_ +SELECT_ +SET_ +THEN_ +TRUE_ +UNION_ +UPDATE_ +USING_ +VALUES_ +WHEN_ +WHERE_ +WITH_ +IDENTIFIER +NUMERIC_LITERAL +BIND_PARAMETER +STRING_LITERAL +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR + +rule names: +SCOL +DOT +OPEN_PAR +CLOSE_PAR +COMMA +ASSIGN +STAR +PLUS +MINUS +DIV +MOD +LT +LT_EQ +GT +GT_EQ +NOT_EQ1 +NOT_EQ2 +TYPE_CAST +ADD_ +ALL_ +AND_ +ASC_ +AS_ +BETWEEN_ +BY_ +CASE_ +COLLATE_ +COMMIT_ +CONFLICT_ +CREATE_ +CROSS_ +DEFAULT_ +DELETE_ +DESC_ +DISTINCT_ +DO_ +ELSE_ +END_ +ESCAPE_ +EXCEPT_ +EXISTS_ +FALSE_ +FILTER_ +FIRST_ +FROM_ +FULL_ +GROUPS_ +GROUP_ +HAVING_ +INNER_ +INSERT_ +INTERSECT_ +INTO_ +IN_ +ISNULL_ +IS_ +JOIN_ +LAST_ +LEFT_ +LIKE_ +LIMIT_ +NOTHING_ +NOTNULL_ +NOT_ +NULLS_ +NULL_ +OFFSET_ +OF_ +ON_ +ORDER_ +OR_ +OUTER_ +RAISE_ +REPLACE_ +RETURNING_ +RIGHT_ +SELECT_ +SET_ +THEN_ +TRUE_ +UNION_ +UPDATE_ +USING_ +VALUES_ +WHEN_ +WHERE_ +WITH_ +IDENTIFIER +NUMERIC_LITERAL +BIND_PARAMETER +STRING_LITERAL +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +HEX_DIGIT +DIGIT + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 95, 774, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 643, 8, 87, 10, 87, 12, 87, 646, 9, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 653, 8, 87, 10, 87, 12, 87, 656, 9, 87, 1, 87, 1, 87, 1, 87, 5, 87, 661, 8, 87, 10, 87, 12, 87, 664, 9, 87, 1, 87, 1, 87, 1, 87, 5, 87, 669, 8, 87, 10, 87, 12, 87, 672, 9, 87, 3, 87, 674, 8, 87, 1, 88, 4, 88, 677, 8, 88, 11, 88, 12, 88, 678, 1, 88, 1, 88, 5, 88, 683, 8, 88, 10, 88, 12, 88, 686, 9, 88, 3, 88, 688, 8, 88, 1, 88, 1, 88, 4, 88, 692, 8, 88, 11, 88, 12, 88, 693, 3, 88, 696, 8, 88, 1, 88, 1, 88, 3, 88, 700, 8, 88, 1, 88, 4, 88, 703, 8, 88, 11, 88, 12, 88, 704, 3, 88, 707, 8, 88, 1, 88, 1, 88, 1, 88, 1, 88, 4, 88, 713, 8, 88, 11, 88, 12, 88, 714, 3, 88, 717, 8, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 5, 90, 726, 8, 90, 10, 90, 12, 90, 729, 9, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 5, 91, 737, 8, 91, 10, 91, 12, 91, 740, 9, 91, 1, 91, 3, 91, 743, 8, 91, 1, 91, 1, 91, 3, 91, 747, 8, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 5, 92, 755, 8, 92, 10, 92, 12, 92, 758, 9, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 756, 0, 97, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 0, 193, 0, 1, 0, 36, 2, 0, 65, 65, 97, 97, 2, 0, 68, 68, 100, 100, 2, 0, 76, 76, 108, 108, 2, 0, 78, 78, 110, 110, 2, 0, 83, 83, 115, 115, 2, 0, 67, 67, 99, 99, 2, 0, 66, 66, 98, 98, 2, 0, 69, 69, 101, 101, 2, 0, 84, 84, 116, 116, 2, 0, 87, 87, 119, 119, 2, 0, 89, 89, 121, 121, 2, 0, 79, 79, 111, 111, 2, 0, 77, 77, 109, 109, 2, 0, 73, 73, 105, 105, 2, 0, 70, 70, 102, 102, 2, 0, 82, 82, 114, 114, 2, 0, 85, 85, 117, 117, 2, 0, 80, 80, 112, 112, 2, 0, 88, 88, 120, 120, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 1, 0, 34, 34, 1, 0, 96, 96, 1, 0, 93, 93, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 43, 43, 45, 45, 2, 0, 36, 36, 64, 64, 1, 0, 39, 39, 2, 0, 10, 10, 13, 13, 3, 0, 9, 11, 13, 13, 32, 32, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 796, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 1, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 5, 199, 1, 0, 0, 0, 7, 201, 1, 0, 0, 0, 9, 203, 1, 0, 0, 0, 11, 205, 1, 0, 0, 0, 13, 207, 1, 0, 0, 0, 15, 209, 1, 0, 0, 0, 17, 211, 1, 0, 0, 0, 19, 213, 1, 0, 0, 0, 21, 215, 1, 0, 0, 0, 23, 217, 1, 0, 0, 0, 25, 219, 1, 0, 0, 0, 27, 222, 1, 0, 0, 0, 29, 224, 1, 0, 0, 0, 31, 227, 1, 0, 0, 0, 33, 230, 1, 0, 0, 0, 35, 233, 1, 0, 0, 0, 37, 236, 1, 0, 0, 0, 39, 240, 1, 0, 0, 0, 41, 244, 1, 0, 0, 0, 43, 248, 1, 0, 0, 0, 45, 252, 1, 0, 0, 0, 47, 255, 1, 0, 0, 0, 49, 263, 1, 0, 0, 0, 51, 266, 1, 0, 0, 0, 53, 271, 1, 0, 0, 0, 55, 279, 1, 0, 0, 0, 57, 286, 1, 0, 0, 0, 59, 295, 1, 0, 0, 0, 61, 302, 1, 0, 0, 0, 63, 308, 1, 0, 0, 0, 65, 316, 1, 0, 0, 0, 67, 323, 1, 0, 0, 0, 69, 328, 1, 0, 0, 0, 71, 337, 1, 0, 0, 0, 73, 340, 1, 0, 0, 0, 75, 345, 1, 0, 0, 0, 77, 349, 1, 0, 0, 0, 79, 356, 1, 0, 0, 0, 81, 363, 1, 0, 0, 0, 83, 370, 1, 0, 0, 0, 85, 376, 1, 0, 0, 0, 87, 383, 1, 0, 0, 0, 89, 389, 1, 0, 0, 0, 91, 394, 1, 0, 0, 0, 93, 399, 1, 0, 0, 0, 95, 406, 1, 0, 0, 0, 97, 412, 1, 0, 0, 0, 99, 419, 1, 0, 0, 0, 101, 425, 1, 0, 0, 0, 103, 432, 1, 0, 0, 0, 105, 442, 1, 0, 0, 0, 107, 447, 1, 0, 0, 0, 109, 450, 1, 0, 0, 0, 111, 457, 1, 0, 0, 0, 113, 460, 1, 0, 0, 0, 115, 465, 1, 0, 0, 0, 117, 470, 1, 0, 0, 0, 119, 475, 1, 0, 0, 0, 121, 480, 1, 0, 0, 0, 123, 486, 1, 0, 0, 0, 125, 494, 1, 0, 0, 0, 127, 502, 1, 0, 0, 0, 129, 506, 1, 0, 0, 0, 131, 512, 1, 0, 0, 0, 133, 517, 1, 0, 0, 0, 135, 524, 1, 0, 0, 0, 137, 527, 1, 0, 0, 0, 139, 530, 1, 0, 0, 0, 141, 536, 1, 0, 0, 0, 143, 539, 1, 0, 0, 0, 145, 545, 1, 0, 0, 0, 147, 551, 1, 0, 0, 0, 149, 559, 1, 0, 0, 0, 151, 569, 1, 0, 0, 0, 153, 575, 1, 0, 0, 0, 155, 582, 1, 0, 0, 0, 157, 586, 1, 0, 0, 0, 159, 591, 1, 0, 0, 0, 161, 596, 1, 0, 0, 0, 163, 602, 1, 0, 0, 0, 165, 609, 1, 0, 0, 0, 167, 615, 1, 0, 0, 0, 169, 622, 1, 0, 0, 0, 171, 627, 1, 0, 0, 0, 173, 633, 1, 0, 0, 0, 175, 673, 1, 0, 0, 0, 177, 716, 1, 0, 0, 0, 179, 718, 1, 0, 0, 0, 181, 721, 1, 0, 0, 0, 183, 732, 1, 0, 0, 0, 185, 750, 1, 0, 0, 0, 187, 764, 1, 0, 0, 0, 189, 768, 1, 0, 0, 0, 191, 770, 1, 0, 0, 0, 193, 772, 1, 0, 0, 0, 195, 196, 5, 59, 0, 0, 196, 2, 1, 0, 0, 0, 197, 198, 5, 46, 0, 0, 198, 4, 1, 0, 0, 0, 199, 200, 5, 40, 0, 0, 200, 6, 1, 0, 0, 0, 201, 202, 5, 41, 0, 0, 202, 8, 1, 0, 0, 0, 203, 204, 5, 44, 0, 0, 204, 10, 1, 0, 0, 0, 205, 206, 5, 61, 0, 0, 206, 12, 1, 0, 0, 0, 207, 208, 5, 42, 0, 0, 208, 14, 1, 0, 0, 0, 209, 210, 5, 43, 0, 0, 210, 16, 1, 0, 0, 0, 211, 212, 5, 45, 0, 0, 212, 18, 1, 0, 0, 0, 213, 214, 5, 47, 0, 0, 214, 20, 1, 0, 0, 0, 215, 216, 5, 37, 0, 0, 216, 22, 1, 0, 0, 0, 217, 218, 5, 60, 0, 0, 218, 24, 1, 0, 0, 0, 219, 220, 5, 60, 0, 0, 220, 221, 5, 61, 0, 0, 221, 26, 1, 0, 0, 0, 222, 223, 5, 62, 0, 0, 223, 28, 1, 0, 0, 0, 224, 225, 5, 62, 0, 0, 225, 226, 5, 61, 0, 0, 226, 30, 1, 0, 0, 0, 227, 228, 5, 33, 0, 0, 228, 229, 5, 61, 0, 0, 229, 32, 1, 0, 0, 0, 230, 231, 5, 60, 0, 0, 231, 232, 5, 62, 0, 0, 232, 34, 1, 0, 0, 0, 233, 234, 5, 58, 0, 0, 234, 235, 5, 58, 0, 0, 235, 36, 1, 0, 0, 0, 236, 237, 7, 0, 0, 0, 237, 238, 7, 1, 0, 0, 238, 239, 7, 1, 0, 0, 239, 38, 1, 0, 0, 0, 240, 241, 7, 0, 0, 0, 241, 242, 7, 2, 0, 0, 242, 243, 7, 2, 0, 0, 243, 40, 1, 0, 0, 0, 244, 245, 7, 0, 0, 0, 245, 246, 7, 3, 0, 0, 246, 247, 7, 1, 0, 0, 247, 42, 1, 0, 0, 0, 248, 249, 7, 0, 0, 0, 249, 250, 7, 4, 0, 0, 250, 251, 7, 5, 0, 0, 251, 44, 1, 0, 0, 0, 252, 253, 7, 0, 0, 0, 253, 254, 7, 4, 0, 0, 254, 46, 1, 0, 0, 0, 255, 256, 7, 6, 0, 0, 256, 257, 7, 7, 0, 0, 257, 258, 7, 8, 0, 0, 258, 259, 7, 9, 0, 0, 259, 260, 7, 7, 0, 0, 260, 261, 7, 7, 0, 0, 261, 262, 7, 3, 0, 0, 262, 48, 1, 0, 0, 0, 263, 264, 7, 6, 0, 0, 264, 265, 7, 10, 0, 0, 265, 50, 1, 0, 0, 0, 266, 267, 7, 5, 0, 0, 267, 268, 7, 0, 0, 0, 268, 269, 7, 4, 0, 0, 269, 270, 7, 7, 0, 0, 270, 52, 1, 0, 0, 0, 271, 272, 7, 5, 0, 0, 272, 273, 7, 11, 0, 0, 273, 274, 7, 2, 0, 0, 274, 275, 7, 2, 0, 0, 275, 276, 7, 0, 0, 0, 276, 277, 7, 8, 0, 0, 277, 278, 7, 7, 0, 0, 278, 54, 1, 0, 0, 0, 279, 280, 7, 5, 0, 0, 280, 281, 7, 11, 0, 0, 281, 282, 7, 12, 0, 0, 282, 283, 7, 12, 0, 0, 283, 284, 7, 13, 0, 0, 284, 285, 7, 8, 0, 0, 285, 56, 1, 0, 0, 0, 286, 287, 7, 5, 0, 0, 287, 288, 7, 11, 0, 0, 288, 289, 7, 3, 0, 0, 289, 290, 7, 14, 0, 0, 290, 291, 7, 2, 0, 0, 291, 292, 7, 13, 0, 0, 292, 293, 7, 5, 0, 0, 293, 294, 7, 8, 0, 0, 294, 58, 1, 0, 0, 0, 295, 296, 7, 5, 0, 0, 296, 297, 7, 15, 0, 0, 297, 298, 7, 7, 0, 0, 298, 299, 7, 0, 0, 0, 299, 300, 7, 8, 0, 0, 300, 301, 7, 7, 0, 0, 301, 60, 1, 0, 0, 0, 302, 303, 7, 5, 0, 0, 303, 304, 7, 15, 0, 0, 304, 305, 7, 11, 0, 0, 305, 306, 7, 4, 0, 0, 306, 307, 7, 4, 0, 0, 307, 62, 1, 0, 0, 0, 308, 309, 7, 1, 0, 0, 309, 310, 7, 7, 0, 0, 310, 311, 7, 14, 0, 0, 311, 312, 7, 0, 0, 0, 312, 313, 7, 16, 0, 0, 313, 314, 7, 2, 0, 0, 314, 315, 7, 8, 0, 0, 315, 64, 1, 0, 0, 0, 316, 317, 7, 1, 0, 0, 317, 318, 7, 7, 0, 0, 318, 319, 7, 2, 0, 0, 319, 320, 7, 7, 0, 0, 320, 321, 7, 8, 0, 0, 321, 322, 7, 7, 0, 0, 322, 66, 1, 0, 0, 0, 323, 324, 7, 1, 0, 0, 324, 325, 7, 7, 0, 0, 325, 326, 7, 4, 0, 0, 326, 327, 7, 5, 0, 0, 327, 68, 1, 0, 0, 0, 328, 329, 7, 1, 0, 0, 329, 330, 7, 13, 0, 0, 330, 331, 7, 4, 0, 0, 331, 332, 7, 8, 0, 0, 332, 333, 7, 13, 0, 0, 333, 334, 7, 3, 0, 0, 334, 335, 7, 5, 0, 0, 335, 336, 7, 8, 0, 0, 336, 70, 1, 0, 0, 0, 337, 338, 7, 1, 0, 0, 338, 339, 7, 11, 0, 0, 339, 72, 1, 0, 0, 0, 340, 341, 7, 7, 0, 0, 341, 342, 7, 2, 0, 0, 342, 343, 7, 4, 0, 0, 343, 344, 7, 7, 0, 0, 344, 74, 1, 0, 0, 0, 345, 346, 7, 7, 0, 0, 346, 347, 7, 3, 0, 0, 347, 348, 7, 1, 0, 0, 348, 76, 1, 0, 0, 0, 349, 350, 7, 7, 0, 0, 350, 351, 7, 4, 0, 0, 351, 352, 7, 5, 0, 0, 352, 353, 7, 0, 0, 0, 353, 354, 7, 17, 0, 0, 354, 355, 7, 7, 0, 0, 355, 78, 1, 0, 0, 0, 356, 357, 7, 7, 0, 0, 357, 358, 7, 18, 0, 0, 358, 359, 7, 5, 0, 0, 359, 360, 7, 7, 0, 0, 360, 361, 7, 17, 0, 0, 361, 362, 7, 8, 0, 0, 362, 80, 1, 0, 0, 0, 363, 364, 7, 7, 0, 0, 364, 365, 7, 18, 0, 0, 365, 366, 7, 13, 0, 0, 366, 367, 7, 4, 0, 0, 367, 368, 7, 8, 0, 0, 368, 369, 7, 4, 0, 0, 369, 82, 1, 0, 0, 0, 370, 371, 7, 14, 0, 0, 371, 372, 7, 0, 0, 0, 372, 373, 7, 2, 0, 0, 373, 374, 7, 4, 0, 0, 374, 375, 7, 7, 0, 0, 375, 84, 1, 0, 0, 0, 376, 377, 7, 14, 0, 0, 377, 378, 7, 13, 0, 0, 378, 379, 7, 2, 0, 0, 379, 380, 7, 8, 0, 0, 380, 381, 7, 7, 0, 0, 381, 382, 7, 15, 0, 0, 382, 86, 1, 0, 0, 0, 383, 384, 7, 14, 0, 0, 384, 385, 7, 13, 0, 0, 385, 386, 7, 15, 0, 0, 386, 387, 7, 4, 0, 0, 387, 388, 7, 8, 0, 0, 388, 88, 1, 0, 0, 0, 389, 390, 7, 14, 0, 0, 390, 391, 7, 15, 0, 0, 391, 392, 7, 11, 0, 0, 392, 393, 7, 12, 0, 0, 393, 90, 1, 0, 0, 0, 394, 395, 7, 14, 0, 0, 395, 396, 7, 16, 0, 0, 396, 397, 7, 2, 0, 0, 397, 398, 7, 2, 0, 0, 398, 92, 1, 0, 0, 0, 399, 400, 7, 19, 0, 0, 400, 401, 7, 15, 0, 0, 401, 402, 7, 11, 0, 0, 402, 403, 7, 16, 0, 0, 403, 404, 7, 17, 0, 0, 404, 405, 7, 4, 0, 0, 405, 94, 1, 0, 0, 0, 406, 407, 7, 19, 0, 0, 407, 408, 7, 15, 0, 0, 408, 409, 7, 11, 0, 0, 409, 410, 7, 16, 0, 0, 410, 411, 7, 17, 0, 0, 411, 96, 1, 0, 0, 0, 412, 413, 7, 20, 0, 0, 413, 414, 7, 0, 0, 0, 414, 415, 7, 21, 0, 0, 415, 416, 7, 13, 0, 0, 416, 417, 7, 3, 0, 0, 417, 418, 7, 19, 0, 0, 418, 98, 1, 0, 0, 0, 419, 420, 7, 13, 0, 0, 420, 421, 7, 3, 0, 0, 421, 422, 7, 3, 0, 0, 422, 423, 7, 7, 0, 0, 423, 424, 7, 15, 0, 0, 424, 100, 1, 0, 0, 0, 425, 426, 7, 13, 0, 0, 426, 427, 7, 3, 0, 0, 427, 428, 7, 4, 0, 0, 428, 429, 7, 7, 0, 0, 429, 430, 7, 15, 0, 0, 430, 431, 7, 8, 0, 0, 431, 102, 1, 0, 0, 0, 432, 433, 7, 13, 0, 0, 433, 434, 7, 3, 0, 0, 434, 435, 7, 8, 0, 0, 435, 436, 7, 7, 0, 0, 436, 437, 7, 15, 0, 0, 437, 438, 7, 4, 0, 0, 438, 439, 7, 7, 0, 0, 439, 440, 7, 5, 0, 0, 440, 441, 7, 8, 0, 0, 441, 104, 1, 0, 0, 0, 442, 443, 7, 13, 0, 0, 443, 444, 7, 3, 0, 0, 444, 445, 7, 8, 0, 0, 445, 446, 7, 11, 0, 0, 446, 106, 1, 0, 0, 0, 447, 448, 7, 13, 0, 0, 448, 449, 7, 3, 0, 0, 449, 108, 1, 0, 0, 0, 450, 451, 7, 13, 0, 0, 451, 452, 7, 4, 0, 0, 452, 453, 7, 3, 0, 0, 453, 454, 7, 16, 0, 0, 454, 455, 7, 2, 0, 0, 455, 456, 7, 2, 0, 0, 456, 110, 1, 0, 0, 0, 457, 458, 7, 13, 0, 0, 458, 459, 7, 4, 0, 0, 459, 112, 1, 0, 0, 0, 460, 461, 7, 22, 0, 0, 461, 462, 7, 11, 0, 0, 462, 463, 7, 13, 0, 0, 463, 464, 7, 3, 0, 0, 464, 114, 1, 0, 0, 0, 465, 466, 7, 2, 0, 0, 466, 467, 7, 0, 0, 0, 467, 468, 7, 4, 0, 0, 468, 469, 7, 8, 0, 0, 469, 116, 1, 0, 0, 0, 470, 471, 7, 2, 0, 0, 471, 472, 7, 7, 0, 0, 472, 473, 7, 14, 0, 0, 473, 474, 7, 8, 0, 0, 474, 118, 1, 0, 0, 0, 475, 476, 7, 2, 0, 0, 476, 477, 7, 13, 0, 0, 477, 478, 7, 23, 0, 0, 478, 479, 7, 7, 0, 0, 479, 120, 1, 0, 0, 0, 480, 481, 7, 2, 0, 0, 481, 482, 7, 13, 0, 0, 482, 483, 7, 12, 0, 0, 483, 484, 7, 13, 0, 0, 484, 485, 7, 8, 0, 0, 485, 122, 1, 0, 0, 0, 486, 487, 7, 3, 0, 0, 487, 488, 7, 11, 0, 0, 488, 489, 7, 8, 0, 0, 489, 490, 7, 20, 0, 0, 490, 491, 7, 13, 0, 0, 491, 492, 7, 3, 0, 0, 492, 493, 7, 19, 0, 0, 493, 124, 1, 0, 0, 0, 494, 495, 7, 3, 0, 0, 495, 496, 7, 11, 0, 0, 496, 497, 7, 8, 0, 0, 497, 498, 7, 3, 0, 0, 498, 499, 7, 16, 0, 0, 499, 500, 7, 2, 0, 0, 500, 501, 7, 2, 0, 0, 501, 126, 1, 0, 0, 0, 502, 503, 7, 3, 0, 0, 503, 504, 7, 11, 0, 0, 504, 505, 7, 8, 0, 0, 505, 128, 1, 0, 0, 0, 506, 507, 7, 3, 0, 0, 507, 508, 7, 16, 0, 0, 508, 509, 7, 2, 0, 0, 509, 510, 7, 2, 0, 0, 510, 511, 7, 4, 0, 0, 511, 130, 1, 0, 0, 0, 512, 513, 7, 3, 0, 0, 513, 514, 7, 16, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 2, 0, 0, 516, 132, 1, 0, 0, 0, 517, 518, 7, 11, 0, 0, 518, 519, 7, 14, 0, 0, 519, 520, 7, 14, 0, 0, 520, 521, 7, 4, 0, 0, 521, 522, 7, 7, 0, 0, 522, 523, 7, 8, 0, 0, 523, 134, 1, 0, 0, 0, 524, 525, 7, 11, 0, 0, 525, 526, 7, 14, 0, 0, 526, 136, 1, 0, 0, 0, 527, 528, 7, 11, 0, 0, 528, 529, 7, 3, 0, 0, 529, 138, 1, 0, 0, 0, 530, 531, 7, 11, 0, 0, 531, 532, 7, 15, 0, 0, 532, 533, 7, 1, 0, 0, 533, 534, 7, 7, 0, 0, 534, 535, 7, 15, 0, 0, 535, 140, 1, 0, 0, 0, 536, 537, 7, 11, 0, 0, 537, 538, 7, 15, 0, 0, 538, 142, 1, 0, 0, 0, 539, 540, 7, 11, 0, 0, 540, 541, 7, 16, 0, 0, 541, 542, 7, 8, 0, 0, 542, 543, 7, 7, 0, 0, 543, 544, 7, 15, 0, 0, 544, 144, 1, 0, 0, 0, 545, 546, 7, 15, 0, 0, 546, 547, 7, 0, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, 7, 4, 0, 0, 549, 550, 7, 7, 0, 0, 550, 146, 1, 0, 0, 0, 551, 552, 7, 15, 0, 0, 552, 553, 7, 7, 0, 0, 553, 554, 7, 17, 0, 0, 554, 555, 7, 2, 0, 0, 555, 556, 7, 0, 0, 0, 556, 557, 7, 5, 0, 0, 557, 558, 7, 7, 0, 0, 558, 148, 1, 0, 0, 0, 559, 560, 7, 15, 0, 0, 560, 561, 7, 7, 0, 0, 561, 562, 7, 8, 0, 0, 562, 563, 7, 16, 0, 0, 563, 564, 7, 15, 0, 0, 564, 565, 7, 3, 0, 0, 565, 566, 7, 13, 0, 0, 566, 567, 7, 3, 0, 0, 567, 568, 7, 19, 0, 0, 568, 150, 1, 0, 0, 0, 569, 570, 7, 15, 0, 0, 570, 571, 7, 13, 0, 0, 571, 572, 7, 19, 0, 0, 572, 573, 7, 20, 0, 0, 573, 574, 7, 8, 0, 0, 574, 152, 1, 0, 0, 0, 575, 576, 7, 4, 0, 0, 576, 577, 7, 7, 0, 0, 577, 578, 7, 2, 0, 0, 578, 579, 7, 7, 0, 0, 579, 580, 7, 5, 0, 0, 580, 581, 7, 8, 0, 0, 581, 154, 1, 0, 0, 0, 582, 583, 7, 4, 0, 0, 583, 584, 7, 7, 0, 0, 584, 585, 7, 8, 0, 0, 585, 156, 1, 0, 0, 0, 586, 587, 7, 8, 0, 0, 587, 588, 7, 20, 0, 0, 588, 589, 7, 7, 0, 0, 589, 590, 7, 3, 0, 0, 590, 158, 1, 0, 0, 0, 591, 592, 7, 8, 0, 0, 592, 593, 7, 15, 0, 0, 593, 594, 7, 16, 0, 0, 594, 595, 7, 7, 0, 0, 595, 160, 1, 0, 0, 0, 596, 597, 7, 16, 0, 0, 597, 598, 7, 3, 0, 0, 598, 599, 7, 13, 0, 0, 599, 600, 7, 11, 0, 0, 600, 601, 7, 3, 0, 0, 601, 162, 1, 0, 0, 0, 602, 603, 7, 16, 0, 0, 603, 604, 7, 17, 0, 0, 604, 605, 7, 1, 0, 0, 605, 606, 7, 0, 0, 0, 606, 607, 7, 8, 0, 0, 607, 608, 7, 7, 0, 0, 608, 164, 1, 0, 0, 0, 609, 610, 7, 16, 0, 0, 610, 611, 7, 4, 0, 0, 611, 612, 7, 13, 0, 0, 612, 613, 7, 3, 0, 0, 613, 614, 7, 19, 0, 0, 614, 166, 1, 0, 0, 0, 615, 616, 7, 21, 0, 0, 616, 617, 7, 0, 0, 0, 617, 618, 7, 2, 0, 0, 618, 619, 7, 16, 0, 0, 619, 620, 7, 7, 0, 0, 620, 621, 7, 4, 0, 0, 621, 168, 1, 0, 0, 0, 622, 623, 7, 9, 0, 0, 623, 624, 7, 20, 0, 0, 624, 625, 7, 7, 0, 0, 625, 626, 7, 3, 0, 0, 626, 170, 1, 0, 0, 0, 627, 628, 7, 9, 0, 0, 628, 629, 7, 20, 0, 0, 629, 630, 7, 7, 0, 0, 630, 631, 7, 15, 0, 0, 631, 632, 7, 7, 0, 0, 632, 172, 1, 0, 0, 0, 633, 634, 7, 9, 0, 0, 634, 635, 7, 13, 0, 0, 635, 636, 7, 8, 0, 0, 636, 637, 7, 20, 0, 0, 637, 174, 1, 0, 0, 0, 638, 644, 5, 34, 0, 0, 639, 643, 8, 24, 0, 0, 640, 641, 5, 34, 0, 0, 641, 643, 5, 34, 0, 0, 642, 639, 1, 0, 0, 0, 642, 640, 1, 0, 0, 0, 643, 646, 1, 0, 0, 0, 644, 642, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 647, 1, 0, 0, 0, 646, 644, 1, 0, 0, 0, 647, 674, 5, 34, 0, 0, 648, 654, 5, 96, 0, 0, 649, 653, 8, 25, 0, 0, 650, 651, 5, 96, 0, 0, 651, 653, 5, 96, 0, 0, 652, 649, 1, 0, 0, 0, 652, 650, 1, 0, 0, 0, 653, 656, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 657, 674, 5, 96, 0, 0, 658, 662, 5, 91, 0, 0, 659, 661, 8, 26, 0, 0, 660, 659, 1, 0, 0, 0, 661, 664, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 665, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 674, 5, 93, 0, 0, 666, 670, 7, 27, 0, 0, 667, 669, 7, 28, 0, 0, 668, 667, 1, 0, 0, 0, 669, 672, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 673, 638, 1, 0, 0, 0, 673, 648, 1, 0, 0, 0, 673, 658, 1, 0, 0, 0, 673, 666, 1, 0, 0, 0, 674, 176, 1, 0, 0, 0, 675, 677, 3, 193, 96, 0, 676, 675, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 687, 1, 0, 0, 0, 680, 684, 5, 46, 0, 0, 681, 683, 3, 193, 96, 0, 682, 681, 1, 0, 0, 0, 683, 686, 1, 0, 0, 0, 684, 682, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 687, 680, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 696, 1, 0, 0, 0, 689, 691, 5, 46, 0, 0, 690, 692, 3, 193, 96, 0, 691, 690, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 696, 1, 0, 0, 0, 695, 676, 1, 0, 0, 0, 695, 689, 1, 0, 0, 0, 696, 706, 1, 0, 0, 0, 697, 699, 7, 7, 0, 0, 698, 700, 7, 29, 0, 0, 699, 698, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 702, 1, 0, 0, 0, 701, 703, 3, 193, 96, 0, 702, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 702, 1, 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 707, 1, 0, 0, 0, 706, 697, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 717, 1, 0, 0, 0, 708, 709, 5, 48, 0, 0, 709, 710, 7, 18, 0, 0, 710, 712, 1, 0, 0, 0, 711, 713, 3, 191, 95, 0, 712, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 695, 1, 0, 0, 0, 716, 708, 1, 0, 0, 0, 717, 178, 1, 0, 0, 0, 718, 719, 7, 30, 0, 0, 719, 720, 3, 175, 87, 0, 720, 180, 1, 0, 0, 0, 721, 727, 5, 39, 0, 0, 722, 726, 8, 31, 0, 0, 723, 724, 5, 39, 0, 0, 724, 726, 5, 39, 0, 0, 725, 722, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 729, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 730, 1, 0, 0, 0, 729, 727, 1, 0, 0, 0, 730, 731, 5, 39, 0, 0, 731, 182, 1, 0, 0, 0, 732, 733, 5, 45, 0, 0, 733, 734, 5, 45, 0, 0, 734, 738, 1, 0, 0, 0, 735, 737, 8, 32, 0, 0, 736, 735, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 746, 1, 0, 0, 0, 740, 738, 1, 0, 0, 0, 741, 743, 5, 13, 0, 0, 742, 741, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 747, 5, 10, 0, 0, 745, 747, 5, 0, 0, 1, 746, 742, 1, 0, 0, 0, 746, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 6, 91, 0, 0, 749, 184, 1, 0, 0, 0, 750, 751, 5, 47, 0, 0, 751, 752, 5, 42, 0, 0, 752, 756, 1, 0, 0, 0, 753, 755, 9, 0, 0, 0, 754, 753, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 759, 1, 0, 0, 0, 758, 756, 1, 0, 0, 0, 759, 760, 5, 42, 0, 0, 760, 761, 5, 47, 0, 0, 761, 762, 1, 0, 0, 0, 762, 763, 6, 92, 0, 0, 763, 186, 1, 0, 0, 0, 764, 765, 7, 33, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 6, 93, 0, 0, 767, 188, 1, 0, 0, 0, 768, 769, 9, 0, 0, 0, 769, 190, 1, 0, 0, 0, 770, 771, 7, 34, 0, 0, 771, 192, 1, 0, 0, 0, 772, 773, 7, 35, 0, 0, 773, 194, 1, 0, 0, 0, 24, 0, 642, 644, 652, 654, 662, 670, 673, 678, 684, 687, 693, 695, 699, 704, 706, 714, 716, 725, 727, 738, 742, 746, 756, 1, 0, 1, 0] \ No newline at end of file diff --git a/parse/sql/grammar/SQLLexer.tokens b/parse/sql/grammar/SQLLexer.tokens new file mode 100644 index 000000000..4ff4dbdb0 --- /dev/null +++ b/parse/sql/grammar/SQLLexer.tokens @@ -0,0 +1,182 @@ +SCOL=1 +DOT=2 +OPEN_PAR=3 +CLOSE_PAR=4 +COMMA=5 +ASSIGN=6 +STAR=7 +PLUS=8 +MINUS=9 +DIV=10 +MOD=11 +LT=12 +LT_EQ=13 +GT=14 +GT_EQ=15 +NOT_EQ1=16 +NOT_EQ2=17 +TYPE_CAST=18 +ADD_=19 +ALL_=20 +AND_=21 +ASC_=22 +AS_=23 +BETWEEN_=24 +BY_=25 +CASE_=26 +COLLATE_=27 +COMMIT_=28 +CONFLICT_=29 +CREATE_=30 +CROSS_=31 +DEFAULT_=32 +DELETE_=33 +DESC_=34 +DISTINCT_=35 +DO_=36 +ELSE_=37 +END_=38 +ESCAPE_=39 +EXCEPT_=40 +EXISTS_=41 +FALSE_=42 +FILTER_=43 +FIRST_=44 +FROM_=45 +FULL_=46 +GROUPS_=47 +GROUP_=48 +HAVING_=49 +INNER_=50 +INSERT_=51 +INTERSECT_=52 +INTO_=53 +IN_=54 +ISNULL_=55 +IS_=56 +JOIN_=57 +LAST_=58 +LEFT_=59 +LIKE_=60 +LIMIT_=61 +NOTHING_=62 +NOTNULL_=63 +NOT_=64 +NULLS_=65 +NULL_=66 +OFFSET_=67 +OF_=68 +ON_=69 +ORDER_=70 +OR_=71 +OUTER_=72 +RAISE_=73 +REPLACE_=74 +RETURNING_=75 +RIGHT_=76 +SELECT_=77 +SET_=78 +THEN_=79 +TRUE_=80 +UNION_=81 +UPDATE_=82 +USING_=83 +VALUES_=84 +WHEN_=85 +WHERE_=86 +WITH_=87 +IDENTIFIER=88 +NUMERIC_LITERAL=89 +BIND_PARAMETER=90 +STRING_LITERAL=91 +SINGLE_LINE_COMMENT=92 +MULTILINE_COMMENT=93 +SPACES=94 +UNEXPECTED_CHAR=95 +';'=1 +'.'=2 +'('=3 +')'=4 +','=5 +'='=6 +'*'=7 +'+'=8 +'-'=9 +'/'=10 +'%'=11 +'<'=12 +'<='=13 +'>'=14 +'>='=15 +'!='=16 +'<>'=17 +'::'=18 +'ADD'=19 +'ALL'=20 +'AND'=21 +'ASC'=22 +'AS'=23 +'BETWEEN'=24 +'BY'=25 +'CASE'=26 +'COLLATE'=27 +'COMMIT'=28 +'CONFLICT'=29 +'CREATE'=30 +'CROSS'=31 +'DEFAULT'=32 +'DELETE'=33 +'DESC'=34 +'DISTINCT'=35 +'DO'=36 +'ELSE'=37 +'END'=38 +'ESCAPE'=39 +'EXCEPT'=40 +'EXISTS'=41 +'FALSE'=42 +'FILTER'=43 +'FIRST'=44 +'FROM'=45 +'FULL'=46 +'GROUPS'=47 +'GROUP'=48 +'HAVING'=49 +'INNER'=50 +'INSERT'=51 +'INTERSECT'=52 +'INTO'=53 +'IN'=54 +'ISNULL'=55 +'IS'=56 +'JOIN'=57 +'LAST'=58 +'LEFT'=59 +'LIKE'=60 +'LIMIT'=61 +'NOTHING'=62 +'NOTNULL'=63 +'NOT'=64 +'NULLS'=65 +'NULL'=66 +'OFFSET'=67 +'OF'=68 +'ON'=69 +'ORDER'=70 +'OR'=71 +'OUTER'=72 +'RAISE'=73 +'REPLACE'=74 +'RETURNING'=75 +'RIGHT'=76 +'SELECT'=77 +'SET'=78 +'THEN'=79 +'TRUE'=80 +'UNION'=81 +'UPDATE'=82 +'USING'=83 +'VALUES'=84 +'WHEN'=85 +'WHERE'=86 +'WITH'=87 diff --git a/parse/sql/grammar/SQLParser.interp b/parse/sql/grammar/SQLParser.interp new file mode 100644 index 000000000..7f13b40dc --- /dev/null +++ b/parse/sql/grammar/SQLParser.interp @@ -0,0 +1,259 @@ +token literal names: +null +';' +'.' +'(' +')' +',' +'=' +'*' +'+' +'-' +'/' +'%' +'<' +'<=' +'>' +'>=' +'!=' +'<>' +'::' +'ADD' +'ALL' +'AND' +'ASC' +'AS' +'BETWEEN' +'BY' +'CASE' +'COLLATE' +'COMMIT' +'CONFLICT' +'CREATE' +'CROSS' +'DEFAULT' +'DELETE' +'DESC' +'DISTINCT' +'DO' +'ELSE' +'END' +'ESCAPE' +'EXCEPT' +'EXISTS' +'FALSE' +'FILTER' +'FIRST' +'FROM' +'FULL' +'GROUPS' +'GROUP' +'HAVING' +'INNER' +'INSERT' +'INTERSECT' +'INTO' +'IN' +'ISNULL' +'IS' +'JOIN' +'LAST' +'LEFT' +'LIKE' +'LIMIT' +'NOTHING' +'NOTNULL' +'NOT' +'NULLS' +'NULL' +'OFFSET' +'OF' +'ON' +'ORDER' +'OR' +'OUTER' +'RAISE' +'REPLACE' +'RETURNING' +'RIGHT' +'SELECT' +'SET' +'THEN' +'TRUE' +'UNION' +'UPDATE' +'USING' +'VALUES' +'WHEN' +'WHERE' +'WITH' +null +null +null +null +null +null +null +null + +token symbolic names: +null +SCOL +DOT +OPEN_PAR +CLOSE_PAR +COMMA +ASSIGN +STAR +PLUS +MINUS +DIV +MOD +LT +LT_EQ +GT +GT_EQ +NOT_EQ1 +NOT_EQ2 +TYPE_CAST +ADD_ +ALL_ +AND_ +ASC_ +AS_ +BETWEEN_ +BY_ +CASE_ +COLLATE_ +COMMIT_ +CONFLICT_ +CREATE_ +CROSS_ +DEFAULT_ +DELETE_ +DESC_ +DISTINCT_ +DO_ +ELSE_ +END_ +ESCAPE_ +EXCEPT_ +EXISTS_ +FALSE_ +FILTER_ +FIRST_ +FROM_ +FULL_ +GROUPS_ +GROUP_ +HAVING_ +INNER_ +INSERT_ +INTERSECT_ +INTO_ +IN_ +ISNULL_ +IS_ +JOIN_ +LAST_ +LEFT_ +LIKE_ +LIMIT_ +NOTHING_ +NOTNULL_ +NOT_ +NULLS_ +NULL_ +OFFSET_ +OF_ +ON_ +ORDER_ +OR_ +OUTER_ +RAISE_ +REPLACE_ +RETURNING_ +RIGHT_ +SELECT_ +SET_ +THEN_ +TRUE_ +UNION_ +UPDATE_ +USING_ +VALUES_ +WHEN_ +WHERE_ +WITH_ +IDENTIFIER +NUMERIC_LITERAL +BIND_PARAMETER +STRING_LITERAL +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR + +rule names: +statements +sql_stmt_list +sql_stmt +indexed_column +cte_table_name +common_table_expression +common_table_stmt +delete_core +delete_stmt +variable +function_call +column_ref +when_clause +expr +subquery +expr_list +comparisonOperator +cast_type +type_cast +boolean_value +string_value +numeric_value +literal +value_row +values_clause +insert_core +insert_stmt +returning_clause +upsert_update +upsert_clause +select_stmt_no_cte +select_stmt +join_relation +relation +select_core +table_or_subquery +result_column +returning_clause_result_column +join_operator +join_constraint +compound_operator +update_set_subclause +update_core +update_stmt +column_name_list +qualified_table_name +order_by_stmt +limit_stmt +ordering_term +asc_desc +function_keyword +function_name +table_name +table_alias +column_name +column_alias +collation_name +index_name + + +atn: +[4, 1, 95, 713, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 1, 0, 5, 0, 118, 8, 0, 10, 0, 12, 0, 121, 9, 0, 1, 0, 1, 0, 1, 1, 5, 1, 126, 8, 1, 10, 1, 12, 1, 129, 9, 1, 1, 1, 1, 1, 4, 1, 133, 8, 1, 11, 1, 12, 1, 134, 1, 1, 5, 1, 138, 8, 1, 10, 1, 12, 1, 141, 9, 1, 1, 1, 5, 1, 144, 8, 1, 10, 1, 12, 1, 147, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 153, 8, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 162, 8, 4, 10, 4, 12, 4, 165, 9, 4, 1, 4, 1, 4, 3, 4, 169, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 181, 8, 6, 10, 6, 12, 6, 184, 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 191, 8, 7, 1, 7, 3, 7, 194, 8, 7, 1, 8, 3, 8, 197, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 3, 10, 206, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 211, 8, 10, 10, 10, 12, 10, 214, 9, 10, 1, 10, 3, 10, 217, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 3, 11, 224, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 252, 8, 13, 1, 13, 3, 13, 255, 8, 13, 1, 13, 3, 13, 258, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 263, 8, 13, 1, 13, 4, 13, 266, 8, 13, 11, 13, 12, 13, 267, 1, 13, 1, 13, 3, 13, 272, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 282, 8, 13, 1, 13, 1, 13, 3, 13, 286, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 296, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 318, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 324, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 333, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 339, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 344, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 351, 8, 13, 1, 13, 1, 13, 5, 13, 355, 8, 13, 10, 13, 12, 13, 358, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 367, 8, 15, 10, 15, 12, 15, 370, 9, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 389, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 395, 8, 23, 10, 23, 12, 23, 398, 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 406, 8, 24, 10, 24, 12, 24, 409, 9, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 416, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 422, 8, 25, 10, 25, 12, 25, 425, 9, 25, 1, 25, 1, 25, 3, 25, 429, 8, 25, 1, 25, 1, 25, 3, 25, 433, 8, 25, 1, 25, 3, 25, 436, 8, 25, 1, 26, 3, 26, 439, 8, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 447, 8, 27, 10, 27, 12, 27, 450, 9, 27, 1, 28, 1, 28, 3, 28, 454, 8, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 465, 8, 29, 10, 29, 12, 29, 468, 9, 29, 1, 29, 1, 29, 1, 29, 3, 29, 473, 8, 29, 3, 29, 475, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 484, 8, 29, 10, 29, 12, 29, 487, 9, 29, 1, 29, 1, 29, 3, 29, 491, 8, 29, 3, 29, 493, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 499, 8, 30, 10, 30, 12, 30, 502, 9, 30, 1, 30, 3, 30, 505, 8, 30, 1, 30, 3, 30, 508, 8, 30, 1, 31, 3, 31, 511, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 5, 33, 521, 8, 33, 10, 33, 12, 33, 524, 9, 33, 1, 34, 1, 34, 3, 34, 528, 8, 34, 1, 34, 1, 34, 1, 34, 5, 34, 533, 8, 34, 10, 34, 12, 34, 536, 9, 34, 1, 34, 1, 34, 3, 34, 540, 8, 34, 1, 34, 1, 34, 3, 34, 544, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 551, 8, 34, 10, 34, 12, 34, 554, 9, 34, 1, 34, 1, 34, 3, 34, 558, 8, 34, 3, 34, 560, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 565, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 572, 8, 35, 3, 35, 574, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 584, 8, 36, 3, 36, 586, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 592, 8, 37, 3, 37, 594, 8, 37, 1, 38, 1, 38, 3, 38, 598, 8, 38, 1, 38, 3, 38, 601, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 3, 40, 610, 8, 40, 1, 40, 1, 40, 3, 40, 614, 8, 40, 1, 41, 1, 41, 3, 41, 618, 8, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 629, 8, 42, 10, 42, 12, 42, 632, 9, 42, 1, 42, 1, 42, 3, 42, 636, 8, 42, 1, 42, 1, 42, 3, 42, 640, 8, 42, 1, 42, 3, 42, 643, 8, 42, 1, 43, 3, 43, 646, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 654, 8, 44, 10, 44, 12, 44, 657, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 3, 45, 664, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 671, 8, 46, 10, 46, 12, 46, 674, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 680, 8, 47, 1, 48, 1, 48, 3, 48, 684, 8, 48, 1, 48, 1, 48, 3, 48, 688, 8, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 3, 50, 695, 8, 50, 1, 51, 1, 51, 3, 51, 699, 8, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 0, 1, 26, 58, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 0, 8, 1, 0, 8, 9, 2, 0, 7, 7, 10, 11, 2, 0, 55, 55, 63, 63, 2, 0, 6, 6, 12, 17, 2, 0, 42, 42, 80, 80, 3, 0, 46, 46, 59, 59, 76, 76, 2, 0, 44, 44, 58, 58, 2, 0, 22, 22, 34, 34, 773, 0, 119, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 4, 152, 1, 0, 0, 0, 6, 154, 1, 0, 0, 0, 8, 156, 1, 0, 0, 0, 10, 170, 1, 0, 0, 0, 12, 176, 1, 0, 0, 0, 14, 185, 1, 0, 0, 0, 16, 196, 1, 0, 0, 0, 18, 200, 1, 0, 0, 0, 20, 202, 1, 0, 0, 0, 22, 223, 1, 0, 0, 0, 24, 227, 1, 0, 0, 0, 26, 285, 1, 0, 0, 0, 28, 359, 1, 0, 0, 0, 30, 363, 1, 0, 0, 0, 32, 371, 1, 0, 0, 0, 34, 373, 1, 0, 0, 0, 36, 375, 1, 0, 0, 0, 38, 378, 1, 0, 0, 0, 40, 380, 1, 0, 0, 0, 42, 382, 1, 0, 0, 0, 44, 388, 1, 0, 0, 0, 46, 390, 1, 0, 0, 0, 48, 401, 1, 0, 0, 0, 50, 410, 1, 0, 0, 0, 52, 438, 1, 0, 0, 0, 54, 442, 1, 0, 0, 0, 56, 453, 1, 0, 0, 0, 58, 458, 1, 0, 0, 0, 60, 494, 1, 0, 0, 0, 62, 510, 1, 0, 0, 0, 64, 514, 1, 0, 0, 0, 66, 518, 1, 0, 0, 0, 68, 525, 1, 0, 0, 0, 70, 573, 1, 0, 0, 0, 72, 585, 1, 0, 0, 0, 74, 593, 1, 0, 0, 0, 76, 600, 1, 0, 0, 0, 78, 604, 1, 0, 0, 0, 80, 613, 1, 0, 0, 0, 82, 617, 1, 0, 0, 0, 84, 622, 1, 0, 0, 0, 86, 645, 1, 0, 0, 0, 88, 649, 1, 0, 0, 0, 90, 660, 1, 0, 0, 0, 92, 665, 1, 0, 0, 0, 94, 675, 1, 0, 0, 0, 96, 681, 1, 0, 0, 0, 98, 689, 1, 0, 0, 0, 100, 694, 1, 0, 0, 0, 102, 698, 1, 0, 0, 0, 104, 700, 1, 0, 0, 0, 106, 702, 1, 0, 0, 0, 108, 704, 1, 0, 0, 0, 110, 706, 1, 0, 0, 0, 112, 708, 1, 0, 0, 0, 114, 710, 1, 0, 0, 0, 116, 118, 3, 2, 1, 0, 117, 116, 1, 0, 0, 0, 118, 121, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 122, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 122, 123, 5, 0, 0, 1, 123, 1, 1, 0, 0, 0, 124, 126, 5, 1, 0, 0, 125, 124, 1, 0, 0, 0, 126, 129, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 130, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 130, 139, 3, 4, 2, 0, 131, 133, 5, 1, 0, 0, 132, 131, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 3, 4, 2, 0, 137, 132, 1, 0, 0, 0, 138, 141, 1, 0, 0, 0, 139, 137, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 145, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 144, 5, 1, 0, 0, 143, 142, 1, 0, 0, 0, 144, 147, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 3, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 148, 153, 3, 16, 8, 0, 149, 153, 3, 52, 26, 0, 150, 153, 3, 62, 31, 0, 151, 153, 3, 86, 43, 0, 152, 148, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 152, 151, 1, 0, 0, 0, 153, 5, 1, 0, 0, 0, 154, 155, 3, 108, 54, 0, 155, 7, 1, 0, 0, 0, 156, 168, 3, 104, 52, 0, 157, 158, 5, 3, 0, 0, 158, 163, 3, 108, 54, 0, 159, 160, 5, 5, 0, 0, 160, 162, 3, 108, 54, 0, 161, 159, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 166, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 166, 167, 5, 4, 0, 0, 167, 169, 1, 0, 0, 0, 168, 157, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 9, 1, 0, 0, 0, 170, 171, 3, 8, 4, 0, 171, 172, 5, 23, 0, 0, 172, 173, 5, 3, 0, 0, 173, 174, 3, 60, 30, 0, 174, 175, 5, 4, 0, 0, 175, 11, 1, 0, 0, 0, 176, 177, 5, 87, 0, 0, 177, 182, 3, 10, 5, 0, 178, 179, 5, 5, 0, 0, 179, 181, 3, 10, 5, 0, 180, 178, 1, 0, 0, 0, 181, 184, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 13, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 185, 186, 5, 33, 0, 0, 186, 187, 5, 45, 0, 0, 187, 190, 3, 90, 45, 0, 188, 189, 5, 86, 0, 0, 189, 191, 3, 26, 13, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 194, 3, 54, 27, 0, 193, 192, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 15, 1, 0, 0, 0, 195, 197, 3, 12, 6, 0, 196, 195, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 3, 14, 7, 0, 199, 17, 1, 0, 0, 0, 200, 201, 5, 90, 0, 0, 201, 19, 1, 0, 0, 0, 202, 203, 3, 102, 51, 0, 203, 216, 5, 3, 0, 0, 204, 206, 5, 35, 0, 0, 205, 204, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 212, 3, 26, 13, 0, 208, 209, 5, 5, 0, 0, 209, 211, 3, 26, 13, 0, 210, 208, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 217, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 217, 5, 7, 0, 0, 216, 205, 1, 0, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 4, 0, 0, 219, 21, 1, 0, 0, 0, 220, 221, 3, 104, 52, 0, 221, 222, 5, 2, 0, 0, 222, 224, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 226, 3, 108, 54, 0, 226, 23, 1, 0, 0, 0, 227, 228, 5, 85, 0, 0, 228, 229, 3, 26, 13, 0, 229, 230, 5, 79, 0, 0, 230, 231, 3, 26, 13, 0, 231, 25, 1, 0, 0, 0, 232, 233, 6, 13, -1, 0, 233, 235, 3, 44, 22, 0, 234, 236, 3, 36, 18, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 286, 1, 0, 0, 0, 237, 239, 3, 18, 9, 0, 238, 240, 3, 36, 18, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 286, 1, 0, 0, 0, 241, 243, 3, 22, 11, 0, 242, 244, 3, 36, 18, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 286, 1, 0, 0, 0, 245, 246, 7, 0, 0, 0, 246, 286, 3, 26, 13, 19, 247, 248, 5, 3, 0, 0, 248, 249, 3, 26, 13, 0, 249, 251, 5, 4, 0, 0, 250, 252, 3, 36, 18, 0, 251, 250, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 286, 1, 0, 0, 0, 253, 255, 5, 64, 0, 0, 254, 253, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 258, 5, 41, 0, 0, 257, 254, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 286, 3, 28, 14, 0, 260, 262, 5, 26, 0, 0, 261, 263, 3, 26, 13, 0, 262, 261, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 265, 1, 0, 0, 0, 264, 266, 3, 24, 12, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 270, 5, 37, 0, 0, 270, 272, 3, 26, 13, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 5, 38, 0, 0, 274, 286, 1, 0, 0, 0, 275, 276, 5, 3, 0, 0, 276, 277, 3, 30, 15, 0, 277, 278, 5, 4, 0, 0, 278, 286, 1, 0, 0, 0, 279, 281, 3, 20, 10, 0, 280, 282, 3, 36, 18, 0, 281, 280, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 286, 1, 0, 0, 0, 283, 284, 5, 64, 0, 0, 284, 286, 3, 26, 13, 3, 285, 232, 1, 0, 0, 0, 285, 237, 1, 0, 0, 0, 285, 241, 1, 0, 0, 0, 285, 245, 1, 0, 0, 0, 285, 247, 1, 0, 0, 0, 285, 257, 1, 0, 0, 0, 285, 260, 1, 0, 0, 0, 285, 275, 1, 0, 0, 0, 285, 279, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 286, 356, 1, 0, 0, 0, 287, 288, 10, 12, 0, 0, 288, 289, 7, 1, 0, 0, 289, 355, 3, 26, 13, 13, 290, 291, 10, 11, 0, 0, 291, 292, 7, 0, 0, 0, 292, 355, 3, 26, 13, 12, 293, 295, 10, 8, 0, 0, 294, 296, 5, 64, 0, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, 5, 24, 0, 0, 298, 299, 3, 26, 13, 0, 299, 300, 5, 21, 0, 0, 300, 301, 3, 26, 13, 9, 301, 355, 1, 0, 0, 0, 302, 303, 10, 6, 0, 0, 303, 304, 3, 32, 16, 0, 304, 305, 3, 26, 13, 7, 305, 355, 1, 0, 0, 0, 306, 307, 10, 2, 0, 0, 307, 308, 5, 21, 0, 0, 308, 355, 3, 26, 13, 3, 309, 310, 10, 1, 0, 0, 310, 311, 5, 71, 0, 0, 311, 355, 3, 26, 13, 2, 312, 313, 10, 18, 0, 0, 313, 314, 5, 27, 0, 0, 314, 355, 3, 112, 56, 0, 315, 317, 10, 10, 0, 0, 316, 318, 5, 64, 0, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 5, 54, 0, 0, 320, 355, 3, 28, 14, 0, 321, 323, 10, 9, 0, 0, 322, 324, 5, 64, 0, 0, 323, 322, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 326, 5, 54, 0, 0, 326, 327, 5, 3, 0, 0, 327, 328, 3, 30, 15, 0, 328, 329, 5, 4, 0, 0, 329, 355, 1, 0, 0, 0, 330, 332, 10, 7, 0, 0, 331, 333, 5, 64, 0, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 335, 5, 60, 0, 0, 335, 338, 3, 26, 13, 0, 336, 337, 5, 39, 0, 0, 337, 339, 3, 26, 13, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 355, 1, 0, 0, 0, 340, 341, 10, 5, 0, 0, 341, 343, 5, 56, 0, 0, 342, 344, 5, 64, 0, 0, 343, 342, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 350, 1, 0, 0, 0, 345, 346, 5, 35, 0, 0, 346, 347, 5, 45, 0, 0, 347, 351, 3, 26, 13, 0, 348, 351, 3, 38, 19, 0, 349, 351, 5, 66, 0, 0, 350, 345, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 355, 1, 0, 0, 0, 352, 353, 10, 4, 0, 0, 353, 355, 7, 2, 0, 0, 354, 287, 1, 0, 0, 0, 354, 290, 1, 0, 0, 0, 354, 293, 1, 0, 0, 0, 354, 302, 1, 0, 0, 0, 354, 306, 1, 0, 0, 0, 354, 309, 1, 0, 0, 0, 354, 312, 1, 0, 0, 0, 354, 315, 1, 0, 0, 0, 354, 321, 1, 0, 0, 0, 354, 330, 1, 0, 0, 0, 354, 340, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 27, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 359, 360, 5, 3, 0, 0, 360, 361, 3, 60, 30, 0, 361, 362, 5, 4, 0, 0, 362, 29, 1, 0, 0, 0, 363, 368, 3, 26, 13, 0, 364, 365, 5, 5, 0, 0, 365, 367, 3, 26, 13, 0, 366, 364, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 31, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 372, 7, 3, 0, 0, 372, 33, 1, 0, 0, 0, 373, 374, 5, 88, 0, 0, 374, 35, 1, 0, 0, 0, 375, 376, 5, 18, 0, 0, 376, 377, 3, 34, 17, 0, 377, 37, 1, 0, 0, 0, 378, 379, 7, 4, 0, 0, 379, 39, 1, 0, 0, 0, 380, 381, 5, 91, 0, 0, 381, 41, 1, 0, 0, 0, 382, 383, 5, 89, 0, 0, 383, 43, 1, 0, 0, 0, 384, 389, 5, 66, 0, 0, 385, 389, 3, 38, 19, 0, 386, 389, 3, 40, 20, 0, 387, 389, 3, 42, 21, 0, 388, 384, 1, 0, 0, 0, 388, 385, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 387, 1, 0, 0, 0, 389, 45, 1, 0, 0, 0, 390, 391, 5, 3, 0, 0, 391, 396, 3, 26, 13, 0, 392, 393, 5, 5, 0, 0, 393, 395, 3, 26, 13, 0, 394, 392, 1, 0, 0, 0, 395, 398, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 399, 400, 5, 4, 0, 0, 400, 47, 1, 0, 0, 0, 401, 402, 5, 84, 0, 0, 402, 407, 3, 46, 23, 0, 403, 404, 5, 5, 0, 0, 404, 406, 3, 46, 23, 0, 405, 403, 1, 0, 0, 0, 406, 409, 1, 0, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 49, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 410, 411, 5, 51, 0, 0, 411, 412, 5, 53, 0, 0, 412, 415, 3, 104, 52, 0, 413, 414, 5, 23, 0, 0, 414, 416, 3, 106, 53, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 428, 1, 0, 0, 0, 417, 418, 5, 3, 0, 0, 418, 423, 3, 108, 54, 0, 419, 420, 5, 5, 0, 0, 420, 422, 3, 108, 54, 0, 421, 419, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 5, 4, 0, 0, 427, 429, 1, 0, 0, 0, 428, 417, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 432, 3, 48, 24, 0, 431, 433, 3, 58, 29, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 54, 27, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 51, 1, 0, 0, 0, 437, 439, 3, 12, 6, 0, 438, 437, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 3, 50, 25, 0, 441, 53, 1, 0, 0, 0, 442, 443, 5, 75, 0, 0, 443, 448, 3, 74, 37, 0, 444, 445, 5, 5, 0, 0, 445, 447, 3, 74, 37, 0, 446, 444, 1, 0, 0, 0, 447, 450, 1, 0, 0, 0, 448, 446, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 55, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 451, 454, 3, 108, 54, 0, 452, 454, 3, 88, 44, 0, 453, 451, 1, 0, 0, 0, 453, 452, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 5, 6, 0, 0, 456, 457, 3, 26, 13, 0, 457, 57, 1, 0, 0, 0, 458, 459, 5, 69, 0, 0, 459, 474, 5, 29, 0, 0, 460, 461, 5, 3, 0, 0, 461, 466, 3, 6, 3, 0, 462, 463, 5, 5, 0, 0, 463, 465, 3, 6, 3, 0, 464, 462, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 469, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 469, 472, 5, 4, 0, 0, 470, 471, 5, 86, 0, 0, 471, 473, 3, 26, 13, 0, 472, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 475, 1, 0, 0, 0, 474, 460, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 492, 5, 36, 0, 0, 477, 493, 5, 62, 0, 0, 478, 479, 5, 82, 0, 0, 479, 480, 5, 78, 0, 0, 480, 485, 3, 56, 28, 0, 481, 482, 5, 5, 0, 0, 482, 484, 3, 56, 28, 0, 483, 481, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 490, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 86, 0, 0, 489, 491, 3, 26, 13, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 493, 1, 0, 0, 0, 492, 477, 1, 0, 0, 0, 492, 478, 1, 0, 0, 0, 493, 59, 1, 0, 0, 0, 494, 500, 3, 68, 34, 0, 495, 496, 3, 80, 40, 0, 496, 497, 3, 68, 34, 0, 497, 499, 1, 0, 0, 0, 498, 495, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 503, 505, 3, 92, 46, 0, 504, 503, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 507, 1, 0, 0, 0, 506, 508, 3, 94, 47, 0, 507, 506, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 61, 1, 0, 0, 0, 509, 511, 3, 12, 6, 0, 510, 509, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 3, 60, 30, 0, 513, 63, 1, 0, 0, 0, 514, 515, 3, 76, 38, 0, 515, 516, 3, 70, 35, 0, 516, 517, 3, 78, 39, 0, 517, 65, 1, 0, 0, 0, 518, 522, 3, 70, 35, 0, 519, 521, 3, 64, 32, 0, 520, 519, 1, 0, 0, 0, 521, 524, 1, 0, 0, 0, 522, 520, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 67, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 525, 527, 5, 77, 0, 0, 526, 528, 5, 35, 0, 0, 527, 526, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 534, 3, 72, 36, 0, 530, 531, 5, 5, 0, 0, 531, 533, 3, 72, 36, 0, 532, 530, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 539, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 45, 0, 0, 538, 540, 3, 66, 33, 0, 539, 537, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 543, 1, 0, 0, 0, 541, 542, 5, 86, 0, 0, 542, 544, 3, 26, 13, 0, 543, 541, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 559, 1, 0, 0, 0, 545, 546, 5, 48, 0, 0, 546, 547, 5, 25, 0, 0, 547, 552, 3, 26, 13, 0, 548, 549, 5, 5, 0, 0, 549, 551, 3, 26, 13, 0, 550, 548, 1, 0, 0, 0, 551, 554, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 557, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 555, 556, 5, 49, 0, 0, 556, 558, 3, 26, 13, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 545, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 69, 1, 0, 0, 0, 561, 564, 3, 104, 52, 0, 562, 563, 5, 23, 0, 0, 563, 565, 3, 106, 53, 0, 564, 562, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 574, 1, 0, 0, 0, 566, 567, 5, 3, 0, 0, 567, 568, 3, 60, 30, 0, 568, 571, 5, 4, 0, 0, 569, 570, 5, 23, 0, 0, 570, 572, 3, 106, 53, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 574, 1, 0, 0, 0, 573, 561, 1, 0, 0, 0, 573, 566, 1, 0, 0, 0, 574, 71, 1, 0, 0, 0, 575, 586, 5, 7, 0, 0, 576, 577, 3, 104, 52, 0, 577, 578, 5, 2, 0, 0, 578, 579, 5, 7, 0, 0, 579, 586, 1, 0, 0, 0, 580, 583, 3, 26, 13, 0, 581, 582, 5, 23, 0, 0, 582, 584, 3, 110, 55, 0, 583, 581, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 586, 1, 0, 0, 0, 585, 575, 1, 0, 0, 0, 585, 576, 1, 0, 0, 0, 585, 580, 1, 0, 0, 0, 586, 73, 1, 0, 0, 0, 587, 594, 5, 7, 0, 0, 588, 591, 3, 26, 13, 0, 589, 590, 5, 23, 0, 0, 590, 592, 3, 110, 55, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 587, 1, 0, 0, 0, 593, 588, 1, 0, 0, 0, 594, 75, 1, 0, 0, 0, 595, 597, 7, 5, 0, 0, 596, 598, 5, 72, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 601, 1, 0, 0, 0, 599, 601, 5, 50, 0, 0, 600, 595, 1, 0, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 5, 57, 0, 0, 603, 77, 1, 0, 0, 0, 604, 605, 5, 69, 0, 0, 605, 606, 3, 26, 13, 0, 606, 79, 1, 0, 0, 0, 607, 609, 5, 81, 0, 0, 608, 610, 5, 20, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 614, 1, 0, 0, 0, 611, 614, 5, 52, 0, 0, 612, 614, 5, 40, 0, 0, 613, 607, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 612, 1, 0, 0, 0, 614, 81, 1, 0, 0, 0, 615, 618, 3, 108, 54, 0, 616, 618, 3, 88, 44, 0, 617, 615, 1, 0, 0, 0, 617, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 5, 6, 0, 0, 620, 621, 3, 26, 13, 0, 621, 83, 1, 0, 0, 0, 622, 623, 5, 82, 0, 0, 623, 624, 3, 90, 45, 0, 624, 625, 5, 78, 0, 0, 625, 630, 3, 82, 41, 0, 626, 627, 5, 5, 0, 0, 627, 629, 3, 82, 41, 0, 628, 626, 1, 0, 0, 0, 629, 632, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 635, 1, 0, 0, 0, 632, 630, 1, 0, 0, 0, 633, 634, 5, 45, 0, 0, 634, 636, 3, 66, 33, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 638, 5, 86, 0, 0, 638, 640, 3, 26, 13, 0, 639, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 1, 0, 0, 0, 641, 643, 3, 54, 27, 0, 642, 641, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 85, 1, 0, 0, 0, 644, 646, 3, 12, 6, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 3, 84, 42, 0, 648, 87, 1, 0, 0, 0, 649, 650, 5, 3, 0, 0, 650, 655, 3, 108, 54, 0, 651, 652, 5, 5, 0, 0, 652, 654, 3, 108, 54, 0, 653, 651, 1, 0, 0, 0, 654, 657, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 658, 1, 0, 0, 0, 657, 655, 1, 0, 0, 0, 658, 659, 5, 4, 0, 0, 659, 89, 1, 0, 0, 0, 660, 663, 3, 104, 52, 0, 661, 662, 5, 23, 0, 0, 662, 664, 3, 106, 53, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 91, 1, 0, 0, 0, 665, 666, 5, 70, 0, 0, 666, 667, 5, 25, 0, 0, 667, 672, 3, 96, 48, 0, 668, 669, 5, 5, 0, 0, 669, 671, 3, 96, 48, 0, 670, 668, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 93, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 676, 5, 61, 0, 0, 676, 679, 3, 26, 13, 0, 677, 678, 5, 67, 0, 0, 678, 680, 3, 26, 13, 0, 679, 677, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 95, 1, 0, 0, 0, 681, 683, 3, 26, 13, 0, 682, 684, 3, 98, 49, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 687, 1, 0, 0, 0, 685, 686, 5, 65, 0, 0, 686, 688, 7, 6, 0, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 97, 1, 0, 0, 0, 689, 690, 7, 7, 0, 0, 690, 99, 1, 0, 0, 0, 691, 695, 1, 0, 0, 0, 692, 695, 5, 60, 0, 0, 693, 695, 5, 74, 0, 0, 694, 691, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 693, 1, 0, 0, 0, 695, 101, 1, 0, 0, 0, 696, 699, 5, 88, 0, 0, 697, 699, 3, 100, 50, 0, 698, 696, 1, 0, 0, 0, 698, 697, 1, 0, 0, 0, 699, 103, 1, 0, 0, 0, 700, 701, 5, 88, 0, 0, 701, 105, 1, 0, 0, 0, 702, 703, 5, 88, 0, 0, 703, 107, 1, 0, 0, 0, 704, 705, 5, 88, 0, 0, 705, 109, 1, 0, 0, 0, 706, 707, 5, 88, 0, 0, 707, 111, 1, 0, 0, 0, 708, 709, 5, 88, 0, 0, 709, 113, 1, 0, 0, 0, 710, 711, 5, 88, 0, 0, 711, 115, 1, 0, 0, 0, 91, 119, 127, 134, 139, 145, 152, 163, 168, 182, 190, 193, 196, 205, 212, 216, 223, 235, 239, 243, 251, 254, 257, 262, 267, 271, 281, 285, 295, 317, 323, 332, 338, 343, 350, 354, 356, 368, 388, 396, 407, 415, 423, 428, 432, 435, 438, 448, 453, 466, 472, 474, 485, 490, 492, 500, 504, 507, 510, 522, 527, 534, 539, 543, 552, 557, 559, 564, 571, 573, 583, 585, 591, 593, 597, 600, 609, 613, 617, 630, 635, 639, 642, 645, 655, 663, 672, 679, 683, 687, 694, 698] \ No newline at end of file diff --git a/parse/sql/grammar/SQLParser.tokens b/parse/sql/grammar/SQLParser.tokens new file mode 100644 index 000000000..4ff4dbdb0 --- /dev/null +++ b/parse/sql/grammar/SQLParser.tokens @@ -0,0 +1,182 @@ +SCOL=1 +DOT=2 +OPEN_PAR=3 +CLOSE_PAR=4 +COMMA=5 +ASSIGN=6 +STAR=7 +PLUS=8 +MINUS=9 +DIV=10 +MOD=11 +LT=12 +LT_EQ=13 +GT=14 +GT_EQ=15 +NOT_EQ1=16 +NOT_EQ2=17 +TYPE_CAST=18 +ADD_=19 +ALL_=20 +AND_=21 +ASC_=22 +AS_=23 +BETWEEN_=24 +BY_=25 +CASE_=26 +COLLATE_=27 +COMMIT_=28 +CONFLICT_=29 +CREATE_=30 +CROSS_=31 +DEFAULT_=32 +DELETE_=33 +DESC_=34 +DISTINCT_=35 +DO_=36 +ELSE_=37 +END_=38 +ESCAPE_=39 +EXCEPT_=40 +EXISTS_=41 +FALSE_=42 +FILTER_=43 +FIRST_=44 +FROM_=45 +FULL_=46 +GROUPS_=47 +GROUP_=48 +HAVING_=49 +INNER_=50 +INSERT_=51 +INTERSECT_=52 +INTO_=53 +IN_=54 +ISNULL_=55 +IS_=56 +JOIN_=57 +LAST_=58 +LEFT_=59 +LIKE_=60 +LIMIT_=61 +NOTHING_=62 +NOTNULL_=63 +NOT_=64 +NULLS_=65 +NULL_=66 +OFFSET_=67 +OF_=68 +ON_=69 +ORDER_=70 +OR_=71 +OUTER_=72 +RAISE_=73 +REPLACE_=74 +RETURNING_=75 +RIGHT_=76 +SELECT_=77 +SET_=78 +THEN_=79 +TRUE_=80 +UNION_=81 +UPDATE_=82 +USING_=83 +VALUES_=84 +WHEN_=85 +WHERE_=86 +WITH_=87 +IDENTIFIER=88 +NUMERIC_LITERAL=89 +BIND_PARAMETER=90 +STRING_LITERAL=91 +SINGLE_LINE_COMMENT=92 +MULTILINE_COMMENT=93 +SPACES=94 +UNEXPECTED_CHAR=95 +';'=1 +'.'=2 +'('=3 +')'=4 +','=5 +'='=6 +'*'=7 +'+'=8 +'-'=9 +'/'=10 +'%'=11 +'<'=12 +'<='=13 +'>'=14 +'>='=15 +'!='=16 +'<>'=17 +'::'=18 +'ADD'=19 +'ALL'=20 +'AND'=21 +'ASC'=22 +'AS'=23 +'BETWEEN'=24 +'BY'=25 +'CASE'=26 +'COLLATE'=27 +'COMMIT'=28 +'CONFLICT'=29 +'CREATE'=30 +'CROSS'=31 +'DEFAULT'=32 +'DELETE'=33 +'DESC'=34 +'DISTINCT'=35 +'DO'=36 +'ELSE'=37 +'END'=38 +'ESCAPE'=39 +'EXCEPT'=40 +'EXISTS'=41 +'FALSE'=42 +'FILTER'=43 +'FIRST'=44 +'FROM'=45 +'FULL'=46 +'GROUPS'=47 +'GROUP'=48 +'HAVING'=49 +'INNER'=50 +'INSERT'=51 +'INTERSECT'=52 +'INTO'=53 +'IN'=54 +'ISNULL'=55 +'IS'=56 +'JOIN'=57 +'LAST'=58 +'LEFT'=59 +'LIKE'=60 +'LIMIT'=61 +'NOTHING'=62 +'NOTNULL'=63 +'NOT'=64 +'NULLS'=65 +'NULL'=66 +'OFFSET'=67 +'OF'=68 +'ON'=69 +'ORDER'=70 +'OR'=71 +'OUTER'=72 +'RAISE'=73 +'REPLACE'=74 +'RETURNING'=75 +'RIGHT'=76 +'SELECT'=77 +'SET'=78 +'THEN'=79 +'TRUE'=80 +'UNION'=81 +'UPDATE'=82 +'USING'=83 +'VALUES'=84 +'WHEN'=85 +'WHERE'=86 +'WITH'=87 diff --git a/parse/sql/grammar/sql_lexer.go b/parse/sql/grammar/sql_lexer.go new file mode 100644 index 000000000..41a1c371e --- /dev/null +++ b/parse/sql/grammar/sql_lexer.go @@ -0,0 +1,570 @@ +// Code generated from SQLLexer.g4 by ANTLR 4.13.1. DO NOT EDIT. + +package grammar + +import ( + "fmt" + "github.com/antlr4-go/antlr/v4" + "sync" + "unicode" +) + +// Suppress unused import error +var _ = fmt.Printf +var _ = sync.Once{} +var _ = unicode.IsLetter + +type SQLLexer struct { + *antlr.BaseLexer + channelNames []string + modeNames []string + // TODO: EOF string +} + +var SQLLexerLexerStaticData struct { + once sync.Once + serializedATN []int32 + ChannelNames []string + ModeNames []string + LiteralNames []string + SymbolicNames []string + RuleNames []string + PredictionContextCache *antlr.PredictionContextCache + atn *antlr.ATN + decisionToDFA []*antlr.DFA +} + +func sqllexerLexerInit() { + staticData := &SQLLexerLexerStaticData + staticData.ChannelNames = []string{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", + } + staticData.ModeNames = []string{ + "DEFAULT_MODE", + } + staticData.LiteralNames = []string{ + "", "';'", "'.'", "'('", "')'", "','", "'='", "'*'", "'+'", "'-'", "'/'", + "'%'", "'<'", "'<='", "'>'", "'>='", "'!='", "'<>'", "'::'", "'ADD'", + "'ALL'", "'AND'", "'ASC'", "'AS'", "'BETWEEN'", "'BY'", "'CASE'", "'COLLATE'", + "'COMMIT'", "'CONFLICT'", "'CREATE'", "'CROSS'", "'DEFAULT'", "'DELETE'", + "'DESC'", "'DISTINCT'", "'DO'", "'ELSE'", "'END'", "'ESCAPE'", "'EXCEPT'", + "'EXISTS'", "'FALSE'", "'FILTER'", "'FIRST'", "'FROM'", "'FULL'", "'GROUPS'", + "'GROUP'", "'HAVING'", "'INNER'", "'INSERT'", "'INTERSECT'", "'INTO'", + "'IN'", "'ISNULL'", "'IS'", "'JOIN'", "'LAST'", "'LEFT'", "'LIKE'", + "'LIMIT'", "'NOTHING'", "'NOTNULL'", "'NOT'", "'NULLS'", "'NULL'", "'OFFSET'", + "'OF'", "'ON'", "'ORDER'", "'OR'", "'OUTER'", "'RAISE'", "'REPLACE'", + "'RETURNING'", "'RIGHT'", "'SELECT'", "'SET'", "'THEN'", "'TRUE'", "'UNION'", + "'UPDATE'", "'USING'", "'VALUES'", "'WHEN'", "'WHERE'", "'WITH'", + } + staticData.SymbolicNames = []string{ + "", "SCOL", "DOT", "OPEN_PAR", "CLOSE_PAR", "COMMA", "ASSIGN", "STAR", + "PLUS", "MINUS", "DIV", "MOD", "LT", "LT_EQ", "GT", "GT_EQ", "NOT_EQ1", + "NOT_EQ2", "TYPE_CAST", "ADD_", "ALL_", "AND_", "ASC_", "AS_", "BETWEEN_", + "BY_", "CASE_", "COLLATE_", "COMMIT_", "CONFLICT_", "CREATE_", "CROSS_", + "DEFAULT_", "DELETE_", "DESC_", "DISTINCT_", "DO_", "ELSE_", "END_", + "ESCAPE_", "EXCEPT_", "EXISTS_", "FALSE_", "FILTER_", "FIRST_", "FROM_", + "FULL_", "GROUPS_", "GROUP_", "HAVING_", "INNER_", "INSERT_", "INTERSECT_", + "INTO_", "IN_", "ISNULL_", "IS_", "JOIN_", "LAST_", "LEFT_", "LIKE_", + "LIMIT_", "NOTHING_", "NOTNULL_", "NOT_", "NULLS_", "NULL_", "OFFSET_", + "OF_", "ON_", "ORDER_", "OR_", "OUTER_", "RAISE_", "REPLACE_", "RETURNING_", + "RIGHT_", "SELECT_", "SET_", "THEN_", "TRUE_", "UNION_", "UPDATE_", + "USING_", "VALUES_", "WHEN_", "WHERE_", "WITH_", "IDENTIFIER", "NUMERIC_LITERAL", + "BIND_PARAMETER", "STRING_LITERAL", "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", + "SPACES", "UNEXPECTED_CHAR", + } + staticData.RuleNames = []string{ + "SCOL", "DOT", "OPEN_PAR", "CLOSE_PAR", "COMMA", "ASSIGN", "STAR", "PLUS", + "MINUS", "DIV", "MOD", "LT", "LT_EQ", "GT", "GT_EQ", "NOT_EQ1", "NOT_EQ2", + "TYPE_CAST", "ADD_", "ALL_", "AND_", "ASC_", "AS_", "BETWEEN_", "BY_", + "CASE_", "COLLATE_", "COMMIT_", "CONFLICT_", "CREATE_", "CROSS_", "DEFAULT_", + "DELETE_", "DESC_", "DISTINCT_", "DO_", "ELSE_", "END_", "ESCAPE_", + "EXCEPT_", "EXISTS_", "FALSE_", "FILTER_", "FIRST_", "FROM_", "FULL_", + "GROUPS_", "GROUP_", "HAVING_", "INNER_", "INSERT_", "INTERSECT_", "INTO_", + "IN_", "ISNULL_", "IS_", "JOIN_", "LAST_", "LEFT_", "LIKE_", "LIMIT_", + "NOTHING_", "NOTNULL_", "NOT_", "NULLS_", "NULL_", "OFFSET_", "OF_", + "ON_", "ORDER_", "OR_", "OUTER_", "RAISE_", "REPLACE_", "RETURNING_", + "RIGHT_", "SELECT_", "SET_", "THEN_", "TRUE_", "UNION_", "UPDATE_", + "USING_", "VALUES_", "WHEN_", "WHERE_", "WITH_", "IDENTIFIER", "NUMERIC_LITERAL", + "BIND_PARAMETER", "STRING_LITERAL", "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", + "SPACES", "UNEXPECTED_CHAR", "HEX_DIGIT", "DIGIT", + } + staticData.PredictionContextCache = antlr.NewPredictionContextCache() + staticData.serializedATN = []int32{ + 4, 0, 95, 774, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, + 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, + 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, + 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, + 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, + 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, + 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, + 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, + 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, + 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, + 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, + 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, + 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, + 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, + 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, + 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, + 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, + 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, + 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, + 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, + 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, + 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, + 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, + 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, + 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, + 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, + 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, + 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, + 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, + 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, + 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, + 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, + 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, + 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, + 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, + 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, + 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, + 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, + 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, + 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, + 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, + 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, + 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, + 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, + 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, + 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, + 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, + 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, + 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, + 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, + 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, + 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, + 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, + 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, + 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, + 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, + 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, + 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, + 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, + 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, + 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, + 643, 8, 87, 10, 87, 12, 87, 646, 9, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, + 87, 5, 87, 653, 8, 87, 10, 87, 12, 87, 656, 9, 87, 1, 87, 1, 87, 1, 87, + 5, 87, 661, 8, 87, 10, 87, 12, 87, 664, 9, 87, 1, 87, 1, 87, 1, 87, 5, + 87, 669, 8, 87, 10, 87, 12, 87, 672, 9, 87, 3, 87, 674, 8, 87, 1, 88, 4, + 88, 677, 8, 88, 11, 88, 12, 88, 678, 1, 88, 1, 88, 5, 88, 683, 8, 88, 10, + 88, 12, 88, 686, 9, 88, 3, 88, 688, 8, 88, 1, 88, 1, 88, 4, 88, 692, 8, + 88, 11, 88, 12, 88, 693, 3, 88, 696, 8, 88, 1, 88, 1, 88, 3, 88, 700, 8, + 88, 1, 88, 4, 88, 703, 8, 88, 11, 88, 12, 88, 704, 3, 88, 707, 8, 88, 1, + 88, 1, 88, 1, 88, 1, 88, 4, 88, 713, 8, 88, 11, 88, 12, 88, 714, 3, 88, + 717, 8, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 5, 90, 726, + 8, 90, 10, 90, 12, 90, 729, 9, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, + 91, 5, 91, 737, 8, 91, 10, 91, 12, 91, 740, 9, 91, 1, 91, 3, 91, 743, 8, + 91, 1, 91, 1, 91, 3, 91, 747, 8, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, + 1, 92, 5, 92, 755, 8, 92, 10, 92, 12, 92, 758, 9, 92, 1, 92, 1, 92, 1, + 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, + 1, 96, 1, 96, 1, 756, 0, 97, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, + 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, + 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, + 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, + 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, + 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, + 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, + 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, + 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, + 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, + 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, + 93, 187, 94, 189, 95, 191, 0, 193, 0, 1, 0, 36, 2, 0, 65, 65, 97, 97, 2, + 0, 68, 68, 100, 100, 2, 0, 76, 76, 108, 108, 2, 0, 78, 78, 110, 110, 2, + 0, 83, 83, 115, 115, 2, 0, 67, 67, 99, 99, 2, 0, 66, 66, 98, 98, 2, 0, + 69, 69, 101, 101, 2, 0, 84, 84, 116, 116, 2, 0, 87, 87, 119, 119, 2, 0, + 89, 89, 121, 121, 2, 0, 79, 79, 111, 111, 2, 0, 77, 77, 109, 109, 2, 0, + 73, 73, 105, 105, 2, 0, 70, 70, 102, 102, 2, 0, 82, 82, 114, 114, 2, 0, + 85, 85, 117, 117, 2, 0, 80, 80, 112, 112, 2, 0, 88, 88, 120, 120, 2, 0, + 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, + 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 1, 0, 34, 34, 1, 0, 96, 96, 1, + 0, 93, 93, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, + 97, 122, 2, 0, 43, 43, 45, 45, 2, 0, 36, 36, 64, 64, 1, 0, 39, 39, 2, 0, + 10, 10, 13, 13, 3, 0, 9, 11, 13, 13, 32, 32, 3, 0, 48, 57, 65, 70, 97, + 102, 1, 0, 48, 57, 796, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, + 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, + 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, + 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, + 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, + 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, + 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, + 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, + 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, + 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, + 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, + 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, + 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, + 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, + 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, + 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, + 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, + 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, + 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, + 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, + 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, + 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, + 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, + 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, + 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, + 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 1, 195, 1, + 0, 0, 0, 3, 197, 1, 0, 0, 0, 5, 199, 1, 0, 0, 0, 7, 201, 1, 0, 0, 0, 9, + 203, 1, 0, 0, 0, 11, 205, 1, 0, 0, 0, 13, 207, 1, 0, 0, 0, 15, 209, 1, + 0, 0, 0, 17, 211, 1, 0, 0, 0, 19, 213, 1, 0, 0, 0, 21, 215, 1, 0, 0, 0, + 23, 217, 1, 0, 0, 0, 25, 219, 1, 0, 0, 0, 27, 222, 1, 0, 0, 0, 29, 224, + 1, 0, 0, 0, 31, 227, 1, 0, 0, 0, 33, 230, 1, 0, 0, 0, 35, 233, 1, 0, 0, + 0, 37, 236, 1, 0, 0, 0, 39, 240, 1, 0, 0, 0, 41, 244, 1, 0, 0, 0, 43, 248, + 1, 0, 0, 0, 45, 252, 1, 0, 0, 0, 47, 255, 1, 0, 0, 0, 49, 263, 1, 0, 0, + 0, 51, 266, 1, 0, 0, 0, 53, 271, 1, 0, 0, 0, 55, 279, 1, 0, 0, 0, 57, 286, + 1, 0, 0, 0, 59, 295, 1, 0, 0, 0, 61, 302, 1, 0, 0, 0, 63, 308, 1, 0, 0, + 0, 65, 316, 1, 0, 0, 0, 67, 323, 1, 0, 0, 0, 69, 328, 1, 0, 0, 0, 71, 337, + 1, 0, 0, 0, 73, 340, 1, 0, 0, 0, 75, 345, 1, 0, 0, 0, 77, 349, 1, 0, 0, + 0, 79, 356, 1, 0, 0, 0, 81, 363, 1, 0, 0, 0, 83, 370, 1, 0, 0, 0, 85, 376, + 1, 0, 0, 0, 87, 383, 1, 0, 0, 0, 89, 389, 1, 0, 0, 0, 91, 394, 1, 0, 0, + 0, 93, 399, 1, 0, 0, 0, 95, 406, 1, 0, 0, 0, 97, 412, 1, 0, 0, 0, 99, 419, + 1, 0, 0, 0, 101, 425, 1, 0, 0, 0, 103, 432, 1, 0, 0, 0, 105, 442, 1, 0, + 0, 0, 107, 447, 1, 0, 0, 0, 109, 450, 1, 0, 0, 0, 111, 457, 1, 0, 0, 0, + 113, 460, 1, 0, 0, 0, 115, 465, 1, 0, 0, 0, 117, 470, 1, 0, 0, 0, 119, + 475, 1, 0, 0, 0, 121, 480, 1, 0, 0, 0, 123, 486, 1, 0, 0, 0, 125, 494, + 1, 0, 0, 0, 127, 502, 1, 0, 0, 0, 129, 506, 1, 0, 0, 0, 131, 512, 1, 0, + 0, 0, 133, 517, 1, 0, 0, 0, 135, 524, 1, 0, 0, 0, 137, 527, 1, 0, 0, 0, + 139, 530, 1, 0, 0, 0, 141, 536, 1, 0, 0, 0, 143, 539, 1, 0, 0, 0, 145, + 545, 1, 0, 0, 0, 147, 551, 1, 0, 0, 0, 149, 559, 1, 0, 0, 0, 151, 569, + 1, 0, 0, 0, 153, 575, 1, 0, 0, 0, 155, 582, 1, 0, 0, 0, 157, 586, 1, 0, + 0, 0, 159, 591, 1, 0, 0, 0, 161, 596, 1, 0, 0, 0, 163, 602, 1, 0, 0, 0, + 165, 609, 1, 0, 0, 0, 167, 615, 1, 0, 0, 0, 169, 622, 1, 0, 0, 0, 171, + 627, 1, 0, 0, 0, 173, 633, 1, 0, 0, 0, 175, 673, 1, 0, 0, 0, 177, 716, + 1, 0, 0, 0, 179, 718, 1, 0, 0, 0, 181, 721, 1, 0, 0, 0, 183, 732, 1, 0, + 0, 0, 185, 750, 1, 0, 0, 0, 187, 764, 1, 0, 0, 0, 189, 768, 1, 0, 0, 0, + 191, 770, 1, 0, 0, 0, 193, 772, 1, 0, 0, 0, 195, 196, 5, 59, 0, 0, 196, + 2, 1, 0, 0, 0, 197, 198, 5, 46, 0, 0, 198, 4, 1, 0, 0, 0, 199, 200, 5, + 40, 0, 0, 200, 6, 1, 0, 0, 0, 201, 202, 5, 41, 0, 0, 202, 8, 1, 0, 0, 0, + 203, 204, 5, 44, 0, 0, 204, 10, 1, 0, 0, 0, 205, 206, 5, 61, 0, 0, 206, + 12, 1, 0, 0, 0, 207, 208, 5, 42, 0, 0, 208, 14, 1, 0, 0, 0, 209, 210, 5, + 43, 0, 0, 210, 16, 1, 0, 0, 0, 211, 212, 5, 45, 0, 0, 212, 18, 1, 0, 0, + 0, 213, 214, 5, 47, 0, 0, 214, 20, 1, 0, 0, 0, 215, 216, 5, 37, 0, 0, 216, + 22, 1, 0, 0, 0, 217, 218, 5, 60, 0, 0, 218, 24, 1, 0, 0, 0, 219, 220, 5, + 60, 0, 0, 220, 221, 5, 61, 0, 0, 221, 26, 1, 0, 0, 0, 222, 223, 5, 62, + 0, 0, 223, 28, 1, 0, 0, 0, 224, 225, 5, 62, 0, 0, 225, 226, 5, 61, 0, 0, + 226, 30, 1, 0, 0, 0, 227, 228, 5, 33, 0, 0, 228, 229, 5, 61, 0, 0, 229, + 32, 1, 0, 0, 0, 230, 231, 5, 60, 0, 0, 231, 232, 5, 62, 0, 0, 232, 34, + 1, 0, 0, 0, 233, 234, 5, 58, 0, 0, 234, 235, 5, 58, 0, 0, 235, 36, 1, 0, + 0, 0, 236, 237, 7, 0, 0, 0, 237, 238, 7, 1, 0, 0, 238, 239, 7, 1, 0, 0, + 239, 38, 1, 0, 0, 0, 240, 241, 7, 0, 0, 0, 241, 242, 7, 2, 0, 0, 242, 243, + 7, 2, 0, 0, 243, 40, 1, 0, 0, 0, 244, 245, 7, 0, 0, 0, 245, 246, 7, 3, + 0, 0, 246, 247, 7, 1, 0, 0, 247, 42, 1, 0, 0, 0, 248, 249, 7, 0, 0, 0, + 249, 250, 7, 4, 0, 0, 250, 251, 7, 5, 0, 0, 251, 44, 1, 0, 0, 0, 252, 253, + 7, 0, 0, 0, 253, 254, 7, 4, 0, 0, 254, 46, 1, 0, 0, 0, 255, 256, 7, 6, + 0, 0, 256, 257, 7, 7, 0, 0, 257, 258, 7, 8, 0, 0, 258, 259, 7, 9, 0, 0, + 259, 260, 7, 7, 0, 0, 260, 261, 7, 7, 0, 0, 261, 262, 7, 3, 0, 0, 262, + 48, 1, 0, 0, 0, 263, 264, 7, 6, 0, 0, 264, 265, 7, 10, 0, 0, 265, 50, 1, + 0, 0, 0, 266, 267, 7, 5, 0, 0, 267, 268, 7, 0, 0, 0, 268, 269, 7, 4, 0, + 0, 269, 270, 7, 7, 0, 0, 270, 52, 1, 0, 0, 0, 271, 272, 7, 5, 0, 0, 272, + 273, 7, 11, 0, 0, 273, 274, 7, 2, 0, 0, 274, 275, 7, 2, 0, 0, 275, 276, + 7, 0, 0, 0, 276, 277, 7, 8, 0, 0, 277, 278, 7, 7, 0, 0, 278, 54, 1, 0, + 0, 0, 279, 280, 7, 5, 0, 0, 280, 281, 7, 11, 0, 0, 281, 282, 7, 12, 0, + 0, 282, 283, 7, 12, 0, 0, 283, 284, 7, 13, 0, 0, 284, 285, 7, 8, 0, 0, + 285, 56, 1, 0, 0, 0, 286, 287, 7, 5, 0, 0, 287, 288, 7, 11, 0, 0, 288, + 289, 7, 3, 0, 0, 289, 290, 7, 14, 0, 0, 290, 291, 7, 2, 0, 0, 291, 292, + 7, 13, 0, 0, 292, 293, 7, 5, 0, 0, 293, 294, 7, 8, 0, 0, 294, 58, 1, 0, + 0, 0, 295, 296, 7, 5, 0, 0, 296, 297, 7, 15, 0, 0, 297, 298, 7, 7, 0, 0, + 298, 299, 7, 0, 0, 0, 299, 300, 7, 8, 0, 0, 300, 301, 7, 7, 0, 0, 301, + 60, 1, 0, 0, 0, 302, 303, 7, 5, 0, 0, 303, 304, 7, 15, 0, 0, 304, 305, + 7, 11, 0, 0, 305, 306, 7, 4, 0, 0, 306, 307, 7, 4, 0, 0, 307, 62, 1, 0, + 0, 0, 308, 309, 7, 1, 0, 0, 309, 310, 7, 7, 0, 0, 310, 311, 7, 14, 0, 0, + 311, 312, 7, 0, 0, 0, 312, 313, 7, 16, 0, 0, 313, 314, 7, 2, 0, 0, 314, + 315, 7, 8, 0, 0, 315, 64, 1, 0, 0, 0, 316, 317, 7, 1, 0, 0, 317, 318, 7, + 7, 0, 0, 318, 319, 7, 2, 0, 0, 319, 320, 7, 7, 0, 0, 320, 321, 7, 8, 0, + 0, 321, 322, 7, 7, 0, 0, 322, 66, 1, 0, 0, 0, 323, 324, 7, 1, 0, 0, 324, + 325, 7, 7, 0, 0, 325, 326, 7, 4, 0, 0, 326, 327, 7, 5, 0, 0, 327, 68, 1, + 0, 0, 0, 328, 329, 7, 1, 0, 0, 329, 330, 7, 13, 0, 0, 330, 331, 7, 4, 0, + 0, 331, 332, 7, 8, 0, 0, 332, 333, 7, 13, 0, 0, 333, 334, 7, 3, 0, 0, 334, + 335, 7, 5, 0, 0, 335, 336, 7, 8, 0, 0, 336, 70, 1, 0, 0, 0, 337, 338, 7, + 1, 0, 0, 338, 339, 7, 11, 0, 0, 339, 72, 1, 0, 0, 0, 340, 341, 7, 7, 0, + 0, 341, 342, 7, 2, 0, 0, 342, 343, 7, 4, 0, 0, 343, 344, 7, 7, 0, 0, 344, + 74, 1, 0, 0, 0, 345, 346, 7, 7, 0, 0, 346, 347, 7, 3, 0, 0, 347, 348, 7, + 1, 0, 0, 348, 76, 1, 0, 0, 0, 349, 350, 7, 7, 0, 0, 350, 351, 7, 4, 0, + 0, 351, 352, 7, 5, 0, 0, 352, 353, 7, 0, 0, 0, 353, 354, 7, 17, 0, 0, 354, + 355, 7, 7, 0, 0, 355, 78, 1, 0, 0, 0, 356, 357, 7, 7, 0, 0, 357, 358, 7, + 18, 0, 0, 358, 359, 7, 5, 0, 0, 359, 360, 7, 7, 0, 0, 360, 361, 7, 17, + 0, 0, 361, 362, 7, 8, 0, 0, 362, 80, 1, 0, 0, 0, 363, 364, 7, 7, 0, 0, + 364, 365, 7, 18, 0, 0, 365, 366, 7, 13, 0, 0, 366, 367, 7, 4, 0, 0, 367, + 368, 7, 8, 0, 0, 368, 369, 7, 4, 0, 0, 369, 82, 1, 0, 0, 0, 370, 371, 7, + 14, 0, 0, 371, 372, 7, 0, 0, 0, 372, 373, 7, 2, 0, 0, 373, 374, 7, 4, 0, + 0, 374, 375, 7, 7, 0, 0, 375, 84, 1, 0, 0, 0, 376, 377, 7, 14, 0, 0, 377, + 378, 7, 13, 0, 0, 378, 379, 7, 2, 0, 0, 379, 380, 7, 8, 0, 0, 380, 381, + 7, 7, 0, 0, 381, 382, 7, 15, 0, 0, 382, 86, 1, 0, 0, 0, 383, 384, 7, 14, + 0, 0, 384, 385, 7, 13, 0, 0, 385, 386, 7, 15, 0, 0, 386, 387, 7, 4, 0, + 0, 387, 388, 7, 8, 0, 0, 388, 88, 1, 0, 0, 0, 389, 390, 7, 14, 0, 0, 390, + 391, 7, 15, 0, 0, 391, 392, 7, 11, 0, 0, 392, 393, 7, 12, 0, 0, 393, 90, + 1, 0, 0, 0, 394, 395, 7, 14, 0, 0, 395, 396, 7, 16, 0, 0, 396, 397, 7, + 2, 0, 0, 397, 398, 7, 2, 0, 0, 398, 92, 1, 0, 0, 0, 399, 400, 7, 19, 0, + 0, 400, 401, 7, 15, 0, 0, 401, 402, 7, 11, 0, 0, 402, 403, 7, 16, 0, 0, + 403, 404, 7, 17, 0, 0, 404, 405, 7, 4, 0, 0, 405, 94, 1, 0, 0, 0, 406, + 407, 7, 19, 0, 0, 407, 408, 7, 15, 0, 0, 408, 409, 7, 11, 0, 0, 409, 410, + 7, 16, 0, 0, 410, 411, 7, 17, 0, 0, 411, 96, 1, 0, 0, 0, 412, 413, 7, 20, + 0, 0, 413, 414, 7, 0, 0, 0, 414, 415, 7, 21, 0, 0, 415, 416, 7, 13, 0, + 0, 416, 417, 7, 3, 0, 0, 417, 418, 7, 19, 0, 0, 418, 98, 1, 0, 0, 0, 419, + 420, 7, 13, 0, 0, 420, 421, 7, 3, 0, 0, 421, 422, 7, 3, 0, 0, 422, 423, + 7, 7, 0, 0, 423, 424, 7, 15, 0, 0, 424, 100, 1, 0, 0, 0, 425, 426, 7, 13, + 0, 0, 426, 427, 7, 3, 0, 0, 427, 428, 7, 4, 0, 0, 428, 429, 7, 7, 0, 0, + 429, 430, 7, 15, 0, 0, 430, 431, 7, 8, 0, 0, 431, 102, 1, 0, 0, 0, 432, + 433, 7, 13, 0, 0, 433, 434, 7, 3, 0, 0, 434, 435, 7, 8, 0, 0, 435, 436, + 7, 7, 0, 0, 436, 437, 7, 15, 0, 0, 437, 438, 7, 4, 0, 0, 438, 439, 7, 7, + 0, 0, 439, 440, 7, 5, 0, 0, 440, 441, 7, 8, 0, 0, 441, 104, 1, 0, 0, 0, + 442, 443, 7, 13, 0, 0, 443, 444, 7, 3, 0, 0, 444, 445, 7, 8, 0, 0, 445, + 446, 7, 11, 0, 0, 446, 106, 1, 0, 0, 0, 447, 448, 7, 13, 0, 0, 448, 449, + 7, 3, 0, 0, 449, 108, 1, 0, 0, 0, 450, 451, 7, 13, 0, 0, 451, 452, 7, 4, + 0, 0, 452, 453, 7, 3, 0, 0, 453, 454, 7, 16, 0, 0, 454, 455, 7, 2, 0, 0, + 455, 456, 7, 2, 0, 0, 456, 110, 1, 0, 0, 0, 457, 458, 7, 13, 0, 0, 458, + 459, 7, 4, 0, 0, 459, 112, 1, 0, 0, 0, 460, 461, 7, 22, 0, 0, 461, 462, + 7, 11, 0, 0, 462, 463, 7, 13, 0, 0, 463, 464, 7, 3, 0, 0, 464, 114, 1, + 0, 0, 0, 465, 466, 7, 2, 0, 0, 466, 467, 7, 0, 0, 0, 467, 468, 7, 4, 0, + 0, 468, 469, 7, 8, 0, 0, 469, 116, 1, 0, 0, 0, 470, 471, 7, 2, 0, 0, 471, + 472, 7, 7, 0, 0, 472, 473, 7, 14, 0, 0, 473, 474, 7, 8, 0, 0, 474, 118, + 1, 0, 0, 0, 475, 476, 7, 2, 0, 0, 476, 477, 7, 13, 0, 0, 477, 478, 7, 23, + 0, 0, 478, 479, 7, 7, 0, 0, 479, 120, 1, 0, 0, 0, 480, 481, 7, 2, 0, 0, + 481, 482, 7, 13, 0, 0, 482, 483, 7, 12, 0, 0, 483, 484, 7, 13, 0, 0, 484, + 485, 7, 8, 0, 0, 485, 122, 1, 0, 0, 0, 486, 487, 7, 3, 0, 0, 487, 488, + 7, 11, 0, 0, 488, 489, 7, 8, 0, 0, 489, 490, 7, 20, 0, 0, 490, 491, 7, + 13, 0, 0, 491, 492, 7, 3, 0, 0, 492, 493, 7, 19, 0, 0, 493, 124, 1, 0, + 0, 0, 494, 495, 7, 3, 0, 0, 495, 496, 7, 11, 0, 0, 496, 497, 7, 8, 0, 0, + 497, 498, 7, 3, 0, 0, 498, 499, 7, 16, 0, 0, 499, 500, 7, 2, 0, 0, 500, + 501, 7, 2, 0, 0, 501, 126, 1, 0, 0, 0, 502, 503, 7, 3, 0, 0, 503, 504, + 7, 11, 0, 0, 504, 505, 7, 8, 0, 0, 505, 128, 1, 0, 0, 0, 506, 507, 7, 3, + 0, 0, 507, 508, 7, 16, 0, 0, 508, 509, 7, 2, 0, 0, 509, 510, 7, 2, 0, 0, + 510, 511, 7, 4, 0, 0, 511, 130, 1, 0, 0, 0, 512, 513, 7, 3, 0, 0, 513, + 514, 7, 16, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 2, 0, 0, 516, 132, + 1, 0, 0, 0, 517, 518, 7, 11, 0, 0, 518, 519, 7, 14, 0, 0, 519, 520, 7, + 14, 0, 0, 520, 521, 7, 4, 0, 0, 521, 522, 7, 7, 0, 0, 522, 523, 7, 8, 0, + 0, 523, 134, 1, 0, 0, 0, 524, 525, 7, 11, 0, 0, 525, 526, 7, 14, 0, 0, + 526, 136, 1, 0, 0, 0, 527, 528, 7, 11, 0, 0, 528, 529, 7, 3, 0, 0, 529, + 138, 1, 0, 0, 0, 530, 531, 7, 11, 0, 0, 531, 532, 7, 15, 0, 0, 532, 533, + 7, 1, 0, 0, 533, 534, 7, 7, 0, 0, 534, 535, 7, 15, 0, 0, 535, 140, 1, 0, + 0, 0, 536, 537, 7, 11, 0, 0, 537, 538, 7, 15, 0, 0, 538, 142, 1, 0, 0, + 0, 539, 540, 7, 11, 0, 0, 540, 541, 7, 16, 0, 0, 541, 542, 7, 8, 0, 0, + 542, 543, 7, 7, 0, 0, 543, 544, 7, 15, 0, 0, 544, 144, 1, 0, 0, 0, 545, + 546, 7, 15, 0, 0, 546, 547, 7, 0, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, + 7, 4, 0, 0, 549, 550, 7, 7, 0, 0, 550, 146, 1, 0, 0, 0, 551, 552, 7, 15, + 0, 0, 552, 553, 7, 7, 0, 0, 553, 554, 7, 17, 0, 0, 554, 555, 7, 2, 0, 0, + 555, 556, 7, 0, 0, 0, 556, 557, 7, 5, 0, 0, 557, 558, 7, 7, 0, 0, 558, + 148, 1, 0, 0, 0, 559, 560, 7, 15, 0, 0, 560, 561, 7, 7, 0, 0, 561, 562, + 7, 8, 0, 0, 562, 563, 7, 16, 0, 0, 563, 564, 7, 15, 0, 0, 564, 565, 7, + 3, 0, 0, 565, 566, 7, 13, 0, 0, 566, 567, 7, 3, 0, 0, 567, 568, 7, 19, + 0, 0, 568, 150, 1, 0, 0, 0, 569, 570, 7, 15, 0, 0, 570, 571, 7, 13, 0, + 0, 571, 572, 7, 19, 0, 0, 572, 573, 7, 20, 0, 0, 573, 574, 7, 8, 0, 0, + 574, 152, 1, 0, 0, 0, 575, 576, 7, 4, 0, 0, 576, 577, 7, 7, 0, 0, 577, + 578, 7, 2, 0, 0, 578, 579, 7, 7, 0, 0, 579, 580, 7, 5, 0, 0, 580, 581, + 7, 8, 0, 0, 581, 154, 1, 0, 0, 0, 582, 583, 7, 4, 0, 0, 583, 584, 7, 7, + 0, 0, 584, 585, 7, 8, 0, 0, 585, 156, 1, 0, 0, 0, 586, 587, 7, 8, 0, 0, + 587, 588, 7, 20, 0, 0, 588, 589, 7, 7, 0, 0, 589, 590, 7, 3, 0, 0, 590, + 158, 1, 0, 0, 0, 591, 592, 7, 8, 0, 0, 592, 593, 7, 15, 0, 0, 593, 594, + 7, 16, 0, 0, 594, 595, 7, 7, 0, 0, 595, 160, 1, 0, 0, 0, 596, 597, 7, 16, + 0, 0, 597, 598, 7, 3, 0, 0, 598, 599, 7, 13, 0, 0, 599, 600, 7, 11, 0, + 0, 600, 601, 7, 3, 0, 0, 601, 162, 1, 0, 0, 0, 602, 603, 7, 16, 0, 0, 603, + 604, 7, 17, 0, 0, 604, 605, 7, 1, 0, 0, 605, 606, 7, 0, 0, 0, 606, 607, + 7, 8, 0, 0, 607, 608, 7, 7, 0, 0, 608, 164, 1, 0, 0, 0, 609, 610, 7, 16, + 0, 0, 610, 611, 7, 4, 0, 0, 611, 612, 7, 13, 0, 0, 612, 613, 7, 3, 0, 0, + 613, 614, 7, 19, 0, 0, 614, 166, 1, 0, 0, 0, 615, 616, 7, 21, 0, 0, 616, + 617, 7, 0, 0, 0, 617, 618, 7, 2, 0, 0, 618, 619, 7, 16, 0, 0, 619, 620, + 7, 7, 0, 0, 620, 621, 7, 4, 0, 0, 621, 168, 1, 0, 0, 0, 622, 623, 7, 9, + 0, 0, 623, 624, 7, 20, 0, 0, 624, 625, 7, 7, 0, 0, 625, 626, 7, 3, 0, 0, + 626, 170, 1, 0, 0, 0, 627, 628, 7, 9, 0, 0, 628, 629, 7, 20, 0, 0, 629, + 630, 7, 7, 0, 0, 630, 631, 7, 15, 0, 0, 631, 632, 7, 7, 0, 0, 632, 172, + 1, 0, 0, 0, 633, 634, 7, 9, 0, 0, 634, 635, 7, 13, 0, 0, 635, 636, 7, 8, + 0, 0, 636, 637, 7, 20, 0, 0, 637, 174, 1, 0, 0, 0, 638, 644, 5, 34, 0, + 0, 639, 643, 8, 24, 0, 0, 640, 641, 5, 34, 0, 0, 641, 643, 5, 34, 0, 0, + 642, 639, 1, 0, 0, 0, 642, 640, 1, 0, 0, 0, 643, 646, 1, 0, 0, 0, 644, + 642, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 647, 1, 0, 0, 0, 646, 644, + 1, 0, 0, 0, 647, 674, 5, 34, 0, 0, 648, 654, 5, 96, 0, 0, 649, 653, 8, + 25, 0, 0, 650, 651, 5, 96, 0, 0, 651, 653, 5, 96, 0, 0, 652, 649, 1, 0, + 0, 0, 652, 650, 1, 0, 0, 0, 653, 656, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, + 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 657, + 674, 5, 96, 0, 0, 658, 662, 5, 91, 0, 0, 659, 661, 8, 26, 0, 0, 660, 659, + 1, 0, 0, 0, 661, 664, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 662, 663, 1, 0, + 0, 0, 663, 665, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 674, 5, 93, 0, 0, + 666, 670, 7, 27, 0, 0, 667, 669, 7, 28, 0, 0, 668, 667, 1, 0, 0, 0, 669, + 672, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 674, + 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 673, 638, 1, 0, 0, 0, 673, 648, 1, 0, + 0, 0, 673, 658, 1, 0, 0, 0, 673, 666, 1, 0, 0, 0, 674, 176, 1, 0, 0, 0, + 675, 677, 3, 193, 96, 0, 676, 675, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, + 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 687, 1, 0, 0, 0, 680, 684, + 5, 46, 0, 0, 681, 683, 3, 193, 96, 0, 682, 681, 1, 0, 0, 0, 683, 686, 1, + 0, 0, 0, 684, 682, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 688, 1, 0, 0, + 0, 686, 684, 1, 0, 0, 0, 687, 680, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, + 696, 1, 0, 0, 0, 689, 691, 5, 46, 0, 0, 690, 692, 3, 193, 96, 0, 691, 690, + 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, + 0, 0, 694, 696, 1, 0, 0, 0, 695, 676, 1, 0, 0, 0, 695, 689, 1, 0, 0, 0, + 696, 706, 1, 0, 0, 0, 697, 699, 7, 7, 0, 0, 698, 700, 7, 29, 0, 0, 699, + 698, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 702, 1, 0, 0, 0, 701, 703, + 3, 193, 96, 0, 702, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 702, 1, + 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 707, 1, 0, 0, 0, 706, 697, 1, 0, 0, + 0, 706, 707, 1, 0, 0, 0, 707, 717, 1, 0, 0, 0, 708, 709, 5, 48, 0, 0, 709, + 710, 7, 18, 0, 0, 710, 712, 1, 0, 0, 0, 711, 713, 3, 191, 95, 0, 712, 711, + 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, + 0, 0, 715, 717, 1, 0, 0, 0, 716, 695, 1, 0, 0, 0, 716, 708, 1, 0, 0, 0, + 717, 178, 1, 0, 0, 0, 718, 719, 7, 30, 0, 0, 719, 720, 3, 175, 87, 0, 720, + 180, 1, 0, 0, 0, 721, 727, 5, 39, 0, 0, 722, 726, 8, 31, 0, 0, 723, 724, + 5, 39, 0, 0, 724, 726, 5, 39, 0, 0, 725, 722, 1, 0, 0, 0, 725, 723, 1, + 0, 0, 0, 726, 729, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 727, 728, 1, 0, 0, + 0, 728, 730, 1, 0, 0, 0, 729, 727, 1, 0, 0, 0, 730, 731, 5, 39, 0, 0, 731, + 182, 1, 0, 0, 0, 732, 733, 5, 45, 0, 0, 733, 734, 5, 45, 0, 0, 734, 738, + 1, 0, 0, 0, 735, 737, 8, 32, 0, 0, 736, 735, 1, 0, 0, 0, 737, 740, 1, 0, + 0, 0, 738, 736, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 746, 1, 0, 0, 0, + 740, 738, 1, 0, 0, 0, 741, 743, 5, 13, 0, 0, 742, 741, 1, 0, 0, 0, 742, + 743, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 747, 5, 10, 0, 0, 745, 747, + 5, 0, 0, 1, 746, 742, 1, 0, 0, 0, 746, 745, 1, 0, 0, 0, 747, 748, 1, 0, + 0, 0, 748, 749, 6, 91, 0, 0, 749, 184, 1, 0, 0, 0, 750, 751, 5, 47, 0, + 0, 751, 752, 5, 42, 0, 0, 752, 756, 1, 0, 0, 0, 753, 755, 9, 0, 0, 0, 754, + 753, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 756, 754, + 1, 0, 0, 0, 757, 759, 1, 0, 0, 0, 758, 756, 1, 0, 0, 0, 759, 760, 5, 42, + 0, 0, 760, 761, 5, 47, 0, 0, 761, 762, 1, 0, 0, 0, 762, 763, 6, 92, 0, + 0, 763, 186, 1, 0, 0, 0, 764, 765, 7, 33, 0, 0, 765, 766, 1, 0, 0, 0, 766, + 767, 6, 93, 0, 0, 767, 188, 1, 0, 0, 0, 768, 769, 9, 0, 0, 0, 769, 190, + 1, 0, 0, 0, 770, 771, 7, 34, 0, 0, 771, 192, 1, 0, 0, 0, 772, 773, 7, 35, + 0, 0, 773, 194, 1, 0, 0, 0, 24, 0, 642, 644, 652, 654, 662, 670, 673, 678, + 684, 687, 693, 695, 699, 704, 706, 714, 716, 725, 727, 738, 742, 746, 756, + 1, 0, 1, 0, + } + deserializer := antlr.NewATNDeserializer(nil) + staticData.atn = deserializer.Deserialize(staticData.serializedATN) + atn := staticData.atn + staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) + decisionToDFA := staticData.decisionToDFA + for index, state := range atn.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(state, index) + } +} + +// SQLLexerInit initializes any static state used to implement SQLLexer. By default the +// static state used to implement the lexer is lazily initialized during the first call to +// NewSQLLexer(). You can call this function if you wish to initialize the static state ahead +// of time. +func SQLLexerInit() { + staticData := &SQLLexerLexerStaticData + staticData.once.Do(sqllexerLexerInit) +} + +// NewSQLLexer produces a new lexer instance for the optional input antlr.CharStream. +func NewSQLLexer(input antlr.CharStream) *SQLLexer { + SQLLexerInit() + l := new(SQLLexer) + l.BaseLexer = antlr.NewBaseLexer(input) + staticData := &SQLLexerLexerStaticData + l.Interpreter = antlr.NewLexerATNSimulator(l, staticData.atn, staticData.decisionToDFA, staticData.PredictionContextCache) + l.channelNames = staticData.ChannelNames + l.modeNames = staticData.ModeNames + l.RuleNames = staticData.RuleNames + l.LiteralNames = staticData.LiteralNames + l.SymbolicNames = staticData.SymbolicNames + l.GrammarFileName = "SQLLexer.g4" + // TODO: l.EOF = antlr.TokenEOF + + return l +} + +// SQLLexer tokens. +const ( + SQLLexerSCOL = 1 + SQLLexerDOT = 2 + SQLLexerOPEN_PAR = 3 + SQLLexerCLOSE_PAR = 4 + SQLLexerCOMMA = 5 + SQLLexerASSIGN = 6 + SQLLexerSTAR = 7 + SQLLexerPLUS = 8 + SQLLexerMINUS = 9 + SQLLexerDIV = 10 + SQLLexerMOD = 11 + SQLLexerLT = 12 + SQLLexerLT_EQ = 13 + SQLLexerGT = 14 + SQLLexerGT_EQ = 15 + SQLLexerNOT_EQ1 = 16 + SQLLexerNOT_EQ2 = 17 + SQLLexerTYPE_CAST = 18 + SQLLexerADD_ = 19 + SQLLexerALL_ = 20 + SQLLexerAND_ = 21 + SQLLexerASC_ = 22 + SQLLexerAS_ = 23 + SQLLexerBETWEEN_ = 24 + SQLLexerBY_ = 25 + SQLLexerCASE_ = 26 + SQLLexerCOLLATE_ = 27 + SQLLexerCOMMIT_ = 28 + SQLLexerCONFLICT_ = 29 + SQLLexerCREATE_ = 30 + SQLLexerCROSS_ = 31 + SQLLexerDEFAULT_ = 32 + SQLLexerDELETE_ = 33 + SQLLexerDESC_ = 34 + SQLLexerDISTINCT_ = 35 + SQLLexerDO_ = 36 + SQLLexerELSE_ = 37 + SQLLexerEND_ = 38 + SQLLexerESCAPE_ = 39 + SQLLexerEXCEPT_ = 40 + SQLLexerEXISTS_ = 41 + SQLLexerFALSE_ = 42 + SQLLexerFILTER_ = 43 + SQLLexerFIRST_ = 44 + SQLLexerFROM_ = 45 + SQLLexerFULL_ = 46 + SQLLexerGROUPS_ = 47 + SQLLexerGROUP_ = 48 + SQLLexerHAVING_ = 49 + SQLLexerINNER_ = 50 + SQLLexerINSERT_ = 51 + SQLLexerINTERSECT_ = 52 + SQLLexerINTO_ = 53 + SQLLexerIN_ = 54 + SQLLexerISNULL_ = 55 + SQLLexerIS_ = 56 + SQLLexerJOIN_ = 57 + SQLLexerLAST_ = 58 + SQLLexerLEFT_ = 59 + SQLLexerLIKE_ = 60 + SQLLexerLIMIT_ = 61 + SQLLexerNOTHING_ = 62 + SQLLexerNOTNULL_ = 63 + SQLLexerNOT_ = 64 + SQLLexerNULLS_ = 65 + SQLLexerNULL_ = 66 + SQLLexerOFFSET_ = 67 + SQLLexerOF_ = 68 + SQLLexerON_ = 69 + SQLLexerORDER_ = 70 + SQLLexerOR_ = 71 + SQLLexerOUTER_ = 72 + SQLLexerRAISE_ = 73 + SQLLexerREPLACE_ = 74 + SQLLexerRETURNING_ = 75 + SQLLexerRIGHT_ = 76 + SQLLexerSELECT_ = 77 + SQLLexerSET_ = 78 + SQLLexerTHEN_ = 79 + SQLLexerTRUE_ = 80 + SQLLexerUNION_ = 81 + SQLLexerUPDATE_ = 82 + SQLLexerUSING_ = 83 + SQLLexerVALUES_ = 84 + SQLLexerWHEN_ = 85 + SQLLexerWHERE_ = 86 + SQLLexerWITH_ = 87 + SQLLexerIDENTIFIER = 88 + SQLLexerNUMERIC_LITERAL = 89 + SQLLexerBIND_PARAMETER = 90 + SQLLexerSTRING_LITERAL = 91 + SQLLexerSINGLE_LINE_COMMENT = 92 + SQLLexerMULTILINE_COMMENT = 93 + SQLLexerSPACES = 94 + SQLLexerUNEXPECTED_CHAR = 95 +) diff --git a/parse/sql/grammar/sql_parser.go b/parse/sql/grammar/sql_parser.go new file mode 100644 index 000000000..5c06f550c --- /dev/null +++ b/parse/sql/grammar/sql_parser.go @@ -0,0 +1,13022 @@ +// Code generated from SQLParser.g4 by ANTLR 4.13.1. DO NOT EDIT. + +package grammar // SQLParser +import ( + "fmt" + "strconv" + "sync" + + "github.com/antlr4-go/antlr/v4" +) + +// Suppress unused import errors +var _ = fmt.Printf +var _ = strconv.Itoa +var _ = sync.Once{} + +type SQLParser struct { + *antlr.BaseParser +} + +var SQLParserParserStaticData struct { + once sync.Once + serializedATN []int32 + LiteralNames []string + SymbolicNames []string + RuleNames []string + PredictionContextCache *antlr.PredictionContextCache + atn *antlr.ATN + decisionToDFA []*antlr.DFA +} + +func sqlparserParserInit() { + staticData := &SQLParserParserStaticData + staticData.LiteralNames = []string{ + "", "';'", "'.'", "'('", "')'", "','", "'='", "'*'", "'+'", "'-'", "'/'", + "'%'", "'<'", "'<='", "'>'", "'>='", "'!='", "'<>'", "'::'", "'ADD'", + "'ALL'", "'AND'", "'ASC'", "'AS'", "'BETWEEN'", "'BY'", "'CASE'", "'COLLATE'", + "'COMMIT'", "'CONFLICT'", "'CREATE'", "'CROSS'", "'DEFAULT'", "'DELETE'", + "'DESC'", "'DISTINCT'", "'DO'", "'ELSE'", "'END'", "'ESCAPE'", "'EXCEPT'", + "'EXISTS'", "'FALSE'", "'FILTER'", "'FIRST'", "'FROM'", "'FULL'", "'GROUPS'", + "'GROUP'", "'HAVING'", "'INNER'", "'INSERT'", "'INTERSECT'", "'INTO'", + "'IN'", "'ISNULL'", "'IS'", "'JOIN'", "'LAST'", "'LEFT'", "'LIKE'", + "'LIMIT'", "'NOTHING'", "'NOTNULL'", "'NOT'", "'NULLS'", "'NULL'", "'OFFSET'", + "'OF'", "'ON'", "'ORDER'", "'OR'", "'OUTER'", "'RAISE'", "'REPLACE'", + "'RETURNING'", "'RIGHT'", "'SELECT'", "'SET'", "'THEN'", "'TRUE'", "'UNION'", + "'UPDATE'", "'USING'", "'VALUES'", "'WHEN'", "'WHERE'", "'WITH'", + } + staticData.SymbolicNames = []string{ + "", "SCOL", "DOT", "OPEN_PAR", "CLOSE_PAR", "COMMA", "ASSIGN", "STAR", + "PLUS", "MINUS", "DIV", "MOD", "LT", "LT_EQ", "GT", "GT_EQ", "NOT_EQ1", + "NOT_EQ2", "TYPE_CAST", "ADD_", "ALL_", "AND_", "ASC_", "AS_", "BETWEEN_", + "BY_", "CASE_", "COLLATE_", "COMMIT_", "CONFLICT_", "CREATE_", "CROSS_", + "DEFAULT_", "DELETE_", "DESC_", "DISTINCT_", "DO_", "ELSE_", "END_", + "ESCAPE_", "EXCEPT_", "EXISTS_", "FALSE_", "FILTER_", "FIRST_", "FROM_", + "FULL_", "GROUPS_", "GROUP_", "HAVING_", "INNER_", "INSERT_", "INTERSECT_", + "INTO_", "IN_", "ISNULL_", "IS_", "JOIN_", "LAST_", "LEFT_", "LIKE_", + "LIMIT_", "NOTHING_", "NOTNULL_", "NOT_", "NULLS_", "NULL_", "OFFSET_", + "OF_", "ON_", "ORDER_", "OR_", "OUTER_", "RAISE_", "REPLACE_", "RETURNING_", + "RIGHT_", "SELECT_", "SET_", "THEN_", "TRUE_", "UNION_", "UPDATE_", + "USING_", "VALUES_", "WHEN_", "WHERE_", "WITH_", "IDENTIFIER", "NUMERIC_LITERAL", + "BIND_PARAMETER", "STRING_LITERAL", "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", + "SPACES", "UNEXPECTED_CHAR", + } + staticData.RuleNames = []string{ + "statements", "sql_stmt_list", "sql_stmt", "indexed_column", "cte_table_name", + "common_table_expression", "common_table_stmt", "delete_core", "delete_stmt", + "variable", "function_call", "column_ref", "when_clause", "expr", "subquery", + "expr_list", "comparisonOperator", "cast_type", "type_cast", "boolean_value", + "string_value", "numeric_value", "literal", "value_row", "values_clause", + "insert_core", "insert_stmt", "returning_clause", "upsert_update", "upsert_clause", + "select_stmt_no_cte", "select_stmt", "join_relation", "relation", "select_core", + "table_or_subquery", "result_column", "returning_clause_result_column", + "join_operator", "join_constraint", "compound_operator", "update_set_subclause", + "update_core", "update_stmt", "column_name_list", "qualified_table_name", + "order_by_stmt", "limit_stmt", "ordering_term", "asc_desc", "function_keyword", + "function_name", "table_name", "table_alias", "column_name", "column_alias", + "collation_name", "index_name", + } + staticData.PredictionContextCache = antlr.NewPredictionContextCache() + staticData.serializedATN = []int32{ + 4, 1, 95, 713, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, + 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, + 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, + 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, + 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, + 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, + 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, + 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, + 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, + 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, + 1, 0, 5, 0, 118, 8, 0, 10, 0, 12, 0, 121, 9, 0, 1, 0, 1, 0, 1, 1, 5, 1, + 126, 8, 1, 10, 1, 12, 1, 129, 9, 1, 1, 1, 1, 1, 4, 1, 133, 8, 1, 11, 1, + 12, 1, 134, 1, 1, 5, 1, 138, 8, 1, 10, 1, 12, 1, 141, 9, 1, 1, 1, 5, 1, + 144, 8, 1, 10, 1, 12, 1, 147, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 153, + 8, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 162, 8, 4, 10, 4, + 12, 4, 165, 9, 4, 1, 4, 1, 4, 3, 4, 169, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, + 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 181, 8, 6, 10, 6, 12, 6, 184, + 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 191, 8, 7, 1, 7, 3, 7, 194, 8, + 7, 1, 8, 3, 8, 197, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, + 3, 10, 206, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 211, 8, 10, 10, 10, 12, + 10, 214, 9, 10, 1, 10, 3, 10, 217, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, + 11, 3, 11, 224, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, + 1, 13, 1, 13, 1, 13, 3, 13, 236, 8, 13, 1, 13, 1, 13, 3, 13, 240, 8, 13, + 1, 13, 1, 13, 3, 13, 244, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, + 13, 3, 13, 252, 8, 13, 1, 13, 3, 13, 255, 8, 13, 1, 13, 3, 13, 258, 8, + 13, 1, 13, 1, 13, 1, 13, 3, 13, 263, 8, 13, 1, 13, 4, 13, 266, 8, 13, 11, + 13, 12, 13, 267, 1, 13, 1, 13, 3, 13, 272, 8, 13, 1, 13, 1, 13, 1, 13, + 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 282, 8, 13, 1, 13, 1, 13, 3, + 13, 286, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, + 3, 13, 296, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, + 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, + 1, 13, 1, 13, 3, 13, 318, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 324, + 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 333, 8, + 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 339, 8, 13, 1, 13, 1, 13, 1, 13, + 3, 13, 344, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 351, 8, 13, + 1, 13, 1, 13, 5, 13, 355, 8, 13, 10, 13, 12, 13, 358, 9, 13, 1, 14, 1, + 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 367, 8, 15, 10, 15, 12, 15, + 370, 9, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, + 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 389, + 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 395, 8, 23, 10, 23, 12, 23, 398, + 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 406, 8, 24, 10, + 24, 12, 24, 409, 9, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 416, + 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 422, 8, 25, 10, 25, 12, 25, 425, + 9, 25, 1, 25, 1, 25, 3, 25, 429, 8, 25, 1, 25, 1, 25, 3, 25, 433, 8, 25, + 1, 25, 3, 25, 436, 8, 25, 1, 26, 3, 26, 439, 8, 26, 1, 26, 1, 26, 1, 27, + 1, 27, 1, 27, 1, 27, 5, 27, 447, 8, 27, 10, 27, 12, 27, 450, 9, 27, 1, + 28, 1, 28, 3, 28, 454, 8, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, + 1, 29, 1, 29, 1, 29, 5, 29, 465, 8, 29, 10, 29, 12, 29, 468, 9, 29, 1, + 29, 1, 29, 1, 29, 3, 29, 473, 8, 29, 3, 29, 475, 8, 29, 1, 29, 1, 29, 1, + 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 484, 8, 29, 10, 29, 12, 29, 487, + 9, 29, 1, 29, 1, 29, 3, 29, 491, 8, 29, 3, 29, 493, 8, 29, 1, 30, 1, 30, + 1, 30, 1, 30, 5, 30, 499, 8, 30, 10, 30, 12, 30, 502, 9, 30, 1, 30, 3, + 30, 505, 8, 30, 1, 30, 3, 30, 508, 8, 30, 1, 31, 3, 31, 511, 8, 31, 1, + 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 5, 33, 521, 8, 33, + 10, 33, 12, 33, 524, 9, 33, 1, 34, 1, 34, 3, 34, 528, 8, 34, 1, 34, 1, + 34, 1, 34, 5, 34, 533, 8, 34, 10, 34, 12, 34, 536, 9, 34, 1, 34, 1, 34, + 3, 34, 540, 8, 34, 1, 34, 1, 34, 3, 34, 544, 8, 34, 1, 34, 1, 34, 1, 34, + 1, 34, 1, 34, 5, 34, 551, 8, 34, 10, 34, 12, 34, 554, 9, 34, 1, 34, 1, + 34, 3, 34, 558, 8, 34, 3, 34, 560, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 565, + 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 572, 8, 35, 3, 35, 574, + 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 584, + 8, 36, 3, 36, 586, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 592, 8, 37, + 3, 37, 594, 8, 37, 1, 38, 1, 38, 3, 38, 598, 8, 38, 1, 38, 3, 38, 601, + 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 3, 40, 610, 8, + 40, 1, 40, 1, 40, 3, 40, 614, 8, 40, 1, 41, 1, 41, 3, 41, 618, 8, 41, 1, + 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 629, + 8, 42, 10, 42, 12, 42, 632, 9, 42, 1, 42, 1, 42, 3, 42, 636, 8, 42, 1, + 42, 1, 42, 3, 42, 640, 8, 42, 1, 42, 3, 42, 643, 8, 42, 1, 43, 3, 43, 646, + 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 654, 8, 44, 10, + 44, 12, 44, 657, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 3, 45, 664, + 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 671, 8, 46, 10, 46, 12, + 46, 674, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 680, 8, 47, 1, 48, 1, + 48, 3, 48, 684, 8, 48, 1, 48, 1, 48, 3, 48, 688, 8, 48, 1, 49, 1, 49, 1, + 50, 1, 50, 1, 50, 3, 50, 695, 8, 50, 1, 51, 1, 51, 3, 51, 699, 8, 51, 1, + 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, + 1, 57, 1, 57, 0, 1, 26, 58, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, + 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, + 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, + 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 0, 8, 1, 0, 8, 9, 2, 0, + 7, 7, 10, 11, 2, 0, 55, 55, 63, 63, 2, 0, 6, 6, 12, 17, 2, 0, 42, 42, 80, + 80, 3, 0, 46, 46, 59, 59, 76, 76, 2, 0, 44, 44, 58, 58, 2, 0, 22, 22, 34, + 34, 773, 0, 119, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 4, 152, 1, 0, 0, 0, 6, + 154, 1, 0, 0, 0, 8, 156, 1, 0, 0, 0, 10, 170, 1, 0, 0, 0, 12, 176, 1, 0, + 0, 0, 14, 185, 1, 0, 0, 0, 16, 196, 1, 0, 0, 0, 18, 200, 1, 0, 0, 0, 20, + 202, 1, 0, 0, 0, 22, 223, 1, 0, 0, 0, 24, 227, 1, 0, 0, 0, 26, 285, 1, + 0, 0, 0, 28, 359, 1, 0, 0, 0, 30, 363, 1, 0, 0, 0, 32, 371, 1, 0, 0, 0, + 34, 373, 1, 0, 0, 0, 36, 375, 1, 0, 0, 0, 38, 378, 1, 0, 0, 0, 40, 380, + 1, 0, 0, 0, 42, 382, 1, 0, 0, 0, 44, 388, 1, 0, 0, 0, 46, 390, 1, 0, 0, + 0, 48, 401, 1, 0, 0, 0, 50, 410, 1, 0, 0, 0, 52, 438, 1, 0, 0, 0, 54, 442, + 1, 0, 0, 0, 56, 453, 1, 0, 0, 0, 58, 458, 1, 0, 0, 0, 60, 494, 1, 0, 0, + 0, 62, 510, 1, 0, 0, 0, 64, 514, 1, 0, 0, 0, 66, 518, 1, 0, 0, 0, 68, 525, + 1, 0, 0, 0, 70, 573, 1, 0, 0, 0, 72, 585, 1, 0, 0, 0, 74, 593, 1, 0, 0, + 0, 76, 600, 1, 0, 0, 0, 78, 604, 1, 0, 0, 0, 80, 613, 1, 0, 0, 0, 82, 617, + 1, 0, 0, 0, 84, 622, 1, 0, 0, 0, 86, 645, 1, 0, 0, 0, 88, 649, 1, 0, 0, + 0, 90, 660, 1, 0, 0, 0, 92, 665, 1, 0, 0, 0, 94, 675, 1, 0, 0, 0, 96, 681, + 1, 0, 0, 0, 98, 689, 1, 0, 0, 0, 100, 694, 1, 0, 0, 0, 102, 698, 1, 0, + 0, 0, 104, 700, 1, 0, 0, 0, 106, 702, 1, 0, 0, 0, 108, 704, 1, 0, 0, 0, + 110, 706, 1, 0, 0, 0, 112, 708, 1, 0, 0, 0, 114, 710, 1, 0, 0, 0, 116, + 118, 3, 2, 1, 0, 117, 116, 1, 0, 0, 0, 118, 121, 1, 0, 0, 0, 119, 117, + 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 122, 1, 0, 0, 0, 121, 119, 1, 0, + 0, 0, 122, 123, 5, 0, 0, 1, 123, 1, 1, 0, 0, 0, 124, 126, 5, 1, 0, 0, 125, + 124, 1, 0, 0, 0, 126, 129, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 128, + 1, 0, 0, 0, 128, 130, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 130, 139, 3, 4, + 2, 0, 131, 133, 5, 1, 0, 0, 132, 131, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, + 134, 132, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, + 138, 3, 4, 2, 0, 137, 132, 1, 0, 0, 0, 138, 141, 1, 0, 0, 0, 139, 137, + 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 145, 1, 0, 0, 0, 141, 139, 1, 0, + 0, 0, 142, 144, 5, 1, 0, 0, 143, 142, 1, 0, 0, 0, 144, 147, 1, 0, 0, 0, + 145, 143, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 3, 1, 0, 0, 0, 147, 145, + 1, 0, 0, 0, 148, 153, 3, 16, 8, 0, 149, 153, 3, 52, 26, 0, 150, 153, 3, + 62, 31, 0, 151, 153, 3, 86, 43, 0, 152, 148, 1, 0, 0, 0, 152, 149, 1, 0, + 0, 0, 152, 150, 1, 0, 0, 0, 152, 151, 1, 0, 0, 0, 153, 5, 1, 0, 0, 0, 154, + 155, 3, 108, 54, 0, 155, 7, 1, 0, 0, 0, 156, 168, 3, 104, 52, 0, 157, 158, + 5, 3, 0, 0, 158, 163, 3, 108, 54, 0, 159, 160, 5, 5, 0, 0, 160, 162, 3, + 108, 54, 0, 161, 159, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, + 0, 0, 163, 164, 1, 0, 0, 0, 164, 166, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, + 166, 167, 5, 4, 0, 0, 167, 169, 1, 0, 0, 0, 168, 157, 1, 0, 0, 0, 168, + 169, 1, 0, 0, 0, 169, 9, 1, 0, 0, 0, 170, 171, 3, 8, 4, 0, 171, 172, 5, + 23, 0, 0, 172, 173, 5, 3, 0, 0, 173, 174, 3, 60, 30, 0, 174, 175, 5, 4, + 0, 0, 175, 11, 1, 0, 0, 0, 176, 177, 5, 87, 0, 0, 177, 182, 3, 10, 5, 0, + 178, 179, 5, 5, 0, 0, 179, 181, 3, 10, 5, 0, 180, 178, 1, 0, 0, 0, 181, + 184, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 13, 1, + 0, 0, 0, 184, 182, 1, 0, 0, 0, 185, 186, 5, 33, 0, 0, 186, 187, 5, 45, + 0, 0, 187, 190, 3, 90, 45, 0, 188, 189, 5, 86, 0, 0, 189, 191, 3, 26, 13, + 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, + 194, 3, 54, 27, 0, 193, 192, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 15, + 1, 0, 0, 0, 195, 197, 3, 12, 6, 0, 196, 195, 1, 0, 0, 0, 196, 197, 1, 0, + 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 3, 14, 7, 0, 199, 17, 1, 0, 0, 0, + 200, 201, 5, 90, 0, 0, 201, 19, 1, 0, 0, 0, 202, 203, 3, 102, 51, 0, 203, + 216, 5, 3, 0, 0, 204, 206, 5, 35, 0, 0, 205, 204, 1, 0, 0, 0, 205, 206, + 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 212, 3, 26, 13, 0, 208, 209, 5, + 5, 0, 0, 209, 211, 3, 26, 13, 0, 210, 208, 1, 0, 0, 0, 211, 214, 1, 0, + 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 217, 1, 0, 0, 0, + 214, 212, 1, 0, 0, 0, 215, 217, 5, 7, 0, 0, 216, 205, 1, 0, 0, 0, 216, + 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, + 5, 4, 0, 0, 219, 21, 1, 0, 0, 0, 220, 221, 3, 104, 52, 0, 221, 222, 5, + 2, 0, 0, 222, 224, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 224, 1, 0, 0, + 0, 224, 225, 1, 0, 0, 0, 225, 226, 3, 108, 54, 0, 226, 23, 1, 0, 0, 0, + 227, 228, 5, 85, 0, 0, 228, 229, 3, 26, 13, 0, 229, 230, 5, 79, 0, 0, 230, + 231, 3, 26, 13, 0, 231, 25, 1, 0, 0, 0, 232, 233, 6, 13, -1, 0, 233, 235, + 3, 44, 22, 0, 234, 236, 3, 36, 18, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, + 0, 0, 0, 236, 286, 1, 0, 0, 0, 237, 239, 3, 18, 9, 0, 238, 240, 3, 36, + 18, 0, 239, 238, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 286, 1, 0, 0, 0, + 241, 243, 3, 22, 11, 0, 242, 244, 3, 36, 18, 0, 243, 242, 1, 0, 0, 0, 243, + 244, 1, 0, 0, 0, 244, 286, 1, 0, 0, 0, 245, 246, 7, 0, 0, 0, 246, 286, + 3, 26, 13, 19, 247, 248, 5, 3, 0, 0, 248, 249, 3, 26, 13, 0, 249, 251, + 5, 4, 0, 0, 250, 252, 3, 36, 18, 0, 251, 250, 1, 0, 0, 0, 251, 252, 1, + 0, 0, 0, 252, 286, 1, 0, 0, 0, 253, 255, 5, 64, 0, 0, 254, 253, 1, 0, 0, + 0, 254, 255, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 258, 5, 41, 0, 0, 257, + 254, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 286, + 3, 28, 14, 0, 260, 262, 5, 26, 0, 0, 261, 263, 3, 26, 13, 0, 262, 261, + 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 265, 1, 0, 0, 0, 264, 266, 3, 24, + 12, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, + 267, 268, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 270, 5, 37, 0, 0, 270, + 272, 3, 26, 13, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, + 1, 0, 0, 0, 273, 274, 5, 38, 0, 0, 274, 286, 1, 0, 0, 0, 275, 276, 5, 3, + 0, 0, 276, 277, 3, 30, 15, 0, 277, 278, 5, 4, 0, 0, 278, 286, 1, 0, 0, + 0, 279, 281, 3, 20, 10, 0, 280, 282, 3, 36, 18, 0, 281, 280, 1, 0, 0, 0, + 281, 282, 1, 0, 0, 0, 282, 286, 1, 0, 0, 0, 283, 284, 5, 64, 0, 0, 284, + 286, 3, 26, 13, 3, 285, 232, 1, 0, 0, 0, 285, 237, 1, 0, 0, 0, 285, 241, + 1, 0, 0, 0, 285, 245, 1, 0, 0, 0, 285, 247, 1, 0, 0, 0, 285, 257, 1, 0, + 0, 0, 285, 260, 1, 0, 0, 0, 285, 275, 1, 0, 0, 0, 285, 279, 1, 0, 0, 0, + 285, 283, 1, 0, 0, 0, 286, 356, 1, 0, 0, 0, 287, 288, 10, 12, 0, 0, 288, + 289, 7, 1, 0, 0, 289, 355, 3, 26, 13, 13, 290, 291, 10, 11, 0, 0, 291, + 292, 7, 0, 0, 0, 292, 355, 3, 26, 13, 12, 293, 295, 10, 8, 0, 0, 294, 296, + 5, 64, 0, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, + 0, 0, 297, 298, 5, 24, 0, 0, 298, 299, 3, 26, 13, 0, 299, 300, 5, 21, 0, + 0, 300, 301, 3, 26, 13, 9, 301, 355, 1, 0, 0, 0, 302, 303, 10, 6, 0, 0, + 303, 304, 3, 32, 16, 0, 304, 305, 3, 26, 13, 7, 305, 355, 1, 0, 0, 0, 306, + 307, 10, 2, 0, 0, 307, 308, 5, 21, 0, 0, 308, 355, 3, 26, 13, 3, 309, 310, + 10, 1, 0, 0, 310, 311, 5, 71, 0, 0, 311, 355, 3, 26, 13, 2, 312, 313, 10, + 18, 0, 0, 313, 314, 5, 27, 0, 0, 314, 355, 3, 112, 56, 0, 315, 317, 10, + 10, 0, 0, 316, 318, 5, 64, 0, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, + 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 5, 54, 0, 0, 320, 355, 3, 28, 14, + 0, 321, 323, 10, 9, 0, 0, 322, 324, 5, 64, 0, 0, 323, 322, 1, 0, 0, 0, + 323, 324, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 326, 5, 54, 0, 0, 326, + 327, 5, 3, 0, 0, 327, 328, 3, 30, 15, 0, 328, 329, 5, 4, 0, 0, 329, 355, + 1, 0, 0, 0, 330, 332, 10, 7, 0, 0, 331, 333, 5, 64, 0, 0, 332, 331, 1, + 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 335, 5, 60, 0, + 0, 335, 338, 3, 26, 13, 0, 336, 337, 5, 39, 0, 0, 337, 339, 3, 26, 13, + 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 355, 1, 0, 0, 0, 340, + 341, 10, 5, 0, 0, 341, 343, 5, 56, 0, 0, 342, 344, 5, 64, 0, 0, 343, 342, + 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 350, 1, 0, 0, 0, 345, 346, 5, 35, + 0, 0, 346, 347, 5, 45, 0, 0, 347, 351, 3, 26, 13, 0, 348, 351, 3, 38, 19, + 0, 349, 351, 5, 66, 0, 0, 350, 345, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, + 349, 1, 0, 0, 0, 351, 355, 1, 0, 0, 0, 352, 353, 10, 4, 0, 0, 353, 355, + 7, 2, 0, 0, 354, 287, 1, 0, 0, 0, 354, 290, 1, 0, 0, 0, 354, 293, 1, 0, + 0, 0, 354, 302, 1, 0, 0, 0, 354, 306, 1, 0, 0, 0, 354, 309, 1, 0, 0, 0, + 354, 312, 1, 0, 0, 0, 354, 315, 1, 0, 0, 0, 354, 321, 1, 0, 0, 0, 354, + 330, 1, 0, 0, 0, 354, 340, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, 358, + 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 27, 1, 0, + 0, 0, 358, 356, 1, 0, 0, 0, 359, 360, 5, 3, 0, 0, 360, 361, 3, 60, 30, + 0, 361, 362, 5, 4, 0, 0, 362, 29, 1, 0, 0, 0, 363, 368, 3, 26, 13, 0, 364, + 365, 5, 5, 0, 0, 365, 367, 3, 26, 13, 0, 366, 364, 1, 0, 0, 0, 367, 370, + 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 31, 1, 0, + 0, 0, 370, 368, 1, 0, 0, 0, 371, 372, 7, 3, 0, 0, 372, 33, 1, 0, 0, 0, + 373, 374, 5, 88, 0, 0, 374, 35, 1, 0, 0, 0, 375, 376, 5, 18, 0, 0, 376, + 377, 3, 34, 17, 0, 377, 37, 1, 0, 0, 0, 378, 379, 7, 4, 0, 0, 379, 39, + 1, 0, 0, 0, 380, 381, 5, 91, 0, 0, 381, 41, 1, 0, 0, 0, 382, 383, 5, 89, + 0, 0, 383, 43, 1, 0, 0, 0, 384, 389, 5, 66, 0, 0, 385, 389, 3, 38, 19, + 0, 386, 389, 3, 40, 20, 0, 387, 389, 3, 42, 21, 0, 388, 384, 1, 0, 0, 0, + 388, 385, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 387, 1, 0, 0, 0, 389, + 45, 1, 0, 0, 0, 390, 391, 5, 3, 0, 0, 391, 396, 3, 26, 13, 0, 392, 393, + 5, 5, 0, 0, 393, 395, 3, 26, 13, 0, 394, 392, 1, 0, 0, 0, 395, 398, 1, + 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 1, 0, 0, + 0, 398, 396, 1, 0, 0, 0, 399, 400, 5, 4, 0, 0, 400, 47, 1, 0, 0, 0, 401, + 402, 5, 84, 0, 0, 402, 407, 3, 46, 23, 0, 403, 404, 5, 5, 0, 0, 404, 406, + 3, 46, 23, 0, 405, 403, 1, 0, 0, 0, 406, 409, 1, 0, 0, 0, 407, 405, 1, + 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 49, 1, 0, 0, 0, 409, 407, 1, 0, 0, + 0, 410, 411, 5, 51, 0, 0, 411, 412, 5, 53, 0, 0, 412, 415, 3, 104, 52, + 0, 413, 414, 5, 23, 0, 0, 414, 416, 3, 106, 53, 0, 415, 413, 1, 0, 0, 0, + 415, 416, 1, 0, 0, 0, 416, 428, 1, 0, 0, 0, 417, 418, 5, 3, 0, 0, 418, + 423, 3, 108, 54, 0, 419, 420, 5, 5, 0, 0, 420, 422, 3, 108, 54, 0, 421, + 419, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, + 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 5, 4, + 0, 0, 427, 429, 1, 0, 0, 0, 428, 417, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, + 429, 430, 1, 0, 0, 0, 430, 432, 3, 48, 24, 0, 431, 433, 3, 58, 29, 0, 432, + 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, + 3, 54, 27, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 51, 1, 0, + 0, 0, 437, 439, 3, 12, 6, 0, 438, 437, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, + 439, 440, 1, 0, 0, 0, 440, 441, 3, 50, 25, 0, 441, 53, 1, 0, 0, 0, 442, + 443, 5, 75, 0, 0, 443, 448, 3, 74, 37, 0, 444, 445, 5, 5, 0, 0, 445, 447, + 3, 74, 37, 0, 446, 444, 1, 0, 0, 0, 447, 450, 1, 0, 0, 0, 448, 446, 1, + 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 55, 1, 0, 0, 0, 450, 448, 1, 0, 0, + 0, 451, 454, 3, 108, 54, 0, 452, 454, 3, 88, 44, 0, 453, 451, 1, 0, 0, + 0, 453, 452, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 5, 6, 0, 0, 456, + 457, 3, 26, 13, 0, 457, 57, 1, 0, 0, 0, 458, 459, 5, 69, 0, 0, 459, 474, + 5, 29, 0, 0, 460, 461, 5, 3, 0, 0, 461, 466, 3, 6, 3, 0, 462, 463, 5, 5, + 0, 0, 463, 465, 3, 6, 3, 0, 464, 462, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, + 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 469, 1, 0, 0, 0, 468, + 466, 1, 0, 0, 0, 469, 472, 5, 4, 0, 0, 470, 471, 5, 86, 0, 0, 471, 473, + 3, 26, 13, 0, 472, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 475, 1, + 0, 0, 0, 474, 460, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, + 0, 476, 492, 5, 36, 0, 0, 477, 493, 5, 62, 0, 0, 478, 479, 5, 82, 0, 0, + 479, 480, 5, 78, 0, 0, 480, 485, 3, 56, 28, 0, 481, 482, 5, 5, 0, 0, 482, + 484, 3, 56, 28, 0, 483, 481, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, + 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 490, 1, 0, 0, 0, 487, 485, 1, 0, + 0, 0, 488, 489, 5, 86, 0, 0, 489, 491, 3, 26, 13, 0, 490, 488, 1, 0, 0, + 0, 490, 491, 1, 0, 0, 0, 491, 493, 1, 0, 0, 0, 492, 477, 1, 0, 0, 0, 492, + 478, 1, 0, 0, 0, 493, 59, 1, 0, 0, 0, 494, 500, 3, 68, 34, 0, 495, 496, + 3, 80, 40, 0, 496, 497, 3, 68, 34, 0, 497, 499, 1, 0, 0, 0, 498, 495, 1, + 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, + 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 503, 505, 3, 92, 46, 0, + 504, 503, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 507, 1, 0, 0, 0, 506, + 508, 3, 94, 47, 0, 507, 506, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 61, + 1, 0, 0, 0, 509, 511, 3, 12, 6, 0, 510, 509, 1, 0, 0, 0, 510, 511, 1, 0, + 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 3, 60, 30, 0, 513, 63, 1, 0, 0, 0, + 514, 515, 3, 76, 38, 0, 515, 516, 3, 70, 35, 0, 516, 517, 3, 78, 39, 0, + 517, 65, 1, 0, 0, 0, 518, 522, 3, 70, 35, 0, 519, 521, 3, 64, 32, 0, 520, + 519, 1, 0, 0, 0, 521, 524, 1, 0, 0, 0, 522, 520, 1, 0, 0, 0, 522, 523, + 1, 0, 0, 0, 523, 67, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 525, 527, 5, 77, + 0, 0, 526, 528, 5, 35, 0, 0, 527, 526, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, + 528, 529, 1, 0, 0, 0, 529, 534, 3, 72, 36, 0, 530, 531, 5, 5, 0, 0, 531, + 533, 3, 72, 36, 0, 532, 530, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, + 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 539, 1, 0, 0, 0, 536, 534, 1, 0, + 0, 0, 537, 538, 5, 45, 0, 0, 538, 540, 3, 66, 33, 0, 539, 537, 1, 0, 0, + 0, 539, 540, 1, 0, 0, 0, 540, 543, 1, 0, 0, 0, 541, 542, 5, 86, 0, 0, 542, + 544, 3, 26, 13, 0, 543, 541, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 559, + 1, 0, 0, 0, 545, 546, 5, 48, 0, 0, 546, 547, 5, 25, 0, 0, 547, 552, 3, + 26, 13, 0, 548, 549, 5, 5, 0, 0, 549, 551, 3, 26, 13, 0, 550, 548, 1, 0, + 0, 0, 551, 554, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, + 553, 557, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 555, 556, 5, 49, 0, 0, 556, + 558, 3, 26, 13, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, + 1, 0, 0, 0, 559, 545, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 69, 1, 0, + 0, 0, 561, 564, 3, 104, 52, 0, 562, 563, 5, 23, 0, 0, 563, 565, 3, 106, + 53, 0, 564, 562, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 574, 1, 0, 0, 0, + 566, 567, 5, 3, 0, 0, 567, 568, 3, 60, 30, 0, 568, 571, 5, 4, 0, 0, 569, + 570, 5, 23, 0, 0, 570, 572, 3, 106, 53, 0, 571, 569, 1, 0, 0, 0, 571, 572, + 1, 0, 0, 0, 572, 574, 1, 0, 0, 0, 573, 561, 1, 0, 0, 0, 573, 566, 1, 0, + 0, 0, 574, 71, 1, 0, 0, 0, 575, 586, 5, 7, 0, 0, 576, 577, 3, 104, 52, + 0, 577, 578, 5, 2, 0, 0, 578, 579, 5, 7, 0, 0, 579, 586, 1, 0, 0, 0, 580, + 583, 3, 26, 13, 0, 581, 582, 5, 23, 0, 0, 582, 584, 3, 110, 55, 0, 583, + 581, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 586, 1, 0, 0, 0, 585, 575, + 1, 0, 0, 0, 585, 576, 1, 0, 0, 0, 585, 580, 1, 0, 0, 0, 586, 73, 1, 0, + 0, 0, 587, 594, 5, 7, 0, 0, 588, 591, 3, 26, 13, 0, 589, 590, 5, 23, 0, + 0, 590, 592, 3, 110, 55, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, + 592, 594, 1, 0, 0, 0, 593, 587, 1, 0, 0, 0, 593, 588, 1, 0, 0, 0, 594, + 75, 1, 0, 0, 0, 595, 597, 7, 5, 0, 0, 596, 598, 5, 72, 0, 0, 597, 596, + 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 601, 1, 0, 0, 0, 599, 601, 5, 50, + 0, 0, 600, 595, 1, 0, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, + 601, 602, 1, 0, 0, 0, 602, 603, 5, 57, 0, 0, 603, 77, 1, 0, 0, 0, 604, + 605, 5, 69, 0, 0, 605, 606, 3, 26, 13, 0, 606, 79, 1, 0, 0, 0, 607, 609, + 5, 81, 0, 0, 608, 610, 5, 20, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, + 0, 0, 0, 610, 614, 1, 0, 0, 0, 611, 614, 5, 52, 0, 0, 612, 614, 5, 40, + 0, 0, 613, 607, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 612, 1, 0, 0, 0, + 614, 81, 1, 0, 0, 0, 615, 618, 3, 108, 54, 0, 616, 618, 3, 88, 44, 0, 617, + 615, 1, 0, 0, 0, 617, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, + 5, 6, 0, 0, 620, 621, 3, 26, 13, 0, 621, 83, 1, 0, 0, 0, 622, 623, 5, 82, + 0, 0, 623, 624, 3, 90, 45, 0, 624, 625, 5, 78, 0, 0, 625, 630, 3, 82, 41, + 0, 626, 627, 5, 5, 0, 0, 627, 629, 3, 82, 41, 0, 628, 626, 1, 0, 0, 0, + 629, 632, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, + 635, 1, 0, 0, 0, 632, 630, 1, 0, 0, 0, 633, 634, 5, 45, 0, 0, 634, 636, + 3, 66, 33, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, + 0, 0, 0, 637, 638, 5, 86, 0, 0, 638, 640, 3, 26, 13, 0, 639, 637, 1, 0, + 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 1, 0, 0, 0, 641, 643, 3, 54, 27, + 0, 642, 641, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 85, 1, 0, 0, 0, 644, + 646, 3, 12, 6, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, + 1, 0, 0, 0, 647, 648, 3, 84, 42, 0, 648, 87, 1, 0, 0, 0, 649, 650, 5, 3, + 0, 0, 650, 655, 3, 108, 54, 0, 651, 652, 5, 5, 0, 0, 652, 654, 3, 108, + 54, 0, 653, 651, 1, 0, 0, 0, 654, 657, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, + 655, 656, 1, 0, 0, 0, 656, 658, 1, 0, 0, 0, 657, 655, 1, 0, 0, 0, 658, + 659, 5, 4, 0, 0, 659, 89, 1, 0, 0, 0, 660, 663, 3, 104, 52, 0, 661, 662, + 5, 23, 0, 0, 662, 664, 3, 106, 53, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, + 0, 0, 0, 664, 91, 1, 0, 0, 0, 665, 666, 5, 70, 0, 0, 666, 667, 5, 25, 0, + 0, 667, 672, 3, 96, 48, 0, 668, 669, 5, 5, 0, 0, 669, 671, 3, 96, 48, 0, + 670, 668, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 672, + 673, 1, 0, 0, 0, 673, 93, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 676, 5, + 61, 0, 0, 676, 679, 3, 26, 13, 0, 677, 678, 5, 67, 0, 0, 678, 680, 3, 26, + 13, 0, 679, 677, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 95, 1, 0, 0, 0, + 681, 683, 3, 26, 13, 0, 682, 684, 3, 98, 49, 0, 683, 682, 1, 0, 0, 0, 683, + 684, 1, 0, 0, 0, 684, 687, 1, 0, 0, 0, 685, 686, 5, 65, 0, 0, 686, 688, + 7, 6, 0, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 97, 1, 0, + 0, 0, 689, 690, 7, 7, 0, 0, 690, 99, 1, 0, 0, 0, 691, 695, 1, 0, 0, 0, + 692, 695, 5, 60, 0, 0, 693, 695, 5, 74, 0, 0, 694, 691, 1, 0, 0, 0, 694, + 692, 1, 0, 0, 0, 694, 693, 1, 0, 0, 0, 695, 101, 1, 0, 0, 0, 696, 699, + 5, 88, 0, 0, 697, 699, 3, 100, 50, 0, 698, 696, 1, 0, 0, 0, 698, 697, 1, + 0, 0, 0, 699, 103, 1, 0, 0, 0, 700, 701, 5, 88, 0, 0, 701, 105, 1, 0, 0, + 0, 702, 703, 5, 88, 0, 0, 703, 107, 1, 0, 0, 0, 704, 705, 5, 88, 0, 0, + 705, 109, 1, 0, 0, 0, 706, 707, 5, 88, 0, 0, 707, 111, 1, 0, 0, 0, 708, + 709, 5, 88, 0, 0, 709, 113, 1, 0, 0, 0, 710, 711, 5, 88, 0, 0, 711, 115, + 1, 0, 0, 0, 91, 119, 127, 134, 139, 145, 152, 163, 168, 182, 190, 193, + 196, 205, 212, 216, 223, 235, 239, 243, 251, 254, 257, 262, 267, 271, 281, + 285, 295, 317, 323, 332, 338, 343, 350, 354, 356, 368, 388, 396, 407, 415, + 423, 428, 432, 435, 438, 448, 453, 466, 472, 474, 485, 490, 492, 500, 504, + 507, 510, 522, 527, 534, 539, 543, 552, 557, 559, 564, 571, 573, 583, 585, + 591, 593, 597, 600, 609, 613, 617, 630, 635, 639, 642, 645, 655, 663, 672, + 679, 683, 687, 694, 698, + } + deserializer := antlr.NewATNDeserializer(nil) + staticData.atn = deserializer.Deserialize(staticData.serializedATN) + atn := staticData.atn + staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) + decisionToDFA := staticData.decisionToDFA + for index, state := range atn.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(state, index) + } +} + +// SQLParserInit initializes any static state used to implement SQLParser. By default the +// static state used to implement the parser is lazily initialized during the first call to +// NewSQLParser(). You can call this function if you wish to initialize the static state ahead +// of time. +func SQLParserInit() { + staticData := &SQLParserParserStaticData + staticData.once.Do(sqlparserParserInit) +} + +// NewSQLParser produces a new parser instance for the optional input antlr.TokenStream. +func NewSQLParser(input antlr.TokenStream) *SQLParser { + SQLParserInit() + this := new(SQLParser) + this.BaseParser = antlr.NewBaseParser(input) + staticData := &SQLParserParserStaticData + this.Interpreter = antlr.NewParserATNSimulator(this, staticData.atn, staticData.decisionToDFA, staticData.PredictionContextCache) + this.RuleNames = staticData.RuleNames + this.LiteralNames = staticData.LiteralNames + this.SymbolicNames = staticData.SymbolicNames + this.GrammarFileName = "SQLParser.g4" + + return this +} + +// SQLParser tokens. +const ( + SQLParserEOF = antlr.TokenEOF + SQLParserSCOL = 1 + SQLParserDOT = 2 + SQLParserOPEN_PAR = 3 + SQLParserCLOSE_PAR = 4 + SQLParserCOMMA = 5 + SQLParserASSIGN = 6 + SQLParserSTAR = 7 + SQLParserPLUS = 8 + SQLParserMINUS = 9 + SQLParserDIV = 10 + SQLParserMOD = 11 + SQLParserLT = 12 + SQLParserLT_EQ = 13 + SQLParserGT = 14 + SQLParserGT_EQ = 15 + SQLParserNOT_EQ1 = 16 + SQLParserNOT_EQ2 = 17 + SQLParserTYPE_CAST = 18 + SQLParserADD_ = 19 + SQLParserALL_ = 20 + SQLParserAND_ = 21 + SQLParserASC_ = 22 + SQLParserAS_ = 23 + SQLParserBETWEEN_ = 24 + SQLParserBY_ = 25 + SQLParserCASE_ = 26 + SQLParserCOLLATE_ = 27 + SQLParserCOMMIT_ = 28 + SQLParserCONFLICT_ = 29 + SQLParserCREATE_ = 30 + SQLParserCROSS_ = 31 + SQLParserDEFAULT_ = 32 + SQLParserDELETE_ = 33 + SQLParserDESC_ = 34 + SQLParserDISTINCT_ = 35 + SQLParserDO_ = 36 + SQLParserELSE_ = 37 + SQLParserEND_ = 38 + SQLParserESCAPE_ = 39 + SQLParserEXCEPT_ = 40 + SQLParserEXISTS_ = 41 + SQLParserFALSE_ = 42 + SQLParserFILTER_ = 43 + SQLParserFIRST_ = 44 + SQLParserFROM_ = 45 + SQLParserFULL_ = 46 + SQLParserGROUPS_ = 47 + SQLParserGROUP_ = 48 + SQLParserHAVING_ = 49 + SQLParserINNER_ = 50 + SQLParserINSERT_ = 51 + SQLParserINTERSECT_ = 52 + SQLParserINTO_ = 53 + SQLParserIN_ = 54 + SQLParserISNULL_ = 55 + SQLParserIS_ = 56 + SQLParserJOIN_ = 57 + SQLParserLAST_ = 58 + SQLParserLEFT_ = 59 + SQLParserLIKE_ = 60 + SQLParserLIMIT_ = 61 + SQLParserNOTHING_ = 62 + SQLParserNOTNULL_ = 63 + SQLParserNOT_ = 64 + SQLParserNULLS_ = 65 + SQLParserNULL_ = 66 + SQLParserOFFSET_ = 67 + SQLParserOF_ = 68 + SQLParserON_ = 69 + SQLParserORDER_ = 70 + SQLParserOR_ = 71 + SQLParserOUTER_ = 72 + SQLParserRAISE_ = 73 + SQLParserREPLACE_ = 74 + SQLParserRETURNING_ = 75 + SQLParserRIGHT_ = 76 + SQLParserSELECT_ = 77 + SQLParserSET_ = 78 + SQLParserTHEN_ = 79 + SQLParserTRUE_ = 80 + SQLParserUNION_ = 81 + SQLParserUPDATE_ = 82 + SQLParserUSING_ = 83 + SQLParserVALUES_ = 84 + SQLParserWHEN_ = 85 + SQLParserWHERE_ = 86 + SQLParserWITH_ = 87 + SQLParserIDENTIFIER = 88 + SQLParserNUMERIC_LITERAL = 89 + SQLParserBIND_PARAMETER = 90 + SQLParserSTRING_LITERAL = 91 + SQLParserSINGLE_LINE_COMMENT = 92 + SQLParserMULTILINE_COMMENT = 93 + SQLParserSPACES = 94 + SQLParserUNEXPECTED_CHAR = 95 +) + +// SQLParser rules. +const ( + SQLParserRULE_statements = 0 + SQLParserRULE_sql_stmt_list = 1 + SQLParserRULE_sql_stmt = 2 + SQLParserRULE_indexed_column = 3 + SQLParserRULE_cte_table_name = 4 + SQLParserRULE_common_table_expression = 5 + SQLParserRULE_common_table_stmt = 6 + SQLParserRULE_delete_core = 7 + SQLParserRULE_delete_stmt = 8 + SQLParserRULE_variable = 9 + SQLParserRULE_function_call = 10 + SQLParserRULE_column_ref = 11 + SQLParserRULE_when_clause = 12 + SQLParserRULE_expr = 13 + SQLParserRULE_subquery = 14 + SQLParserRULE_expr_list = 15 + SQLParserRULE_comparisonOperator = 16 + SQLParserRULE_cast_type = 17 + SQLParserRULE_type_cast = 18 + SQLParserRULE_boolean_value = 19 + SQLParserRULE_string_value = 20 + SQLParserRULE_numeric_value = 21 + SQLParserRULE_literal = 22 + SQLParserRULE_value_row = 23 + SQLParserRULE_values_clause = 24 + SQLParserRULE_insert_core = 25 + SQLParserRULE_insert_stmt = 26 + SQLParserRULE_returning_clause = 27 + SQLParserRULE_upsert_update = 28 + SQLParserRULE_upsert_clause = 29 + SQLParserRULE_select_stmt_no_cte = 30 + SQLParserRULE_select_stmt = 31 + SQLParserRULE_join_relation = 32 + SQLParserRULE_relation = 33 + SQLParserRULE_select_core = 34 + SQLParserRULE_table_or_subquery = 35 + SQLParserRULE_result_column = 36 + SQLParserRULE_returning_clause_result_column = 37 + SQLParserRULE_join_operator = 38 + SQLParserRULE_join_constraint = 39 + SQLParserRULE_compound_operator = 40 + SQLParserRULE_update_set_subclause = 41 + SQLParserRULE_update_core = 42 + SQLParserRULE_update_stmt = 43 + SQLParserRULE_column_name_list = 44 + SQLParserRULE_qualified_table_name = 45 + SQLParserRULE_order_by_stmt = 46 + SQLParserRULE_limit_stmt = 47 + SQLParserRULE_ordering_term = 48 + SQLParserRULE_asc_desc = 49 + SQLParserRULE_function_keyword = 50 + SQLParserRULE_function_name = 51 + SQLParserRULE_table_name = 52 + SQLParserRULE_table_alias = 53 + SQLParserRULE_column_name = 54 + SQLParserRULE_column_alias = 55 + SQLParserRULE_collation_name = 56 + SQLParserRULE_index_name = 57 +) + +// IStatementsContext is an interface to support dynamic dispatch. +type IStatementsContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + EOF() antlr.TerminalNode + AllSql_stmt_list() []ISql_stmt_listContext + Sql_stmt_list(i int) ISql_stmt_listContext + + // IsStatementsContext differentiates from other interfaces. + IsStatementsContext() +} + +type StatementsContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyStatementsContext() *StatementsContext { + var p = new(StatementsContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_statements + return p +} + +func InitEmptyStatementsContext(p *StatementsContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_statements +} + +func (*StatementsContext) IsStatementsContext() {} + +func NewStatementsContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *StatementsContext { + var p = new(StatementsContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_statements + + return p +} + +func (s *StatementsContext) GetParser() antlr.Parser { return s.parser } + +func (s *StatementsContext) EOF() antlr.TerminalNode { + return s.GetToken(SQLParserEOF, 0) +} + +func (s *StatementsContext) AllSql_stmt_list() []ISql_stmt_listContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(ISql_stmt_listContext); ok { + len++ + } + } + + tst := make([]ISql_stmt_listContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(ISql_stmt_listContext); ok { + tst[i] = t.(ISql_stmt_listContext) + i++ + } + } + + return tst +} + +func (s *StatementsContext) Sql_stmt_list(i int) ISql_stmt_listContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISql_stmt_listContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(ISql_stmt_listContext) +} + +func (s *StatementsContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *StatementsContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *StatementsContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitStatements(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Statements() (localctx IStatementsContext) { + localctx = NewStatementsContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 0, SQLParserRULE_statements) + var _la int + + p.EnterOuterAlt(localctx, 1) + p.SetState(119) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for ((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&2251808403619842) != 0) || ((int64((_la-77)) & ^0x3f) == 0 && ((int64(1)<<(_la-77))&1057) != 0) { + { + p.SetState(116) + p.Sql_stmt_list() + } + + p.SetState(121) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(122) + p.Match(SQLParserEOF) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ISql_stmt_listContext is an interface to support dynamic dispatch. +type ISql_stmt_listContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + AllSql_stmt() []ISql_stmtContext + Sql_stmt(i int) ISql_stmtContext + AllSCOL() []antlr.TerminalNode + SCOL(i int) antlr.TerminalNode + + // IsSql_stmt_listContext differentiates from other interfaces. + IsSql_stmt_listContext() +} + +type Sql_stmt_listContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptySql_stmt_listContext() *Sql_stmt_listContext { + var p = new(Sql_stmt_listContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_sql_stmt_list + return p +} + +func InitEmptySql_stmt_listContext(p *Sql_stmt_listContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_sql_stmt_list +} + +func (*Sql_stmt_listContext) IsSql_stmt_listContext() {} + +func NewSql_stmt_listContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Sql_stmt_listContext { + var p = new(Sql_stmt_listContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_sql_stmt_list + + return p +} + +func (s *Sql_stmt_listContext) GetParser() antlr.Parser { return s.parser } + +func (s *Sql_stmt_listContext) AllSql_stmt() []ISql_stmtContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(ISql_stmtContext); ok { + len++ + } + } + + tst := make([]ISql_stmtContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(ISql_stmtContext); ok { + tst[i] = t.(ISql_stmtContext) + i++ + } + } + + return tst +} + +func (s *Sql_stmt_listContext) Sql_stmt(i int) ISql_stmtContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISql_stmtContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(ISql_stmtContext) +} + +func (s *Sql_stmt_listContext) AllSCOL() []antlr.TerminalNode { + return s.GetTokens(SQLParserSCOL) +} + +func (s *Sql_stmt_listContext) SCOL(i int) antlr.TerminalNode { + return s.GetToken(SQLParserSCOL, i) +} + +func (s *Sql_stmt_listContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Sql_stmt_listContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Sql_stmt_listContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSql_stmt_list(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Sql_stmt_list() (localctx ISql_stmt_listContext) { + localctx = NewSql_stmt_listContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 2, SQLParserRULE_sql_stmt_list) + var _la int + + var _alt int + + p.EnterOuterAlt(localctx, 1) + p.SetState(127) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserSCOL { + { + p.SetState(124) + p.Match(SQLParserSCOL) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + p.SetState(129) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(130) + p.Sql_stmt() + } + p.SetState(139) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 3, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { + if _alt == 1 { + p.SetState(132) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for ok := true; ok; ok = _la == SQLParserSCOL { + { + p.SetState(131) + p.Match(SQLParserSCOL) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + p.SetState(134) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(136) + p.Sql_stmt() + } + + } + p.SetState(141) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 3, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + } + p.SetState(145) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 4, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { + if _alt == 1 { + { + p.SetState(142) + p.Match(SQLParserSCOL) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + p.SetState(147) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 4, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ISql_stmtContext is an interface to support dynamic dispatch. +type ISql_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Delete_stmt() IDelete_stmtContext + Insert_stmt() IInsert_stmtContext + Select_stmt() ISelect_stmtContext + Update_stmt() IUpdate_stmtContext + + // IsSql_stmtContext differentiates from other interfaces. + IsSql_stmtContext() +} + +type Sql_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptySql_stmtContext() *Sql_stmtContext { + var p = new(Sql_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_sql_stmt + return p +} + +func InitEmptySql_stmtContext(p *Sql_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_sql_stmt +} + +func (*Sql_stmtContext) IsSql_stmtContext() {} + +func NewSql_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Sql_stmtContext { + var p = new(Sql_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_sql_stmt + + return p +} + +func (s *Sql_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Sql_stmtContext) Delete_stmt() IDelete_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IDelete_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IDelete_stmtContext) +} + +func (s *Sql_stmtContext) Insert_stmt() IInsert_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IInsert_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IInsert_stmtContext) +} + +func (s *Sql_stmtContext) Select_stmt() ISelect_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISelect_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISelect_stmtContext) +} + +func (s *Sql_stmtContext) Update_stmt() IUpdate_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IUpdate_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IUpdate_stmtContext) +} + +func (s *Sql_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Sql_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Sql_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSql_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Sql_stmt() (localctx ISql_stmtContext) { + localctx = NewSql_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 4, SQLParserRULE_sql_stmt) + p.EnterOuterAlt(localctx, 1) + p.SetState(152) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 5, p.GetParserRuleContext()) { + case 1: + { + p.SetState(148) + p.Delete_stmt() + } + + case 2: + { + p.SetState(149) + p.Insert_stmt() + } + + case 3: + { + p.SetState(150) + p.Select_stmt() + } + + case 4: + { + p.SetState(151) + p.Update_stmt() + } + + case antlr.ATNInvalidAltNumber: + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IIndexed_columnContext is an interface to support dynamic dispatch. +type IIndexed_columnContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Column_name() IColumn_nameContext + + // IsIndexed_columnContext differentiates from other interfaces. + IsIndexed_columnContext() +} + +type Indexed_columnContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyIndexed_columnContext() *Indexed_columnContext { + var p = new(Indexed_columnContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_indexed_column + return p +} + +func InitEmptyIndexed_columnContext(p *Indexed_columnContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_indexed_column +} + +func (*Indexed_columnContext) IsIndexed_columnContext() {} + +func NewIndexed_columnContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Indexed_columnContext { + var p = new(Indexed_columnContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_indexed_column + + return p +} + +func (s *Indexed_columnContext) GetParser() antlr.Parser { return s.parser } + +func (s *Indexed_columnContext) Column_name() IColumn_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Indexed_columnContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Indexed_columnContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Indexed_columnContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitIndexed_column(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Indexed_column() (localctx IIndexed_columnContext) { + localctx = NewIndexed_columnContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 6, SQLParserRULE_indexed_column) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(154) + p.Column_name() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ICte_table_nameContext is an interface to support dynamic dispatch. +type ICte_table_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Table_name() ITable_nameContext + OPEN_PAR() antlr.TerminalNode + AllColumn_name() []IColumn_nameContext + Column_name(i int) IColumn_nameContext + CLOSE_PAR() antlr.TerminalNode + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsCte_table_nameContext differentiates from other interfaces. + IsCte_table_nameContext() +} + +type Cte_table_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyCte_table_nameContext() *Cte_table_nameContext { + var p = new(Cte_table_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_cte_table_name + return p +} + +func InitEmptyCte_table_nameContext(p *Cte_table_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_cte_table_name +} + +func (*Cte_table_nameContext) IsCte_table_nameContext() {} + +func NewCte_table_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Cte_table_nameContext { + var p = new(Cte_table_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_cte_table_name + + return p +} + +func (s *Cte_table_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Cte_table_nameContext) Table_name() ITable_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_nameContext) +} + +func (s *Cte_table_nameContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Cte_table_nameContext) AllColumn_name() []IColumn_nameContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IColumn_nameContext); ok { + len++ + } + } + + tst := make([]IColumn_nameContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IColumn_nameContext); ok { + tst[i] = t.(IColumn_nameContext) + i++ + } + } + + return tst +} + +func (s *Cte_table_nameContext) Column_name(i int) IColumn_nameContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Cte_table_nameContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Cte_table_nameContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Cte_table_nameContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Cte_table_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Cte_table_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Cte_table_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCte_table_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Cte_table_name() (localctx ICte_table_nameContext) { + localctx = NewCte_table_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 8, SQLParserRULE_cte_table_name) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(156) + p.Table_name() + } + p.SetState(168) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserOPEN_PAR { + { + p.SetState(157) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(158) + p.Column_name() + } + p.SetState(163) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(159) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(160) + p.Column_name() + } + + p.SetState(165) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(166) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ICommon_table_expressionContext is an interface to support dynamic dispatch. +type ICommon_table_expressionContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Cte_table_name() ICte_table_nameContext + AS_() antlr.TerminalNode + OPEN_PAR() antlr.TerminalNode + Select_stmt_no_cte() ISelect_stmt_no_cteContext + CLOSE_PAR() antlr.TerminalNode + + // IsCommon_table_expressionContext differentiates from other interfaces. + IsCommon_table_expressionContext() +} + +type Common_table_expressionContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyCommon_table_expressionContext() *Common_table_expressionContext { + var p = new(Common_table_expressionContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_common_table_expression + return p +} + +func InitEmptyCommon_table_expressionContext(p *Common_table_expressionContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_common_table_expression +} + +func (*Common_table_expressionContext) IsCommon_table_expressionContext() {} + +func NewCommon_table_expressionContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Common_table_expressionContext { + var p = new(Common_table_expressionContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_common_table_expression + + return p +} + +func (s *Common_table_expressionContext) GetParser() antlr.Parser { return s.parser } + +func (s *Common_table_expressionContext) Cte_table_name() ICte_table_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICte_table_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICte_table_nameContext) +} + +func (s *Common_table_expressionContext) AS_() antlr.TerminalNode { + return s.GetToken(SQLParserAS_, 0) +} + +func (s *Common_table_expressionContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Common_table_expressionContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISelect_stmt_no_cteContext) +} + +func (s *Common_table_expressionContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Common_table_expressionContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Common_table_expressionContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Common_table_expressionContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCommon_table_expression(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Common_table_expression() (localctx ICommon_table_expressionContext) { + localctx = NewCommon_table_expressionContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 10, SQLParserRULE_common_table_expression) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(170) + p.Cte_table_name() + } + { + p.SetState(171) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(172) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(173) + p.Select_stmt_no_cte() + } + { + p.SetState(174) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ICommon_table_stmtContext is an interface to support dynamic dispatch. +type ICommon_table_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + WITH_() antlr.TerminalNode + AllCommon_table_expression() []ICommon_table_expressionContext + Common_table_expression(i int) ICommon_table_expressionContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsCommon_table_stmtContext differentiates from other interfaces. + IsCommon_table_stmtContext() +} + +type Common_table_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyCommon_table_stmtContext() *Common_table_stmtContext { + var p = new(Common_table_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_common_table_stmt + return p +} + +func InitEmptyCommon_table_stmtContext(p *Common_table_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_common_table_stmt +} + +func (*Common_table_stmtContext) IsCommon_table_stmtContext() {} + +func NewCommon_table_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Common_table_stmtContext { + var p = new(Common_table_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_common_table_stmt + + return p +} + +func (s *Common_table_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Common_table_stmtContext) WITH_() antlr.TerminalNode { + return s.GetToken(SQLParserWITH_, 0) +} + +func (s *Common_table_stmtContext) AllCommon_table_expression() []ICommon_table_expressionContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(ICommon_table_expressionContext); ok { + len++ + } + } + + tst := make([]ICommon_table_expressionContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(ICommon_table_expressionContext); ok { + tst[i] = t.(ICommon_table_expressionContext) + i++ + } + } + + return tst +} + +func (s *Common_table_stmtContext) Common_table_expression(i int) ICommon_table_expressionContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICommon_table_expressionContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(ICommon_table_expressionContext) +} + +func (s *Common_table_stmtContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Common_table_stmtContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Common_table_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Common_table_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Common_table_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCommon_table_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Common_table_stmt() (localctx ICommon_table_stmtContext) { + localctx = NewCommon_table_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 12, SQLParserRULE_common_table_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(176) + p.Match(SQLParserWITH_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(177) + p.Common_table_expression() + } + p.SetState(182) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(178) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(179) + p.Common_table_expression() + } + + p.SetState(184) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IDelete_coreContext is an interface to support dynamic dispatch. +type IDelete_coreContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + DELETE_() antlr.TerminalNode + FROM_() antlr.TerminalNode + Qualified_table_name() IQualified_table_nameContext + WHERE_() antlr.TerminalNode + Expr() IExprContext + Returning_clause() IReturning_clauseContext + + // IsDelete_coreContext differentiates from other interfaces. + IsDelete_coreContext() +} + +type Delete_coreContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyDelete_coreContext() *Delete_coreContext { + var p = new(Delete_coreContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_delete_core + return p +} + +func InitEmptyDelete_coreContext(p *Delete_coreContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_delete_core +} + +func (*Delete_coreContext) IsDelete_coreContext() {} + +func NewDelete_coreContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Delete_coreContext { + var p = new(Delete_coreContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_delete_core + + return p +} + +func (s *Delete_coreContext) GetParser() antlr.Parser { return s.parser } + +func (s *Delete_coreContext) DELETE_() antlr.TerminalNode { + return s.GetToken(SQLParserDELETE_, 0) +} + +func (s *Delete_coreContext) FROM_() antlr.TerminalNode { + return s.GetToken(SQLParserFROM_, 0) +} + +func (s *Delete_coreContext) Qualified_table_name() IQualified_table_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IQualified_table_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IQualified_table_nameContext) +} + +func (s *Delete_coreContext) WHERE_() antlr.TerminalNode { + return s.GetToken(SQLParserWHERE_, 0) +} + +func (s *Delete_coreContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Delete_coreContext) Returning_clause() IReturning_clauseContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IReturning_clauseContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IReturning_clauseContext) +} + +func (s *Delete_coreContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Delete_coreContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Delete_coreContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitDelete_core(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Delete_core() (localctx IDelete_coreContext) { + localctx = NewDelete_coreContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 14, SQLParserRULE_delete_core) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(185) + p.Match(SQLParserDELETE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(186) + p.Match(SQLParserFROM_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(187) + p.Qualified_table_name() + } + p.SetState(190) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWHERE_ { + { + p.SetState(188) + p.Match(SQLParserWHERE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(189) + p.expr(0) + } + + } + p.SetState(193) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserRETURNING_ { + { + p.SetState(192) + p.Returning_clause() + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IDelete_stmtContext is an interface to support dynamic dispatch. +type IDelete_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Delete_core() IDelete_coreContext + Common_table_stmt() ICommon_table_stmtContext + + // IsDelete_stmtContext differentiates from other interfaces. + IsDelete_stmtContext() +} + +type Delete_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyDelete_stmtContext() *Delete_stmtContext { + var p = new(Delete_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_delete_stmt + return p +} + +func InitEmptyDelete_stmtContext(p *Delete_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_delete_stmt +} + +func (*Delete_stmtContext) IsDelete_stmtContext() {} + +func NewDelete_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Delete_stmtContext { + var p = new(Delete_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_delete_stmt + + return p +} + +func (s *Delete_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Delete_stmtContext) Delete_core() IDelete_coreContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IDelete_coreContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IDelete_coreContext) +} + +func (s *Delete_stmtContext) Common_table_stmt() ICommon_table_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICommon_table_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICommon_table_stmtContext) +} + +func (s *Delete_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Delete_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Delete_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitDelete_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Delete_stmt() (localctx IDelete_stmtContext) { + localctx = NewDelete_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 16, SQLParserRULE_delete_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + p.SetState(196) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWITH_ { + { + p.SetState(195) + p.Common_table_stmt() + } + + } + { + p.SetState(198) + p.Delete_core() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IVariableContext is an interface to support dynamic dispatch. +type IVariableContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + BIND_PARAMETER() antlr.TerminalNode + + // IsVariableContext differentiates from other interfaces. + IsVariableContext() +} + +type VariableContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyVariableContext() *VariableContext { + var p = new(VariableContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_variable + return p +} + +func InitEmptyVariableContext(p *VariableContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_variable +} + +func (*VariableContext) IsVariableContext() {} + +func NewVariableContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *VariableContext { + var p = new(VariableContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_variable + + return p +} + +func (s *VariableContext) GetParser() antlr.Parser { return s.parser } + +func (s *VariableContext) BIND_PARAMETER() antlr.TerminalNode { + return s.GetToken(SQLParserBIND_PARAMETER, 0) +} + +func (s *VariableContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *VariableContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *VariableContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitVariable(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Variable() (localctx IVariableContext) { + localctx = NewVariableContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 18, SQLParserRULE_variable) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(200) + p.Match(SQLParserBIND_PARAMETER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IFunction_callContext is an interface to support dynamic dispatch. +type IFunction_callContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Function_name() IFunction_nameContext + OPEN_PAR() antlr.TerminalNode + CLOSE_PAR() antlr.TerminalNode + STAR() antlr.TerminalNode + AllExpr() []IExprContext + Expr(i int) IExprContext + DISTINCT_() antlr.TerminalNode + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsFunction_callContext differentiates from other interfaces. + IsFunction_callContext() +} + +type Function_callContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyFunction_callContext() *Function_callContext { + var p = new(Function_callContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_function_call + return p +} + +func InitEmptyFunction_callContext(p *Function_callContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_function_call +} + +func (*Function_callContext) IsFunction_callContext() {} + +func NewFunction_callContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Function_callContext { + var p = new(Function_callContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_function_call + + return p +} + +func (s *Function_callContext) GetParser() antlr.Parser { return s.parser } + +func (s *Function_callContext) Function_name() IFunction_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IFunction_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IFunction_nameContext) +} + +func (s *Function_callContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Function_callContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Function_callContext) STAR() antlr.TerminalNode { + return s.GetToken(SQLParserSTAR, 0) +} + +func (s *Function_callContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Function_callContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Function_callContext) DISTINCT_() antlr.TerminalNode { + return s.GetToken(SQLParserDISTINCT_, 0) +} + +func (s *Function_callContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Function_callContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Function_callContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Function_callContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Function_callContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitFunction_call(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Function_call() (localctx IFunction_callContext) { + localctx = NewFunction_callContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 20, SQLParserRULE_function_call) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(202) + p.Function_name() + } + { + p.SetState(203) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(216) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + switch p.GetTokenStream().LA(1) { + case SQLParserOPEN_PAR, SQLParserPLUS, SQLParserMINUS, SQLParserCASE_, SQLParserDISTINCT_, SQLParserEXISTS_, SQLParserFALSE_, SQLParserLIKE_, SQLParserNOT_, SQLParserNULL_, SQLParserREPLACE_, SQLParserTRUE_, SQLParserIDENTIFIER, SQLParserNUMERIC_LITERAL, SQLParserBIND_PARAMETER, SQLParserSTRING_LITERAL: + p.SetState(205) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserDISTINCT_ { + { + p.SetState(204) + p.Match(SQLParserDISTINCT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(207) + p.expr(0) + } + p.SetState(212) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(208) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(209) + p.expr(0) + } + + p.SetState(214) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + + case SQLParserSTAR: + { + p.SetState(215) + p.Match(SQLParserSTAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserCLOSE_PAR: + + default: + } + { + p.SetState(218) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IColumn_refContext is an interface to support dynamic dispatch. +type IColumn_refContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Column_name() IColumn_nameContext + Table_name() ITable_nameContext + DOT() antlr.TerminalNode + + // IsColumn_refContext differentiates from other interfaces. + IsColumn_refContext() +} + +type Column_refContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyColumn_refContext() *Column_refContext { + var p = new(Column_refContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_ref + return p +} + +func InitEmptyColumn_refContext(p *Column_refContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_ref +} + +func (*Column_refContext) IsColumn_refContext() {} + +func NewColumn_refContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Column_refContext { + var p = new(Column_refContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_column_ref + + return p +} + +func (s *Column_refContext) GetParser() antlr.Parser { return s.parser } + +func (s *Column_refContext) Column_name() IColumn_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Column_refContext) Table_name() ITable_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_nameContext) +} + +func (s *Column_refContext) DOT() antlr.TerminalNode { + return s.GetToken(SQLParserDOT, 0) +} + +func (s *Column_refContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Column_refContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Column_refContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitColumn_ref(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Column_ref() (localctx IColumn_refContext) { + localctx = NewColumn_refContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 22, SQLParserRULE_column_ref) + p.EnterOuterAlt(localctx, 1) + p.SetState(223) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 15, p.GetParserRuleContext()) == 1 { + { + p.SetState(220) + p.Table_name() + } + { + p.SetState(221) + p.Match(SQLParserDOT) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } else if p.HasError() { // JIM + goto errorExit + } + { + p.SetState(225) + p.Column_name() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IWhen_clauseContext is an interface to support dynamic dispatch. +type IWhen_clauseContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // GetCondition returns the condition rule contexts. + GetCondition() IExprContext + + // GetResult returns the result rule contexts. + GetResult() IExprContext + + // SetCondition sets the condition rule contexts. + SetCondition(IExprContext) + + // SetResult sets the result rule contexts. + SetResult(IExprContext) + + // Getter signatures + WHEN_() antlr.TerminalNode + THEN_() antlr.TerminalNode + AllExpr() []IExprContext + Expr(i int) IExprContext + + // IsWhen_clauseContext differentiates from other interfaces. + IsWhen_clauseContext() +} + +type When_clauseContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser + condition IExprContext + result IExprContext +} + +func NewEmptyWhen_clauseContext() *When_clauseContext { + var p = new(When_clauseContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_when_clause + return p +} + +func InitEmptyWhen_clauseContext(p *When_clauseContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_when_clause +} + +func (*When_clauseContext) IsWhen_clauseContext() {} + +func NewWhen_clauseContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *When_clauseContext { + var p = new(When_clauseContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_when_clause + + return p +} + +func (s *When_clauseContext) GetParser() antlr.Parser { return s.parser } + +func (s *When_clauseContext) GetCondition() IExprContext { return s.condition } + +func (s *When_clauseContext) GetResult() IExprContext { return s.result } + +func (s *When_clauseContext) SetCondition(v IExprContext) { s.condition = v } + +func (s *When_clauseContext) SetResult(v IExprContext) { s.result = v } + +func (s *When_clauseContext) WHEN_() antlr.TerminalNode { + return s.GetToken(SQLParserWHEN_, 0) +} + +func (s *When_clauseContext) THEN_() antlr.TerminalNode { + return s.GetToken(SQLParserTHEN_, 0) +} + +func (s *When_clauseContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *When_clauseContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *When_clauseContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *When_clauseContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *When_clauseContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitWhen_clause(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) When_clause() (localctx IWhen_clauseContext) { + localctx = NewWhen_clauseContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 24, SQLParserRULE_when_clause) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(227) + p.Match(SQLParserWHEN_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(228) + + var _x = p.expr(0) + + localctx.(*When_clauseContext).condition = _x + } + { + p.SetState(229) + p.Match(SQLParserTHEN_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(230) + + var _x = p.expr(0) + + localctx.(*When_clauseContext).result = _x + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IExprContext is an interface to support dynamic dispatch. +type IExprContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + // IsExprContext differentiates from other interfaces. + IsExprContext() +} + +type ExprContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyExprContext() *ExprContext { + var p = new(ExprContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_expr + return p +} + +func InitEmptyExprContext(p *ExprContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_expr +} + +func (*ExprContext) IsExprContext() {} + +func NewExprContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ExprContext { + var p = new(ExprContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_expr + + return p +} + +func (s *ExprContext) GetParser() antlr.Parser { return s.parser } + +func (s *ExprContext) CopyAll(ctx *ExprContext) { + s.CopyFrom(&ctx.BaseParserRuleContext) +} + +func (s *ExprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ExprContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +type Subquery_exprContext struct { + ExprContext +} + +func NewSubquery_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Subquery_exprContext { + var p = new(Subquery_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Subquery_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Subquery_exprContext) Subquery() ISubqueryContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISubqueryContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISubqueryContext) +} + +func (s *Subquery_exprContext) EXISTS_() antlr.TerminalNode { + return s.GetToken(SQLParserEXISTS_, 0) +} + +func (s *Subquery_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *Subquery_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSubquery_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Logical_not_exprContext struct { + ExprContext +} + +func NewLogical_not_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Logical_not_exprContext { + var p = new(Logical_not_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Logical_not_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Logical_not_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *Logical_not_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Logical_not_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitLogical_not_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Comparison_exprContext struct { + ExprContext + left IExprContext + right IExprContext +} + +func NewComparison_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Comparison_exprContext { + var p = new(Comparison_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Comparison_exprContext) GetLeft() IExprContext { return s.left } + +func (s *Comparison_exprContext) GetRight() IExprContext { return s.right } + +func (s *Comparison_exprContext) SetLeft(v IExprContext) { s.left = v } + +func (s *Comparison_exprContext) SetRight(v IExprContext) { s.right = v } + +func (s *Comparison_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Comparison_exprContext) ComparisonOperator() IComparisonOperatorContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IComparisonOperatorContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IComparisonOperatorContext) +} + +func (s *Comparison_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Comparison_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Comparison_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitComparison_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Like_exprContext struct { + ExprContext + elem IExprContext + operator antlr.Token + pattern IExprContext + escape IExprContext +} + +func NewLike_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Like_exprContext { + var p = new(Like_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Like_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *Like_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *Like_exprContext) GetElem() IExprContext { return s.elem } + +func (s *Like_exprContext) GetPattern() IExprContext { return s.pattern } + +func (s *Like_exprContext) GetEscape() IExprContext { return s.escape } + +func (s *Like_exprContext) SetElem(v IExprContext) { s.elem = v } + +func (s *Like_exprContext) SetPattern(v IExprContext) { s.pattern = v } + +func (s *Like_exprContext) SetEscape(v IExprContext) { s.escape = v } + +func (s *Like_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Like_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Like_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Like_exprContext) LIKE_() antlr.TerminalNode { + return s.GetToken(SQLParserLIKE_, 0) +} + +func (s *Like_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *Like_exprContext) ESCAPE_() antlr.TerminalNode { + return s.GetToken(SQLParserESCAPE_, 0) +} + +func (s *Like_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitLike_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Null_exprContext struct { + ExprContext +} + +func NewNull_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Null_exprContext { + var p = new(Null_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Null_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Null_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Null_exprContext) ISNULL_() antlr.TerminalNode { + return s.GetToken(SQLParserISNULL_, 0) +} + +func (s *Null_exprContext) NOTNULL_() antlr.TerminalNode { + return s.GetToken(SQLParserNOTNULL_, 0) +} + +func (s *Null_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitNull_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Column_exprContext struct { + ExprContext +} + +func NewColumn_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Column_exprContext { + var p = new(Column_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Column_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Column_exprContext) Column_ref() IColumn_refContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_refContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_refContext) +} + +func (s *Column_exprContext) Type_cast() IType_castContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IType_castContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IType_castContext) +} + +func (s *Column_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitColumn_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type In_subquery_exprContext struct { + ExprContext + elem IExprContext + operator antlr.Token +} + +func NewIn_subquery_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *In_subquery_exprContext { + var p = new(In_subquery_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *In_subquery_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *In_subquery_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *In_subquery_exprContext) GetElem() IExprContext { return s.elem } + +func (s *In_subquery_exprContext) SetElem(v IExprContext) { s.elem = v } + +func (s *In_subquery_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *In_subquery_exprContext) Subquery() ISubqueryContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISubqueryContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISubqueryContext) +} + +func (s *In_subquery_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *In_subquery_exprContext) IN_() antlr.TerminalNode { + return s.GetToken(SQLParserIN_, 0) +} + +func (s *In_subquery_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *In_subquery_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitIn_subquery_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Arithmetic_exprContext struct { + ExprContext + left IExprContext + operator antlr.Token + right IExprContext +} + +func NewArithmetic_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Arithmetic_exprContext { + var p = new(Arithmetic_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Arithmetic_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *Arithmetic_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *Arithmetic_exprContext) GetLeft() IExprContext { return s.left } + +func (s *Arithmetic_exprContext) GetRight() IExprContext { return s.right } + +func (s *Arithmetic_exprContext) SetLeft(v IExprContext) { s.left = v } + +func (s *Arithmetic_exprContext) SetRight(v IExprContext) { s.right = v } + +func (s *Arithmetic_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Arithmetic_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Arithmetic_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Arithmetic_exprContext) STAR() antlr.TerminalNode { + return s.GetToken(SQLParserSTAR, 0) +} + +func (s *Arithmetic_exprContext) DIV() antlr.TerminalNode { + return s.GetToken(SQLParserDIV, 0) +} + +func (s *Arithmetic_exprContext) MOD() antlr.TerminalNode { + return s.GetToken(SQLParserMOD, 0) +} + +func (s *Arithmetic_exprContext) PLUS() antlr.TerminalNode { + return s.GetToken(SQLParserPLUS, 0) +} + +func (s *Arithmetic_exprContext) MINUS() antlr.TerminalNode { + return s.GetToken(SQLParserMINUS, 0) +} + +func (s *Arithmetic_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitArithmetic_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Logical_binary_exprContext struct { + ExprContext + left IExprContext + operator antlr.Token + right IExprContext +} + +func NewLogical_binary_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Logical_binary_exprContext { + var p = new(Logical_binary_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Logical_binary_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *Logical_binary_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *Logical_binary_exprContext) GetLeft() IExprContext { return s.left } + +func (s *Logical_binary_exprContext) GetRight() IExprContext { return s.right } + +func (s *Logical_binary_exprContext) SetLeft(v IExprContext) { s.left = v } + +func (s *Logical_binary_exprContext) SetRight(v IExprContext) { s.right = v } + +func (s *Logical_binary_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Logical_binary_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Logical_binary_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Logical_binary_exprContext) AND_() antlr.TerminalNode { + return s.GetToken(SQLParserAND_, 0) +} + +func (s *Logical_binary_exprContext) OR_() antlr.TerminalNode { + return s.GetToken(SQLParserOR_, 0) +} + +func (s *Logical_binary_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitLogical_binary_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Variable_exprContext struct { + ExprContext +} + +func NewVariable_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Variable_exprContext { + var p = new(Variable_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Variable_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Variable_exprContext) Variable() IVariableContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IVariableContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IVariableContext) +} + +func (s *Variable_exprContext) Type_cast() IType_castContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IType_castContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IType_castContext) +} + +func (s *Variable_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitVariable_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Unary_exprContext struct { + ExprContext + operator antlr.Token +} + +func NewUnary_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Unary_exprContext { + var p = new(Unary_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Unary_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *Unary_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *Unary_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Unary_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Unary_exprContext) MINUS() antlr.TerminalNode { + return s.GetToken(SQLParserMINUS, 0) +} + +func (s *Unary_exprContext) PLUS() antlr.TerminalNode { + return s.GetToken(SQLParserPLUS, 0) +} + +func (s *Unary_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitUnary_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Collate_exprContext struct { + ExprContext +} + +func NewCollate_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Collate_exprContext { + var p = new(Collate_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Collate_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Collate_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Collate_exprContext) COLLATE_() antlr.TerminalNode { + return s.GetToken(SQLParserCOLLATE_, 0) +} + +func (s *Collate_exprContext) Collation_name() ICollation_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICollation_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICollation_nameContext) +} + +func (s *Collate_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCollate_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Parenthesized_exprContext struct { + ExprContext +} + +func NewParenthesized_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Parenthesized_exprContext { + var p = new(Parenthesized_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Parenthesized_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Parenthesized_exprContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Parenthesized_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Parenthesized_exprContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Parenthesized_exprContext) Type_cast() IType_castContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IType_castContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IType_castContext) +} + +func (s *Parenthesized_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitParenthesized_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Between_exprContext struct { + ExprContext + elem IExprContext + operator antlr.Token + low IExprContext + high IExprContext +} + +func NewBetween_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Between_exprContext { + var p = new(Between_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Between_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *Between_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *Between_exprContext) GetElem() IExprContext { return s.elem } + +func (s *Between_exprContext) GetLow() IExprContext { return s.low } + +func (s *Between_exprContext) GetHigh() IExprContext { return s.high } + +func (s *Between_exprContext) SetElem(v IExprContext) { s.elem = v } + +func (s *Between_exprContext) SetLow(v IExprContext) { s.low = v } + +func (s *Between_exprContext) SetHigh(v IExprContext) { s.high = v } + +func (s *Between_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Between_exprContext) AND_() antlr.TerminalNode { + return s.GetToken(SQLParserAND_, 0) +} + +func (s *Between_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Between_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Between_exprContext) BETWEEN_() antlr.TerminalNode { + return s.GetToken(SQLParserBETWEEN_, 0) +} + +func (s *Between_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *Between_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitBetween_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Expr_list_exprContext struct { + ExprContext +} + +func NewExpr_list_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Expr_list_exprContext { + var p = new(Expr_list_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Expr_list_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Expr_list_exprContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Expr_list_exprContext) Expr_list() IExpr_listContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExpr_listContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExpr_listContext) +} + +func (s *Expr_list_exprContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Expr_list_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitExpr_list_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type In_list_exprContext struct { + ExprContext + elem IExprContext + operator antlr.Token +} + +func NewIn_list_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *In_list_exprContext { + var p = new(In_list_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *In_list_exprContext) GetOperator() antlr.Token { return s.operator } + +func (s *In_list_exprContext) SetOperator(v antlr.Token) { s.operator = v } + +func (s *In_list_exprContext) GetElem() IExprContext { return s.elem } + +func (s *In_list_exprContext) SetElem(v IExprContext) { s.elem = v } + +func (s *In_list_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *In_list_exprContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *In_list_exprContext) Expr_list() IExpr_listContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExpr_listContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExpr_listContext) +} + +func (s *In_list_exprContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *In_list_exprContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *In_list_exprContext) IN_() antlr.TerminalNode { + return s.GetToken(SQLParserIN_, 0) +} + +func (s *In_list_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *In_list_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitIn_list_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Literal_exprContext struct { + ExprContext +} + +func NewLiteral_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Literal_exprContext { + var p = new(Literal_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Literal_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Literal_exprContext) Literal() ILiteralContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ILiteralContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ILiteralContext) +} + +func (s *Literal_exprContext) Type_cast() IType_castContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IType_castContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IType_castContext) +} + +func (s *Literal_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitLiteral_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Is_exprContext struct { + ExprContext +} + +func NewIs_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Is_exprContext { + var p = new(Is_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Is_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Is_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Is_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Is_exprContext) IS_() antlr.TerminalNode { + return s.GetToken(SQLParserIS_, 0) +} + +func (s *Is_exprContext) DISTINCT_() antlr.TerminalNode { + return s.GetToken(SQLParserDISTINCT_, 0) +} + +func (s *Is_exprContext) FROM_() antlr.TerminalNode { + return s.GetToken(SQLParserFROM_, 0) +} + +func (s *Is_exprContext) Boolean_value() IBoolean_valueContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IBoolean_valueContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IBoolean_valueContext) +} + +func (s *Is_exprContext) NULL_() antlr.TerminalNode { + return s.GetToken(SQLParserNULL_, 0) +} + +func (s *Is_exprContext) NOT_() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_, 0) +} + +func (s *Is_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitIs_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Case_exprContext struct { + ExprContext + case_clause IExprContext + else_clause IExprContext +} + +func NewCase_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Case_exprContext { + var p = new(Case_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Case_exprContext) GetCase_clause() IExprContext { return s.case_clause } + +func (s *Case_exprContext) GetElse_clause() IExprContext { return s.else_clause } + +func (s *Case_exprContext) SetCase_clause(v IExprContext) { s.case_clause = v } + +func (s *Case_exprContext) SetElse_clause(v IExprContext) { s.else_clause = v } + +func (s *Case_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Case_exprContext) CASE_() antlr.TerminalNode { + return s.GetToken(SQLParserCASE_, 0) +} + +func (s *Case_exprContext) END_() antlr.TerminalNode { + return s.GetToken(SQLParserEND_, 0) +} + +func (s *Case_exprContext) AllWhen_clause() []IWhen_clauseContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IWhen_clauseContext); ok { + len++ + } + } + + tst := make([]IWhen_clauseContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IWhen_clauseContext); ok { + tst[i] = t.(IWhen_clauseContext) + i++ + } + } + + return tst +} + +func (s *Case_exprContext) When_clause(i int) IWhen_clauseContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IWhen_clauseContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IWhen_clauseContext) +} + +func (s *Case_exprContext) ELSE_() antlr.TerminalNode { + return s.GetToken(SQLParserELSE_, 0) +} + +func (s *Case_exprContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Case_exprContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Case_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCase_expr(s) + + default: + return t.VisitChildren(s) + } +} + +type Function_exprContext struct { + ExprContext +} + +func NewFunction_exprContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Function_exprContext { + var p = new(Function_exprContext) + + InitEmptyExprContext(&p.ExprContext) + p.parser = parser + p.CopyAll(ctx.(*ExprContext)) + + return p +} + +func (s *Function_exprContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Function_exprContext) Function_call() IFunction_callContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IFunction_callContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IFunction_callContext) +} + +func (s *Function_exprContext) Type_cast() IType_castContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IType_castContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IType_castContext) +} + +func (s *Function_exprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitFunction_expr(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Expr() (localctx IExprContext) { + return p.expr(0) +} + +func (p *SQLParser) expr(_p int) (localctx IExprContext) { + var _parentctx antlr.ParserRuleContext = p.GetParserRuleContext() + + _parentState := p.GetState() + localctx = NewExprContext(p, p.GetParserRuleContext(), _parentState) + var _prevctx IExprContext = localctx + var _ antlr.ParserRuleContext = _prevctx // TODO: To prevent unused variable warning. + _startState := 26 + p.EnterRecursionRule(localctx, 26, SQLParserRULE_expr, _p) + var _la int + + var _alt int + + p.EnterOuterAlt(localctx, 1) + p.SetState(285) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 26, p.GetParserRuleContext()) { + case 1: + localctx = NewLiteral_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + + { + p.SetState(233) + p.Literal() + } + p.SetState(235) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 16, p.GetParserRuleContext()) == 1 { + { + p.SetState(234) + p.Type_cast() + } + + } else if p.HasError() { // JIM + goto errorExit + } + + case 2: + localctx = NewVariable_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(237) + p.Variable() + } + p.SetState(239) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 17, p.GetParserRuleContext()) == 1 { + { + p.SetState(238) + p.Type_cast() + } + + } else if p.HasError() { // JIM + goto errorExit + } + + case 3: + localctx = NewColumn_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(241) + p.Column_ref() + } + p.SetState(243) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 18, p.GetParserRuleContext()) == 1 { + { + p.SetState(242) + p.Type_cast() + } + + } else if p.HasError() { // JIM + goto errorExit + } + + case 4: + localctx = NewUnary_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(245) + + var _lt = p.GetTokenStream().LT(1) + + localctx.(*Unary_exprContext).operator = _lt + + _la = p.GetTokenStream().LA(1) + + if !(_la == SQLParserPLUS || _la == SQLParserMINUS) { + var _ri = p.GetErrorHandler().RecoverInline(p) + + localctx.(*Unary_exprContext).operator = _ri + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + { + p.SetState(246) + p.expr(19) + } + + case 5: + localctx = NewParenthesized_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(247) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(248) + p.expr(0) + } + { + p.SetState(249) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(251) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 19, p.GetParserRuleContext()) == 1 { + { + p.SetState(250) + p.Type_cast() + } + + } else if p.HasError() { // JIM + goto errorExit + } + + case 6: + localctx = NewSubquery_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + p.SetState(257) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserEXISTS_ || _la == SQLParserNOT_ { + p.SetState(254) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNOT_ { + { + p.SetState(253) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(256) + p.Match(SQLParserEXISTS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(259) + p.Subquery() + } + + case 7: + localctx = NewCase_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(260) + p.Match(SQLParserCASE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(262) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if ((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&1152928101743723272) != 0) || ((int64((_la-64)) & ^0x3f) == 0 && ((int64(1)<<(_la-64))&251724805) != 0) { + { + p.SetState(261) + + var _x = p.expr(0) + + localctx.(*Case_exprContext).case_clause = _x + } + + } + p.SetState(265) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for ok := true; ok; ok = _la == SQLParserWHEN_ { + { + p.SetState(264) + p.When_clause() + } + + p.SetState(267) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + p.SetState(271) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserELSE_ { + { + p.SetState(269) + p.Match(SQLParserELSE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(270) + + var _x = p.expr(0) + + localctx.(*Case_exprContext).else_clause = _x + } + + } + { + p.SetState(273) + p.Match(SQLParserEND_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case 8: + localctx = NewExpr_list_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(275) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(276) + p.Expr_list() + } + { + p.SetState(277) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case 9: + localctx = NewFunction_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(279) + p.Function_call() + } + p.SetState(281) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 25, p.GetParserRuleContext()) == 1 { + { + p.SetState(280) + p.Type_cast() + } + + } else if p.HasError() { // JIM + goto errorExit + } + + case 10: + localctx = NewLogical_not_exprContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(283) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(284) + p.expr(3) + } + + case antlr.ATNInvalidAltNumber: + goto errorExit + } + p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) + p.SetState(356) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 35, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { + if _alt == 1 { + if p.GetParseListeners() != nil { + p.TriggerExitRuleEvent() + } + _prevctx = localctx + p.SetState(354) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 34, p.GetParserRuleContext()) { + case 1: + localctx = NewArithmetic_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Arithmetic_exprContext).left = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(287) + + if !(p.Precpred(p.GetParserRuleContext(), 12)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 12)", "")) + goto errorExit + } + { + p.SetState(288) + + var _lt = p.GetTokenStream().LT(1) + + localctx.(*Arithmetic_exprContext).operator = _lt + + _la = p.GetTokenStream().LA(1) + + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&3200) != 0) { + var _ri = p.GetErrorHandler().RecoverInline(p) + + localctx.(*Arithmetic_exprContext).operator = _ri + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + { + p.SetState(289) + + var _x = p.expr(13) + + localctx.(*Arithmetic_exprContext).right = _x + } + + case 2: + localctx = NewArithmetic_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Arithmetic_exprContext).left = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(290) + + if !(p.Precpred(p.GetParserRuleContext(), 11)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 11)", "")) + goto errorExit + } + { + p.SetState(291) + + var _lt = p.GetTokenStream().LT(1) + + localctx.(*Arithmetic_exprContext).operator = _lt + + _la = p.GetTokenStream().LA(1) + + if !(_la == SQLParserPLUS || _la == SQLParserMINUS) { + var _ri = p.GetErrorHandler().RecoverInline(p) + + localctx.(*Arithmetic_exprContext).operator = _ri + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + { + p.SetState(292) + + var _x = p.expr(12) + + localctx.(*Arithmetic_exprContext).right = _x + } + + case 3: + localctx = NewBetween_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Between_exprContext).elem = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(293) + + if !(p.Precpred(p.GetParserRuleContext(), 8)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 8)", "")) + goto errorExit + } + p.SetState(295) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNOT_ { + { + p.SetState(294) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(297) + + var _m = p.Match(SQLParserBETWEEN_) + + localctx.(*Between_exprContext).operator = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(298) + + var _x = p.expr(0) + + localctx.(*Between_exprContext).low = _x + } + { + p.SetState(299) + p.Match(SQLParserAND_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(300) + + var _x = p.expr(9) + + localctx.(*Between_exprContext).high = _x + } + + case 4: + localctx = NewComparison_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Comparison_exprContext).left = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(302) + + if !(p.Precpred(p.GetParserRuleContext(), 6)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 6)", "")) + goto errorExit + } + { + p.SetState(303) + p.ComparisonOperator() + } + { + p.SetState(304) + + var _x = p.expr(7) + + localctx.(*Comparison_exprContext).right = _x + } + + case 5: + localctx = NewLogical_binary_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Logical_binary_exprContext).left = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(306) + + if !(p.Precpred(p.GetParserRuleContext(), 2)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 2)", "")) + goto errorExit + } + { + p.SetState(307) + + var _m = p.Match(SQLParserAND_) + + localctx.(*Logical_binary_exprContext).operator = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(308) + + var _x = p.expr(3) + + localctx.(*Logical_binary_exprContext).right = _x + } + + case 6: + localctx = NewLogical_binary_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Logical_binary_exprContext).left = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(309) + + if !(p.Precpred(p.GetParserRuleContext(), 1)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 1)", "")) + goto errorExit + } + { + p.SetState(310) + + var _m = p.Match(SQLParserOR_) + + localctx.(*Logical_binary_exprContext).operator = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(311) + + var _x = p.expr(2) + + localctx.(*Logical_binary_exprContext).right = _x + } + + case 7: + localctx = NewCollate_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(312) + + if !(p.Precpred(p.GetParserRuleContext(), 18)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 18)", "")) + goto errorExit + } + { + p.SetState(313) + p.Match(SQLParserCOLLATE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(314) + p.Collation_name() + } + + case 8: + localctx = NewIn_subquery_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*In_subquery_exprContext).elem = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(315) + + if !(p.Precpred(p.GetParserRuleContext(), 10)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 10)", "")) + goto errorExit + } + p.SetState(317) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNOT_ { + { + p.SetState(316) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(319) + + var _m = p.Match(SQLParserIN_) + + localctx.(*In_subquery_exprContext).operator = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(320) + p.Subquery() + } + + case 9: + localctx = NewIn_list_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*In_list_exprContext).elem = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(321) + + if !(p.Precpred(p.GetParserRuleContext(), 9)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 9)", "")) + goto errorExit + } + p.SetState(323) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNOT_ { + { + p.SetState(322) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(325) + + var _m = p.Match(SQLParserIN_) + + localctx.(*In_list_exprContext).operator = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(326) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(327) + p.Expr_list() + } + { + p.SetState(328) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case 10: + localctx = NewLike_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + localctx.(*Like_exprContext).elem = _prevctx + + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(330) + + if !(p.Precpred(p.GetParserRuleContext(), 7)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 7)", "")) + goto errorExit + } + p.SetState(332) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNOT_ { + { + p.SetState(331) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(334) + + var _m = p.Match(SQLParserLIKE_) + + localctx.(*Like_exprContext).operator = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(335) + + var _x = p.expr(0) + + localctx.(*Like_exprContext).pattern = _x + } + p.SetState(338) + p.GetErrorHandler().Sync(p) + + if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 31, p.GetParserRuleContext()) == 1 { + { + p.SetState(336) + p.Match(SQLParserESCAPE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(337) + + var _x = p.expr(0) + + localctx.(*Like_exprContext).escape = _x + } + + } else if p.HasError() { // JIM + goto errorExit + } + + case 11: + localctx = NewIs_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(340) + + if !(p.Precpred(p.GetParserRuleContext(), 5)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 5)", "")) + goto errorExit + } + { + p.SetState(341) + p.Match(SQLParserIS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(343) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNOT_ { + { + p.SetState(342) + p.Match(SQLParserNOT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + p.SetState(350) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserDISTINCT_: + { + p.SetState(345) + p.Match(SQLParserDISTINCT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(346) + p.Match(SQLParserFROM_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(347) + p.expr(0) + } + + case SQLParserFALSE_, SQLParserTRUE_: + { + p.SetState(348) + p.Boolean_value() + } + + case SQLParserNULL_: + { + p.SetState(349) + p.Match(SQLParserNULL_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + + case 12: + localctx = NewNull_exprContext(p, NewExprContext(p, _parentctx, _parentState)) + p.PushNewRecursionContext(localctx, _startState, SQLParserRULE_expr) + p.SetState(352) + + if !(p.Precpred(p.GetParserRuleContext(), 4)) { + p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 4)", "")) + goto errorExit + } + { + p.SetState(353) + _la = p.GetTokenStream().LA(1) + + if !(_la == SQLParserISNULL_ || _la == SQLParserNOTNULL_) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + + case antlr.ATNInvalidAltNumber: + goto errorExit + } + + } + p.SetState(358) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 35, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.UnrollRecursionContexts(_parentctx) + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ISubqueryContext is an interface to support dynamic dispatch. +type ISubqueryContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + OPEN_PAR() antlr.TerminalNode + Select_stmt_no_cte() ISelect_stmt_no_cteContext + CLOSE_PAR() antlr.TerminalNode + + // IsSubqueryContext differentiates from other interfaces. + IsSubqueryContext() +} + +type SubqueryContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptySubqueryContext() *SubqueryContext { + var p = new(SubqueryContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_subquery + return p +} + +func InitEmptySubqueryContext(p *SubqueryContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_subquery +} + +func (*SubqueryContext) IsSubqueryContext() {} + +func NewSubqueryContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *SubqueryContext { + var p = new(SubqueryContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_subquery + + return p +} + +func (s *SubqueryContext) GetParser() antlr.Parser { return s.parser } + +func (s *SubqueryContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *SubqueryContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISelect_stmt_no_cteContext) +} + +func (s *SubqueryContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *SubqueryContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *SubqueryContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *SubqueryContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSubquery(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Subquery() (localctx ISubqueryContext) { + localctx = NewSubqueryContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 28, SQLParserRULE_subquery) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(359) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(360) + p.Select_stmt_no_cte() + } + { + p.SetState(361) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IExpr_listContext is an interface to support dynamic dispatch. +type IExpr_listContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + AllExpr() []IExprContext + Expr(i int) IExprContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsExpr_listContext differentiates from other interfaces. + IsExpr_listContext() +} + +type Expr_listContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyExpr_listContext() *Expr_listContext { + var p = new(Expr_listContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_expr_list + return p +} + +func InitEmptyExpr_listContext(p *Expr_listContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_expr_list +} + +func (*Expr_listContext) IsExpr_listContext() {} + +func NewExpr_listContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Expr_listContext { + var p = new(Expr_listContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_expr_list + + return p +} + +func (s *Expr_listContext) GetParser() antlr.Parser { return s.parser } + +func (s *Expr_listContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Expr_listContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Expr_listContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Expr_listContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Expr_listContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Expr_listContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Expr_listContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitExpr_list(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Expr_list() (localctx IExpr_listContext) { + localctx = NewExpr_listContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 30, SQLParserRULE_expr_list) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(363) + p.expr(0) + } + p.SetState(368) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(364) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(365) + p.expr(0) + } + + p.SetState(370) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IComparisonOperatorContext is an interface to support dynamic dispatch. +type IComparisonOperatorContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + LT() antlr.TerminalNode + LT_EQ() antlr.TerminalNode + GT() antlr.TerminalNode + GT_EQ() antlr.TerminalNode + ASSIGN() antlr.TerminalNode + NOT_EQ1() antlr.TerminalNode + NOT_EQ2() antlr.TerminalNode + + // IsComparisonOperatorContext differentiates from other interfaces. + IsComparisonOperatorContext() +} + +type ComparisonOperatorContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyComparisonOperatorContext() *ComparisonOperatorContext { + var p = new(ComparisonOperatorContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_comparisonOperator + return p +} + +func InitEmptyComparisonOperatorContext(p *ComparisonOperatorContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_comparisonOperator +} + +func (*ComparisonOperatorContext) IsComparisonOperatorContext() {} + +func NewComparisonOperatorContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ComparisonOperatorContext { + var p = new(ComparisonOperatorContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_comparisonOperator + + return p +} + +func (s *ComparisonOperatorContext) GetParser() antlr.Parser { return s.parser } + +func (s *ComparisonOperatorContext) LT() antlr.TerminalNode { + return s.GetToken(SQLParserLT, 0) +} + +func (s *ComparisonOperatorContext) LT_EQ() antlr.TerminalNode { + return s.GetToken(SQLParserLT_EQ, 0) +} + +func (s *ComparisonOperatorContext) GT() antlr.TerminalNode { + return s.GetToken(SQLParserGT, 0) +} + +func (s *ComparisonOperatorContext) GT_EQ() antlr.TerminalNode { + return s.GetToken(SQLParserGT_EQ, 0) +} + +func (s *ComparisonOperatorContext) ASSIGN() antlr.TerminalNode { + return s.GetToken(SQLParserASSIGN, 0) +} + +func (s *ComparisonOperatorContext) NOT_EQ1() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_EQ1, 0) +} + +func (s *ComparisonOperatorContext) NOT_EQ2() antlr.TerminalNode { + return s.GetToken(SQLParserNOT_EQ2, 0) +} + +func (s *ComparisonOperatorContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ComparisonOperatorContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *ComparisonOperatorContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitComparisonOperator(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) ComparisonOperator() (localctx IComparisonOperatorContext) { + localctx = NewComparisonOperatorContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 32, SQLParserRULE_comparisonOperator) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(371) + _la = p.GetTokenStream().LA(1) + + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&258112) != 0) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ICast_typeContext is an interface to support dynamic dispatch. +type ICast_typeContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsCast_typeContext differentiates from other interfaces. + IsCast_typeContext() +} + +type Cast_typeContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyCast_typeContext() *Cast_typeContext { + var p = new(Cast_typeContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_cast_type + return p +} + +func InitEmptyCast_typeContext(p *Cast_typeContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_cast_type +} + +func (*Cast_typeContext) IsCast_typeContext() {} + +func NewCast_typeContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Cast_typeContext { + var p = new(Cast_typeContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_cast_type + + return p +} + +func (s *Cast_typeContext) GetParser() antlr.Parser { return s.parser } + +func (s *Cast_typeContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Cast_typeContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Cast_typeContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Cast_typeContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCast_type(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Cast_type() (localctx ICast_typeContext) { + localctx = NewCast_typeContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 34, SQLParserRULE_cast_type) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(373) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IType_castContext is an interface to support dynamic dispatch. +type IType_castContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + TYPE_CAST() antlr.TerminalNode + Cast_type() ICast_typeContext + + // IsType_castContext differentiates from other interfaces. + IsType_castContext() +} + +type Type_castContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyType_castContext() *Type_castContext { + var p = new(Type_castContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_type_cast + return p +} + +func InitEmptyType_castContext(p *Type_castContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_type_cast +} + +func (*Type_castContext) IsType_castContext() {} + +func NewType_castContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Type_castContext { + var p = new(Type_castContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_type_cast + + return p +} + +func (s *Type_castContext) GetParser() antlr.Parser { return s.parser } + +func (s *Type_castContext) TYPE_CAST() antlr.TerminalNode { + return s.GetToken(SQLParserTYPE_CAST, 0) +} + +func (s *Type_castContext) Cast_type() ICast_typeContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICast_typeContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICast_typeContext) +} + +func (s *Type_castContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Type_castContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Type_castContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitType_cast(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Type_cast() (localctx IType_castContext) { + localctx = NewType_castContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 36, SQLParserRULE_type_cast) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(375) + p.Match(SQLParserTYPE_CAST) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(376) + p.Cast_type() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IBoolean_valueContext is an interface to support dynamic dispatch. +type IBoolean_valueContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + TRUE_() antlr.TerminalNode + FALSE_() antlr.TerminalNode + + // IsBoolean_valueContext differentiates from other interfaces. + IsBoolean_valueContext() +} + +type Boolean_valueContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyBoolean_valueContext() *Boolean_valueContext { + var p = new(Boolean_valueContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_boolean_value + return p +} + +func InitEmptyBoolean_valueContext(p *Boolean_valueContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_boolean_value +} + +func (*Boolean_valueContext) IsBoolean_valueContext() {} + +func NewBoolean_valueContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Boolean_valueContext { + var p = new(Boolean_valueContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_boolean_value + + return p +} + +func (s *Boolean_valueContext) GetParser() antlr.Parser { return s.parser } + +func (s *Boolean_valueContext) TRUE_() antlr.TerminalNode { + return s.GetToken(SQLParserTRUE_, 0) +} + +func (s *Boolean_valueContext) FALSE_() antlr.TerminalNode { + return s.GetToken(SQLParserFALSE_, 0) +} + +func (s *Boolean_valueContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Boolean_valueContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Boolean_valueContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitBoolean_value(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Boolean_value() (localctx IBoolean_valueContext) { + localctx = NewBoolean_valueContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 38, SQLParserRULE_boolean_value) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(378) + _la = p.GetTokenStream().LA(1) + + if !(_la == SQLParserFALSE_ || _la == SQLParserTRUE_) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IString_valueContext is an interface to support dynamic dispatch. +type IString_valueContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + STRING_LITERAL() antlr.TerminalNode + + // IsString_valueContext differentiates from other interfaces. + IsString_valueContext() +} + +type String_valueContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyString_valueContext() *String_valueContext { + var p = new(String_valueContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_string_value + return p +} + +func InitEmptyString_valueContext(p *String_valueContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_string_value +} + +func (*String_valueContext) IsString_valueContext() {} + +func NewString_valueContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *String_valueContext { + var p = new(String_valueContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_string_value + + return p +} + +func (s *String_valueContext) GetParser() antlr.Parser { return s.parser } + +func (s *String_valueContext) STRING_LITERAL() antlr.TerminalNode { + return s.GetToken(SQLParserSTRING_LITERAL, 0) +} + +func (s *String_valueContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *String_valueContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *String_valueContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitString_value(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) String_value() (localctx IString_valueContext) { + localctx = NewString_valueContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 40, SQLParserRULE_string_value) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(380) + p.Match(SQLParserSTRING_LITERAL) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// INumeric_valueContext is an interface to support dynamic dispatch. +type INumeric_valueContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + NUMERIC_LITERAL() antlr.TerminalNode + + // IsNumeric_valueContext differentiates from other interfaces. + IsNumeric_valueContext() +} + +type Numeric_valueContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyNumeric_valueContext() *Numeric_valueContext { + var p = new(Numeric_valueContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_numeric_value + return p +} + +func InitEmptyNumeric_valueContext(p *Numeric_valueContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_numeric_value +} + +func (*Numeric_valueContext) IsNumeric_valueContext() {} + +func NewNumeric_valueContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Numeric_valueContext { + var p = new(Numeric_valueContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_numeric_value + + return p +} + +func (s *Numeric_valueContext) GetParser() antlr.Parser { return s.parser } + +func (s *Numeric_valueContext) NUMERIC_LITERAL() antlr.TerminalNode { + return s.GetToken(SQLParserNUMERIC_LITERAL, 0) +} + +func (s *Numeric_valueContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Numeric_valueContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Numeric_valueContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitNumeric_value(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Numeric_value() (localctx INumeric_valueContext) { + localctx = NewNumeric_valueContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 42, SQLParserRULE_numeric_value) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(382) + p.Match(SQLParserNUMERIC_LITERAL) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ILiteralContext is an interface to support dynamic dispatch. +type ILiteralContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + NULL_() antlr.TerminalNode + Boolean_value() IBoolean_valueContext + String_value() IString_valueContext + Numeric_value() INumeric_valueContext + + // IsLiteralContext differentiates from other interfaces. + IsLiteralContext() +} + +type LiteralContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyLiteralContext() *LiteralContext { + var p = new(LiteralContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_literal + return p +} + +func InitEmptyLiteralContext(p *LiteralContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_literal +} + +func (*LiteralContext) IsLiteralContext() {} + +func NewLiteralContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *LiteralContext { + var p = new(LiteralContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_literal + + return p +} + +func (s *LiteralContext) GetParser() antlr.Parser { return s.parser } + +func (s *LiteralContext) NULL_() antlr.TerminalNode { + return s.GetToken(SQLParserNULL_, 0) +} + +func (s *LiteralContext) Boolean_value() IBoolean_valueContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IBoolean_valueContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IBoolean_valueContext) +} + +func (s *LiteralContext) String_value() IString_valueContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IString_valueContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IString_valueContext) +} + +func (s *LiteralContext) Numeric_value() INumeric_valueContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(INumeric_valueContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(INumeric_valueContext) +} + +func (s *LiteralContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *LiteralContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *LiteralContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitLiteral(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Literal() (localctx ILiteralContext) { + localctx = NewLiteralContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 44, SQLParserRULE_literal) + p.SetState(388) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserNULL_: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(384) + p.Match(SQLParserNULL_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserFALSE_, SQLParserTRUE_: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(385) + p.Boolean_value() + } + + case SQLParserSTRING_LITERAL: + p.EnterOuterAlt(localctx, 3) + { + p.SetState(386) + p.String_value() + } + + case SQLParserNUMERIC_LITERAL: + p.EnterOuterAlt(localctx, 4) + { + p.SetState(387) + p.Numeric_value() + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IValue_rowContext is an interface to support dynamic dispatch. +type IValue_rowContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + OPEN_PAR() antlr.TerminalNode + AllExpr() []IExprContext + Expr(i int) IExprContext + CLOSE_PAR() antlr.TerminalNode + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsValue_rowContext differentiates from other interfaces. + IsValue_rowContext() +} + +type Value_rowContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyValue_rowContext() *Value_rowContext { + var p = new(Value_rowContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_value_row + return p +} + +func InitEmptyValue_rowContext(p *Value_rowContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_value_row +} + +func (*Value_rowContext) IsValue_rowContext() {} + +func NewValue_rowContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Value_rowContext { + var p = new(Value_rowContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_value_row + + return p +} + +func (s *Value_rowContext) GetParser() antlr.Parser { return s.parser } + +func (s *Value_rowContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Value_rowContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Value_rowContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Value_rowContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Value_rowContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Value_rowContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Value_rowContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Value_rowContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Value_rowContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitValue_row(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Value_row() (localctx IValue_rowContext) { + localctx = NewValue_rowContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 46, SQLParserRULE_value_row) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(390) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(391) + p.expr(0) + } + p.SetState(396) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(392) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(393) + p.expr(0) + } + + p.SetState(398) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(399) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IValues_clauseContext is an interface to support dynamic dispatch. +type IValues_clauseContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + VALUES_() antlr.TerminalNode + AllValue_row() []IValue_rowContext + Value_row(i int) IValue_rowContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsValues_clauseContext differentiates from other interfaces. + IsValues_clauseContext() +} + +type Values_clauseContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyValues_clauseContext() *Values_clauseContext { + var p = new(Values_clauseContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_values_clause + return p +} + +func InitEmptyValues_clauseContext(p *Values_clauseContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_values_clause +} + +func (*Values_clauseContext) IsValues_clauseContext() {} + +func NewValues_clauseContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Values_clauseContext { + var p = new(Values_clauseContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_values_clause + + return p +} + +func (s *Values_clauseContext) GetParser() antlr.Parser { return s.parser } + +func (s *Values_clauseContext) VALUES_() antlr.TerminalNode { + return s.GetToken(SQLParserVALUES_, 0) +} + +func (s *Values_clauseContext) AllValue_row() []IValue_rowContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IValue_rowContext); ok { + len++ + } + } + + tst := make([]IValue_rowContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IValue_rowContext); ok { + tst[i] = t.(IValue_rowContext) + i++ + } + } + + return tst +} + +func (s *Values_clauseContext) Value_row(i int) IValue_rowContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IValue_rowContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IValue_rowContext) +} + +func (s *Values_clauseContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Values_clauseContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Values_clauseContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Values_clauseContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Values_clauseContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitValues_clause(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Values_clause() (localctx IValues_clauseContext) { + localctx = NewValues_clauseContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 48, SQLParserRULE_values_clause) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(401) + p.Match(SQLParserVALUES_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(402) + p.Value_row() + } + p.SetState(407) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(403) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(404) + p.Value_row() + } + + p.SetState(409) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IInsert_coreContext is an interface to support dynamic dispatch. +type IInsert_coreContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + INSERT_() antlr.TerminalNode + INTO_() antlr.TerminalNode + Table_name() ITable_nameContext + Values_clause() IValues_clauseContext + AS_() antlr.TerminalNode + Table_alias() ITable_aliasContext + OPEN_PAR() antlr.TerminalNode + AllColumn_name() []IColumn_nameContext + Column_name(i int) IColumn_nameContext + CLOSE_PAR() antlr.TerminalNode + Upsert_clause() IUpsert_clauseContext + Returning_clause() IReturning_clauseContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsInsert_coreContext differentiates from other interfaces. + IsInsert_coreContext() +} + +type Insert_coreContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyInsert_coreContext() *Insert_coreContext { + var p = new(Insert_coreContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_insert_core + return p +} + +func InitEmptyInsert_coreContext(p *Insert_coreContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_insert_core +} + +func (*Insert_coreContext) IsInsert_coreContext() {} + +func NewInsert_coreContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Insert_coreContext { + var p = new(Insert_coreContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_insert_core + + return p +} + +func (s *Insert_coreContext) GetParser() antlr.Parser { return s.parser } + +func (s *Insert_coreContext) INSERT_() antlr.TerminalNode { + return s.GetToken(SQLParserINSERT_, 0) +} + +func (s *Insert_coreContext) INTO_() antlr.TerminalNode { + return s.GetToken(SQLParserINTO_, 0) +} + +func (s *Insert_coreContext) Table_name() ITable_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_nameContext) +} + +func (s *Insert_coreContext) Values_clause() IValues_clauseContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IValues_clauseContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IValues_clauseContext) +} + +func (s *Insert_coreContext) AS_() antlr.TerminalNode { + return s.GetToken(SQLParserAS_, 0) +} + +func (s *Insert_coreContext) Table_alias() ITable_aliasContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_aliasContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_aliasContext) +} + +func (s *Insert_coreContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Insert_coreContext) AllColumn_name() []IColumn_nameContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IColumn_nameContext); ok { + len++ + } + } + + tst := make([]IColumn_nameContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IColumn_nameContext); ok { + tst[i] = t.(IColumn_nameContext) + i++ + } + } + + return tst +} + +func (s *Insert_coreContext) Column_name(i int) IColumn_nameContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Insert_coreContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Insert_coreContext) Upsert_clause() IUpsert_clauseContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IUpsert_clauseContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IUpsert_clauseContext) +} + +func (s *Insert_coreContext) Returning_clause() IReturning_clauseContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IReturning_clauseContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IReturning_clauseContext) +} + +func (s *Insert_coreContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Insert_coreContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Insert_coreContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Insert_coreContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Insert_coreContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitInsert_core(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Insert_core() (localctx IInsert_coreContext) { + localctx = NewInsert_coreContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 50, SQLParserRULE_insert_core) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(410) + p.Match(SQLParserINSERT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(411) + p.Match(SQLParserINTO_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(412) + p.Table_name() + } + p.SetState(415) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserAS_ { + { + p.SetState(413) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(414) + p.Table_alias() + } + + } + p.SetState(428) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserOPEN_PAR { + { + p.SetState(417) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(418) + p.Column_name() + } + p.SetState(423) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(419) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(420) + p.Column_name() + } + + p.SetState(425) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(426) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(430) + p.Values_clause() + } + p.SetState(432) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserON_ { + { + p.SetState(431) + p.Upsert_clause() + } + + } + p.SetState(435) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserRETURNING_ { + { + p.SetState(434) + p.Returning_clause() + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IInsert_stmtContext is an interface to support dynamic dispatch. +type IInsert_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Insert_core() IInsert_coreContext + Common_table_stmt() ICommon_table_stmtContext + + // IsInsert_stmtContext differentiates from other interfaces. + IsInsert_stmtContext() +} + +type Insert_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyInsert_stmtContext() *Insert_stmtContext { + var p = new(Insert_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_insert_stmt + return p +} + +func InitEmptyInsert_stmtContext(p *Insert_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_insert_stmt +} + +func (*Insert_stmtContext) IsInsert_stmtContext() {} + +func NewInsert_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Insert_stmtContext { + var p = new(Insert_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_insert_stmt + + return p +} + +func (s *Insert_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Insert_stmtContext) Insert_core() IInsert_coreContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IInsert_coreContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IInsert_coreContext) +} + +func (s *Insert_stmtContext) Common_table_stmt() ICommon_table_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICommon_table_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICommon_table_stmtContext) +} + +func (s *Insert_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Insert_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Insert_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitInsert_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Insert_stmt() (localctx IInsert_stmtContext) { + localctx = NewInsert_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 52, SQLParserRULE_insert_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + p.SetState(438) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWITH_ { + { + p.SetState(437) + p.Common_table_stmt() + } + + } + { + p.SetState(440) + p.Insert_core() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IReturning_clauseContext is an interface to support dynamic dispatch. +type IReturning_clauseContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + RETURNING_() antlr.TerminalNode + AllReturning_clause_result_column() []IReturning_clause_result_columnContext + Returning_clause_result_column(i int) IReturning_clause_result_columnContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsReturning_clauseContext differentiates from other interfaces. + IsReturning_clauseContext() +} + +type Returning_clauseContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyReturning_clauseContext() *Returning_clauseContext { + var p = new(Returning_clauseContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_returning_clause + return p +} + +func InitEmptyReturning_clauseContext(p *Returning_clauseContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_returning_clause +} + +func (*Returning_clauseContext) IsReturning_clauseContext() {} + +func NewReturning_clauseContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Returning_clauseContext { + var p = new(Returning_clauseContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_returning_clause + + return p +} + +func (s *Returning_clauseContext) GetParser() antlr.Parser { return s.parser } + +func (s *Returning_clauseContext) RETURNING_() antlr.TerminalNode { + return s.GetToken(SQLParserRETURNING_, 0) +} + +func (s *Returning_clauseContext) AllReturning_clause_result_column() []IReturning_clause_result_columnContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IReturning_clause_result_columnContext); ok { + len++ + } + } + + tst := make([]IReturning_clause_result_columnContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IReturning_clause_result_columnContext); ok { + tst[i] = t.(IReturning_clause_result_columnContext) + i++ + } + } + + return tst +} + +func (s *Returning_clauseContext) Returning_clause_result_column(i int) IReturning_clause_result_columnContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IReturning_clause_result_columnContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IReturning_clause_result_columnContext) +} + +func (s *Returning_clauseContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Returning_clauseContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Returning_clauseContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Returning_clauseContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Returning_clauseContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitReturning_clause(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Returning_clause() (localctx IReturning_clauseContext) { + localctx = NewReturning_clauseContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 54, SQLParserRULE_returning_clause) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(442) + p.Match(SQLParserRETURNING_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(443) + p.Returning_clause_result_column() + } + p.SetState(448) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(444) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(445) + p.Returning_clause_result_column() + } + + p.SetState(450) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IUpsert_updateContext is an interface to support dynamic dispatch. +type IUpsert_updateContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + ASSIGN() antlr.TerminalNode + Expr() IExprContext + Column_name() IColumn_nameContext + Column_name_list() IColumn_name_listContext + + // IsUpsert_updateContext differentiates from other interfaces. + IsUpsert_updateContext() +} + +type Upsert_updateContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyUpsert_updateContext() *Upsert_updateContext { + var p = new(Upsert_updateContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_upsert_update + return p +} + +func InitEmptyUpsert_updateContext(p *Upsert_updateContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_upsert_update +} + +func (*Upsert_updateContext) IsUpsert_updateContext() {} + +func NewUpsert_updateContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Upsert_updateContext { + var p = new(Upsert_updateContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_upsert_update + + return p +} + +func (s *Upsert_updateContext) GetParser() antlr.Parser { return s.parser } + +func (s *Upsert_updateContext) ASSIGN() antlr.TerminalNode { + return s.GetToken(SQLParserASSIGN, 0) +} + +func (s *Upsert_updateContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Upsert_updateContext) Column_name() IColumn_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Upsert_updateContext) Column_name_list() IColumn_name_listContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_name_listContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_name_listContext) +} + +func (s *Upsert_updateContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Upsert_updateContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Upsert_updateContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitUpsert_update(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Upsert_update() (localctx IUpsert_updateContext) { + localctx = NewUpsert_updateContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 56, SQLParserRULE_upsert_update) + p.EnterOuterAlt(localctx, 1) + p.SetState(453) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserIDENTIFIER: + { + p.SetState(451) + p.Column_name() + } + + case SQLParserOPEN_PAR: + { + p.SetState(452) + p.Column_name_list() + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + { + p.SetState(455) + p.Match(SQLParserASSIGN) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(456) + p.expr(0) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IUpsert_clauseContext is an interface to support dynamic dispatch. +type IUpsert_clauseContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // GetTarget_expr returns the target_expr rule contexts. + GetTarget_expr() IExprContext + + // GetUpdate_expr returns the update_expr rule contexts. + GetUpdate_expr() IExprContext + + // SetTarget_expr sets the target_expr rule contexts. + SetTarget_expr(IExprContext) + + // SetUpdate_expr sets the update_expr rule contexts. + SetUpdate_expr(IExprContext) + + // Getter signatures + ON_() antlr.TerminalNode + CONFLICT_() antlr.TerminalNode + DO_() antlr.TerminalNode + NOTHING_() antlr.TerminalNode + UPDATE_() antlr.TerminalNode + SET_() antlr.TerminalNode + OPEN_PAR() antlr.TerminalNode + AllIndexed_column() []IIndexed_columnContext + Indexed_column(i int) IIndexed_columnContext + CLOSE_PAR() antlr.TerminalNode + AllUpsert_update() []IUpsert_updateContext + Upsert_update(i int) IUpsert_updateContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + AllWHERE_() []antlr.TerminalNode + WHERE_(i int) antlr.TerminalNode + AllExpr() []IExprContext + Expr(i int) IExprContext + + // IsUpsert_clauseContext differentiates from other interfaces. + IsUpsert_clauseContext() +} + +type Upsert_clauseContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser + target_expr IExprContext + update_expr IExprContext +} + +func NewEmptyUpsert_clauseContext() *Upsert_clauseContext { + var p = new(Upsert_clauseContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_upsert_clause + return p +} + +func InitEmptyUpsert_clauseContext(p *Upsert_clauseContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_upsert_clause +} + +func (*Upsert_clauseContext) IsUpsert_clauseContext() {} + +func NewUpsert_clauseContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Upsert_clauseContext { + var p = new(Upsert_clauseContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_upsert_clause + + return p +} + +func (s *Upsert_clauseContext) GetParser() antlr.Parser { return s.parser } + +func (s *Upsert_clauseContext) GetTarget_expr() IExprContext { return s.target_expr } + +func (s *Upsert_clauseContext) GetUpdate_expr() IExprContext { return s.update_expr } + +func (s *Upsert_clauseContext) SetTarget_expr(v IExprContext) { s.target_expr = v } + +func (s *Upsert_clauseContext) SetUpdate_expr(v IExprContext) { s.update_expr = v } + +func (s *Upsert_clauseContext) ON_() antlr.TerminalNode { + return s.GetToken(SQLParserON_, 0) +} + +func (s *Upsert_clauseContext) CONFLICT_() antlr.TerminalNode { + return s.GetToken(SQLParserCONFLICT_, 0) +} + +func (s *Upsert_clauseContext) DO_() antlr.TerminalNode { + return s.GetToken(SQLParserDO_, 0) +} + +func (s *Upsert_clauseContext) NOTHING_() antlr.TerminalNode { + return s.GetToken(SQLParserNOTHING_, 0) +} + +func (s *Upsert_clauseContext) UPDATE_() antlr.TerminalNode { + return s.GetToken(SQLParserUPDATE_, 0) +} + +func (s *Upsert_clauseContext) SET_() antlr.TerminalNode { + return s.GetToken(SQLParserSET_, 0) +} + +func (s *Upsert_clauseContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Upsert_clauseContext) AllIndexed_column() []IIndexed_columnContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IIndexed_columnContext); ok { + len++ + } + } + + tst := make([]IIndexed_columnContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IIndexed_columnContext); ok { + tst[i] = t.(IIndexed_columnContext) + i++ + } + } + + return tst +} + +func (s *Upsert_clauseContext) Indexed_column(i int) IIndexed_columnContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IIndexed_columnContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IIndexed_columnContext) +} + +func (s *Upsert_clauseContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Upsert_clauseContext) AllUpsert_update() []IUpsert_updateContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IUpsert_updateContext); ok { + len++ + } + } + + tst := make([]IUpsert_updateContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IUpsert_updateContext); ok { + tst[i] = t.(IUpsert_updateContext) + i++ + } + } + + return tst +} + +func (s *Upsert_clauseContext) Upsert_update(i int) IUpsert_updateContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IUpsert_updateContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IUpsert_updateContext) +} + +func (s *Upsert_clauseContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Upsert_clauseContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Upsert_clauseContext) AllWHERE_() []antlr.TerminalNode { + return s.GetTokens(SQLParserWHERE_) +} + +func (s *Upsert_clauseContext) WHERE_(i int) antlr.TerminalNode { + return s.GetToken(SQLParserWHERE_, i) +} + +func (s *Upsert_clauseContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Upsert_clauseContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Upsert_clauseContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Upsert_clauseContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Upsert_clauseContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitUpsert_clause(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Upsert_clause() (localctx IUpsert_clauseContext) { + localctx = NewUpsert_clauseContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 58, SQLParserRULE_upsert_clause) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(458) + p.Match(SQLParserON_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(459) + p.Match(SQLParserCONFLICT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(474) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserOPEN_PAR { + { + p.SetState(460) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(461) + p.Indexed_column() + } + p.SetState(466) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(462) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(463) + p.Indexed_column() + } + + p.SetState(468) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(469) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(472) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWHERE_ { + { + p.SetState(470) + p.Match(SQLParserWHERE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(471) + + var _x = p.expr(0) + + localctx.(*Upsert_clauseContext).target_expr = _x + } + + } + + } + { + p.SetState(476) + p.Match(SQLParserDO_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(492) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserNOTHING_: + { + p.SetState(477) + p.Match(SQLParserNOTHING_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserUPDATE_: + { + p.SetState(478) + p.Match(SQLParserUPDATE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(479) + p.Match(SQLParserSET_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + { + p.SetState(480) + p.Upsert_update() + } + p.SetState(485) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(481) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(482) + p.Upsert_update() + } + + p.SetState(487) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + p.SetState(490) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWHERE_ { + { + p.SetState(488) + p.Match(SQLParserWHERE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(489) + + var _x = p.expr(0) + + localctx.(*Upsert_clauseContext).update_expr = _x + } + + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ISelect_stmt_no_cteContext is an interface to support dynamic dispatch. +type ISelect_stmt_no_cteContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + AllSelect_core() []ISelect_coreContext + Select_core(i int) ISelect_coreContext + AllCompound_operator() []ICompound_operatorContext + Compound_operator(i int) ICompound_operatorContext + Order_by_stmt() IOrder_by_stmtContext + Limit_stmt() ILimit_stmtContext + + // IsSelect_stmt_no_cteContext differentiates from other interfaces. + IsSelect_stmt_no_cteContext() +} + +type Select_stmt_no_cteContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptySelect_stmt_no_cteContext() *Select_stmt_no_cteContext { + var p = new(Select_stmt_no_cteContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_select_stmt_no_cte + return p +} + +func InitEmptySelect_stmt_no_cteContext(p *Select_stmt_no_cteContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_select_stmt_no_cte +} + +func (*Select_stmt_no_cteContext) IsSelect_stmt_no_cteContext() {} + +func NewSelect_stmt_no_cteContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Select_stmt_no_cteContext { + var p = new(Select_stmt_no_cteContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_select_stmt_no_cte + + return p +} + +func (s *Select_stmt_no_cteContext) GetParser() antlr.Parser { return s.parser } + +func (s *Select_stmt_no_cteContext) AllSelect_core() []ISelect_coreContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(ISelect_coreContext); ok { + len++ + } + } + + tst := make([]ISelect_coreContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(ISelect_coreContext); ok { + tst[i] = t.(ISelect_coreContext) + i++ + } + } + + return tst +} + +func (s *Select_stmt_no_cteContext) Select_core(i int) ISelect_coreContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISelect_coreContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(ISelect_coreContext) +} + +func (s *Select_stmt_no_cteContext) AllCompound_operator() []ICompound_operatorContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(ICompound_operatorContext); ok { + len++ + } + } + + tst := make([]ICompound_operatorContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(ICompound_operatorContext); ok { + tst[i] = t.(ICompound_operatorContext) + i++ + } + } + + return tst +} + +func (s *Select_stmt_no_cteContext) Compound_operator(i int) ICompound_operatorContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICompound_operatorContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(ICompound_operatorContext) +} + +func (s *Select_stmt_no_cteContext) Order_by_stmt() IOrder_by_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IOrder_by_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IOrder_by_stmtContext) +} + +func (s *Select_stmt_no_cteContext) Limit_stmt() ILimit_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ILimit_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ILimit_stmtContext) +} + +func (s *Select_stmt_no_cteContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Select_stmt_no_cteContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Select_stmt_no_cteContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSelect_stmt_no_cte(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Select_stmt_no_cte() (localctx ISelect_stmt_no_cteContext) { + localctx = NewSelect_stmt_no_cteContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 60, SQLParserRULE_select_stmt_no_cte) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(494) + p.Select_core() + } + p.SetState(500) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for (int64((_la-40)) & ^0x3f) == 0 && ((int64(1)<<(_la-40))&2199023259649) != 0 { + { + p.SetState(495) + p.Compound_operator() + } + { + p.SetState(496) + p.Select_core() + } + + p.SetState(502) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + p.SetState(504) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserORDER_ { + { + p.SetState(503) + p.Order_by_stmt() + } + + } + p.SetState(507) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserLIMIT_ { + { + p.SetState(506) + p.Limit_stmt() + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ISelect_stmtContext is an interface to support dynamic dispatch. +type ISelect_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Select_stmt_no_cte() ISelect_stmt_no_cteContext + Common_table_stmt() ICommon_table_stmtContext + + // IsSelect_stmtContext differentiates from other interfaces. + IsSelect_stmtContext() +} + +type Select_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptySelect_stmtContext() *Select_stmtContext { + var p = new(Select_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_select_stmt + return p +} + +func InitEmptySelect_stmtContext(p *Select_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_select_stmt +} + +func (*Select_stmtContext) IsSelect_stmtContext() {} + +func NewSelect_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Select_stmtContext { + var p = new(Select_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_select_stmt + + return p +} + +func (s *Select_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Select_stmtContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISelect_stmt_no_cteContext) +} + +func (s *Select_stmtContext) Common_table_stmt() ICommon_table_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICommon_table_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICommon_table_stmtContext) +} + +func (s *Select_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Select_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Select_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSelect_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Select_stmt() (localctx ISelect_stmtContext) { + localctx = NewSelect_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 62, SQLParserRULE_select_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + p.SetState(510) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWITH_ { + { + p.SetState(509) + p.Common_table_stmt() + } + + } + { + p.SetState(512) + p.Select_stmt_no_cte() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IJoin_relationContext is an interface to support dynamic dispatch. +type IJoin_relationContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // GetRight_relation returns the right_relation rule contexts. + GetRight_relation() ITable_or_subqueryContext + + // SetRight_relation sets the right_relation rule contexts. + SetRight_relation(ITable_or_subqueryContext) + + // Getter signatures + Join_operator() IJoin_operatorContext + Join_constraint() IJoin_constraintContext + Table_or_subquery() ITable_or_subqueryContext + + // IsJoin_relationContext differentiates from other interfaces. + IsJoin_relationContext() +} + +type Join_relationContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser + right_relation ITable_or_subqueryContext +} + +func NewEmptyJoin_relationContext() *Join_relationContext { + var p = new(Join_relationContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_join_relation + return p +} + +func InitEmptyJoin_relationContext(p *Join_relationContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_join_relation +} + +func (*Join_relationContext) IsJoin_relationContext() {} + +func NewJoin_relationContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Join_relationContext { + var p = new(Join_relationContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_join_relation + + return p +} + +func (s *Join_relationContext) GetParser() antlr.Parser { return s.parser } + +func (s *Join_relationContext) GetRight_relation() ITable_or_subqueryContext { return s.right_relation } + +func (s *Join_relationContext) SetRight_relation(v ITable_or_subqueryContext) { s.right_relation = v } + +func (s *Join_relationContext) Join_operator() IJoin_operatorContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IJoin_operatorContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IJoin_operatorContext) +} + +func (s *Join_relationContext) Join_constraint() IJoin_constraintContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IJoin_constraintContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IJoin_constraintContext) +} + +func (s *Join_relationContext) Table_or_subquery() ITable_or_subqueryContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_or_subqueryContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_or_subqueryContext) +} + +func (s *Join_relationContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Join_relationContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Join_relationContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitJoin_relation(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Join_relation() (localctx IJoin_relationContext) { + localctx = NewJoin_relationContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 64, SQLParserRULE_join_relation) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(514) + p.Join_operator() + } + { + p.SetState(515) + + var _x = p.Table_or_subquery() + + localctx.(*Join_relationContext).right_relation = _x + } + { + p.SetState(516) + p.Join_constraint() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IRelationContext is an interface to support dynamic dispatch. +type IRelationContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Table_or_subquery() ITable_or_subqueryContext + AllJoin_relation() []IJoin_relationContext + Join_relation(i int) IJoin_relationContext + + // IsRelationContext differentiates from other interfaces. + IsRelationContext() +} + +type RelationContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyRelationContext() *RelationContext { + var p = new(RelationContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_relation + return p +} + +func InitEmptyRelationContext(p *RelationContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_relation +} + +func (*RelationContext) IsRelationContext() {} + +func NewRelationContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *RelationContext { + var p = new(RelationContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_relation + + return p +} + +func (s *RelationContext) GetParser() antlr.Parser { return s.parser } + +func (s *RelationContext) Table_or_subquery() ITable_or_subqueryContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_or_subqueryContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_or_subqueryContext) +} + +func (s *RelationContext) AllJoin_relation() []IJoin_relationContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IJoin_relationContext); ok { + len++ + } + } + + tst := make([]IJoin_relationContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IJoin_relationContext); ok { + tst[i] = t.(IJoin_relationContext) + i++ + } + } + + return tst +} + +func (s *RelationContext) Join_relation(i int) IJoin_relationContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IJoin_relationContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IJoin_relationContext) +} + +func (s *RelationContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *RelationContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *RelationContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitRelation(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Relation() (localctx IRelationContext) { + localctx = NewRelationContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 66, SQLParserRULE_relation) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(518) + p.Table_or_subquery() + } + p.SetState(522) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for (int64((_la-46)) & ^0x3f) == 0 && ((int64(1)<<(_la-46))&1073752081) != 0 { + { + p.SetState(519) + p.Join_relation() + } + + p.SetState(524) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ISelect_coreContext is an interface to support dynamic dispatch. +type ISelect_coreContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // GetWhereExpr returns the whereExpr rule contexts. + GetWhereExpr() IExprContext + + // Get_expr returns the _expr rule contexts. + Get_expr() IExprContext + + // GetHavingExpr returns the havingExpr rule contexts. + GetHavingExpr() IExprContext + + // SetWhereExpr sets the whereExpr rule contexts. + SetWhereExpr(IExprContext) + + // Set_expr sets the _expr rule contexts. + Set_expr(IExprContext) + + // SetHavingExpr sets the havingExpr rule contexts. + SetHavingExpr(IExprContext) + + // GetGroupByExpr returns the groupByExpr rule context list. + GetGroupByExpr() []IExprContext + + // SetGroupByExpr sets the groupByExpr rule context list. + SetGroupByExpr([]IExprContext) + + // Getter signatures + SELECT_() antlr.TerminalNode + AllResult_column() []IResult_columnContext + Result_column(i int) IResult_columnContext + DISTINCT_() antlr.TerminalNode + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + FROM_() antlr.TerminalNode + Relation() IRelationContext + WHERE_() antlr.TerminalNode + GROUP_() antlr.TerminalNode + BY_() antlr.TerminalNode + AllExpr() []IExprContext + Expr(i int) IExprContext + HAVING_() antlr.TerminalNode + + // IsSelect_coreContext differentiates from other interfaces. + IsSelect_coreContext() +} + +type Select_coreContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser + whereExpr IExprContext + _expr IExprContext + groupByExpr []IExprContext + havingExpr IExprContext +} + +func NewEmptySelect_coreContext() *Select_coreContext { + var p = new(Select_coreContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_select_core + return p +} + +func InitEmptySelect_coreContext(p *Select_coreContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_select_core +} + +func (*Select_coreContext) IsSelect_coreContext() {} + +func NewSelect_coreContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Select_coreContext { + var p = new(Select_coreContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_select_core + + return p +} + +func (s *Select_coreContext) GetParser() antlr.Parser { return s.parser } + +func (s *Select_coreContext) GetWhereExpr() IExprContext { return s.whereExpr } + +func (s *Select_coreContext) Get_expr() IExprContext { return s._expr } + +func (s *Select_coreContext) GetHavingExpr() IExprContext { return s.havingExpr } + +func (s *Select_coreContext) SetWhereExpr(v IExprContext) { s.whereExpr = v } + +func (s *Select_coreContext) Set_expr(v IExprContext) { s._expr = v } + +func (s *Select_coreContext) SetHavingExpr(v IExprContext) { s.havingExpr = v } + +func (s *Select_coreContext) GetGroupByExpr() []IExprContext { return s.groupByExpr } + +func (s *Select_coreContext) SetGroupByExpr(v []IExprContext) { s.groupByExpr = v } + +func (s *Select_coreContext) SELECT_() antlr.TerminalNode { + return s.GetToken(SQLParserSELECT_, 0) +} + +func (s *Select_coreContext) AllResult_column() []IResult_columnContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IResult_columnContext); ok { + len++ + } + } + + tst := make([]IResult_columnContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IResult_columnContext); ok { + tst[i] = t.(IResult_columnContext) + i++ + } + } + + return tst +} + +func (s *Select_coreContext) Result_column(i int) IResult_columnContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IResult_columnContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IResult_columnContext) +} + +func (s *Select_coreContext) DISTINCT_() antlr.TerminalNode { + return s.GetToken(SQLParserDISTINCT_, 0) +} + +func (s *Select_coreContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Select_coreContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Select_coreContext) FROM_() antlr.TerminalNode { + return s.GetToken(SQLParserFROM_, 0) +} + +func (s *Select_coreContext) Relation() IRelationContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IRelationContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IRelationContext) +} + +func (s *Select_coreContext) WHERE_() antlr.TerminalNode { + return s.GetToken(SQLParserWHERE_, 0) +} + +func (s *Select_coreContext) GROUP_() antlr.TerminalNode { + return s.GetToken(SQLParserGROUP_, 0) +} + +func (s *Select_coreContext) BY_() antlr.TerminalNode { + return s.GetToken(SQLParserBY_, 0) +} + +func (s *Select_coreContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Select_coreContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Select_coreContext) HAVING_() antlr.TerminalNode { + return s.GetToken(SQLParserHAVING_, 0) +} + +func (s *Select_coreContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Select_coreContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Select_coreContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitSelect_core(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { + localctx = NewSelect_coreContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 68, SQLParserRULE_select_core) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(525) + p.Match(SQLParserSELECT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(527) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserDISTINCT_ { + { + p.SetState(526) + p.Match(SQLParserDISTINCT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + { + p.SetState(529) + p.Result_column() + } + p.SetState(534) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(530) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(531) + p.Result_column() + } + + p.SetState(536) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + p.SetState(539) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserFROM_ { + { + p.SetState(537) + p.Match(SQLParserFROM_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(538) + p.Relation() + } + + } + p.SetState(543) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWHERE_ { + { + p.SetState(541) + p.Match(SQLParserWHERE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(542) + + var _x = p.expr(0) + + localctx.(*Select_coreContext).whereExpr = _x + } + + } + p.SetState(559) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserGROUP_ { + { + p.SetState(545) + p.Match(SQLParserGROUP_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(546) + p.Match(SQLParserBY_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(547) + + var _x = p.expr(0) + + localctx.(*Select_coreContext)._expr = _x + } + localctx.(*Select_coreContext).groupByExpr = append(localctx.(*Select_coreContext).groupByExpr, localctx.(*Select_coreContext)._expr) + p.SetState(552) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(548) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(549) + + var _x = p.expr(0) + + localctx.(*Select_coreContext)._expr = _x + } + localctx.(*Select_coreContext).groupByExpr = append(localctx.(*Select_coreContext).groupByExpr, localctx.(*Select_coreContext)._expr) + + p.SetState(554) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + p.SetState(557) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserHAVING_ { + { + p.SetState(555) + p.Match(SQLParserHAVING_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(556) + + var _x = p.expr(0) + + localctx.(*Select_coreContext).havingExpr = _x + } + + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ITable_or_subqueryContext is an interface to support dynamic dispatch. +type ITable_or_subqueryContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Table_name() ITable_nameContext + AS_() antlr.TerminalNode + Table_alias() ITable_aliasContext + OPEN_PAR() antlr.TerminalNode + Select_stmt_no_cte() ISelect_stmt_no_cteContext + CLOSE_PAR() antlr.TerminalNode + + // IsTable_or_subqueryContext differentiates from other interfaces. + IsTable_or_subqueryContext() +} + +type Table_or_subqueryContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyTable_or_subqueryContext() *Table_or_subqueryContext { + var p = new(Table_or_subqueryContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_table_or_subquery + return p +} + +func InitEmptyTable_or_subqueryContext(p *Table_or_subqueryContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_table_or_subquery +} + +func (*Table_or_subqueryContext) IsTable_or_subqueryContext() {} + +func NewTable_or_subqueryContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Table_or_subqueryContext { + var p = new(Table_or_subqueryContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_table_or_subquery + + return p +} + +func (s *Table_or_subqueryContext) GetParser() antlr.Parser { return s.parser } + +func (s *Table_or_subqueryContext) Table_name() ITable_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_nameContext) +} + +func (s *Table_or_subqueryContext) AS_() antlr.TerminalNode { + return s.GetToken(SQLParserAS_, 0) +} + +func (s *Table_or_subqueryContext) Table_alias() ITable_aliasContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_aliasContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_aliasContext) +} + +func (s *Table_or_subqueryContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Table_or_subqueryContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ISelect_stmt_no_cteContext) +} + +func (s *Table_or_subqueryContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Table_or_subqueryContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Table_or_subqueryContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Table_or_subqueryContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitTable_or_subquery(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Table_or_subquery() (localctx ITable_or_subqueryContext) { + localctx = NewTable_or_subqueryContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 70, SQLParserRULE_table_or_subquery) + var _la int + + p.SetState(573) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserIDENTIFIER: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(561) + p.Table_name() + } + p.SetState(564) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserAS_ { + { + p.SetState(562) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(563) + p.Table_alias() + } + + } + + case SQLParserOPEN_PAR: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(566) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(567) + p.Select_stmt_no_cte() + } + { + p.SetState(568) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(571) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserAS_ { + { + p.SetState(569) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(570) + p.Table_alias() + } + + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IResult_columnContext is an interface to support dynamic dispatch. +type IResult_columnContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + STAR() antlr.TerminalNode + Table_name() ITable_nameContext + DOT() antlr.TerminalNode + Expr() IExprContext + AS_() antlr.TerminalNode + Column_alias() IColumn_aliasContext + + // IsResult_columnContext differentiates from other interfaces. + IsResult_columnContext() +} + +type Result_columnContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyResult_columnContext() *Result_columnContext { + var p = new(Result_columnContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_result_column + return p +} + +func InitEmptyResult_columnContext(p *Result_columnContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_result_column +} + +func (*Result_columnContext) IsResult_columnContext() {} + +func NewResult_columnContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Result_columnContext { + var p = new(Result_columnContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_result_column + + return p +} + +func (s *Result_columnContext) GetParser() antlr.Parser { return s.parser } + +func (s *Result_columnContext) STAR() antlr.TerminalNode { + return s.GetToken(SQLParserSTAR, 0) +} + +func (s *Result_columnContext) Table_name() ITable_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_nameContext) +} + +func (s *Result_columnContext) DOT() antlr.TerminalNode { + return s.GetToken(SQLParserDOT, 0) +} + +func (s *Result_columnContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Result_columnContext) AS_() antlr.TerminalNode { + return s.GetToken(SQLParserAS_, 0) +} + +func (s *Result_columnContext) Column_alias() IColumn_aliasContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_aliasContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_aliasContext) +} + +func (s *Result_columnContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Result_columnContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Result_columnContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitResult_column(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Result_column() (localctx IResult_columnContext) { + localctx = NewResult_columnContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 72, SQLParserRULE_result_column) + var _la int + + p.SetState(585) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 70, p.GetParserRuleContext()) { + case 1: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(575) + p.Match(SQLParserSTAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case 2: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(576) + p.Table_name() + } + { + p.SetState(577) + p.Match(SQLParserDOT) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(578) + p.Match(SQLParserSTAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case 3: + p.EnterOuterAlt(localctx, 3) + { + p.SetState(580) + p.expr(0) + } + p.SetState(583) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserAS_ { + { + p.SetState(581) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(582) + p.Column_alias() + } + + } + + case antlr.ATNInvalidAltNumber: + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IReturning_clause_result_columnContext is an interface to support dynamic dispatch. +type IReturning_clause_result_columnContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + STAR() antlr.TerminalNode + Expr() IExprContext + AS_() antlr.TerminalNode + Column_alias() IColumn_aliasContext + + // IsReturning_clause_result_columnContext differentiates from other interfaces. + IsReturning_clause_result_columnContext() +} + +type Returning_clause_result_columnContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyReturning_clause_result_columnContext() *Returning_clause_result_columnContext { + var p = new(Returning_clause_result_columnContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_returning_clause_result_column + return p +} + +func InitEmptyReturning_clause_result_columnContext(p *Returning_clause_result_columnContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_returning_clause_result_column +} + +func (*Returning_clause_result_columnContext) IsReturning_clause_result_columnContext() {} + +func NewReturning_clause_result_columnContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Returning_clause_result_columnContext { + var p = new(Returning_clause_result_columnContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_returning_clause_result_column + + return p +} + +func (s *Returning_clause_result_columnContext) GetParser() antlr.Parser { return s.parser } + +func (s *Returning_clause_result_columnContext) STAR() antlr.TerminalNode { + return s.GetToken(SQLParserSTAR, 0) +} + +func (s *Returning_clause_result_columnContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Returning_clause_result_columnContext) AS_() antlr.TerminalNode { + return s.GetToken(SQLParserAS_, 0) +} + +func (s *Returning_clause_result_columnContext) Column_alias() IColumn_aliasContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_aliasContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_aliasContext) +} + +func (s *Returning_clause_result_columnContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Returning_clause_result_columnContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Returning_clause_result_columnContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitReturning_clause_result_column(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Returning_clause_result_column() (localctx IReturning_clause_result_columnContext) { + localctx = NewReturning_clause_result_columnContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 74, SQLParserRULE_returning_clause_result_column) + var _la int + + p.SetState(593) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserSTAR: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(587) + p.Match(SQLParserSTAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserOPEN_PAR, SQLParserPLUS, SQLParserMINUS, SQLParserCASE_, SQLParserEXISTS_, SQLParserFALSE_, SQLParserLIKE_, SQLParserNOT_, SQLParserNULL_, SQLParserREPLACE_, SQLParserTRUE_, SQLParserIDENTIFIER, SQLParserNUMERIC_LITERAL, SQLParserBIND_PARAMETER, SQLParserSTRING_LITERAL: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(588) + p.expr(0) + } + p.SetState(591) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserAS_ { + { + p.SetState(589) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(590) + p.Column_alias() + } + + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IJoin_operatorContext is an interface to support dynamic dispatch. +type IJoin_operatorContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + JOIN_() antlr.TerminalNode + INNER_() antlr.TerminalNode + LEFT_() antlr.TerminalNode + RIGHT_() antlr.TerminalNode + FULL_() antlr.TerminalNode + OUTER_() antlr.TerminalNode + + // IsJoin_operatorContext differentiates from other interfaces. + IsJoin_operatorContext() +} + +type Join_operatorContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyJoin_operatorContext() *Join_operatorContext { + var p = new(Join_operatorContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_join_operator + return p +} + +func InitEmptyJoin_operatorContext(p *Join_operatorContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_join_operator +} + +func (*Join_operatorContext) IsJoin_operatorContext() {} + +func NewJoin_operatorContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Join_operatorContext { + var p = new(Join_operatorContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_join_operator + + return p +} + +func (s *Join_operatorContext) GetParser() antlr.Parser { return s.parser } + +func (s *Join_operatorContext) JOIN_() antlr.TerminalNode { + return s.GetToken(SQLParserJOIN_, 0) +} + +func (s *Join_operatorContext) INNER_() antlr.TerminalNode { + return s.GetToken(SQLParserINNER_, 0) +} + +func (s *Join_operatorContext) LEFT_() antlr.TerminalNode { + return s.GetToken(SQLParserLEFT_, 0) +} + +func (s *Join_operatorContext) RIGHT_() antlr.TerminalNode { + return s.GetToken(SQLParserRIGHT_, 0) +} + +func (s *Join_operatorContext) FULL_() antlr.TerminalNode { + return s.GetToken(SQLParserFULL_, 0) +} + +func (s *Join_operatorContext) OUTER_() antlr.TerminalNode { + return s.GetToken(SQLParserOUTER_, 0) +} + +func (s *Join_operatorContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Join_operatorContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Join_operatorContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitJoin_operator(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Join_operator() (localctx IJoin_operatorContext) { + localctx = NewJoin_operatorContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 76, SQLParserRULE_join_operator) + var _la int + + p.EnterOuterAlt(localctx, 1) + p.SetState(600) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + switch p.GetTokenStream().LA(1) { + case SQLParserFULL_, SQLParserLEFT_, SQLParserRIGHT_: + { + p.SetState(595) + _la = p.GetTokenStream().LA(1) + + if !((int64((_la-46)) & ^0x3f) == 0 && ((int64(1)<<(_la-46))&1073750017) != 0) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + p.SetState(597) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserOUTER_ { + { + p.SetState(596) + p.Match(SQLParserOUTER_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + + case SQLParserINNER_: + { + p.SetState(599) + p.Match(SQLParserINNER_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserJOIN_: + + default: + } + { + p.SetState(602) + p.Match(SQLParserJOIN_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IJoin_constraintContext is an interface to support dynamic dispatch. +type IJoin_constraintContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + ON_() antlr.TerminalNode + Expr() IExprContext + + // IsJoin_constraintContext differentiates from other interfaces. + IsJoin_constraintContext() +} + +type Join_constraintContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyJoin_constraintContext() *Join_constraintContext { + var p = new(Join_constraintContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_join_constraint + return p +} + +func InitEmptyJoin_constraintContext(p *Join_constraintContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_join_constraint +} + +func (*Join_constraintContext) IsJoin_constraintContext() {} + +func NewJoin_constraintContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Join_constraintContext { + var p = new(Join_constraintContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_join_constraint + + return p +} + +func (s *Join_constraintContext) GetParser() antlr.Parser { return s.parser } + +func (s *Join_constraintContext) ON_() antlr.TerminalNode { + return s.GetToken(SQLParserON_, 0) +} + +func (s *Join_constraintContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Join_constraintContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Join_constraintContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Join_constraintContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitJoin_constraint(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Join_constraint() (localctx IJoin_constraintContext) { + localctx = NewJoin_constraintContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 78, SQLParserRULE_join_constraint) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(604) + p.Match(SQLParserON_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(605) + p.expr(0) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ICompound_operatorContext is an interface to support dynamic dispatch. +type ICompound_operatorContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + UNION_() antlr.TerminalNode + ALL_() antlr.TerminalNode + INTERSECT_() antlr.TerminalNode + EXCEPT_() antlr.TerminalNode + + // IsCompound_operatorContext differentiates from other interfaces. + IsCompound_operatorContext() +} + +type Compound_operatorContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyCompound_operatorContext() *Compound_operatorContext { + var p = new(Compound_operatorContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_compound_operator + return p +} + +func InitEmptyCompound_operatorContext(p *Compound_operatorContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_compound_operator +} + +func (*Compound_operatorContext) IsCompound_operatorContext() {} + +func NewCompound_operatorContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Compound_operatorContext { + var p = new(Compound_operatorContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_compound_operator + + return p +} + +func (s *Compound_operatorContext) GetParser() antlr.Parser { return s.parser } + +func (s *Compound_operatorContext) UNION_() antlr.TerminalNode { + return s.GetToken(SQLParserUNION_, 0) +} + +func (s *Compound_operatorContext) ALL_() antlr.TerminalNode { + return s.GetToken(SQLParserALL_, 0) +} + +func (s *Compound_operatorContext) INTERSECT_() antlr.TerminalNode { + return s.GetToken(SQLParserINTERSECT_, 0) +} + +func (s *Compound_operatorContext) EXCEPT_() antlr.TerminalNode { + return s.GetToken(SQLParserEXCEPT_, 0) +} + +func (s *Compound_operatorContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Compound_operatorContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Compound_operatorContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCompound_operator(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Compound_operator() (localctx ICompound_operatorContext) { + localctx = NewCompound_operatorContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 80, SQLParserRULE_compound_operator) + var _la int + + p.SetState(613) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserUNION_: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(607) + p.Match(SQLParserUNION_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(609) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserALL_ { + { + p.SetState(608) + p.Match(SQLParserALL_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + } + + case SQLParserINTERSECT_: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(611) + p.Match(SQLParserINTERSECT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserEXCEPT_: + p.EnterOuterAlt(localctx, 3) + { + p.SetState(612) + p.Match(SQLParserEXCEPT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IUpdate_set_subclauseContext is an interface to support dynamic dispatch. +type IUpdate_set_subclauseContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + ASSIGN() antlr.TerminalNode + Expr() IExprContext + Column_name() IColumn_nameContext + Column_name_list() IColumn_name_listContext + + // IsUpdate_set_subclauseContext differentiates from other interfaces. + IsUpdate_set_subclauseContext() +} + +type Update_set_subclauseContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyUpdate_set_subclauseContext() *Update_set_subclauseContext { + var p = new(Update_set_subclauseContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_update_set_subclause + return p +} + +func InitEmptyUpdate_set_subclauseContext(p *Update_set_subclauseContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_update_set_subclause +} + +func (*Update_set_subclauseContext) IsUpdate_set_subclauseContext() {} + +func NewUpdate_set_subclauseContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Update_set_subclauseContext { + var p = new(Update_set_subclauseContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_update_set_subclause + + return p +} + +func (s *Update_set_subclauseContext) GetParser() antlr.Parser { return s.parser } + +func (s *Update_set_subclauseContext) ASSIGN() antlr.TerminalNode { + return s.GetToken(SQLParserASSIGN, 0) +} + +func (s *Update_set_subclauseContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Update_set_subclauseContext) Column_name() IColumn_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Update_set_subclauseContext) Column_name_list() IColumn_name_listContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_name_listContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IColumn_name_listContext) +} + +func (s *Update_set_subclauseContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Update_set_subclauseContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Update_set_subclauseContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitUpdate_set_subclause(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Update_set_subclause() (localctx IUpdate_set_subclauseContext) { + localctx = NewUpdate_set_subclauseContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 82, SQLParserRULE_update_set_subclause) + p.EnterOuterAlt(localctx, 1) + p.SetState(617) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserIDENTIFIER: + { + p.SetState(615) + p.Column_name() + } + + case SQLParserOPEN_PAR: + { + p.SetState(616) + p.Column_name_list() + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + { + p.SetState(619) + p.Match(SQLParserASSIGN) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(620) + p.expr(0) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IUpdate_coreContext is an interface to support dynamic dispatch. +type IUpdate_coreContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + UPDATE_() antlr.TerminalNode + Qualified_table_name() IQualified_table_nameContext + SET_() antlr.TerminalNode + AllUpdate_set_subclause() []IUpdate_set_subclauseContext + Update_set_subclause(i int) IUpdate_set_subclauseContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + FROM_() antlr.TerminalNode + Relation() IRelationContext + WHERE_() antlr.TerminalNode + Expr() IExprContext + Returning_clause() IReturning_clauseContext + + // IsUpdate_coreContext differentiates from other interfaces. + IsUpdate_coreContext() +} + +type Update_coreContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyUpdate_coreContext() *Update_coreContext { + var p = new(Update_coreContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_update_core + return p +} + +func InitEmptyUpdate_coreContext(p *Update_coreContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_update_core +} + +func (*Update_coreContext) IsUpdate_coreContext() {} + +func NewUpdate_coreContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Update_coreContext { + var p = new(Update_coreContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_update_core + + return p +} + +func (s *Update_coreContext) GetParser() antlr.Parser { return s.parser } + +func (s *Update_coreContext) UPDATE_() antlr.TerminalNode { + return s.GetToken(SQLParserUPDATE_, 0) +} + +func (s *Update_coreContext) Qualified_table_name() IQualified_table_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IQualified_table_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IQualified_table_nameContext) +} + +func (s *Update_coreContext) SET_() antlr.TerminalNode { + return s.GetToken(SQLParserSET_, 0) +} + +func (s *Update_coreContext) AllUpdate_set_subclause() []IUpdate_set_subclauseContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IUpdate_set_subclauseContext); ok { + len++ + } + } + + tst := make([]IUpdate_set_subclauseContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IUpdate_set_subclauseContext); ok { + tst[i] = t.(IUpdate_set_subclauseContext) + i++ + } + } + + return tst +} + +func (s *Update_coreContext) Update_set_subclause(i int) IUpdate_set_subclauseContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IUpdate_set_subclauseContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IUpdate_set_subclauseContext) +} + +func (s *Update_coreContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Update_coreContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Update_coreContext) FROM_() antlr.TerminalNode { + return s.GetToken(SQLParserFROM_, 0) +} + +func (s *Update_coreContext) Relation() IRelationContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IRelationContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IRelationContext) +} + +func (s *Update_coreContext) WHERE_() antlr.TerminalNode { + return s.GetToken(SQLParserWHERE_, 0) +} + +func (s *Update_coreContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Update_coreContext) Returning_clause() IReturning_clauseContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IReturning_clauseContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IReturning_clauseContext) +} + +func (s *Update_coreContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Update_coreContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Update_coreContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitUpdate_core(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Update_core() (localctx IUpdate_coreContext) { + localctx = NewUpdate_coreContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 84, SQLParserRULE_update_core) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(622) + p.Match(SQLParserUPDATE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(623) + p.Qualified_table_name() + } + { + p.SetState(624) + p.Match(SQLParserSET_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(625) + p.Update_set_subclause() + } + p.SetState(630) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(626) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(627) + p.Update_set_subclause() + } + + p.SetState(632) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + p.SetState(635) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserFROM_ { + { + p.SetState(633) + p.Match(SQLParserFROM_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(634) + p.Relation() + } + + } + p.SetState(639) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWHERE_ { + { + p.SetState(637) + p.Match(SQLParserWHERE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(638) + p.expr(0) + } + + } + p.SetState(642) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserRETURNING_ { + { + p.SetState(641) + p.Returning_clause() + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IUpdate_stmtContext is an interface to support dynamic dispatch. +type IUpdate_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Update_core() IUpdate_coreContext + Common_table_stmt() ICommon_table_stmtContext + + // IsUpdate_stmtContext differentiates from other interfaces. + IsUpdate_stmtContext() +} + +type Update_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyUpdate_stmtContext() *Update_stmtContext { + var p = new(Update_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_update_stmt + return p +} + +func InitEmptyUpdate_stmtContext(p *Update_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_update_stmt +} + +func (*Update_stmtContext) IsUpdate_stmtContext() {} + +func NewUpdate_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Update_stmtContext { + var p = new(Update_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_update_stmt + + return p +} + +func (s *Update_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Update_stmtContext) Update_core() IUpdate_coreContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IUpdate_coreContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IUpdate_coreContext) +} + +func (s *Update_stmtContext) Common_table_stmt() ICommon_table_stmtContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICommon_table_stmtContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ICommon_table_stmtContext) +} + +func (s *Update_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Update_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Update_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitUpdate_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Update_stmt() (localctx IUpdate_stmtContext) { + localctx = NewUpdate_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 86, SQLParserRULE_update_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + p.SetState(645) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserWITH_ { + { + p.SetState(644) + p.Common_table_stmt() + } + + } + { + p.SetState(647) + p.Update_core() + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IColumn_name_listContext is an interface to support dynamic dispatch. +type IColumn_name_listContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + OPEN_PAR() antlr.TerminalNode + AllColumn_name() []IColumn_nameContext + Column_name(i int) IColumn_nameContext + CLOSE_PAR() antlr.TerminalNode + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsColumn_name_listContext differentiates from other interfaces. + IsColumn_name_listContext() +} + +type Column_name_listContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyColumn_name_listContext() *Column_name_listContext { + var p = new(Column_name_listContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_name_list + return p +} + +func InitEmptyColumn_name_listContext(p *Column_name_listContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_name_list +} + +func (*Column_name_listContext) IsColumn_name_listContext() {} + +func NewColumn_name_listContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Column_name_listContext { + var p = new(Column_name_listContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_column_name_list + + return p +} + +func (s *Column_name_listContext) GetParser() antlr.Parser { return s.parser } + +func (s *Column_name_listContext) OPEN_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserOPEN_PAR, 0) +} + +func (s *Column_name_listContext) AllColumn_name() []IColumn_nameContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IColumn_nameContext); ok { + len++ + } + } + + tst := make([]IColumn_nameContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IColumn_nameContext); ok { + tst[i] = t.(IColumn_nameContext) + i++ + } + } + + return tst +} + +func (s *Column_name_listContext) Column_name(i int) IColumn_nameContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IColumn_nameContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IColumn_nameContext) +} + +func (s *Column_name_listContext) CLOSE_PAR() antlr.TerminalNode { + return s.GetToken(SQLParserCLOSE_PAR, 0) +} + +func (s *Column_name_listContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Column_name_listContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Column_name_listContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Column_name_listContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Column_name_listContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitColumn_name_list(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Column_name_list() (localctx IColumn_name_listContext) { + localctx = NewColumn_name_listContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 88, SQLParserRULE_column_name_list) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(649) + p.Match(SQLParserOPEN_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(650) + p.Column_name() + } + p.SetState(655) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(651) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(652) + p.Column_name() + } + + p.SetState(657) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(658) + p.Match(SQLParserCLOSE_PAR) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IQualified_table_nameContext is an interface to support dynamic dispatch. +type IQualified_table_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Table_name() ITable_nameContext + AS_() antlr.TerminalNode + Table_alias() ITable_aliasContext + + // IsQualified_table_nameContext differentiates from other interfaces. + IsQualified_table_nameContext() +} + +type Qualified_table_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyQualified_table_nameContext() *Qualified_table_nameContext { + var p = new(Qualified_table_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_qualified_table_name + return p +} + +func InitEmptyQualified_table_nameContext(p *Qualified_table_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_qualified_table_name +} + +func (*Qualified_table_nameContext) IsQualified_table_nameContext() {} + +func NewQualified_table_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Qualified_table_nameContext { + var p = new(Qualified_table_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_qualified_table_name + + return p +} + +func (s *Qualified_table_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Qualified_table_nameContext) Table_name() ITable_nameContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_nameContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_nameContext) +} + +func (s *Qualified_table_nameContext) AS_() antlr.TerminalNode { + return s.GetToken(SQLParserAS_, 0) +} + +func (s *Qualified_table_nameContext) Table_alias() ITable_aliasContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITable_aliasContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITable_aliasContext) +} + +func (s *Qualified_table_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Qualified_table_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Qualified_table_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitQualified_table_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Qualified_table_name() (localctx IQualified_table_nameContext) { + localctx = NewQualified_table_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 90, SQLParserRULE_qualified_table_name) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(660) + p.Table_name() + } + p.SetState(663) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserAS_ { + { + p.SetState(661) + p.Match(SQLParserAS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(662) + p.Table_alias() + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IOrder_by_stmtContext is an interface to support dynamic dispatch. +type IOrder_by_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + ORDER_() antlr.TerminalNode + BY_() antlr.TerminalNode + AllOrdering_term() []IOrdering_termContext + Ordering_term(i int) IOrdering_termContext + AllCOMMA() []antlr.TerminalNode + COMMA(i int) antlr.TerminalNode + + // IsOrder_by_stmtContext differentiates from other interfaces. + IsOrder_by_stmtContext() +} + +type Order_by_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyOrder_by_stmtContext() *Order_by_stmtContext { + var p = new(Order_by_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_order_by_stmt + return p +} + +func InitEmptyOrder_by_stmtContext(p *Order_by_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_order_by_stmt +} + +func (*Order_by_stmtContext) IsOrder_by_stmtContext() {} + +func NewOrder_by_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Order_by_stmtContext { + var p = new(Order_by_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_order_by_stmt + + return p +} + +func (s *Order_by_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Order_by_stmtContext) ORDER_() antlr.TerminalNode { + return s.GetToken(SQLParserORDER_, 0) +} + +func (s *Order_by_stmtContext) BY_() antlr.TerminalNode { + return s.GetToken(SQLParserBY_, 0) +} + +func (s *Order_by_stmtContext) AllOrdering_term() []IOrdering_termContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IOrdering_termContext); ok { + len++ + } + } + + tst := make([]IOrdering_termContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IOrdering_termContext); ok { + tst[i] = t.(IOrdering_termContext) + i++ + } + } + + return tst +} + +func (s *Order_by_stmtContext) Ordering_term(i int) IOrdering_termContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IOrdering_termContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IOrdering_termContext) +} + +func (s *Order_by_stmtContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(SQLParserCOMMA) +} + +func (s *Order_by_stmtContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(SQLParserCOMMA, i) +} + +func (s *Order_by_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Order_by_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Order_by_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitOrder_by_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Order_by_stmt() (localctx IOrder_by_stmtContext) { + localctx = NewOrder_by_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 92, SQLParserRULE_order_by_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(665) + p.Match(SQLParserORDER_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(666) + p.Match(SQLParserBY_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(667) + p.Ordering_term() + } + p.SetState(672) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + for _la == SQLParserCOMMA { + { + p.SetState(668) + p.Match(SQLParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(669) + p.Ordering_term() + } + + p.SetState(674) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ILimit_stmtContext is an interface to support dynamic dispatch. +type ILimit_stmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + LIMIT_() antlr.TerminalNode + AllExpr() []IExprContext + Expr(i int) IExprContext + OFFSET_() antlr.TerminalNode + + // IsLimit_stmtContext differentiates from other interfaces. + IsLimit_stmtContext() +} + +type Limit_stmtContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyLimit_stmtContext() *Limit_stmtContext { + var p = new(Limit_stmtContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_limit_stmt + return p +} + +func InitEmptyLimit_stmtContext(p *Limit_stmtContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_limit_stmt +} + +func (*Limit_stmtContext) IsLimit_stmtContext() {} + +func NewLimit_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Limit_stmtContext { + var p = new(Limit_stmtContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_limit_stmt + + return p +} + +func (s *Limit_stmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *Limit_stmtContext) LIMIT_() antlr.TerminalNode { + return s.GetToken(SQLParserLIMIT_, 0) +} + +func (s *Limit_stmtContext) AllExpr() []IExprContext { + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } + + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { + tst[i] = t.(IExprContext) + i++ + } + } + + return tst +} + +func (s *Limit_stmtContext) Expr(i int) IExprContext { + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Limit_stmtContext) OFFSET_() antlr.TerminalNode { + return s.GetToken(SQLParserOFFSET_, 0) +} + +func (s *Limit_stmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Limit_stmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Limit_stmtContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitLimit_stmt(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Limit_stmt() (localctx ILimit_stmtContext) { + localctx = NewLimit_stmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 94, SQLParserRULE_limit_stmt) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(675) + p.Match(SQLParserLIMIT_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(676) + p.expr(0) + } + p.SetState(679) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserOFFSET_ { + { + p.SetState(677) + p.Match(SQLParserOFFSET_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(678) + p.expr(0) + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IOrdering_termContext is an interface to support dynamic dispatch. +type IOrdering_termContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Expr() IExprContext + Asc_desc() IAsc_descContext + NULLS_() antlr.TerminalNode + FIRST_() antlr.TerminalNode + LAST_() antlr.TerminalNode + + // IsOrdering_termContext differentiates from other interfaces. + IsOrdering_termContext() +} + +type Ordering_termContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyOrdering_termContext() *Ordering_termContext { + var p = new(Ordering_termContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_ordering_term + return p +} + +func InitEmptyOrdering_termContext(p *Ordering_termContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_ordering_term +} + +func (*Ordering_termContext) IsOrdering_termContext() {} + +func NewOrdering_termContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Ordering_termContext { + var p = new(Ordering_termContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_ordering_term + + return p +} + +func (s *Ordering_termContext) GetParser() antlr.Parser { return s.parser } + +func (s *Ordering_termContext) Expr() IExprContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *Ordering_termContext) Asc_desc() IAsc_descContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IAsc_descContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IAsc_descContext) +} + +func (s *Ordering_termContext) NULLS_() antlr.TerminalNode { + return s.GetToken(SQLParserNULLS_, 0) +} + +func (s *Ordering_termContext) FIRST_() antlr.TerminalNode { + return s.GetToken(SQLParserFIRST_, 0) +} + +func (s *Ordering_termContext) LAST_() antlr.TerminalNode { + return s.GetToken(SQLParserLAST_, 0) +} + +func (s *Ordering_termContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Ordering_termContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Ordering_termContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitOrdering_term(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Ordering_term() (localctx IOrdering_termContext) { + localctx = NewOrdering_termContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 96, SQLParserRULE_ordering_term) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(681) + p.expr(0) + } + p.SetState(683) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserASC_ || _la == SQLParserDESC_ { + { + p.SetState(682) + p.Asc_desc() + } + + } + p.SetState(687) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == SQLParserNULLS_ { + { + p.SetState(685) + p.Match(SQLParserNULLS_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(686) + _la = p.GetTokenStream().LA(1) + + if !(_la == SQLParserFIRST_ || _la == SQLParserLAST_) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IAsc_descContext is an interface to support dynamic dispatch. +type IAsc_descContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + ASC_() antlr.TerminalNode + DESC_() antlr.TerminalNode + + // IsAsc_descContext differentiates from other interfaces. + IsAsc_descContext() +} + +type Asc_descContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyAsc_descContext() *Asc_descContext { + var p = new(Asc_descContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_asc_desc + return p +} + +func InitEmptyAsc_descContext(p *Asc_descContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_asc_desc +} + +func (*Asc_descContext) IsAsc_descContext() {} + +func NewAsc_descContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Asc_descContext { + var p = new(Asc_descContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_asc_desc + + return p +} + +func (s *Asc_descContext) GetParser() antlr.Parser { return s.parser } + +func (s *Asc_descContext) ASC_() antlr.TerminalNode { + return s.GetToken(SQLParserASC_, 0) +} + +func (s *Asc_descContext) DESC_() antlr.TerminalNode { + return s.GetToken(SQLParserDESC_, 0) +} + +func (s *Asc_descContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Asc_descContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Asc_descContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitAsc_desc(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Asc_desc() (localctx IAsc_descContext) { + localctx = NewAsc_descContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 98, SQLParserRULE_asc_desc) + var _la int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(689) + _la = p.GetTokenStream().LA(1) + + if !(_la == SQLParserASC_ || _la == SQLParserDESC_) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IFunction_keywordContext is an interface to support dynamic dispatch. +type IFunction_keywordContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + LIKE_() antlr.TerminalNode + REPLACE_() antlr.TerminalNode + + // IsFunction_keywordContext differentiates from other interfaces. + IsFunction_keywordContext() +} + +type Function_keywordContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyFunction_keywordContext() *Function_keywordContext { + var p = new(Function_keywordContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_function_keyword + return p +} + +func InitEmptyFunction_keywordContext(p *Function_keywordContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_function_keyword +} + +func (*Function_keywordContext) IsFunction_keywordContext() {} + +func NewFunction_keywordContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Function_keywordContext { + var p = new(Function_keywordContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_function_keyword + + return p +} + +func (s *Function_keywordContext) GetParser() antlr.Parser { return s.parser } + +func (s *Function_keywordContext) LIKE_() antlr.TerminalNode { + return s.GetToken(SQLParserLIKE_, 0) +} + +func (s *Function_keywordContext) REPLACE_() antlr.TerminalNode { + return s.GetToken(SQLParserREPLACE_, 0) +} + +func (s *Function_keywordContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Function_keywordContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Function_keywordContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitFunction_keyword(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Function_keyword() (localctx IFunction_keywordContext) { + localctx = NewFunction_keywordContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 100, SQLParserRULE_function_keyword) + p.SetState(694) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserOPEN_PAR: + p.EnterOuterAlt(localctx, 1) + + case SQLParserLIKE_: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(692) + p.Match(SQLParserLIKE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserREPLACE_: + p.EnterOuterAlt(localctx, 3) + { + p.SetState(693) + p.Match(SQLParserREPLACE_) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IFunction_nameContext is an interface to support dynamic dispatch. +type IFunction_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + Function_keyword() IFunction_keywordContext + + // IsFunction_nameContext differentiates from other interfaces. + IsFunction_nameContext() +} + +type Function_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyFunction_nameContext() *Function_nameContext { + var p = new(Function_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_function_name + return p +} + +func InitEmptyFunction_nameContext(p *Function_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_function_name +} + +func (*Function_nameContext) IsFunction_nameContext() {} + +func NewFunction_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Function_nameContext { + var p = new(Function_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_function_name + + return p +} + +func (s *Function_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Function_nameContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Function_nameContext) Function_keyword() IFunction_keywordContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IFunction_keywordContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IFunction_keywordContext) +} + +func (s *Function_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Function_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Function_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitFunction_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Function_name() (localctx IFunction_nameContext) { + localctx = NewFunction_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 102, SQLParserRULE_function_name) + p.SetState(698) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + + switch p.GetTokenStream().LA(1) { + case SQLParserIDENTIFIER: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(696) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case SQLParserOPEN_PAR, SQLParserLIKE_, SQLParserREPLACE_: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(697) + p.Function_keyword() + } + + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ITable_nameContext is an interface to support dynamic dispatch. +type ITable_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsTable_nameContext differentiates from other interfaces. + IsTable_nameContext() +} + +type Table_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyTable_nameContext() *Table_nameContext { + var p = new(Table_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_table_name + return p +} + +func InitEmptyTable_nameContext(p *Table_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_table_name +} + +func (*Table_nameContext) IsTable_nameContext() {} + +func NewTable_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Table_nameContext { + var p = new(Table_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_table_name + + return p +} + +func (s *Table_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Table_nameContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Table_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Table_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Table_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitTable_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Table_name() (localctx ITable_nameContext) { + localctx = NewTable_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 104, SQLParserRULE_table_name) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(700) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ITable_aliasContext is an interface to support dynamic dispatch. +type ITable_aliasContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsTable_aliasContext differentiates from other interfaces. + IsTable_aliasContext() +} + +type Table_aliasContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyTable_aliasContext() *Table_aliasContext { + var p = new(Table_aliasContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_table_alias + return p +} + +func InitEmptyTable_aliasContext(p *Table_aliasContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_table_alias +} + +func (*Table_aliasContext) IsTable_aliasContext() {} + +func NewTable_aliasContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Table_aliasContext { + var p = new(Table_aliasContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_table_alias + + return p +} + +func (s *Table_aliasContext) GetParser() antlr.Parser { return s.parser } + +func (s *Table_aliasContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Table_aliasContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Table_aliasContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Table_aliasContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitTable_alias(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Table_alias() (localctx ITable_aliasContext) { + localctx = NewTable_aliasContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 106, SQLParserRULE_table_alias) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(702) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IColumn_nameContext is an interface to support dynamic dispatch. +type IColumn_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsColumn_nameContext differentiates from other interfaces. + IsColumn_nameContext() +} + +type Column_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyColumn_nameContext() *Column_nameContext { + var p = new(Column_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_name + return p +} + +func InitEmptyColumn_nameContext(p *Column_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_name +} + +func (*Column_nameContext) IsColumn_nameContext() {} + +func NewColumn_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Column_nameContext { + var p = new(Column_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_column_name + + return p +} + +func (s *Column_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Column_nameContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Column_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Column_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Column_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitColumn_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Column_name() (localctx IColumn_nameContext) { + localctx = NewColumn_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 108, SQLParserRULE_column_name) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(704) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IColumn_aliasContext is an interface to support dynamic dispatch. +type IColumn_aliasContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsColumn_aliasContext differentiates from other interfaces. + IsColumn_aliasContext() +} + +type Column_aliasContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyColumn_aliasContext() *Column_aliasContext { + var p = new(Column_aliasContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_alias + return p +} + +func InitEmptyColumn_aliasContext(p *Column_aliasContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_column_alias +} + +func (*Column_aliasContext) IsColumn_aliasContext() {} + +func NewColumn_aliasContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Column_aliasContext { + var p = new(Column_aliasContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_column_alias + + return p +} + +func (s *Column_aliasContext) GetParser() antlr.Parser { return s.parser } + +func (s *Column_aliasContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Column_aliasContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Column_aliasContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Column_aliasContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitColumn_alias(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Column_alias() (localctx IColumn_aliasContext) { + localctx = NewColumn_aliasContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 110, SQLParserRULE_column_alias) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(706) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// ICollation_nameContext is an interface to support dynamic dispatch. +type ICollation_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsCollation_nameContext differentiates from other interfaces. + IsCollation_nameContext() +} + +type Collation_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyCollation_nameContext() *Collation_nameContext { + var p = new(Collation_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_collation_name + return p +} + +func InitEmptyCollation_nameContext(p *Collation_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_collation_name +} + +func (*Collation_nameContext) IsCollation_nameContext() {} + +func NewCollation_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Collation_nameContext { + var p = new(Collation_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_collation_name + + return p +} + +func (s *Collation_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Collation_nameContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Collation_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Collation_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Collation_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitCollation_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Collation_name() (localctx ICollation_nameContext) { + localctx = NewCollation_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 112, SQLParserRULE_collation_name) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(708) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IIndex_nameContext is an interface to support dynamic dispatch. +type IIndex_nameContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + IDENTIFIER() antlr.TerminalNode + + // IsIndex_nameContext differentiates from other interfaces. + IsIndex_nameContext() +} + +type Index_nameContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyIndex_nameContext() *Index_nameContext { + var p = new(Index_nameContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_index_name + return p +} + +func InitEmptyIndex_nameContext(p *Index_nameContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = SQLParserRULE_index_name +} + +func (*Index_nameContext) IsIndex_nameContext() {} + +func NewIndex_nameContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Index_nameContext { + var p = new(Index_nameContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = SQLParserRULE_index_name + + return p +} + +func (s *Index_nameContext) GetParser() antlr.Parser { return s.parser } + +func (s *Index_nameContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(SQLParserIDENTIFIER, 0) +} + +func (s *Index_nameContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *Index_nameContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *Index_nameContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case SQLParserVisitor: + return t.VisitIndex_name(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *SQLParser) Index_name() (localctx IIndex_nameContext) { + localctx = NewIndex_nameContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 114, SQLParserRULE_index_name) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(710) + p.Match(SQLParserIDENTIFIER) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +func (p *SQLParser) Sempred(localctx antlr.RuleContext, ruleIndex, predIndex int) bool { + switch ruleIndex { + case 13: + var t *ExprContext = nil + if localctx != nil { + t = localctx.(*ExprContext) + } + return p.Expr_Sempred(t, predIndex) + + default: + panic("No predicate with index: " + fmt.Sprint(ruleIndex)) + } +} + +func (p *SQLParser) Expr_Sempred(localctx antlr.RuleContext, predIndex int) bool { + switch predIndex { + case 0: + return p.Precpred(p.GetParserRuleContext(), 12) + + case 1: + return p.Precpred(p.GetParserRuleContext(), 11) + + case 2: + return p.Precpred(p.GetParserRuleContext(), 8) + + case 3: + return p.Precpred(p.GetParserRuleContext(), 6) + + case 4: + return p.Precpred(p.GetParserRuleContext(), 2) + + case 5: + return p.Precpred(p.GetParserRuleContext(), 1) + + case 6: + return p.Precpred(p.GetParserRuleContext(), 18) + + case 7: + return p.Precpred(p.GetParserRuleContext(), 10) + + case 8: + return p.Precpred(p.GetParserRuleContext(), 9) + + case 9: + return p.Precpred(p.GetParserRuleContext(), 7) + + case 10: + return p.Precpred(p.GetParserRuleContext(), 5) + + case 11: + return p.Precpred(p.GetParserRuleContext(), 4) + + default: + panic("No predicate with index: " + fmt.Sprint(predIndex)) + } +} diff --git a/parse/sql/grammar/sqlparser_base_visitor.go b/parse/sql/grammar/sqlparser_base_visitor.go new file mode 100644 index 000000000..fc4cef2dd --- /dev/null +++ b/parse/sql/grammar/sqlparser_base_visitor.go @@ -0,0 +1,316 @@ +// Code generated from SQLParser.g4 by ANTLR 4.13.1. DO NOT EDIT. + +package grammar // SQLParser +import "github.com/antlr4-go/antlr/v4" + +type BaseSQLParserVisitor struct { + *antlr.BaseParseTreeVisitor +} + +func (v *BaseSQLParserVisitor) VisitStatements(ctx *StatementsContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSql_stmt_list(ctx *Sql_stmt_listContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSql_stmt(ctx *Sql_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitIndexed_column(ctx *Indexed_columnContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCte_table_name(ctx *Cte_table_nameContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCommon_table_expression(ctx *Common_table_expressionContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCommon_table_stmt(ctx *Common_table_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitDelete_core(ctx *Delete_coreContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitDelete_stmt(ctx *Delete_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitVariable(ctx *VariableContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitFunction_call(ctx *Function_callContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitColumn_ref(ctx *Column_refContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitWhen_clause(ctx *When_clauseContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSubquery_expr(ctx *Subquery_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitLogical_not_expr(ctx *Logical_not_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitComparison_expr(ctx *Comparison_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitLike_expr(ctx *Like_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitNull_expr(ctx *Null_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitColumn_expr(ctx *Column_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitIn_subquery_expr(ctx *In_subquery_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitArithmetic_expr(ctx *Arithmetic_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitLogical_binary_expr(ctx *Logical_binary_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitVariable_expr(ctx *Variable_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitUnary_expr(ctx *Unary_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCollate_expr(ctx *Collate_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitParenthesized_expr(ctx *Parenthesized_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitBetween_expr(ctx *Between_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitExpr_list_expr(ctx *Expr_list_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitIn_list_expr(ctx *In_list_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitLiteral_expr(ctx *Literal_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitIs_expr(ctx *Is_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCase_expr(ctx *Case_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitFunction_expr(ctx *Function_exprContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSubquery(ctx *SubqueryContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitExpr_list(ctx *Expr_listContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitComparisonOperator(ctx *ComparisonOperatorContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCast_type(ctx *Cast_typeContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitType_cast(ctx *Type_castContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitBoolean_value(ctx *Boolean_valueContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitString_value(ctx *String_valueContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitNumeric_value(ctx *Numeric_valueContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitLiteral(ctx *LiteralContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitValue_row(ctx *Value_rowContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitValues_clause(ctx *Values_clauseContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitInsert_core(ctx *Insert_coreContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitInsert_stmt(ctx *Insert_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitReturning_clause(ctx *Returning_clauseContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitUpsert_update(ctx *Upsert_updateContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitUpsert_clause(ctx *Upsert_clauseContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSelect_stmt_no_cte(ctx *Select_stmt_no_cteContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSelect_stmt(ctx *Select_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitJoin_relation(ctx *Join_relationContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitRelation(ctx *RelationContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitSelect_core(ctx *Select_coreContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitTable_or_subquery(ctx *Table_or_subqueryContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitResult_column(ctx *Result_columnContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitReturning_clause_result_column(ctx *Returning_clause_result_columnContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitJoin_operator(ctx *Join_operatorContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitJoin_constraint(ctx *Join_constraintContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCompound_operator(ctx *Compound_operatorContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitUpdate_set_subclause(ctx *Update_set_subclauseContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitUpdate_core(ctx *Update_coreContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitUpdate_stmt(ctx *Update_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitColumn_name_list(ctx *Column_name_listContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitQualified_table_name(ctx *Qualified_table_nameContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitOrder_by_stmt(ctx *Order_by_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitLimit_stmt(ctx *Limit_stmtContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitOrdering_term(ctx *Ordering_termContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitAsc_desc(ctx *Asc_descContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitFunction_keyword(ctx *Function_keywordContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitFunction_name(ctx *Function_nameContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitTable_name(ctx *Table_nameContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitTable_alias(ctx *Table_aliasContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitColumn_name(ctx *Column_nameContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitColumn_alias(ctx *Column_aliasContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitCollation_name(ctx *Collation_nameContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseSQLParserVisitor) VisitIndex_name(ctx *Index_nameContext) interface{} { + return v.VisitChildren(ctx) +} diff --git a/parse/sql/grammar/sqlparser_visitor.go b/parse/sql/grammar/sqlparser_visitor.go new file mode 100644 index 000000000..7fba20ea2 --- /dev/null +++ b/parse/sql/grammar/sqlparser_visitor.go @@ -0,0 +1,240 @@ +// Code generated from SQLParser.g4 by ANTLR 4.13.1. DO NOT EDIT. + +package grammar // SQLParser +import "github.com/antlr4-go/antlr/v4" + +// A complete Visitor for a parse tree produced by SQLParser. +type SQLParserVisitor interface { + antlr.ParseTreeVisitor + + // Visit a parse tree produced by SQLParser#statements. + VisitStatements(ctx *StatementsContext) interface{} + + // Visit a parse tree produced by SQLParser#sql_stmt_list. + VisitSql_stmt_list(ctx *Sql_stmt_listContext) interface{} + + // Visit a parse tree produced by SQLParser#sql_stmt. + VisitSql_stmt(ctx *Sql_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#indexed_column. + VisitIndexed_column(ctx *Indexed_columnContext) interface{} + + // Visit a parse tree produced by SQLParser#cte_table_name. + VisitCte_table_name(ctx *Cte_table_nameContext) interface{} + + // Visit a parse tree produced by SQLParser#common_table_expression. + VisitCommon_table_expression(ctx *Common_table_expressionContext) interface{} + + // Visit a parse tree produced by SQLParser#common_table_stmt. + VisitCommon_table_stmt(ctx *Common_table_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#delete_core. + VisitDelete_core(ctx *Delete_coreContext) interface{} + + // Visit a parse tree produced by SQLParser#delete_stmt. + VisitDelete_stmt(ctx *Delete_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#variable. + VisitVariable(ctx *VariableContext) interface{} + + // Visit a parse tree produced by SQLParser#function_call. + VisitFunction_call(ctx *Function_callContext) interface{} + + // Visit a parse tree produced by SQLParser#column_ref. + VisitColumn_ref(ctx *Column_refContext) interface{} + + // Visit a parse tree produced by SQLParser#when_clause. + VisitWhen_clause(ctx *When_clauseContext) interface{} + + // Visit a parse tree produced by SQLParser#subquery_expr. + VisitSubquery_expr(ctx *Subquery_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#logical_not_expr. + VisitLogical_not_expr(ctx *Logical_not_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#comparison_expr. + VisitComparison_expr(ctx *Comparison_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#like_expr. + VisitLike_expr(ctx *Like_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#null_expr. + VisitNull_expr(ctx *Null_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#column_expr. + VisitColumn_expr(ctx *Column_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#in_subquery_expr. + VisitIn_subquery_expr(ctx *In_subquery_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#arithmetic_expr. + VisitArithmetic_expr(ctx *Arithmetic_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#logical_binary_expr. + VisitLogical_binary_expr(ctx *Logical_binary_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#variable_expr. + VisitVariable_expr(ctx *Variable_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#unary_expr. + VisitUnary_expr(ctx *Unary_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#collate_expr. + VisitCollate_expr(ctx *Collate_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#parenthesized_expr. + VisitParenthesized_expr(ctx *Parenthesized_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#between_expr. + VisitBetween_expr(ctx *Between_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#expr_list_expr. + VisitExpr_list_expr(ctx *Expr_list_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#in_list_expr. + VisitIn_list_expr(ctx *In_list_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#literal_expr. + VisitLiteral_expr(ctx *Literal_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#is_expr. + VisitIs_expr(ctx *Is_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#case_expr. + VisitCase_expr(ctx *Case_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#function_expr. + VisitFunction_expr(ctx *Function_exprContext) interface{} + + // Visit a parse tree produced by SQLParser#subquery. + VisitSubquery(ctx *SubqueryContext) interface{} + + // Visit a parse tree produced by SQLParser#expr_list. + VisitExpr_list(ctx *Expr_listContext) interface{} + + // Visit a parse tree produced by SQLParser#comparisonOperator. + VisitComparisonOperator(ctx *ComparisonOperatorContext) interface{} + + // Visit a parse tree produced by SQLParser#cast_type. + VisitCast_type(ctx *Cast_typeContext) interface{} + + // Visit a parse tree produced by SQLParser#type_cast. + VisitType_cast(ctx *Type_castContext) interface{} + + // Visit a parse tree produced by SQLParser#boolean_value. + VisitBoolean_value(ctx *Boolean_valueContext) interface{} + + // Visit a parse tree produced by SQLParser#string_value. + VisitString_value(ctx *String_valueContext) interface{} + + // Visit a parse tree produced by SQLParser#numeric_value. + VisitNumeric_value(ctx *Numeric_valueContext) interface{} + + // Visit a parse tree produced by SQLParser#literal. + VisitLiteral(ctx *LiteralContext) interface{} + + // Visit a parse tree produced by SQLParser#value_row. + VisitValue_row(ctx *Value_rowContext) interface{} + + // Visit a parse tree produced by SQLParser#values_clause. + VisitValues_clause(ctx *Values_clauseContext) interface{} + + // Visit a parse tree produced by SQLParser#insert_core. + VisitInsert_core(ctx *Insert_coreContext) interface{} + + // Visit a parse tree produced by SQLParser#insert_stmt. + VisitInsert_stmt(ctx *Insert_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#returning_clause. + VisitReturning_clause(ctx *Returning_clauseContext) interface{} + + // Visit a parse tree produced by SQLParser#upsert_update. + VisitUpsert_update(ctx *Upsert_updateContext) interface{} + + // Visit a parse tree produced by SQLParser#upsert_clause. + VisitUpsert_clause(ctx *Upsert_clauseContext) interface{} + + // Visit a parse tree produced by SQLParser#select_stmt_no_cte. + VisitSelect_stmt_no_cte(ctx *Select_stmt_no_cteContext) interface{} + + // Visit a parse tree produced by SQLParser#select_stmt. + VisitSelect_stmt(ctx *Select_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#join_relation. + VisitJoin_relation(ctx *Join_relationContext) interface{} + + // Visit a parse tree produced by SQLParser#relation. + VisitRelation(ctx *RelationContext) interface{} + + // Visit a parse tree produced by SQLParser#select_core. + VisitSelect_core(ctx *Select_coreContext) interface{} + + // Visit a parse tree produced by SQLParser#table_or_subquery. + VisitTable_or_subquery(ctx *Table_or_subqueryContext) interface{} + + // Visit a parse tree produced by SQLParser#result_column. + VisitResult_column(ctx *Result_columnContext) interface{} + + // Visit a parse tree produced by SQLParser#returning_clause_result_column. + VisitReturning_clause_result_column(ctx *Returning_clause_result_columnContext) interface{} + + // Visit a parse tree produced by SQLParser#join_operator. + VisitJoin_operator(ctx *Join_operatorContext) interface{} + + // Visit a parse tree produced by SQLParser#join_constraint. + VisitJoin_constraint(ctx *Join_constraintContext) interface{} + + // Visit a parse tree produced by SQLParser#compound_operator. + VisitCompound_operator(ctx *Compound_operatorContext) interface{} + + // Visit a parse tree produced by SQLParser#update_set_subclause. + VisitUpdate_set_subclause(ctx *Update_set_subclauseContext) interface{} + + // Visit a parse tree produced by SQLParser#update_core. + VisitUpdate_core(ctx *Update_coreContext) interface{} + + // Visit a parse tree produced by SQLParser#update_stmt. + VisitUpdate_stmt(ctx *Update_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#column_name_list. + VisitColumn_name_list(ctx *Column_name_listContext) interface{} + + // Visit a parse tree produced by SQLParser#qualified_table_name. + VisitQualified_table_name(ctx *Qualified_table_nameContext) interface{} + + // Visit a parse tree produced by SQLParser#order_by_stmt. + VisitOrder_by_stmt(ctx *Order_by_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#limit_stmt. + VisitLimit_stmt(ctx *Limit_stmtContext) interface{} + + // Visit a parse tree produced by SQLParser#ordering_term. + VisitOrdering_term(ctx *Ordering_termContext) interface{} + + // Visit a parse tree produced by SQLParser#asc_desc. + VisitAsc_desc(ctx *Asc_descContext) interface{} + + // Visit a parse tree produced by SQLParser#function_keyword. + VisitFunction_keyword(ctx *Function_keywordContext) interface{} + + // Visit a parse tree produced by SQLParser#function_name. + VisitFunction_name(ctx *Function_nameContext) interface{} + + // Visit a parse tree produced by SQLParser#table_name. + VisitTable_name(ctx *Table_nameContext) interface{} + + // Visit a parse tree produced by SQLParser#table_alias. + VisitTable_alias(ctx *Table_aliasContext) interface{} + + // Visit a parse tree produced by SQLParser#column_name. + VisitColumn_name(ctx *Column_nameContext) interface{} + + // Visit a parse tree produced by SQLParser#column_alias. + VisitColumn_alias(ctx *Column_aliasContext) interface{} + + // Visit a parse tree produced by SQLParser#collation_name. + VisitCollation_name(ctx *Collation_nameContext) interface{} + + // Visit a parse tree produced by SQLParser#index_name. + VisitIndex_name(ctx *Index_nameContext) interface{} +} diff --git a/parse/sql/parser.go b/parse/sql/parser.go index d4f94a381..945ab13c4 100644 --- a/parse/sql/parser.go +++ b/parse/sql/parser.go @@ -5,8 +5,8 @@ import ( "github.com/antlr4-go/antlr/v4" + "github.com/kwilteam/kwil-db/parse/sql/grammar" "github.com/kwilteam/kwil-db/parse/sql/tree" - "github.com/kwilteam/sql-grammar-go/sqlgrammar" ) // Parse parses a raw sql string and returns a tree.Statement @@ -25,9 +25,9 @@ func ParseSql(sql string, currentLine int, errorListener *ErrorListener, } stream := antlr.NewInputStream(sql) - lexer := sqlgrammar.NewSQLLexer(stream) + lexer := grammar.NewSQLLexer(stream) tokenStream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel) - p := sqlgrammar.NewSQLParser(tokenStream) + p := grammar.NewSQLParser(tokenStream) // remove default error visitor p.RemoveErrorListeners() diff --git a/test/go.mod b/test/go.mod index ce313d0a8..b7b80672e 100644 --- a/test/go.mod +++ b/test/go.mod @@ -137,7 +137,6 @@ require ( github.com/klauspost/compress v1.17.0 // indirect github.com/kwilteam/action-grammar-go v0.1.1 // indirect github.com/kwilteam/kwil-db/parse v0.1.2 // indirect - github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect diff --git a/test/go.sum b/test/go.sum index c9401e828..a9deba3df 100644 --- a/test/go.sum +++ b/test/go.sum @@ -476,8 +476,6 @@ github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4Exm github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7jB33zFgCXxqCwea12LcPUiNmpghLTfU9Eg= github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e h1:N7/8ZzPZ5QopHx1ZfPluA5nFNPqbc+LDpuyblptFlWk= -github.com/kwilteam/sql-grammar-go v0.1.1-0.20240322195734-92fa1ff3df1e/go.mod h1:A9AXaH5Vl/uPsY88fWqvU9O7z7P4YfvndaGyc8s//2s= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= From d74d4adf3a91a5672a4801d4160b8ba9a3a748f9 Mon Sep 17 00:00:00 2001 From: Yaiba <4yaiba@gmail.com> Date: Mon, 25 Mar 2024 11:29:06 -0500 Subject: [PATCH 5/7] update kuneiform version --- go.mod | 2 +- go.sum | 4 ++-- test/go.mod | 2 +- test/go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8fa4b651b..ee526f48d 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/jackc/pglogrepl v0.0.0-20231111135425-1627ab1b5780 github.com/jackc/pgx/v5 v5.5.2 github.com/jpillora/backoff v1.0.0 - github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a + github.com/kwilteam/kuneiform v0.6.1-0.20240325162722-e0e0101eca92 github.com/kwilteam/kwil-db/core v0.1.0 github.com/kwilteam/kwil-db/parse v0.1.2 github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 diff --git a/go.sum b/go.sum index c1984246d..b9958c73b 100644 --- a/go.sum +++ b/go.sum @@ -274,8 +274,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7jB33zFgCXxqCwea12LcPUiNmpghLTfU9Eg= -github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= +github.com/kwilteam/kuneiform v0.6.1-0.20240325162722-e0e0101eca92 h1:RoFJdrFt0zI6Y1t23PUTMYgykhCPlEOzxQ4nEd+ymFI= +github.com/kwilteam/kuneiform v0.6.1-0.20240325162722-e0e0101eca92/go.mod h1:+9V+E5I5sEL643ZHaeiF6bVCJqp56lGti+wXZdJ/YYQ= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7 h1:YiPBu0pOeYOtOVfwKQqdWB07SUef9LvngF4bVFD+x34= github.com/kwilteam/kwil-extensions v0.0.0-20230727040522-1cfd930226b7/go.mod h1:+BrFrV+3qcdYIfptqjwatE5gT19azuRHJzw77wMPY8c= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= diff --git a/test/go.mod b/test/go.mod index b7b80672e..60c44065b 100644 --- a/test/go.mod +++ b/test/go.mod @@ -16,7 +16,7 @@ require ( github.com/docker/go-connections v0.4.0 github.com/drhodes/golorem v0.0.0-20220328165741-da82e5b29246 github.com/ethereum/go-ethereum v1.13.8 - github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a + github.com/kwilteam/kuneiform v0.6.1-0.20240325162722-e0e0101eca92 github.com/kwilteam/kwil-db v0.7.0-beta.0.20240301172606-26b70b87eba0 github.com/kwilteam/kwil-db/core v0.1.0 github.com/stretchr/testify v1.8.4 diff --git a/test/go.sum b/test/go.sum index a9deba3df..e2e4c34cb 100644 --- a/test/go.sum +++ b/test/go.sum @@ -474,8 +474,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kwilteam/action-grammar-go v0.1.1 h1:0NeWrIN0B+pQMyiTwW/kWtqLWl7P4ExmfHwaXaJ14zI= github.com/kwilteam/action-grammar-go v0.1.1/go.mod h1:hHGHtnrJpASW9P+F7pdr/EP2M1Hxy1N9Wx/TmjVdV6I= -github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a h1:5JYY37OG7jB33zFgCXxqCwea12LcPUiNmpghLTfU9Eg= -github.com/kwilteam/kuneiform v0.6.1-0.20240313204201-b1d7646afc2a/go.mod h1:LrwGyaTqTZY1Mcv4hXIJ9t8IfdOf+ZowRdCDXHtiIqU= +github.com/kwilteam/kuneiform v0.6.1-0.20240325162722-e0e0101eca92 h1:RoFJdrFt0zI6Y1t23PUTMYgykhCPlEOzxQ4nEd+ymFI= +github.com/kwilteam/kuneiform v0.6.1-0.20240325162722-e0e0101eca92/go.mod h1:+9V+E5I5sEL643ZHaeiF6bVCJqp56lGti+wXZdJ/YYQ= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= From fff2e10c20ac85c7657f7fe503f0dd5ef1ec757c Mon Sep 17 00:00:00 2001 From: Brennan Lamey <66885902+brennanjl@users.noreply.github.com> Date: Mon, 25 Mar 2024 13:47:08 -0500 Subject: [PATCH 6/7] made select node names consistent --- internal/engine/execution/procedure.go | 4 +- .../sqlanalyzer/attributes/select_core.go | 6 +- internal/engine/sqlanalyzer/clean/walker.go | 4 +- internal/engine/sqlanalyzer/order/order.go | 16 +- parse/sql/ast_builder.go | 22 +- parse/sql/parser_test.go | 244 +++++++++--------- parse/sql/tree/CTE.go | 2 +- parse/sql/tree/CTE_test.go | 10 +- parse/sql/tree/ast_listener.go | 32 +-- parse/sql/tree/ast_visitor.go | 6 +- parse/sql/tree/expression.go | 2 +- parse/sql/tree/expression_test.go | 8 +- parse/sql/tree/relation.go | 2 +- parse/sql/tree/relation_test.go | 4 +- parse/sql/tree/select.go | 24 +- parse/sql/tree/select_test.go | 6 +- parse/sql/tree/update_test.go | 4 +- 17 files changed, 198 insertions(+), 198 deletions(-) diff --git a/internal/engine/execution/procedure.go b/internal/engine/execution/procedure.go index 6d3402cdb..21c002a8c 100644 --- a/internal/engine/execution/procedure.go +++ b/internal/engine/execution/procedure.go @@ -472,8 +472,8 @@ func makeExecutables(exprs []tree.Expression) ([]evaluatable, error) { // rather than "extended" execution mode, which asks the database for // OID (placeholder types) that it can't know since there's no FOR table. selectTree := &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ diff --git a/internal/engine/sqlanalyzer/attributes/select_core.go b/internal/engine/sqlanalyzer/attributes/select_core.go index 9c3faf149..ccd13bbf4 100644 --- a/internal/engine/sqlanalyzer/attributes/select_core.go +++ b/internal/engine/sqlanalyzer/attributes/select_core.go @@ -43,7 +43,7 @@ type RelationAttribute struct { // tbl1.col, col, col AS alias, col*5 AS alias, etc. // If a statement has "SELECT * FROM tbl", // then the result column expressions will be tbl.col_1, tbl.col_2, etc. -func GetSelectCoreRelationAttributes(selectCore *tree.SelectCore, tables []*common.Table) ([]*RelationAttribute, error) { +func GetSelectCoreRelationAttributes(selectCore *tree.SimpleSelect, tables []*common.Table) ([]*RelationAttribute, error) { walker := newSelectCoreWalker(tables) err := selectCore.Walk(walker) if err != nil { @@ -197,14 +197,14 @@ func newSelectCoreContext(parent *selectCoreContext) *selectCoreContext { } // EnterSelectCore creates a new scope. -func (s *selectCoreAnalyzer) EnterSelectCore(node *tree.SelectCore) error { +func (s *selectCoreAnalyzer) EnterSelectCore(node *tree.SimpleSelect) error { s.newScope() return nil } // ExitSelectCore pops the current scope. -func (s *selectCoreAnalyzer) ExitSelectCore(node *tree.SelectCore) error { +func (s *selectCoreAnalyzer) ExitSelectCore(node *tree.SimpleSelect) error { var err error s.detectedAttributes, err = s.context.relations() if err != nil { diff --git a/internal/engine/sqlanalyzer/clean/walker.go b/internal/engine/sqlanalyzer/clean/walker.go index f0359bc81..545d3a0ba 100644 --- a/internal/engine/sqlanalyzer/clean/walker.go +++ b/internal/engine/sqlanalyzer/clean/walker.go @@ -295,12 +295,12 @@ func (s *StatementCleaner) EnterSelectStmt(node *tree.SelectStmt) (err error) { } // EnterSelectCore validates the select type -func (s *StatementCleaner) EnterSelectCore(node *tree.SelectCore) (err error) { +func (s *StatementCleaner) EnterSelectCore(node *tree.SimpleSelect) (err error) { return wrapErr(ErrInvalidSelectType, node.SelectType.Valid()) } // EnterSelectStmt checks that, for each SelectCore besides the last, a compound operator is provided -func (s *StatementCleaner) EnterSelectStmtNoCte(node *tree.SelectStmtNoCte) (err error) { +func (s *StatementCleaner) EnterSelectStmtNoCte(node *tree.SelectCore) (err error) { for _, core := range node.SelectCores[:len(node.SelectCores)-1] { if core.Compound == nil { return wrapErr(ErrInvalidCompoundOperator, errors.New("compound operator must be provided for all SelectCores except the last")) diff --git a/internal/engine/sqlanalyzer/order/order.go b/internal/engine/sqlanalyzer/order/order.go index 25deed3f2..6f0df3de9 100644 --- a/internal/engine/sqlanalyzer/order/order.go +++ b/internal/engine/sqlanalyzer/order/order.go @@ -81,7 +81,7 @@ func (o *orderingWalker) EnterRelationSubquery(node *tree.RelationSubquery) erro } // put this on exit so we can search the whole statement for used tables -func (o *orderingWalker) ExitSelectStmtNoCte(node *tree.SelectStmtNoCte) error { +func (o *orderingWalker) ExitSelectStmtNoCte(node *tree.SelectCore) error { var terms []*tree.OrderingTerm var err error switch len(node.SelectCores) { @@ -114,7 +114,7 @@ func (o *orderingWalker) ExitSelectStmtNoCte(node *tree.SelectStmtNoCte) error { var ErrDistinctWithGroupBy = fmt.Errorf("select distinct with group by not supported") // orderSimpleStatement will return the ordering required for a simple statement. -func orderSimpleStatement(stmt *tree.SelectCore, tables []*common.Table) ([]*tree.OrderingTerm, error) { +func orderSimpleStatement(stmt *tree.SimpleSelect, tables []*common.Table) ([]*tree.OrderingTerm, error) { // it is possible to not have any tables in a select // if so, no ordering is required if stmt.From == nil { @@ -252,11 +252,11 @@ func containsAggregateFunc(ret tree.ResultColumn) (bool, error) { } return nil }, - FuncEnterSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { + FuncEnterSelectStmtNoCte: func(p0 *tree.SelectCore) error { depth++ return nil }, - FuncExitSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { + FuncExitSelectStmtNoCte: func(p0 *tree.SelectCore) error { depth-- return nil }, @@ -273,7 +273,7 @@ var ErrCompoundStatementDifferentNumberOfColumns = fmt.Errorf("select cores have // if there is a group by clause in any of the select cores, we will return an error. // using a group by with a compound statement is not yet supported because idk how // to make it deterministic with postgres's ordering, and it is not a common use case. -func orderCompoundStatement(stmt []*tree.SelectCore, tables []*common.Table) ([]*tree.OrderingTerm, error) { +func orderCompoundStatement(stmt []*tree.SimpleSelect, tables []*common.Table) ([]*tree.OrderingTerm, error) { if len(stmt) == 0 { return nil, fmt.Errorf("no select cores in compound statement") } @@ -303,7 +303,7 @@ func orderCompoundStatement(stmt []*tree.SelectCore, tables []*common.Table) ([] } // containsGroupBy will return true if the select core contains a group by clause. -func containsGroupBy(stmt *tree.SelectCore) (bool, error) { +func containsGroupBy(stmt *tree.SimpleSelect) (bool, error) { contains := false depth := 0 @@ -316,11 +316,11 @@ func containsGroupBy(stmt *tree.SelectCore) (bool, error) { } return nil }, - FuncEnterSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { + FuncEnterSelectStmtNoCte: func(p0 *tree.SelectCore) error { depth++ return nil }, - FuncExitSelectStmtNoCte: func(p0 *tree.SelectStmtNoCte) error { + FuncExitSelectStmtNoCte: func(p0 *tree.SelectCore) error { depth-- return nil }, diff --git a/parse/sql/ast_builder.go b/parse/sql/ast_builder.go index 6eaecbcef..be4e590fa 100644 --- a/parse/sql/ast_builder.go +++ b/parse/sql/ast_builder.go @@ -73,7 +73,7 @@ func (v *astBuilder) VisitCommon_table_expression(ctx *grammar.Common_table_expr } } - cte.Select = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) + cte.Select = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore) return &cte } @@ -272,12 +272,12 @@ func (v *astBuilder) VisitParenthesized_expr(ctx *grammar.Parenthesized_exprCont } func (v *astBuilder) VisitSubquery(ctx *grammar.SubqueryContext) interface{} { - return v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) + return v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore) } // VisitSubquery_expr is called when visiting a subquery_expr, return *tree.ExpressionSelect func (v *astBuilder) VisitSubquery_expr(ctx *grammar.Subquery_exprContext) interface{} { - stmt := v.Visit(ctx.Subquery()).(*tree.SelectStmtNoCte) + stmt := v.Visit(ctx.Subquery()).(*tree.SelectCore) expr := &tree.ExpressionSelect{ Select: stmt, } @@ -387,7 +387,7 @@ func (v *astBuilder) VisitIn_subquery_expr(ctx *grammar.In_subquery_exprContext) if ctx.NOT_() != nil { expr.Operator = tree.ComparisonOperatorNotIn } - sub := v.Visit(ctx.Subquery()).(*tree.SelectStmtNoCte) + sub := v.Visit(ctx.Subquery()).(*tree.SelectCore) expr.Right = &tree.ExpressionSelect{Select: sub} return expr } @@ -846,7 +846,7 @@ func (v *astBuilder) VisitTable_or_subquery(ctx *grammar.Table_or_subqueryContex return &t case ctx.Select_stmt_no_cte() != nil: t := tree.RelationSubquery{ - Select: v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte), + Select: v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore), } if ctx.Table_alias() != nil { t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) @@ -945,7 +945,7 @@ func (v *astBuilder) VisitDelete_stmt(ctx *grammar.Delete_stmtContext) interface // VisitSelect_core is called when visiting a select_core, return *tree.SelectCore func (v *astBuilder) VisitSelect_core(ctx *grammar.Select_coreContext) interface{} { - t := tree.SelectCore{ + t := tree.SimpleSelect{ SelectType: tree.SelectTypeAll, } @@ -1010,16 +1010,16 @@ func (v *astBuilder) VisitRelation(ctx *grammar.RelationContext) interface{} { // VisitSelect_stmt_no_cte is called when visiting a select_stmt_core, return *tree.SelectStmtNoCte func (v *astBuilder) VisitSelect_stmt_no_cte(ctx *grammar.Select_stmt_no_cteContext) interface{} { - t := tree.SelectStmtNoCte{} - selectCores := make([]*tree.SelectCore, len(ctx.AllSelect_core())) + t := tree.SelectCore{} + selectCores := make([]*tree.SimpleSelect, len(ctx.AllSelect_core())) // first select_core - selectCores[0] = v.Visit(ctx.Select_core(0)).(*tree.SelectCore) + selectCores[0] = v.Visit(ctx.Select_core(0)).(*tree.SimpleSelect) // rest select_core for i, selectCoreCtx := range ctx.AllSelect_core()[1:] { compoundOperator := v.Visit(ctx.Compound_operator(i)).(*tree.CompoundOperator) - core := v.Visit(selectCoreCtx).(*tree.SelectCore) + core := v.Visit(selectCoreCtx).(*tree.SimpleSelect) core.Compound = compoundOperator selectCores[i+1] = core } @@ -1045,7 +1045,7 @@ func (v *astBuilder) VisitSelect_stmt(ctx *grammar.Select_stmtContext) interface t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) } - t.Stmt = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectStmtNoCte) + t.Stmt = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore) return &t } diff --git a/parse/sql/parser_test.go b/parse/sql/parser_test.go index 96343f5ed..e67549865 100644 --- a/parse/sql/parser_test.go +++ b/parse/sql/parser_test.go @@ -35,8 +35,8 @@ func getResultColumnExprs(values ...string) []tree.ResultColumn { func genSelectUnaryExprTree(op tree.UnaryOperator, value string) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -55,8 +55,8 @@ func genSelectUnaryExprTree(op tree.UnaryOperator, value string) *tree.SelectStm func genSelectColumnLiteralTree(value string) *tree.SelectStmt { t := tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -72,8 +72,8 @@ func genSelectColumnLiteralTree(value string) *tree.SelectStmt { func genSelectColumnStarTree() *tree.SelectStmt { t := tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -87,8 +87,8 @@ func genSelectColumnStarTree() *tree.SelectStmt { func genSelectColumnTableTree(table string) *tree.SelectStmt { t := tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -102,8 +102,8 @@ func genSelectColumnTableTree(table string) *tree.SelectStmt { func genSimpleCompoundSelectTree(op tree.CompoundOperatorType) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: getResultColumnExprs("1"), @@ -120,8 +120,8 @@ func genSimpleCompoundSelectTree(op tree.CompoundOperatorType) *tree.SelectStmt func genSimpleCollateSelectTree(collateType tree.CollationType, value string) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -140,8 +140,8 @@ func genSimpleCollateSelectTree(collateType tree.CollationType, value string) *t func genSimpleBinaryCompareSelectTree(op tree.BinaryOperator, leftValue, rightValue string) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -161,8 +161,8 @@ func genSimpleBinaryCompareSelectTree(op tree.BinaryOperator, leftValue, rightVa func genSimplyArithmeticSelectTree(op tree.ArithmeticOperator, leftValue, rightValue string) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -186,8 +186,8 @@ func genSimpleStringCompareSelectTree(op tree.StringOperator, leftValue, rightVa escapeExpr = nil } return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -215,8 +215,8 @@ func genSimpleCTETree(table, value string) *tree.CTE { func genSimpleExprNullSelectTree(value string, not bool) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -237,8 +237,8 @@ func genSimpleExprNullSelectTree(value string, not bool) *tree.SelectStmt { func genSimpleExprIsSelectTree(left string, right string, not bool) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -259,8 +259,8 @@ func genSimpleExprIsSelectTree(left string, right string, not bool) *tree.Select func genSimpleFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -279,8 +279,8 @@ func genSimpleFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) func genDistinctFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -300,8 +300,8 @@ func genDistinctFunctionSelectTree(f tree.SQLFunction, inputs ...tree.Expression func genSimpleJoinSelectTree(joinOP *tree.JoinOperator, t1, t1Column, t2, t2Column string) *tree.SelectStmt { return &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -389,8 +389,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { //// table or subquery {"table or subquery", "select * from t1 as tt", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -405,8 +405,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"table or subquery nest select", "select * from (select 1) as tt", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -421,8 +421,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"table or subquery join", "select * from t1 as tt join t2 as ttt on tt.a = ttt.a", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -464,8 +464,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // bind parameter {"expr bind parameter $", "select $a", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -480,8 +480,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"expr bind parameter @", "select @a", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -496,8 +496,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"expr names", "select t1.c1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -516,8 +516,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"expr unary op -", "select -1", genSelectUnaryExprTree(tree.UnaryOperatorMinus, "1")}, {"expr unary op - twice, right associative", "select - -1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -540,8 +540,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"expr unary op not", "select not 1", genSelectUnaryExprTree(tree.UnaryOperatorNot, "1")}, {"expr unary op not twice, right associative", "select not not true", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -602,8 +602,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // in {"expr binary op in", "select 1 in (1,2)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -627,8 +627,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr binary op not in", "select 1 not in (1,2)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -652,8 +652,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr binary op in with select", "select 1 in (select 1)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -674,8 +674,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr binary op not in with select", "select 1 not in (select 1)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -730,8 +730,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // expr list {"expr list", "select (1,2)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -752,8 +752,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // expr precedence {"expr precedence 1", "select -1 > 2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -775,8 +775,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr precedence 2", "SELECT NOT (-1 = 1) AND 1 notnull OR 3 < 2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -818,8 +818,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr precedence 3", "SELECT NOT (-1 = 1) AND (1 notnull OR 3 < 2)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -862,8 +862,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr precedence 4", "select not 3 + 4 * 5 - 2 = 2 + -1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -916,8 +916,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { genSimpleExprIsSelectTree("true", "true", true)}, {"expr is distinct from", "select 1 is distinct from 2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -936,8 +936,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr is not distinct from", "select 1 is not distinct from 2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -958,8 +958,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // between {"expr between", "select 1 between 2 and 3", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -978,8 +978,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr not between", "select 1 not between 2 and 3", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1000,8 +1000,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // {"expr exists", "select (select 1)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1020,8 +1020,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr exists", "select exists (select 1)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1040,8 +1040,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr not exists", "select not exists (select 1)", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1061,8 +1061,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { // case {"expr case", "select case when 1 then 2 end", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1084,8 +1084,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr case else", "select case when 1 then 2 else 3 end", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1108,8 +1108,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr case multi when", "select case when 1 then 2 when 3 then 4 end", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1135,8 +1135,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"expr case expr", "select case 1 when 2 then 3 end", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1423,8 +1423,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { //// select {"select *", "select * from t1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1437,8 +1437,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"select with cte", "with t as (select 1) select * from t1", &tree.SelectStmt{ CTE: []*tree.CTE{genSimpleCTETree("t", "1")}, - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1450,8 +1450,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select distinct", "select distinct * from t1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeDistinct, Columns: columnStar, @@ -1463,8 +1463,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with where", "select * from t1 where c1=1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1481,8 +1481,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with where and", "select * from t1 where c1=1 and c2=2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1507,8 +1507,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with where or", "select * from t1 where c1=1 or c2=2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1533,8 +1533,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with group by", "select * from t1 group by c1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1551,8 +1551,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with group by and having", "select * from t1 group by c1 having 1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1570,8 +1570,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with order by", "select * from t1 order by c1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1591,8 +1591,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { {"select with order by all", "select * from t1 order by c1 collate nocase asc nulls first", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1616,8 +1616,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with limit", "select * from t1 limit 1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1630,8 +1630,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }}}, {"select with limit offset", "select * from t1 limit 1 offset 2", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1683,8 +1683,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, "t1", "c1", "t2", "c1")}, {"join multi", "select * from t1 join t2 on t1.c1=t2.c1 left join t3 on t1.c1=t3.c1", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1917,8 +1917,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { //// identifier quotes, `"` and `[]` and "`" {"table name with double quote", `select * from "t1"`, &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1932,8 +1932,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"table name alias with double quote", `select * from "t1" as "t"`, &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: columnStar, @@ -1948,8 +1948,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"column name with bracket quote", `select [col1] from "t1"`, &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1969,8 +1969,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"column name alias with bracket quote", `select [col1] as [col] from t1`, &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -1992,8 +1992,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { }, {"collation name with back tick quote", "select `col1` COLLATE `nocase` from `t1`; ", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ @@ -2023,8 +2023,8 @@ func TestParseRawSQL_syntax_valid(t *testing.T) { "select 1::int as x, @caller::text, t1.c1::text, (t1.c2::int * 3)::int, " + "(t1.c3 isnull)::int, abs(2)::int from t1;", &tree.SelectStmt{ - Stmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Stmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ diff --git a/parse/sql/tree/CTE.go b/parse/sql/tree/CTE.go index 7532cb5be..9e8c78d01 100644 --- a/parse/sql/tree/CTE.go +++ b/parse/sql/tree/CTE.go @@ -9,7 +9,7 @@ type CTE struct { Table string Columns []string - Select *SelectStmtNoCte + Select *SelectCore } func (c *CTE) Accept(v AstVisitor) any { diff --git a/parse/sql/tree/CTE_test.go b/parse/sql/tree/CTE_test.go index 003ad7e95..0e45f0e42 100644 --- a/parse/sql/tree/CTE_test.go +++ b/parse/sql/tree/CTE_test.go @@ -10,7 +10,7 @@ func TestCTE_ToSQL(t *testing.T) { type fields struct { Table string Columns []string - Select *tree.SelectStmtNoCte + Select *tree.SelectCore } tests := []struct { name string @@ -23,8 +23,8 @@ func TestCTE_ToSQL(t *testing.T) { fields: fields{ Table: "foo", Columns: []string{"bar", "baz"}, - Select: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Select: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, From: &tree.RelationTable{ @@ -68,8 +68,8 @@ func TestCTE_ToSQL(t *testing.T) { var mockCTE = &tree.CTE{ Table: "foo", Columns: []string{"bar", "baz"}, - Select: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Select: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { From: &tree.RelationTable{ Name: "foo", diff --git a/parse/sql/tree/ast_listener.go b/parse/sql/tree/ast_listener.go index 24dba449a..ebd611719 100644 --- a/parse/sql/tree/ast_listener.go +++ b/parse/sql/tree/ast_listener.go @@ -80,10 +80,10 @@ type AstListener interface { ExitReturningClauseColumn(*ReturningClauseColumn) error EnterSelectStmt(*SelectStmt) error ExitSelectStmt(*SelectStmt) error - EnterSelectCore(*SelectCore) error - ExitSelectCore(*SelectCore) error - EnterSelectStmtNoCte(*SelectStmtNoCte) error - ExitSelectStmtNoCte(*SelectStmtNoCte) error + EnterSelectCore(*SimpleSelect) error + ExitSelectCore(*SimpleSelect) error + EnterSelectStmtNoCte(*SelectCore) error + ExitSelectStmtNoCte(*SelectCore) error EnterCompoundOperator(*CompoundOperator) error ExitCompoundOperator(*CompoundOperator) error EnterUpdateSetClause(*UpdateSetClause) error @@ -424,19 +424,19 @@ func (b *BaseListener) ExitSelectStmt(p0 *SelectStmt) error { return nil } -func (b *BaseListener) EnterSelectCore(p0 *SelectCore) error { +func (b *BaseListener) EnterSelectCore(p0 *SimpleSelect) error { return nil } -func (b *BaseListener) ExitSelectCore(p0 *SelectCore) error { +func (b *BaseListener) ExitSelectCore(p0 *SimpleSelect) error { return nil } -func (b *BaseListener) EnterSelectStmtNoCte(p0 *SelectStmtNoCte) error { +func (b *BaseListener) EnterSelectStmtNoCte(p0 *SelectCore) error { return nil } -func (b *BaseListener) ExitSelectStmtNoCte(p0 *SelectStmtNoCte) error { +func (b *BaseListener) ExitSelectStmtNoCte(p0 *SelectCore) error { return nil } @@ -557,10 +557,10 @@ type ImplementedListener struct { FuncExitScalarFunc func(p0 *ScalarFunction) error FuncEnterSelectStmt func(p0 *SelectStmt) error FuncExitSelectStmt func(p0 *SelectStmt) error - FuncEnterSelectCore func(p0 *SelectCore) error - FuncExitSelectCore func(p0 *SelectCore) error - FuncEnterSelectStmtNoCte func(p0 *SelectStmtNoCte) error - FuncExitSelectStmtNoCte func(p0 *SelectStmtNoCte) error + FuncEnterSelectCore func(p0 *SimpleSelect) error + FuncExitSelectCore func(p0 *SimpleSelect) error + FuncEnterSelectStmtNoCte func(p0 *SelectCore) error + FuncExitSelectStmtNoCte func(p0 *SelectCore) error FuncEnterUpdateStmt func(p0 *UpdateStmt) error FuncExitUpdateStmt func(p0 *UpdateStmt) error FuncEnterUpdateSetClause func(p0 *UpdateSetClause) error @@ -1213,7 +1213,7 @@ func (b *ImplementedListener) ExitSelectStmt(p0 *SelectStmt) error { return b.FuncExitSelectStmt(p0) } -func (b *ImplementedListener) EnterSelectCore(p0 *SelectCore) error { +func (b *ImplementedListener) EnterSelectCore(p0 *SimpleSelect) error { if b.FuncEnterSelectCore == nil { return nil } @@ -1221,7 +1221,7 @@ func (b *ImplementedListener) EnterSelectCore(p0 *SelectCore) error { return b.FuncEnterSelectCore(p0) } -func (b *ImplementedListener) ExitSelectCore(p0 *SelectCore) error { +func (b *ImplementedListener) ExitSelectCore(p0 *SimpleSelect) error { if b.FuncExitSelectCore == nil { return nil } @@ -1229,7 +1229,7 @@ func (b *ImplementedListener) ExitSelectCore(p0 *SelectCore) error { return b.FuncExitSelectCore(p0) } -func (b *ImplementedListener) EnterSelectStmtNoCte(p0 *SelectStmtNoCte) error { +func (b *ImplementedListener) EnterSelectStmtNoCte(p0 *SelectCore) error { if b.FuncEnterSelectStmtNoCte == nil { return nil } @@ -1237,7 +1237,7 @@ func (b *ImplementedListener) EnterSelectStmtNoCte(p0 *SelectStmtNoCte) error { return b.FuncEnterSelectStmtNoCte(p0) } -func (b *ImplementedListener) ExitSelectStmtNoCte(p0 *SelectStmtNoCte) error { +func (b *ImplementedListener) ExitSelectStmtNoCte(p0 *SelectCore) error { if b.FuncExitSelectStmtNoCte == nil { return nil } diff --git a/parse/sql/tree/ast_visitor.go b/parse/sql/tree/ast_visitor.go index 5b7e37ce4..ce4d0b771 100644 --- a/parse/sql/tree/ast_visitor.go +++ b/parse/sql/tree/ast_visitor.go @@ -44,8 +44,8 @@ type AstVisitor interface { VisitReturningClause(*ReturningClause) any VisitReturningClauseColumn(*ReturningClauseColumn) any VisitSelectStmt(*SelectStmt) any + VisitSimpleSelect(*SimpleSelect) any VisitSelectCore(*SelectCore) any - VisitSelectNoCte(*SelectStmtNoCte) any VisitUpdateSetClause(*UpdateSetClause) any VisitUpdateStmt(*UpdateStmt) any VisitUpdateCore(*UpdateCore) any @@ -210,11 +210,11 @@ func (v *BaseAstVisitor) VisitSelectStmt(node *SelectStmt) any { return nil } -func (v *BaseAstVisitor) VisitSelectCore(node *SelectCore) any { +func (v *BaseAstVisitor) VisitSimpleSelect(node *SimpleSelect) any { return nil } -func (v *BaseAstVisitor) VisitSelectNoCte(node *SelectStmtNoCte) any { +func (v *BaseAstVisitor) VisitSelectCore(node *SelectCore) any { return nil } diff --git a/parse/sql/tree/expression.go b/parse/sql/tree/expression.go index d5e8c34c0..c93c64c0c 100644 --- a/parse/sql/tree/expression.go +++ b/parse/sql/tree/expression.go @@ -572,7 +572,7 @@ type ExpressionSelect struct { Wrapped IsNot bool IsExists bool - Select *SelectStmtNoCte + Select *SelectCore TypeCast TypeCastType // NOTE: type cast only makes sense when wrapped diff --git a/parse/sql/tree/expression_test.go b/parse/sql/tree/expression_test.go index 15bb6a361..46cf975e5 100644 --- a/parse/sql/tree/expression_test.go +++ b/parse/sql/tree/expression_test.go @@ -658,8 +658,8 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { fields: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Select: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, From: &tree.RelationTable{ @@ -687,8 +687,8 @@ func TestExpressionLiteral_ToSQL(t *testing.T) { fields: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Select: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, From: &tree.RelationTable{ diff --git a/parse/sql/tree/relation.go b/parse/sql/tree/relation.go index e38ae66a5..8f6c826bc 100644 --- a/parse/sql/tree/relation.go +++ b/parse/sql/tree/relation.go @@ -70,7 +70,7 @@ func (t *RelationTable) SetSchema(schema string) { type RelationSubquery struct { node - Select *SelectStmtNoCte + Select *SelectCore Alias string } diff --git a/parse/sql/tree/relation_test.go b/parse/sql/tree/relation_test.go index 71c9734e0..120c0a6ed 100644 --- a/parse/sql/tree/relation_test.go +++ b/parse/sql/tree/relation_test.go @@ -40,8 +40,8 @@ func TestRelation_ToSQL(t *testing.T) { name: "subquery", fields: fields{ Relation: &tree.RelationSubquery{ - Select: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Select: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, From: &tree.RelationTable{ diff --git a/parse/sql/tree/select.go b/parse/sql/tree/select.go index ef17bfff9..3d9fbfc47 100644 --- a/parse/sql/tree/select.go +++ b/parse/sql/tree/select.go @@ -10,7 +10,7 @@ type SelectStmt struct { node CTE []*CTE - Stmt *SelectStmtNoCte + Stmt *SelectCore } func (s *SelectStmt) Accept(v AstVisitor) any { @@ -45,19 +45,19 @@ func (s *SelectStmt) ToSQL() string { func (s *SelectStmt) statement() {} -type SelectStmtNoCte struct { +type SelectCore struct { node - SelectCores []*SelectCore + SelectCores []*SimpleSelect OrderBy *OrderBy Limit *Limit } -func (s *SelectStmtNoCte) Accept(v AstVisitor) any { - return v.VisitSelectNoCte(s) +func (s *SelectCore) Accept(v AstVisitor) any { + return v.VisitSelectCore(s) } -func (s *SelectStmtNoCte) Walk(w AstListener) error { +func (s *SelectCore) Walk(w AstListener) error { return run( w.EnterSelectStmtNoCte(s), walkMany(w, s.SelectCores), @@ -67,7 +67,7 @@ func (s *SelectStmtNoCte) Walk(w AstListener) error { ) } -func (s *SelectStmtNoCte) ToSQL() (res string) { +func (s *SelectCore) ToSQL() (res string) { stmt := sqlwriter.NewWriter() for _, core := range s.SelectCores { stmt.WriteString(core.ToSQL()) @@ -82,7 +82,7 @@ func (s *SelectStmtNoCte) ToSQL() (res string) { return stmt.String() } -type SelectCore struct { +type SimpleSelect struct { node SelectType SelectType @@ -93,11 +93,11 @@ type SelectCore struct { Compound *CompoundOperator } -func (s *SelectCore) Accept(v AstVisitor) any { - return v.VisitSelectCore(s) +func (s *SimpleSelect) Accept(v AstVisitor) any { + return v.VisitSimpleSelect(s) } -func (s *SelectCore) Walk(w AstListener) error { +func (s *SimpleSelect) Walk(w AstListener) error { return run( w.EnterSelectCore(s), walkMany(w, s.Columns), @@ -109,7 +109,7 @@ func (s *SelectCore) Walk(w AstListener) error { ) } -func (s *SelectCore) ToSQL() string { +func (s *SimpleSelect) ToSQL() string { stmt := sqlwriter.NewWriter() if s.Compound != nil { diff --git a/parse/sql/tree/select_test.go b/parse/sql/tree/select_test.go index ed67f2426..4f0da4503 100644 --- a/parse/sql/tree/select_test.go +++ b/parse/sql/tree/select_test.go @@ -9,7 +9,7 @@ import ( func TestSelect_ToSQL(t *testing.T) { type fields struct { CTE []*tree.CTE - SelectStmt *tree.SelectStmtNoCte + SelectStmt *tree.SelectCore } tests := []struct { name string @@ -23,8 +23,8 @@ func TestSelect_ToSQL(t *testing.T) { CTE: []*tree.CTE{ mockCTE, }, - SelectStmt: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{{ + SelectStmt: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{{ SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ &tree.ResultColumnExpression{Expression: &tree.ExpressionColumn{Column: "foo"}}, diff --git a/parse/sql/tree/update_test.go b/parse/sql/tree/update_test.go index 04830127b..4e4b2aa56 100644 --- a/parse/sql/tree/update_test.go +++ b/parse/sql/tree/update_test.go @@ -34,8 +34,8 @@ func TestUpdate_ToSQL(t *testing.T) { Expression: &tree.ExpressionSelect{ IsNot: true, IsExists: true, - Select: &tree.SelectStmtNoCte{ - SelectCores: []*tree.SelectCore{ + Select: &tree.SelectCore{ + SelectCores: []*tree.SimpleSelect{ { SelectType: tree.SelectTypeAll, Columns: []tree.ResultColumn{ From 9546b3152cee345fe123ad638762a7dec39ec36a Mon Sep 17 00:00:00 2001 From: Brennan Lamey <66885902+brennanjl@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:23:10 -0500 Subject: [PATCH 7/7] renamed selects --- parse/sql/antlr-grammar | 2 +- parse/sql/ast_builder.go | 28 +-- parse/sql/grammar/SQLParser.interp | 4 +- parse/sql/grammar/sql_parser.go | 222 ++++++++++---------- parse/sql/grammar/sqlparser_base_visitor.go | 4 +- parse/sql/grammar/sqlparser_visitor.go | 8 +- 6 files changed, 134 insertions(+), 134 deletions(-) diff --git a/parse/sql/antlr-grammar b/parse/sql/antlr-grammar index 3247c0966..cec5754a4 160000 --- a/parse/sql/antlr-grammar +++ b/parse/sql/antlr-grammar @@ -1 +1 @@ -Subproject commit 3247c09666d40ab25b12f6d7c9d026511c8f6f50 +Subproject commit cec5754a4654567f0e97e0621f1b0edcac4c9623 diff --git a/parse/sql/ast_builder.go b/parse/sql/ast_builder.go index be4e590fa..e34a9a8fa 100644 --- a/parse/sql/ast_builder.go +++ b/parse/sql/ast_builder.go @@ -73,7 +73,7 @@ func (v *astBuilder) VisitCommon_table_expression(ctx *grammar.Common_table_expr } } - cte.Select = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore) + cte.Select = v.Visit(ctx.Select_core()).(*tree.SelectCore) return &cte } @@ -272,7 +272,7 @@ func (v *astBuilder) VisitParenthesized_expr(ctx *grammar.Parenthesized_exprCont } func (v *astBuilder) VisitSubquery(ctx *grammar.SubqueryContext) interface{} { - return v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore) + return v.Visit(ctx.Select_core()).(*tree.SelectCore) } // VisitSubquery_expr is called when visiting a subquery_expr, return *tree.ExpressionSelect @@ -844,9 +844,9 @@ func (v *astBuilder) VisitTable_or_subquery(ctx *grammar.Table_or_subqueryContex t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) } return &t - case ctx.Select_stmt_no_cte() != nil: + case ctx.Select_core() != nil: t := tree.RelationSubquery{ - Select: v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore), + Select: v.Visit(ctx.Select_core()).(*tree.SelectCore), } if ctx.Table_alias() != nil { t.Alias = util.ExtractSQLName(ctx.Table_alias().GetText()) @@ -943,8 +943,8 @@ func (v *astBuilder) VisitDelete_stmt(ctx *grammar.Delete_stmtContext) interface return &t } -// VisitSelect_core is called when visiting a select_core, return *tree.SelectCore -func (v *astBuilder) VisitSelect_core(ctx *grammar.Select_coreContext) interface{} { +// VisitSimple_select is called when visiting a Simple_select, return *tree.SelectCore +func (v *astBuilder) VisitSimple_select(ctx *grammar.Simple_selectContext) interface{} { t := tree.SimpleSelect{ SelectType: tree.SelectTypeAll, } @@ -1008,16 +1008,16 @@ func (v *astBuilder) VisitRelation(ctx *grammar.RelationContext) interface{} { } } -// VisitSelect_stmt_no_cte is called when visiting a select_stmt_core, return *tree.SelectStmtNoCte -func (v *astBuilder) VisitSelect_stmt_no_cte(ctx *grammar.Select_stmt_no_cteContext) interface{} { +// VisitSelect_core is called when visiting a select_stmt_core, return *tree.SelectStmtNoCte +func (v *astBuilder) VisitSelect_core(ctx *grammar.Select_coreContext) interface{} { t := tree.SelectCore{} - selectCores := make([]*tree.SimpleSelect, len(ctx.AllSelect_core())) + selectCores := make([]*tree.SimpleSelect, len(ctx.AllSimple_select())) - // first select_core - selectCores[0] = v.Visit(ctx.Select_core(0)).(*tree.SimpleSelect) + // first Simple_select + selectCores[0] = v.Visit(ctx.Simple_select(0)).(*tree.SimpleSelect) - // rest select_core - for i, selectCoreCtx := range ctx.AllSelect_core()[1:] { + // rest Simple_select + for i, selectCoreCtx := range ctx.AllSimple_select()[1:] { compoundOperator := v.Visit(ctx.Compound_operator(i)).(*tree.CompoundOperator) core := v.Visit(selectCoreCtx).(*tree.SimpleSelect) core.Compound = compoundOperator @@ -1045,7 +1045,7 @@ func (v *astBuilder) VisitSelect_stmt(ctx *grammar.Select_stmtContext) interface t.CTE = v.Visit(ctx.Common_table_stmt()).([]*tree.CTE) } - t.Stmt = v.Visit(ctx.Select_stmt_no_cte()).(*tree.SelectCore) + t.Stmt = v.Visit(ctx.Select_core()).(*tree.SelectCore) return &t } diff --git a/parse/sql/grammar/SQLParser.interp b/parse/sql/grammar/SQLParser.interp index 7f13b40dc..f07e37890 100644 --- a/parse/sql/grammar/SQLParser.interp +++ b/parse/sql/grammar/SQLParser.interp @@ -225,11 +225,11 @@ insert_stmt returning_clause upsert_update upsert_clause -select_stmt_no_cte +select_core select_stmt join_relation relation -select_core +simple_select table_or_subquery result_column returning_clause_result_column diff --git a/parse/sql/grammar/sql_parser.go b/parse/sql/grammar/sql_parser.go index 5c06f550c..258500cc3 100644 --- a/parse/sql/grammar/sql_parser.go +++ b/parse/sql/grammar/sql_parser.go @@ -68,7 +68,7 @@ func sqlparserParserInit() { "expr_list", "comparisonOperator", "cast_type", "type_cast", "boolean_value", "string_value", "numeric_value", "literal", "value_row", "values_clause", "insert_core", "insert_stmt", "returning_clause", "upsert_update", "upsert_clause", - "select_stmt_no_cte", "select_stmt", "join_relation", "relation", "select_core", + "select_core", "select_stmt", "join_relation", "relation", "simple_select", "table_or_subquery", "result_column", "returning_clause_result_column", "join_operator", "join_constraint", "compound_operator", "update_set_subclause", "update_core", "update_stmt", "column_name_list", "qualified_table_name", @@ -573,11 +573,11 @@ const ( SQLParserRULE_returning_clause = 27 SQLParserRULE_upsert_update = 28 SQLParserRULE_upsert_clause = 29 - SQLParserRULE_select_stmt_no_cte = 30 + SQLParserRULE_select_core = 30 SQLParserRULE_select_stmt = 31 SQLParserRULE_join_relation = 32 SQLParserRULE_relation = 33 - SQLParserRULE_select_core = 34 + SQLParserRULE_simple_select = 34 SQLParserRULE_table_or_subquery = 35 SQLParserRULE_result_column = 36 SQLParserRULE_returning_clause_result_column = 37 @@ -1531,7 +1531,7 @@ type ICommon_table_expressionContext interface { Cte_table_name() ICte_table_nameContext AS_() antlr.TerminalNode OPEN_PAR() antlr.TerminalNode - Select_stmt_no_cte() ISelect_stmt_no_cteContext + Select_core() ISelect_coreContext CLOSE_PAR() antlr.TerminalNode // IsCommon_table_expressionContext differentiates from other interfaces. @@ -1594,10 +1594,10 @@ func (s *Common_table_expressionContext) OPEN_PAR() antlr.TerminalNode { return s.GetToken(SQLParserOPEN_PAR, 0) } -func (s *Common_table_expressionContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { +func (s *Common_table_expressionContext) Select_core() ISelect_coreContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { - if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + if _, ok := ctx.(ISelect_coreContext); ok { t = ctx.(antlr.RuleContext) break } @@ -1607,7 +1607,7 @@ func (s *Common_table_expressionContext) Select_stmt_no_cte() ISelect_stmt_no_ct return nil } - return t.(ISelect_stmt_no_cteContext) + return t.(ISelect_coreContext) } func (s *Common_table_expressionContext) CLOSE_PAR() antlr.TerminalNode { @@ -1658,7 +1658,7 @@ func (p *SQLParser) Common_table_expression() (localctx ICommon_table_expression } { p.SetState(173) - p.Select_stmt_no_cte() + p.Select_core() } { p.SetState(174) @@ -5406,7 +5406,7 @@ type ISubqueryContext interface { // Getter signatures OPEN_PAR() antlr.TerminalNode - Select_stmt_no_cte() ISelect_stmt_no_cteContext + Select_core() ISelect_coreContext CLOSE_PAR() antlr.TerminalNode // IsSubqueryContext differentiates from other interfaces. @@ -5449,10 +5449,10 @@ func (s *SubqueryContext) OPEN_PAR() antlr.TerminalNode { return s.GetToken(SQLParserOPEN_PAR, 0) } -func (s *SubqueryContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { +func (s *SubqueryContext) Select_core() ISelect_coreContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { - if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + if _, ok := ctx.(ISelect_coreContext); ok { t = ctx.(antlr.RuleContext) break } @@ -5462,7 +5462,7 @@ func (s *SubqueryContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { return nil } - return t.(ISelect_stmt_no_cteContext) + return t.(ISelect_coreContext) } func (s *SubqueryContext) CLOSE_PAR() antlr.TerminalNode { @@ -5501,7 +5501,7 @@ func (p *SQLParser) Subquery() (localctx ISubqueryContext) { } { p.SetState(360) - p.Select_stmt_no_cte() + p.Select_core() } { p.SetState(361) @@ -8241,71 +8241,71 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } -// ISelect_stmt_no_cteContext is an interface to support dynamic dispatch. -type ISelect_stmt_no_cteContext interface { +// ISelect_coreContext is an interface to support dynamic dispatch. +type ISelect_coreContext interface { antlr.ParserRuleContext // GetParser returns the parser. GetParser() antlr.Parser // Getter signatures - AllSelect_core() []ISelect_coreContext - Select_core(i int) ISelect_coreContext + AllSimple_select() []ISimple_selectContext + Simple_select(i int) ISimple_selectContext AllCompound_operator() []ICompound_operatorContext Compound_operator(i int) ICompound_operatorContext Order_by_stmt() IOrder_by_stmtContext Limit_stmt() ILimit_stmtContext - // IsSelect_stmt_no_cteContext differentiates from other interfaces. - IsSelect_stmt_no_cteContext() + // IsSelect_coreContext differentiates from other interfaces. + IsSelect_coreContext() } -type Select_stmt_no_cteContext struct { +type Select_coreContext struct { antlr.BaseParserRuleContext parser antlr.Parser } -func NewEmptySelect_stmt_no_cteContext() *Select_stmt_no_cteContext { - var p = new(Select_stmt_no_cteContext) +func NewEmptySelect_coreContext() *Select_coreContext { + var p = new(Select_coreContext) antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) - p.RuleIndex = SQLParserRULE_select_stmt_no_cte + p.RuleIndex = SQLParserRULE_select_core return p } -func InitEmptySelect_stmt_no_cteContext(p *Select_stmt_no_cteContext) { +func InitEmptySelect_coreContext(p *Select_coreContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) - p.RuleIndex = SQLParserRULE_select_stmt_no_cte + p.RuleIndex = SQLParserRULE_select_core } -func (*Select_stmt_no_cteContext) IsSelect_stmt_no_cteContext() {} +func (*Select_coreContext) IsSelect_coreContext() {} -func NewSelect_stmt_no_cteContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Select_stmt_no_cteContext { - var p = new(Select_stmt_no_cteContext) +func NewSelect_coreContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Select_coreContext { + var p = new(Select_coreContext) antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) p.parser = parser - p.RuleIndex = SQLParserRULE_select_stmt_no_cte + p.RuleIndex = SQLParserRULE_select_core return p } -func (s *Select_stmt_no_cteContext) GetParser() antlr.Parser { return s.parser } +func (s *Select_coreContext) GetParser() antlr.Parser { return s.parser } -func (s *Select_stmt_no_cteContext) AllSelect_core() []ISelect_coreContext { +func (s *Select_coreContext) AllSimple_select() []ISimple_selectContext { children := s.GetChildren() len := 0 for _, ctx := range children { - if _, ok := ctx.(ISelect_coreContext); ok { + if _, ok := ctx.(ISimple_selectContext); ok { len++ } } - tst := make([]ISelect_coreContext, len) + tst := make([]ISimple_selectContext, len) i := 0 for _, ctx := range children { - if t, ok := ctx.(ISelect_coreContext); ok { - tst[i] = t.(ISelect_coreContext) + if t, ok := ctx.(ISimple_selectContext); ok { + tst[i] = t.(ISimple_selectContext) i++ } } @@ -8313,11 +8313,11 @@ func (s *Select_stmt_no_cteContext) AllSelect_core() []ISelect_coreContext { return tst } -func (s *Select_stmt_no_cteContext) Select_core(i int) ISelect_coreContext { +func (s *Select_coreContext) Simple_select(i int) ISimple_selectContext { var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { - if _, ok := ctx.(ISelect_coreContext); ok { + if _, ok := ctx.(ISimple_selectContext); ok { if j == i { t = ctx.(antlr.RuleContext) break @@ -8330,10 +8330,10 @@ func (s *Select_stmt_no_cteContext) Select_core(i int) ISelect_coreContext { return nil } - return t.(ISelect_coreContext) + return t.(ISimple_selectContext) } -func (s *Select_stmt_no_cteContext) AllCompound_operator() []ICompound_operatorContext { +func (s *Select_coreContext) AllCompound_operator() []ICompound_operatorContext { children := s.GetChildren() len := 0 for _, ctx := range children { @@ -8354,7 +8354,7 @@ func (s *Select_stmt_no_cteContext) AllCompound_operator() []ICompound_operatorC return tst } -func (s *Select_stmt_no_cteContext) Compound_operator(i int) ICompound_operatorContext { +func (s *Select_coreContext) Compound_operator(i int) ICompound_operatorContext { var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { @@ -8374,7 +8374,7 @@ func (s *Select_stmt_no_cteContext) Compound_operator(i int) ICompound_operatorC return t.(ICompound_operatorContext) } -func (s *Select_stmt_no_cteContext) Order_by_stmt() IOrder_by_stmtContext { +func (s *Select_coreContext) Order_by_stmt() IOrder_by_stmtContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IOrder_by_stmtContext); ok { @@ -8390,7 +8390,7 @@ func (s *Select_stmt_no_cteContext) Order_by_stmt() IOrder_by_stmtContext { return t.(IOrder_by_stmtContext) } -func (s *Select_stmt_no_cteContext) Limit_stmt() ILimit_stmtContext { +func (s *Select_coreContext) Limit_stmt() ILimit_stmtContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(ILimit_stmtContext); ok { @@ -8406,33 +8406,33 @@ func (s *Select_stmt_no_cteContext) Limit_stmt() ILimit_stmtContext { return t.(ILimit_stmtContext) } -func (s *Select_stmt_no_cteContext) GetRuleContext() antlr.RuleContext { +func (s *Select_coreContext) GetRuleContext() antlr.RuleContext { return s } -func (s *Select_stmt_no_cteContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { +func (s *Select_coreContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { return antlr.TreesStringTree(s, ruleNames, recog) } -func (s *Select_stmt_no_cteContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { +func (s *Select_coreContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { switch t := visitor.(type) { case SQLParserVisitor: - return t.VisitSelect_stmt_no_cte(s) + return t.VisitSelect_core(s) default: return t.VisitChildren(s) } } -func (p *SQLParser) Select_stmt_no_cte() (localctx ISelect_stmt_no_cteContext) { - localctx = NewSelect_stmt_no_cteContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 60, SQLParserRULE_select_stmt_no_cte) +func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { + localctx = NewSelect_coreContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 60, SQLParserRULE_select_core) var _la int p.EnterOuterAlt(localctx, 1) { p.SetState(494) - p.Select_core() + p.Simple_select() } p.SetState(500) p.GetErrorHandler().Sync(p) @@ -8448,7 +8448,7 @@ func (p *SQLParser) Select_stmt_no_cte() (localctx ISelect_stmt_no_cteContext) { } { p.SetState(496) - p.Select_core() + p.Simple_select() } p.SetState(502) @@ -8508,7 +8508,7 @@ type ISelect_stmtContext interface { GetParser() antlr.Parser // Getter signatures - Select_stmt_no_cte() ISelect_stmt_no_cteContext + Select_core() ISelect_coreContext Common_table_stmt() ICommon_table_stmtContext // IsSelect_stmtContext differentiates from other interfaces. @@ -8547,10 +8547,10 @@ func NewSelect_stmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, func (s *Select_stmtContext) GetParser() antlr.Parser { return s.parser } -func (s *Select_stmtContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { +func (s *Select_stmtContext) Select_core() ISelect_coreContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { - if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + if _, ok := ctx.(ISelect_coreContext); ok { t = ctx.(antlr.RuleContext) break } @@ -8560,7 +8560,7 @@ func (s *Select_stmtContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { return nil } - return t.(ISelect_stmt_no_cteContext) + return t.(ISelect_coreContext) } func (s *Select_stmtContext) Common_table_stmt() ICommon_table_stmtContext { @@ -8619,7 +8619,7 @@ func (p *SQLParser) Select_stmt() (localctx ISelect_stmtContext) { } { p.SetState(512) - p.Select_stmt_no_cte() + p.Select_core() } errorExit: @@ -8960,8 +8960,8 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } -// ISelect_coreContext is an interface to support dynamic dispatch. -type ISelect_coreContext interface { +// ISimple_selectContext is an interface to support dynamic dispatch. +type ISimple_selectContext interface { antlr.ParserRuleContext // GetParser returns the parser. @@ -9007,11 +9007,11 @@ type ISelect_coreContext interface { Expr(i int) IExprContext HAVING_() antlr.TerminalNode - // IsSelect_coreContext differentiates from other interfaces. - IsSelect_coreContext() + // IsSimple_selectContext differentiates from other interfaces. + IsSimple_selectContext() } -type Select_coreContext struct { +type Simple_selectContext struct { antlr.BaseParserRuleContext parser antlr.Parser whereExpr IExprContext @@ -9020,54 +9020,54 @@ type Select_coreContext struct { havingExpr IExprContext } -func NewEmptySelect_coreContext() *Select_coreContext { - var p = new(Select_coreContext) +func NewEmptySimple_selectContext() *Simple_selectContext { + var p = new(Simple_selectContext) antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) - p.RuleIndex = SQLParserRULE_select_core + p.RuleIndex = SQLParserRULE_simple_select return p } -func InitEmptySelect_coreContext(p *Select_coreContext) { +func InitEmptySimple_selectContext(p *Simple_selectContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) - p.RuleIndex = SQLParserRULE_select_core + p.RuleIndex = SQLParserRULE_simple_select } -func (*Select_coreContext) IsSelect_coreContext() {} +func (*Simple_selectContext) IsSimple_selectContext() {} -func NewSelect_coreContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Select_coreContext { - var p = new(Select_coreContext) +func NewSimple_selectContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *Simple_selectContext { + var p = new(Simple_selectContext) antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) p.parser = parser - p.RuleIndex = SQLParserRULE_select_core + p.RuleIndex = SQLParserRULE_simple_select return p } -func (s *Select_coreContext) GetParser() antlr.Parser { return s.parser } +func (s *Simple_selectContext) GetParser() antlr.Parser { return s.parser } -func (s *Select_coreContext) GetWhereExpr() IExprContext { return s.whereExpr } +func (s *Simple_selectContext) GetWhereExpr() IExprContext { return s.whereExpr } -func (s *Select_coreContext) Get_expr() IExprContext { return s._expr } +func (s *Simple_selectContext) Get_expr() IExprContext { return s._expr } -func (s *Select_coreContext) GetHavingExpr() IExprContext { return s.havingExpr } +func (s *Simple_selectContext) GetHavingExpr() IExprContext { return s.havingExpr } -func (s *Select_coreContext) SetWhereExpr(v IExprContext) { s.whereExpr = v } +func (s *Simple_selectContext) SetWhereExpr(v IExprContext) { s.whereExpr = v } -func (s *Select_coreContext) Set_expr(v IExprContext) { s._expr = v } +func (s *Simple_selectContext) Set_expr(v IExprContext) { s._expr = v } -func (s *Select_coreContext) SetHavingExpr(v IExprContext) { s.havingExpr = v } +func (s *Simple_selectContext) SetHavingExpr(v IExprContext) { s.havingExpr = v } -func (s *Select_coreContext) GetGroupByExpr() []IExprContext { return s.groupByExpr } +func (s *Simple_selectContext) GetGroupByExpr() []IExprContext { return s.groupByExpr } -func (s *Select_coreContext) SetGroupByExpr(v []IExprContext) { s.groupByExpr = v } +func (s *Simple_selectContext) SetGroupByExpr(v []IExprContext) { s.groupByExpr = v } -func (s *Select_coreContext) SELECT_() antlr.TerminalNode { +func (s *Simple_selectContext) SELECT_() antlr.TerminalNode { return s.GetToken(SQLParserSELECT_, 0) } -func (s *Select_coreContext) AllResult_column() []IResult_columnContext { +func (s *Simple_selectContext) AllResult_column() []IResult_columnContext { children := s.GetChildren() len := 0 for _, ctx := range children { @@ -9088,7 +9088,7 @@ func (s *Select_coreContext) AllResult_column() []IResult_columnContext { return tst } -func (s *Select_coreContext) Result_column(i int) IResult_columnContext { +func (s *Simple_selectContext) Result_column(i int) IResult_columnContext { var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { @@ -9108,23 +9108,23 @@ func (s *Select_coreContext) Result_column(i int) IResult_columnContext { return t.(IResult_columnContext) } -func (s *Select_coreContext) DISTINCT_() antlr.TerminalNode { +func (s *Simple_selectContext) DISTINCT_() antlr.TerminalNode { return s.GetToken(SQLParserDISTINCT_, 0) } -func (s *Select_coreContext) AllCOMMA() []antlr.TerminalNode { +func (s *Simple_selectContext) AllCOMMA() []antlr.TerminalNode { return s.GetTokens(SQLParserCOMMA) } -func (s *Select_coreContext) COMMA(i int) antlr.TerminalNode { +func (s *Simple_selectContext) COMMA(i int) antlr.TerminalNode { return s.GetToken(SQLParserCOMMA, i) } -func (s *Select_coreContext) FROM_() antlr.TerminalNode { +func (s *Simple_selectContext) FROM_() antlr.TerminalNode { return s.GetToken(SQLParserFROM_, 0) } -func (s *Select_coreContext) Relation() IRelationContext { +func (s *Simple_selectContext) Relation() IRelationContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IRelationContext); ok { @@ -9140,19 +9140,19 @@ func (s *Select_coreContext) Relation() IRelationContext { return t.(IRelationContext) } -func (s *Select_coreContext) WHERE_() antlr.TerminalNode { +func (s *Simple_selectContext) WHERE_() antlr.TerminalNode { return s.GetToken(SQLParserWHERE_, 0) } -func (s *Select_coreContext) GROUP_() antlr.TerminalNode { +func (s *Simple_selectContext) GROUP_() antlr.TerminalNode { return s.GetToken(SQLParserGROUP_, 0) } -func (s *Select_coreContext) BY_() antlr.TerminalNode { +func (s *Simple_selectContext) BY_() antlr.TerminalNode { return s.GetToken(SQLParserBY_, 0) } -func (s *Select_coreContext) AllExpr() []IExprContext { +func (s *Simple_selectContext) AllExpr() []IExprContext { children := s.GetChildren() len := 0 for _, ctx := range children { @@ -9173,7 +9173,7 @@ func (s *Select_coreContext) AllExpr() []IExprContext { return tst } -func (s *Select_coreContext) Expr(i int) IExprContext { +func (s *Simple_selectContext) Expr(i int) IExprContext { var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { @@ -9193,31 +9193,31 @@ func (s *Select_coreContext) Expr(i int) IExprContext { return t.(IExprContext) } -func (s *Select_coreContext) HAVING_() antlr.TerminalNode { +func (s *Simple_selectContext) HAVING_() antlr.TerminalNode { return s.GetToken(SQLParserHAVING_, 0) } -func (s *Select_coreContext) GetRuleContext() antlr.RuleContext { +func (s *Simple_selectContext) GetRuleContext() antlr.RuleContext { return s } -func (s *Select_coreContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { +func (s *Simple_selectContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { return antlr.TreesStringTree(s, ruleNames, recog) } -func (s *Select_coreContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { +func (s *Simple_selectContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { switch t := visitor.(type) { case SQLParserVisitor: - return t.VisitSelect_core(s) + return t.VisitSimple_select(s) default: return t.VisitChildren(s) } } -func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { - localctx = NewSelect_coreContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 68, SQLParserRULE_select_core) +func (p *SQLParser) Simple_select() (localctx ISimple_selectContext) { + localctx = NewSimple_selectContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 68, SQLParserRULE_simple_select) var _la int p.EnterOuterAlt(localctx, 1) @@ -9322,7 +9322,7 @@ func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { var _x = p.expr(0) - localctx.(*Select_coreContext).whereExpr = _x + localctx.(*Simple_selectContext).whereExpr = _x } } @@ -9355,9 +9355,9 @@ func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { var _x = p.expr(0) - localctx.(*Select_coreContext)._expr = _x + localctx.(*Simple_selectContext)._expr = _x } - localctx.(*Select_coreContext).groupByExpr = append(localctx.(*Select_coreContext).groupByExpr, localctx.(*Select_coreContext)._expr) + localctx.(*Simple_selectContext).groupByExpr = append(localctx.(*Simple_selectContext).groupByExpr, localctx.(*Simple_selectContext)._expr) p.SetState(552) p.GetErrorHandler().Sync(p) if p.HasError() { @@ -9379,9 +9379,9 @@ func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { var _x = p.expr(0) - localctx.(*Select_coreContext)._expr = _x + localctx.(*Simple_selectContext)._expr = _x } - localctx.(*Select_coreContext).groupByExpr = append(localctx.(*Select_coreContext).groupByExpr, localctx.(*Select_coreContext)._expr) + localctx.(*Simple_selectContext).groupByExpr = append(localctx.(*Simple_selectContext).groupByExpr, localctx.(*Simple_selectContext)._expr) p.SetState(554) p.GetErrorHandler().Sync(p) @@ -9411,7 +9411,7 @@ func (p *SQLParser) Select_core() (localctx ISelect_coreContext) { var _x = p.expr(0) - localctx.(*Select_coreContext).havingExpr = _x + localctx.(*Simple_selectContext).havingExpr = _x } } @@ -9443,7 +9443,7 @@ type ITable_or_subqueryContext interface { AS_() antlr.TerminalNode Table_alias() ITable_aliasContext OPEN_PAR() antlr.TerminalNode - Select_stmt_no_cte() ISelect_stmt_no_cteContext + Select_core() ISelect_coreContext CLOSE_PAR() antlr.TerminalNode // IsTable_or_subqueryContext differentiates from other interfaces. @@ -9522,10 +9522,10 @@ func (s *Table_or_subqueryContext) OPEN_PAR() antlr.TerminalNode { return s.GetToken(SQLParserOPEN_PAR, 0) } -func (s *Table_or_subqueryContext) Select_stmt_no_cte() ISelect_stmt_no_cteContext { +func (s *Table_or_subqueryContext) Select_core() ISelect_coreContext { var t antlr.RuleContext for _, ctx := range s.GetChildren() { - if _, ok := ctx.(ISelect_stmt_no_cteContext); ok { + if _, ok := ctx.(ISelect_coreContext); ok { t = ctx.(antlr.RuleContext) break } @@ -9535,7 +9535,7 @@ func (s *Table_or_subqueryContext) Select_stmt_no_cte() ISelect_stmt_no_cteConte return nil } - return t.(ISelect_stmt_no_cteContext) + return t.(ISelect_coreContext) } func (s *Table_or_subqueryContext) CLOSE_PAR() antlr.TerminalNode { @@ -9613,7 +9613,7 @@ func (p *SQLParser) Table_or_subquery() (localctx ITable_or_subqueryContext) { } { p.SetState(567) - p.Select_stmt_no_cte() + p.Select_core() } { p.SetState(568) diff --git a/parse/sql/grammar/sqlparser_base_visitor.go b/parse/sql/grammar/sqlparser_base_visitor.go index fc4cef2dd..7f13397a0 100644 --- a/parse/sql/grammar/sqlparser_base_visitor.go +++ b/parse/sql/grammar/sqlparser_base_visitor.go @@ -203,7 +203,7 @@ func (v *BaseSQLParserVisitor) VisitUpsert_clause(ctx *Upsert_clauseContext) int return v.VisitChildren(ctx) } -func (v *BaseSQLParserVisitor) VisitSelect_stmt_no_cte(ctx *Select_stmt_no_cteContext) interface{} { +func (v *BaseSQLParserVisitor) VisitSelect_core(ctx *Select_coreContext) interface{} { return v.VisitChildren(ctx) } @@ -219,7 +219,7 @@ func (v *BaseSQLParserVisitor) VisitRelation(ctx *RelationContext) interface{} { return v.VisitChildren(ctx) } -func (v *BaseSQLParserVisitor) VisitSelect_core(ctx *Select_coreContext) interface{} { +func (v *BaseSQLParserVisitor) VisitSimple_select(ctx *Simple_selectContext) interface{} { return v.VisitChildren(ctx) } diff --git a/parse/sql/grammar/sqlparser_visitor.go b/parse/sql/grammar/sqlparser_visitor.go index 7fba20ea2..da7ceb955 100644 --- a/parse/sql/grammar/sqlparser_visitor.go +++ b/parse/sql/grammar/sqlparser_visitor.go @@ -154,8 +154,8 @@ type SQLParserVisitor interface { // Visit a parse tree produced by SQLParser#upsert_clause. VisitUpsert_clause(ctx *Upsert_clauseContext) interface{} - // Visit a parse tree produced by SQLParser#select_stmt_no_cte. - VisitSelect_stmt_no_cte(ctx *Select_stmt_no_cteContext) interface{} + // Visit a parse tree produced by SQLParser#select_core. + VisitSelect_core(ctx *Select_coreContext) interface{} // Visit a parse tree produced by SQLParser#select_stmt. VisitSelect_stmt(ctx *Select_stmtContext) interface{} @@ -166,8 +166,8 @@ type SQLParserVisitor interface { // Visit a parse tree produced by SQLParser#relation. VisitRelation(ctx *RelationContext) interface{} - // Visit a parse tree produced by SQLParser#select_core. - VisitSelect_core(ctx *Select_coreContext) interface{} + // Visit a parse tree produced by SQLParser#simple_select. + VisitSimple_select(ctx *Simple_selectContext) interface{} // Visit a parse tree produced by SQLParser#table_or_subquery. VisitTable_or_subquery(ctx *Table_or_subqueryContext) interface{}