Skip to content

Commit

Permalink
parse: change statement structure
Browse files Browse the repository at this point in the history
  • Loading branch information
Yaiba committed Mar 22, 2024
1 parent 8dddb75 commit 4a0e216
Show file tree
Hide file tree
Showing 37 changed files with 702 additions and 790 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
4 changes: 2 additions & 2 deletions internal/engine/execution/procedure.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
6 changes: 3 additions & 3 deletions internal/engine/sqlanalyzer/attributes/select_core_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion internal/engine/sqlanalyzer/clean/clean.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 7 additions & 12 deletions internal/engine/sqlanalyzer/clean/walker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
}

Expand All @@ -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"))
Expand All @@ -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())
Expand Down Expand Up @@ -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
}

Expand Down
6 changes: 3 additions & 3 deletions internal/engine/sqlanalyzer/mutative/walker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
12 changes: 6 additions & 6 deletions internal/engine/sqlanalyzer/order/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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
},
Expand Down Expand Up @@ -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
},
Expand Down
6 changes: 3 additions & 3 deletions internal/engine/sqlanalyzer/parameters/visitor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand All @@ -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)
}
Expand Down
2 changes: 1 addition & 1 deletion internal/engine/sqlanalyzer/schema/walker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
6 changes: 3 additions & 3 deletions internal/engine/sqlanalyzer/schema/walker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
8 changes: 4 additions & 4 deletions internal/engine/sqlanalyzer/utils/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion parse/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
4 changes: 2 additions & 2 deletions parse/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
Loading

0 comments on commit 4a0e216

Please sign in to comment.