Skip to content

Commit

Permalink
parse: tree.Relation insteadof TableOrSubquery+JoinClause
Browse files Browse the repository at this point in the history
  • Loading branch information
Yaiba committed Mar 22, 2024
1 parent 31fb3a4 commit d925983
Show file tree
Hide file tree
Showing 30 changed files with 796 additions and 966 deletions.
5 changes: 2 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
6 changes: 2 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down Expand Up @@ -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.1-0.20240304224347-03ce05ecd4f7 h1:YTuzZjTRE8r9FzIdSpAn9xaTkz8ANyuJpF8LxTO39Us=
Expand Down
4 changes: 2 additions & 2 deletions internal/engine/sqlanalyzer/attributes/select_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
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 @@ -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
}

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

Expand Down
6 changes: 3 additions & 3 deletions internal/engine/sqlanalyzer/order/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
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.JoinClause)
usedTables, err := utils.GetUsedTables(stmt.From.Relation)
if err != nil {
return nil, fmt.Errorf("error getting used tables: %w", err)
}
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 @@ -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
}
Expand Down
14 changes: 7 additions & 7 deletions internal/engine/sqlanalyzer/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -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
},
Expand Down
14 changes: 7 additions & 7 deletions internal/engine/sqlanalyzer/utils/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down Expand Up @@ -52,17 +52,17 @@ 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)
})
}
}

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) {
Expand All @@ -79,17 +79,17 @@ 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,
}
}
if len(alias) > 1 {
panic("too many aliases")
}

return &tree.TableOrSubqueryTable{
return &tree.RelationTable{
Name: name,
Alias: alias[0],
}
Expand Down
52 changes: 26 additions & 26 deletions parse/action/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"}},
},
},
},
},
},
},
Expand Down Expand Up @@ -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"}},
},
},
},
},
},
},
Expand Down
Loading

0 comments on commit d925983

Please sign in to comment.