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 19, 2024
1 parent 3a7ae65 commit c47ca32
Show file tree
Hide file tree
Showing 28 changed files with 694 additions and 872 deletions.
6 changes: 3 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.6.0
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 Down 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.20240304224347-03ce05ecd4f7 // 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
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -274,12 +274,12 @@ 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.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=
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.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=
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) {
// EnterRelationSelect checks the alias
func (s *StatementCleaner) EnterRelationSelect(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 RelationSelects as tables, so that we can order them.
func (o *orderingWalker) EnterRelationSelect(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.Accept(&tree.ImplementedWalker{
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 {
FuncEnterRelationSelect: 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 {
FuncExitRelationSelect: 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
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.20240304224347-03ce05ecd4f7
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.20240304224347-03ce05ecd4f7 h1:YTuzZjTRE8r9FzIdSpAn9xaTkz8ANyuJpF8LxTO39Us=
github.com/kwilteam/sql-grammar-go v0.1.1-0.20240304224347-03ce05ecd4f7/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 c47ca32

Please sign in to comment.