From 6a7ffc590ea8003361121a10935540d4dfc3c870 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Tue, 9 Oct 2018 18:42:06 +0300 Subject: [PATCH 01/12] sql: plan: Add SHOW CREATE TABLE [Fix #406] Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/parse/parse.go | 32 +++++++- sql/plan/show_create_table.go | 124 +++++++++++++++++++++++++++++ sql/plan/show_create_table_test.go | 42 ++++++++++ 3 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 sql/plan/show_create_table.go create mode 100644 sql/plan/show_create_table_test.go diff --git a/sql/parse/parse.go b/sql/parse/parse.go index a9637be2c..58d5c4b3c 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -1,6 +1,7 @@ package parse // import "gopkg.in/src-d/go-mysql-server.v0/sql/parse" import ( + "bufio" "fmt" "regexp" "strconv" @@ -8,7 +9,7 @@ import ( "gopkg.in/src-d/go-mysql-server.v0/sql/expression/function" - opentracing "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go" "gopkg.in/src-d/go-errors.v1" "gopkg.in/src-d/go-mysql-server.v0/sql" "gopkg.in/src-d/go-mysql-server.v0/sql/expression" @@ -35,6 +36,7 @@ var ( createIndexRegex = regexp.MustCompile(`^create\s+index\s+`) dropIndexRegex = regexp.MustCompile(`^drop\s+index\s+`) showIndexRegex = regexp.MustCompile(`^show\s+(index|indexes|keys)\s+(from|in)\s+\S+\s*`) + showCreateTableRegex = regexp.MustCompile(`^show create table\s+\S+\s*`) describeRegex = regexp.MustCompile(`^(describe|desc|explain)\s+(.*)\s+`) fullProcessListRegex = regexp.MustCompile(`^show\s+(full\s+)?processlist$`) ) @@ -59,6 +61,8 @@ func Parse(ctx *sql.Context, s string) (sql.Node, error) { return parseDropIndex(s) case showIndexRegex.MatchString(lowerQuery): return parseShowIndex(s) + case showCreateTableRegex.MatchString(lowerQuery): + return parseShowCreateTable(s) case describeRegex.MatchString(lowerQuery): return parseDescribeQuery(ctx, s) case fullProcessListRegex.MatchString(lowerQuery): @@ -73,6 +77,32 @@ func Parse(ctx *sql.Context, s string) (sql.Node, error) { return convert(ctx, stmt, s) } +//TODO: Move this to somewhere else perhaps? +func parseShowCreateTable(s string) (sql.Node, error) { + r := bufio.NewReader(strings.NewReader(s)) + + var table string + steps := []parseFunc{ + expect("show create table"), + skipSpaces, + readIdent(&table), + skipSpaces, + checkEOF, + } + + for _, step := range steps { + if err := step(r); err != nil { + return nil, err + } + } + + return plan.NewShowCreateTable( + &sql.UnresolvedDatabase{}, + table, + nil, + ), nil +} + func parseDescribeTables(s string) (sql.Node, error) { t := describeTablesRegex.FindStringSubmatch(s) if len(t) == 2 && t[1] != "" { diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go new file mode 100644 index 000000000..f94d0c3d2 --- /dev/null +++ b/sql/plan/show_create_table.go @@ -0,0 +1,124 @@ +package plan + +import ( + "fmt" + "strings" +) + +import ( + "gopkg.in/src-d/go-errors.v1" + "gopkg.in/src-d/go-mysql-server.v0/sql" +) + +var ErrTableNotFound = errors.NewKind("Table `%s` not found") + +// ShowCreateTable is a node that shows the CREATE TABLE statement for a table. +type ShowCreateTable struct { + Database sql.Database + Table string + Registry *sql.IndexRegistry +} + +// Schema implements the Node interface. +func (n *ShowCreateTable) Schema() sql.Schema { + return sql.Schema{ + &sql.Column{Name: "Table", Type: sql.Text, Nullable: false}, + &sql.Column{Name: "Create Table", Type: sql.Text, Nullable: false}, + } +} + +// TransformExpressionsUp implements the Transformable interface. +func (n *ShowCreateTable) TransformExpressionsUp(f sql.TransformExprFunc) (sql.Node, error) { + return n, nil +} + +// TransformUp implements the Transformable interface. +func (n *ShowCreateTable) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) { + return f(NewShowCreateTable(n.Database, n.Table, n.Registry)) +} + +// RowIter implements the Node interface. +func (n *ShowCreateTable) RowIter(*sql.Context) (sql.RowIter, error) { + return &showCreateTablesIter{ + db: n.Database, + table: n.Table, + }, nil +} + +// String implements the Stringer interface. +func (n *ShowCreateTable) String() string { + return fmt.Sprintf("ShowCreateTable(%s)", n.Table) +} + +type createTableStmt struct { + colName string + colType sql.Type +} + +type showCreateTablesIter struct { + db sql.Database + table string + + createStmt *createTableStmt +} + +func (i *showCreateTablesIter) Next() (sql.Row, error) { + table := i.db.Tables()[i.table] + + if table == nil { + return nil, ErrTableNotFound.New(table) + } + + schema := table.Schema() + colCreateStatements := make([]string, len(schema), len(schema)) + // Statement creation parts for each column + for indx, col := range schema { + createStmtPart := fmt.Sprintf("`%s` %s", col.Name, col.Type.Type()) + if col.Default != nil { + createStmtPart = fmt.Sprintf("%s DEFAULT %v", createStmtPart, col.Default) + } + + if !col.Nullable { + createStmtPart = fmt.Sprintf("%sNOT NULL", createStmtPart) + } + + if indx != len(schema)-1 { + colCreateStatements[indx] = createStmtPart + ",\n" + continue + } + + colCreateStatements[indx] = createStmtPart + } + + prettyColCreateStmts := fmt.Sprintf("%s", stripBrackets(colCreateStatements)) + + composedCreateTableStatement := + fmt.Sprintf("CREATE TABLE `%s` (%s) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", i.table, prettyColCreateStmts) + + return sql.NewRow( + i.table, // "Table" string + composedCreateTableStatement, // "Create Table" string + ), nil +} + +func stripBrackets(val interface{}) string { + return strings.Trim(fmt.Sprintf("%s", val), "[]") +} + +func (i *showCreateTablesIter) Close() error { + return nil +} + +// NewShowCreateTable creates a new ShowCreateTable node. +func NewShowCreateTable(db sql.Database, table string, registry *sql.IndexRegistry) sql.Node { + return &ShowCreateTable{db, table, registry} +} + +// Resolved implements the Resolvable interface. +func (n *ShowCreateTable) Resolved() bool { + _, ok := n.Database.(*sql.UnresolvedDatabase) + return !ok +} + +// Children implements the Node interface. +func (n *ShowCreateTable) Children() []sql.Node { return nil } diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go new file mode 100644 index 000000000..53ef5e8c0 --- /dev/null +++ b/sql/plan/show_create_table_test.go @@ -0,0 +1,42 @@ +package plan + +import ( + "github.com/stretchr/testify/require" + "gopkg.in/src-d/go-mysql-server.v0/mem" + "gopkg.in/src-d/go-mysql-server.v0/sql" + "testing" +) + +func TestShowCreateTable(t *testing.T) { + var require = require.New(t) + + db := mem.NewDatabase("test") + + table := mem.NewTable( + "test-table", + sql.Schema{ + &sql.Column{Name: "baz", Type: sql.Text, Default: "", Nullable: false}, + &sql.Column{Name: "zab", Type: sql.Int32, Default: int32(0), Nullable: true}, + &sql.Column{Name: "bza", Type: sql.Int64, Default: int64(0), Nullable: true}, + }) + + db.AddTable(table.Name(), table) + + showCreateTable := NewShowCreateTable(db, table.Name(), sql.NewIndexRegistry()) + + ctx := sql.NewEmptyContext() + rowIter, _ := showCreateTable.RowIter(ctx) + + row, err := rowIter.Next() + + require.Nil(err) + + expected := sql.NewRow( + table.Name(), + "CREATE TABLE `test-table` (`baz` TEXT DEFAULT NOT NULL,\n"+ + " `zab` INT32 DEFAULT 0,\n"+ + " `bza` INT64 DEFAULT 0) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", + ) + + require.Equal(expected, row) +} From a8b819b243301fe9321230900f5182b0b8704e74 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Wed, 10 Oct 2018 14:09:40 +0300 Subject: [PATCH 02/12] sql: plan: Change some things for SHOW CREATE TABLE as per code review Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/plan/show_create_table.go | 9 ++------- sql/plan/show_create_table_test.go | 4 ++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index f94d0c3d2..05c13b774 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -47,7 +47,7 @@ func (n *ShowCreateTable) RowIter(*sql.Context) (sql.RowIter, error) { // String implements the Stringer interface. func (n *ShowCreateTable) String() string { - return fmt.Sprintf("ShowCreateTable(%s)", n.Table) + return fmt.Sprintf("SHOW CREATE TABLE %s", n.Table) } type createTableStmt struct { @@ -82,15 +82,10 @@ func (i *showCreateTablesIter) Next() (sql.Row, error) { createStmtPart = fmt.Sprintf("%sNOT NULL", createStmtPart) } - if indx != len(schema)-1 { - colCreateStatements[indx] = createStmtPart + ",\n" - continue - } - colCreateStatements[indx] = createStmtPart } - prettyColCreateStmts := fmt.Sprintf("%s", stripBrackets(colCreateStatements)) + prettyColCreateStmts := fmt.Sprintf("%s", stripBrackets(strings.Join(colCreateStatements, ",\n"))) composedCreateTableStatement := fmt.Sprintf("CREATE TABLE `%s` (%s) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", i.table, prettyColCreateStmts) diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index 53ef5e8c0..c2dca762c 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -34,8 +34,8 @@ func TestShowCreateTable(t *testing.T) { expected := sql.NewRow( table.Name(), "CREATE TABLE `test-table` (`baz` TEXT DEFAULT NOT NULL,\n"+ - " `zab` INT32 DEFAULT 0,\n"+ - " `bza` INT64 DEFAULT 0) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", + "`zab` INT32 DEFAULT 0,\n"+ + "`bza` INT64 DEFAULT 0) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", ) require.Equal(expected, row) From 1980e77797b1610fd3569998e6025ec0e66da453 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Thu, 11 Oct 2018 11:45:51 +0300 Subject: [PATCH 03/12] sql: plan: Change SHOW CREATE TABLE to accept a catalog and a database name instead Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/analyzer/assign_catalog.go | 5 +++++ sql/parse/parse.go | 14 ++++++------ sql/plan/show_create_table.go | 35 ++++++++++++++++++++++-------- sql/plan/show_create_table_test.go | 5 +++-- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/sql/analyzer/assign_catalog.go b/sql/analyzer/assign_catalog.go index c9e7ee86a..1a6e237f1 100644 --- a/sql/analyzer/assign_catalog.go +++ b/sql/analyzer/assign_catalog.go @@ -34,6 +34,11 @@ func assignCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) nc := *node nc.Catalog = a.Catalog return &nc, nil + case *plan.ShowCreateTable: + nc := *node + nc.Catalog = a.Catalog + nc.DatabaseName = a.CurrentDatabase + return &nc, nil case *plan.ShowProcessList: nc := *node nc.Database = a.CurrentDatabase diff --git a/sql/parse/parse.go b/sql/parse/parse.go index 6cde774c7..785d82c22 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -3,19 +3,19 @@ package parse // import "gopkg.in/src-d/go-mysql-server.v0/sql/parse" import ( "bufio" "fmt" - "io" - "io/ioutil" - "regexp" - "strconv" - "strings" - "gopkg.in/src-d/go-mysql-server.v0/sql/expression/function" "github.com/opentracing/opentracing-go" "github.com/sirupsen/logrus" "gopkg.in/src-d/go-errors.v1" "gopkg.in/src-d/go-mysql-server.v0/sql" "gopkg.in/src-d/go-mysql-server.v0/sql/expression" + "gopkg.in/src-d/go-mysql-server.v0/sql/expression/function" "gopkg.in/src-d/go-mysql-server.v0/sql/plan" "gopkg.in/src-d/go-vitess.v1/vt/sqlparser" + "io" + "io/ioutil" + "regexp" + "strconv" + "strings" ) var ( @@ -104,7 +104,7 @@ func parseShowCreateTable(s string) (sql.Node, error) { } return plan.NewShowCreateTable( - &sql.UnresolvedDatabase{}, + "", table, nil, ), nil diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 05c13b774..30325704b 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -14,9 +14,10 @@ var ErrTableNotFound = errors.NewKind("Table `%s` not found") // ShowCreateTable is a node that shows the CREATE TABLE statement for a table. type ShowCreateTable struct { - Database sql.Database - Table string - Registry *sql.IndexRegistry + DatabaseName string + Table string + Registry *sql.IndexRegistry + Catalog *sql.Catalog } // Schema implements the Node interface. @@ -34,13 +35,23 @@ func (n *ShowCreateTable) TransformExpressionsUp(f sql.TransformExprFunc) (sql.N // TransformUp implements the Transformable interface. func (n *ShowCreateTable) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) { - return f(NewShowCreateTable(n.Database, n.Table, n.Registry)) + datab, _ := n.Catalog.Database(n.DatabaseName) + if datab == nil { + datab = &sql.UnresolvedDatabase{} + } + + return f(NewShowCreateTable(n.DatabaseName, n.Table, n.Registry)) } // RowIter implements the Node interface. func (n *ShowCreateTable) RowIter(*sql.Context) (sql.RowIter, error) { + datab, _ := n.Catalog.Database(n.DatabaseName) + if datab == nil { + datab = &sql.UnresolvedDatabase{} + } + return &showCreateTablesIter{ - db: n.Database, + db: datab, table: n.Table, }, nil } @@ -105,14 +116,20 @@ func (i *showCreateTablesIter) Close() error { } // NewShowCreateTable creates a new ShowCreateTable node. -func NewShowCreateTable(db sql.Database, table string, registry *sql.IndexRegistry) sql.Node { - return &ShowCreateTable{db, table, registry} +func NewShowCreateTable(db string, table string, registry *sql.IndexRegistry) sql.Node { + return &ShowCreateTable{DatabaseName: db, + Table: table, + Registry: registry} } // Resolved implements the Resolvable interface. func (n *ShowCreateTable) Resolved() bool { - _, ok := n.Database.(*sql.UnresolvedDatabase) - return !ok + _, err := n.Catalog.Database(n.DatabaseName) + if err == nil { + return true + } + + return false } // Children implements the Node interface. diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index c2dca762c..502e2787a 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -10,7 +10,7 @@ import ( func TestShowCreateTable(t *testing.T) { var require = require.New(t) - db := mem.NewDatabase("test") + db := mem.NewDatabase("testdb") table := mem.NewTable( "test-table", @@ -22,7 +22,8 @@ func TestShowCreateTable(t *testing.T) { db.AddTable(table.Name(), table) - showCreateTable := NewShowCreateTable(db, table.Name(), sql.NewIndexRegistry()) + showCreateTable := NewShowCreateTable(db.Name(), table.Name(), sql.NewIndexRegistry()) + showCreateTable.(*ShowCreateTable).Catalog = &sql.Catalog{Databases: sql.Databases{db}} ctx := sql.NewEmptyContext() rowIter, _ := showCreateTable.RowIter(ctx) From e0be8b01942fe4173ecc8dcdbee7a587222aed8c Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Thu, 11 Oct 2018 14:28:47 +0300 Subject: [PATCH 04/12] sql: expression: function: Fix parser and some nil panics Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/parse/parse.go | 5 ++++- sql/plan/show_create_table.go | 26 ++++++++++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/sql/parse/parse.go b/sql/parse/parse.go index 785d82c22..9984f8ea5 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -90,8 +90,11 @@ func parseShowCreateTable(s string) (sql.Node, error) { var table string steps := []parseFunc{ - expect("show create table"), + expect("show"), + skipSpaces, + expect("create"), skipSpaces, + expect("table"), readIdent(&table), skipSpaces, checkEOF, diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 30325704b..8de3c7d4b 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -35,7 +35,12 @@ func (n *ShowCreateTable) TransformExpressionsUp(f sql.TransformExprFunc) (sql.N // TransformUp implements the Transformable interface. func (n *ShowCreateTable) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) { - datab, _ := n.Catalog.Database(n.DatabaseName) + var datab sql.Database + if n.Catalog == nil { + datab = &sql.UnresolvedDatabase{} + return f(NewShowCreateTable(n.DatabaseName, n.Table, n.Registry)) + } + datab, _ = n.Catalog.Database(n.DatabaseName) if datab == nil { datab = &sql.UnresolvedDatabase{} } @@ -45,7 +50,17 @@ func (n *ShowCreateTable) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) // RowIter implements the Node interface. func (n *ShowCreateTable) RowIter(*sql.Context) (sql.RowIter, error) { - datab, _ := n.Catalog.Database(n.DatabaseName) + var datab sql.Database + if n.Catalog == nil { + datab = &sql.UnresolvedDatabase{} + + return &showCreateTablesIter{ + db: datab, + table: n.Table, + }, nil + } + + datab, _ = n.Catalog.Database(n.DatabaseName) if datab == nil { datab = &sql.UnresolvedDatabase{} } @@ -124,12 +139,7 @@ func NewShowCreateTable(db string, table string, registry *sql.IndexRegistry) sq // Resolved implements the Resolvable interface. func (n *ShowCreateTable) Resolved() bool { - _, err := n.Catalog.Database(n.DatabaseName) - if err == nil { - return true - } - - return false + return true } // Children implements the Node interface. From 1c3ce54871ec2f9e580f17d0c9e84e927e7c3a2f Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Thu, 11 Oct 2018 14:42:26 +0300 Subject: [PATCH 05/12] sql: plan: SHOW CREATE TABLE - Use catalog, without database found Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/parse/parse.go | 3 +- sql/plan/show_create_table.go | 47 +++++++----------------------- sql/plan/show_create_table_test.go | 3 +- 3 files changed, 13 insertions(+), 40 deletions(-) diff --git a/sql/parse/parse.go b/sql/parse/parse.go index 9984f8ea5..38f097d6c 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -107,9 +107,8 @@ func parseShowCreateTable(s string) (sql.Node, error) { } return plan.NewShowCreateTable( - "", - table, nil, + table, ), nil } diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 8de3c7d4b..57e5a2bb1 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -14,10 +14,8 @@ var ErrTableNotFound = errors.NewKind("Table `%s` not found") // ShowCreateTable is a node that shows the CREATE TABLE statement for a table. type ShowCreateTable struct { - DatabaseName string - Table string - Registry *sql.IndexRegistry - Catalog *sql.Catalog + Table string + Catalog *sql.Catalog } // Schema implements the Node interface. @@ -35,38 +33,15 @@ func (n *ShowCreateTable) TransformExpressionsUp(f sql.TransformExprFunc) (sql.N // TransformUp implements the Transformable interface. func (n *ShowCreateTable) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) { - var datab sql.Database - if n.Catalog == nil { - datab = &sql.UnresolvedDatabase{} - return f(NewShowCreateTable(n.DatabaseName, n.Table, n.Registry)) - } - datab, _ = n.Catalog.Database(n.DatabaseName) - if datab == nil { - datab = &sql.UnresolvedDatabase{} - } - - return f(NewShowCreateTable(n.DatabaseName, n.Table, n.Registry)) + return f(NewShowCreateTable(n.Catalog, n.Table)) } -// RowIter implements the Node interface. -func (n *ShowCreateTable) RowIter(*sql.Context) (sql.RowIter, error) { - var datab sql.Database - if n.Catalog == nil { - datab = &sql.UnresolvedDatabase{} - - return &showCreateTablesIter{ - db: datab, - table: n.Table, - }, nil - } - - datab, _ = n.Catalog.Database(n.DatabaseName) - if datab == nil { - datab = &sql.UnresolvedDatabase{} - } +// RowIter implements the Node interface +func (n *ShowCreateTable) RowIter(c *sql.Context) (sql.RowIter, error) { + // Find correct db here? return &showCreateTablesIter{ - db: datab, + db: &sql.UnresolvedDatabase{}, table: n.Table, }, nil } @@ -131,10 +106,10 @@ func (i *showCreateTablesIter) Close() error { } // NewShowCreateTable creates a new ShowCreateTable node. -func NewShowCreateTable(db string, table string, registry *sql.IndexRegistry) sql.Node { - return &ShowCreateTable{DatabaseName: db, - Table: table, - Registry: registry} +func NewShowCreateTable(ctl *sql.Catalog, table string) sql.Node { + return &ShowCreateTable{ + Table: table, + Catalog: ctl} } // Resolved implements the Resolvable interface. diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index 502e2787a..9289e6231 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -22,8 +22,7 @@ func TestShowCreateTable(t *testing.T) { db.AddTable(table.Name(), table) - showCreateTable := NewShowCreateTable(db.Name(), table.Name(), sql.NewIndexRegistry()) - showCreateTable.(*ShowCreateTable).Catalog = &sql.Catalog{Databases: sql.Databases{db}} + showCreateTable := NewShowCreateTable(&sql.Catalog{Databases: sql.Databases{db}}, table.Name()) ctx := sql.NewEmptyContext() rowIter, _ := showCreateTable.RowIter(ctx) From addd4ae1b2fae479dedb678309948c138d6b7496 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Thu, 11 Oct 2018 15:43:00 +0300 Subject: [PATCH 06/12] sql: plan SHOW CREATE TABLE: Implement correct database usage from catalog Signed-off-by: Theodoros Zarkopafilis Ntakouris --- go.mod | 2 +- sql/analyzer/assign_catalog.go | 2 +- sql/parse/parse.go | 4 ++-- sql/plan/show_create_table.go | 31 ++++++++++++++++-------------- sql/plan/show_create_table_test.go | 2 +- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 3d05a537a..f05480f1e 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/spf13/cast v1.2.0 github.com/stretchr/testify v1.2.2 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 // indirect - golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3 // indirect + golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3 // indirect google.golang.org/grpc v1.15.0 // indirect gopkg.in/src-d/go-errors.v1 v1.0.0 gopkg.in/src-d/go-vitess.v1 v1.1.0 diff --git a/sql/analyzer/assign_catalog.go b/sql/analyzer/assign_catalog.go index 1a6e237f1..38eedfd0d 100644 --- a/sql/analyzer/assign_catalog.go +++ b/sql/analyzer/assign_catalog.go @@ -37,7 +37,7 @@ func assignCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) case *plan.ShowCreateTable: nc := *node nc.Catalog = a.Catalog - nc.DatabaseName = a.CurrentDatabase + nc.CurrentDatabase = a.CurrentDatabase return &nc, nil case *plan.ShowProcessList: nc := *node diff --git a/sql/parse/parse.go b/sql/parse/parse.go index 38f097d6c..a2b032cb8 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -107,9 +107,9 @@ func parseShowCreateTable(s string) (sql.Node, error) { } return plan.NewShowCreateTable( + (&sql.UnresolvedDatabase{}).Name(), nil, - table, - ), nil + table), nil } func parseDescribeTables(s string) (sql.Node, error) { diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 57e5a2bb1..354e36470 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -14,8 +14,9 @@ var ErrTableNotFound = errors.NewKind("Table `%s` not found") // ShowCreateTable is a node that shows the CREATE TABLE statement for a table. type ShowCreateTable struct { - Table string - Catalog *sql.Catalog + Catalog *sql.Catalog + CurrentDatabase string + Table string } // Schema implements the Node interface. @@ -33,15 +34,19 @@ func (n *ShowCreateTable) TransformExpressionsUp(f sql.TransformExprFunc) (sql.N // TransformUp implements the Transformable interface. func (n *ShowCreateTable) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) { - return f(NewShowCreateTable(n.Catalog, n.Table)) + return f(NewShowCreateTable(n.CurrentDatabase, n.Catalog, n.Table)) } // RowIter implements the Node interface -func (n *ShowCreateTable) RowIter(c *sql.Context) (sql.RowIter, error) { - // Find correct db here? +func (n *ShowCreateTable) RowIter(*sql.Context) (sql.RowIter, error) { + db, err := n.Catalog.Database(n.CurrentDatabase) + + if err != nil { + return nil, sql.ErrDatabaseNotFound.New(n.CurrentDatabase) + } return &showCreateTablesIter{ - db: &sql.UnresolvedDatabase{}, + db: db, table: n.Table, }, nil } @@ -86,7 +91,7 @@ func (i *showCreateTablesIter) Next() (sql.Row, error) { colCreateStatements[indx] = createStmtPart } - prettyColCreateStmts := fmt.Sprintf("%s", stripBrackets(strings.Join(colCreateStatements, ",\n"))) + prettyColCreateStmts := fmt.Sprintf("%s", strings.Join(colCreateStatements, ",\n")) composedCreateTableStatement := fmt.Sprintf("CREATE TABLE `%s` (%s) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", i.table, prettyColCreateStmts) @@ -97,24 +102,22 @@ func (i *showCreateTablesIter) Next() (sql.Row, error) { ), nil } -func stripBrackets(val interface{}) string { - return strings.Trim(fmt.Sprintf("%s", val), "[]") -} - func (i *showCreateTablesIter) Close() error { return nil } // NewShowCreateTable creates a new ShowCreateTable node. -func NewShowCreateTable(ctl *sql.Catalog, table string) sql.Node { +func NewShowCreateTable(db string, ctl *sql.Catalog, table string) sql.Node { return &ShowCreateTable{ - Table: table, - Catalog: ctl} + CurrentDatabase: db, + Table: table, + Catalog: ctl} } // Resolved implements the Resolvable interface. func (n *ShowCreateTable) Resolved() bool { return true + //return n.CurrentDatabase == (&sql.UnresolvedDatabase{}).Name() } // Children implements the Node interface. diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index 9289e6231..de5799cac 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -22,7 +22,7 @@ func TestShowCreateTable(t *testing.T) { db.AddTable(table.Name(), table) - showCreateTable := NewShowCreateTable(&sql.Catalog{Databases: sql.Databases{db}}, table.Name()) + showCreateTable := NewShowCreateTable(db.Name(), &sql.Catalog{Databases: sql.Databases{db}}, table.Name()) ctx := sql.NewEmptyContext() rowIter, _ := showCreateTable.RowIter(ctx) From c3eee19ede0159680b4693ce1037e119073e4e6f Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Thu, 11 Oct 2018 16:25:36 +0300 Subject: [PATCH 07/12] sql: plan: SHOW CREATE TABLE: Fix iterator to only run once Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/parse/parse.go | 1 + sql/plan/show_create_table.go | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sql/parse/parse.go b/sql/parse/parse.go index a2b032cb8..84b11000c 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -95,6 +95,7 @@ func parseShowCreateTable(s string) (sql.Node, error) { expect("create"), skipSpaces, expect("table"), + skipSpaces, readIdent(&table), skipSpaces, checkEOF, diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 354e36470..322487b9e 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -2,6 +2,7 @@ package plan import ( "fmt" + "io" "strings" ) @@ -65,14 +66,21 @@ type showCreateTablesIter struct { db sql.Database table string - createStmt *createTableStmt + createStmt *createTableStmt + didIteration bool } func (i *showCreateTablesIter) Next() (sql.Row, error) { - table := i.db.Tables()[i.table] + if i.didIteration { + return nil, io.EOF + } + + i.didIteration = true + + table, found := i.db.Tables()[i.table] - if table == nil { - return nil, ErrTableNotFound.New(table) + if !found { + return nil, ErrTableNotFound.New(i.table) } schema := table.Schema() From a7bf5f6baf479b23603c0fce5e4a22b2f47aab74 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Fri, 12 Oct 2018 13:36:02 +0300 Subject: [PATCH 08/12] sql: parse/plan: Extract show create parser function, refactor SHOW CREATE TABLE Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/parse/parse.go | 48 +++++++---------------------- sql/parse/show_create.go | 48 +++++++++++++++++++++++++++++ sql/parse/show_create_test.go | 58 +++++++++++++++++++++++++++++++++++ sql/plan/show_create_table.go | 19 +++++++----- 4 files changed, 129 insertions(+), 44 deletions(-) create mode 100644 sql/parse/show_create.go create mode 100644 sql/parse/show_create_test.go diff --git a/sql/parse/parse.go b/sql/parse/parse.go index 84b11000c..31c069e7f 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -3,6 +3,14 @@ package parse // import "gopkg.in/src-d/go-mysql-server.v0/sql/parse" import ( "bufio" "fmt" + "io" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +import ( "github.com/opentracing/opentracing-go" "github.com/sirupsen/logrus" "gopkg.in/src-d/go-errors.v1" @@ -11,11 +19,6 @@ import ( "gopkg.in/src-d/go-mysql-server.v0/sql/expression/function" "gopkg.in/src-d/go-mysql-server.v0/sql/plan" "gopkg.in/src-d/go-vitess.v1/vt/sqlparser" - "io" - "io/ioutil" - "regexp" - "strconv" - "strings" ) var ( @@ -37,7 +40,7 @@ var ( createIndexRegex = regexp.MustCompile(`^create\s+index\s+`) dropIndexRegex = regexp.MustCompile(`^drop\s+index\s+`) showIndexRegex = regexp.MustCompile(`^show\s+(index|indexes|keys)\s+(from|in)\s+\S+\s*`) - showCreateTableRegex = regexp.MustCompile(`^show create table\s+\S+\s*`) + showCreate = regexp.MustCompile(`^show create\s+\S+\s*`) describeRegex = regexp.MustCompile(`^(describe|desc|explain)\s+(.*)\s+`) fullProcessListRegex = regexp.MustCompile(`^show\s+(full\s+)?processlist$`) ) @@ -68,8 +71,8 @@ func Parse(ctx *sql.Context, query string) (sql.Node, error) { return parseDropIndex(s) case showIndexRegex.MatchString(lowerQuery): return parseShowIndex(s) - case showCreateTableRegex.MatchString(lowerQuery): - return parseShowCreateTable(s) + case showCreate.MatchString(lowerQuery): + return parseShowCreate(s) case describeRegex.MatchString(lowerQuery): return parseDescribeQuery(ctx, s) case fullProcessListRegex.MatchString(lowerQuery): @@ -84,35 +87,6 @@ func Parse(ctx *sql.Context, query string) (sql.Node, error) { return convert(ctx, stmt, s) } -//TODO: Move this to somewhere else perhaps? -func parseShowCreateTable(s string) (sql.Node, error) { - r := bufio.NewReader(strings.NewReader(s)) - - var table string - steps := []parseFunc{ - expect("show"), - skipSpaces, - expect("create"), - skipSpaces, - expect("table"), - skipSpaces, - readIdent(&table), - skipSpaces, - checkEOF, - } - - for _, step := range steps { - if err := step(r); err != nil { - return nil, err - } - } - - return plan.NewShowCreateTable( - (&sql.UnresolvedDatabase{}).Name(), - nil, - table), nil -} - func parseDescribeTables(s string) (sql.Node, error) { t := describeTablesRegex.FindStringSubmatch(s) if len(t) == 2 && t[1] != "" { diff --git a/sql/parse/show_create.go b/sql/parse/show_create.go new file mode 100644 index 000000000..31407de19 --- /dev/null +++ b/sql/parse/show_create.go @@ -0,0 +1,48 @@ +package parse + +import ( + "bufio" + "strings" +) + +import ( + "gopkg.in/src-d/go-errors.v1" + "gopkg.in/src-d/go-mysql-server.v0/sql" + "gopkg.in/src-d/go-mysql-server.v0/sql/plan" +) + +var errUnsupportedShowCreateQuery = errors.NewKind("Unsupported query: SHOW CREATE %s") + +func parseShowCreate(s string) (sql.Node, error) { + r := bufio.NewReader(strings.NewReader(s)) + + var thingToShow string + var name string + steps := []parseFunc{ + expect("show"), + skipSpaces, + expect("create"), + skipSpaces, + readIdent(&thingToShow), + skipSpaces, + readIdent(&name), + skipSpaces, + checkEOF, + } + + for _, step := range steps { + if err := step(r); err != nil { + return nil, err + } + } + + switch strings.ToLower(thingToShow) { + case "table": + return plan.NewShowCreateTable( + (&sql.UnresolvedDatabase{}).Name(), + nil, + name), nil + default: + return nil, errUnsupportedShowCreateQuery.New(name) + } +} diff --git a/sql/parse/show_create_test.go b/sql/parse/show_create_test.go new file mode 100644 index 000000000..cedb5c1f0 --- /dev/null +++ b/sql/parse/show_create_test.go @@ -0,0 +1,58 @@ +package parse + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +import ( + "gopkg.in/src-d/go-errors.v1" + "gopkg.in/src-d/go-mysql-server.v0/sql" + "gopkg.in/src-d/go-mysql-server.v0/sql/plan" +) + +func TestParseShowCreateTableQuery(t *testing.T) { + testCases := []struct { + query string + result sql.Node + err *errors.Kind + }{ + { + "SHOW CREATE", + nil, + errUnsupportedShowCreateQuery, + }, + { + "SHOW CREATE ANYTHING", + nil, + errUnsupportedShowCreateQuery, + }, + { + "SHOW CREATE ASDF foo", + nil, + errUnsupportedShowCreateQuery, + }, + { + "SHOW CREATE TABLE mytable", + plan.NewShowCreateTable((&sql.UnresolvedDatabase{}).Name(), + nil, + "mytable"), + nil, + }, + } + + for _, tt := range testCases { + t.Run(tt.query, func(t *testing.T) { + require := require.New(t) + + result, err := parseShowCreate(tt.query) + if tt.err != nil { + require.Error(err) + require.True(tt.err.Is(err)) + } else { + require.NoError(err) + require.Equal(tt.result, result) + } + }) + } +} diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 322487b9e..2a115a375 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -83,8 +83,18 @@ func (i *showCreateTablesIter) Next() (sql.Row, error) { return nil, ErrTableNotFound.New(i.table) } + composedCreateTableStatement := produceCreateStatement(table) + + return sql.NewRow( + i.table, // "Table" string + composedCreateTableStatement, // "Create Table" string + ), nil +} + +func produceCreateStatement(table sql.Table) string { schema := table.Schema() colCreateStatements := make([]string, len(schema), len(schema)) + // Statement creation parts for each column for indx, col := range schema { createStmtPart := fmt.Sprintf("`%s` %s", col.Name, col.Type.Type()) @@ -100,14 +110,10 @@ func (i *showCreateTablesIter) Next() (sql.Row, error) { } prettyColCreateStmts := fmt.Sprintf("%s", strings.Join(colCreateStatements, ",\n")) - composedCreateTableStatement := - fmt.Sprintf("CREATE TABLE `%s` (%s) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", i.table, prettyColCreateStmts) + fmt.Sprintf("CREATE TABLE `%s` (%s) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", table.Name(), prettyColCreateStmts) - return sql.NewRow( - i.table, // "Table" string - composedCreateTableStatement, // "Create Table" string - ), nil + return composedCreateTableStatement } func (i *showCreateTablesIter) Close() error { @@ -125,7 +131,6 @@ func NewShowCreateTable(db string, ctl *sql.Catalog, table string) sql.Node { // Resolved implements the Resolvable interface. func (n *ShowCreateTable) Resolved() bool { return true - //return n.CurrentDatabase == (&sql.UnresolvedDatabase{}).Name() } // Children implements the Node interface. From 297820676460c01fd83ef3100df2cb4832e0f1d1 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Fri, 12 Oct 2018 17:25:35 +0300 Subject: [PATCH 09/12] sql: plan: SHOW CREATE TABLE: Make query generation a bit more readable Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/expression/function/ceil_round_floor.go | 4 ++-- sql/plan/show_create_table.go | 16 ++++++++++++---- sql/plan/show_create_table_test.go | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/sql/expression/function/ceil_round_floor.go b/sql/expression/function/ceil_round_floor.go index 66bd7edf4..e6f4d2509 100644 --- a/sql/expression/function/ceil_round_floor.go +++ b/sql/expression/function/ceil_round_floor.go @@ -231,10 +231,10 @@ func (r *Round) IsNullable() bool { func (r *Round) String() string { if r.Right == nil { - return fmt.Sprintf("ROUND(%s, 0)", r.Right.String()) + return fmt.Sprintf("ROUND(%s, 0)", r.Left.String()) } - return fmt.Sprintf("ROUND(%s, %s)", r.Right.String(), r.Left.String()) + return fmt.Sprintf("ROUND(%s, %s)", r.Left.String(), r.Left.String()) } // Resolved implements the Expression interface. diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index 2a115a375..b4dbbb151 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -98,12 +98,20 @@ func produceCreateStatement(table sql.Table) string { // Statement creation parts for each column for indx, col := range schema { createStmtPart := fmt.Sprintf("`%s` %s", col.Name, col.Type.Type()) - if col.Default != nil { - createStmtPart = fmt.Sprintf("%s DEFAULT %v", createStmtPart, col.Default) - } if !col.Nullable { - createStmtPart = fmt.Sprintf("%sNOT NULL", createStmtPart) + createStmtPart = fmt.Sprintf("%s NOT NULL", createStmtPart) + } + + switch def := col.Default.(type) { + case string: + if def != "" { + createStmtPart = fmt.Sprintf("%s DEFAULT %s", createStmtPart, def) + } + default: + if def != nil { + createStmtPart = fmt.Sprintf("%s DEFAULT %v", createStmtPart, col.Default) + } } colCreateStatements[indx] = createStmtPart diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index de5799cac..c51c61689 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -33,7 +33,7 @@ func TestShowCreateTable(t *testing.T) { expected := sql.NewRow( table.Name(), - "CREATE TABLE `test-table` (`baz` TEXT DEFAULT NOT NULL,\n"+ + "CREATE TABLE `test-table` (`baz` TEXT NOT NULL,\n"+ "`zab` INT32 DEFAULT 0,\n"+ "`bza` INT64 DEFAULT 0) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", ) From b4e04f1fc4bdbf9969ada14975c636fb60b9327b Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Mon, 15 Oct 2018 15:47:03 +0300 Subject: [PATCH 10/12] sql: parse/plan: Clean imports Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/parse/parse.go | 2 -- sql/parse/show_create_test.go | 5 ++--- sql/plan/show_create_table.go | 2 -- sql/plan/show_create_table_test.go | 3 ++- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/sql/parse/parse.go b/sql/parse/parse.go index 31c069e7f..21ceac85f 100644 --- a/sql/parse/parse.go +++ b/sql/parse/parse.go @@ -8,9 +8,7 @@ import ( "regexp" "strconv" "strings" -) -import ( "github.com/opentracing/opentracing-go" "github.com/sirupsen/logrus" "gopkg.in/src-d/go-errors.v1" diff --git a/sql/parse/show_create_test.go b/sql/parse/show_create_test.go index cedb5c1f0..8235fd1f2 100644 --- a/sql/parse/show_create_test.go +++ b/sql/parse/show_create_test.go @@ -1,15 +1,14 @@ package parse import ( - "github.com/stretchr/testify/require" "testing" -) -import ( + "github.com/stretchr/testify/require" "gopkg.in/src-d/go-errors.v1" "gopkg.in/src-d/go-mysql-server.v0/sql" "gopkg.in/src-d/go-mysql-server.v0/sql/plan" ) +s func TestParseShowCreateTableQuery(t *testing.T) { testCases := []struct { diff --git a/sql/plan/show_create_table.go b/sql/plan/show_create_table.go index b4dbbb151..a8a461e21 100644 --- a/sql/plan/show_create_table.go +++ b/sql/plan/show_create_table.go @@ -4,9 +4,7 @@ import ( "fmt" "io" "strings" -) -import ( "gopkg.in/src-d/go-errors.v1" "gopkg.in/src-d/go-mysql-server.v0/sql" ) diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index c51c61689..8dd67ca48 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -1,10 +1,11 @@ package plan import ( + "testing" + "github.com/stretchr/testify/require" "gopkg.in/src-d/go-mysql-server.v0/mem" "gopkg.in/src-d/go-mysql-server.v0/sql" - "testing" ) func TestShowCreateTable(t *testing.T) { From a1fcbc3cabc86befef12c5c22dcd271425b4cd09 Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Wed, 17 Oct 2018 12:25:35 +0300 Subject: [PATCH 11/12] sql: plan/parse: Fix CI Signed-off-by: Theodoros Zarkopafilis Ntakouris --- sql/analyzer/assign_catalog.go | 2 +- sql/parse/show_create.go | 2 +- sql/parse/show_create_test.go | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sql/analyzer/assign_catalog.go b/sql/analyzer/assign_catalog.go index 985920fa9..45d77def2 100644 --- a/sql/analyzer/assign_catalog.go +++ b/sql/analyzer/assign_catalog.go @@ -37,7 +37,7 @@ func assignCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) case *plan.ShowCreateTable: nc := *node nc.Catalog = a.Catalog - nc.CurrentDatabase = a.CurrentDatabase + nc.CurrentDatabase = a.Catalog.CurrentDatabase() return &nc, nil case *plan.ShowProcessList: nc := *node diff --git a/sql/parse/show_create.go b/sql/parse/show_create.go index 31407de19..cbc9a0d43 100644 --- a/sql/parse/show_create.go +++ b/sql/parse/show_create.go @@ -39,7 +39,7 @@ func parseShowCreate(s string) (sql.Node, error) { switch strings.ToLower(thingToShow) { case "table": return plan.NewShowCreateTable( - (&sql.UnresolvedDatabase{}).Name(), + sql.UnresolvedDatabase("").Name(), nil, name), nil default: diff --git a/sql/parse/show_create_test.go b/sql/parse/show_create_test.go index 8235fd1f2..032d655c6 100644 --- a/sql/parse/show_create_test.go +++ b/sql/parse/show_create_test.go @@ -8,7 +8,6 @@ import ( "gopkg.in/src-d/go-mysql-server.v0/sql" "gopkg.in/src-d/go-mysql-server.v0/sql/plan" ) -s func TestParseShowCreateTableQuery(t *testing.T) { testCases := []struct { @@ -33,7 +32,7 @@ func TestParseShowCreateTableQuery(t *testing.T) { }, { "SHOW CREATE TABLE mytable", - plan.NewShowCreateTable((&sql.UnresolvedDatabase{}).Name(), + plan.NewShowCreateTable(sql.UnresolvedDatabase("").Name(), nil, "mytable"), nil, From 549bfadd3f58a2be8857167930fa08af5a5d4c4a Mon Sep 17 00:00:00 2001 From: Theodoros Zarkopafilis Ntakouris Date: Wed, 17 Oct 2018 13:51:06 +0300 Subject: [PATCH 12/12] sql: plan/parse: Change to comply with the new catalog api Signed-off-by: Theodoros Zarkopafilis Ntakouris --- go.mod | 75 +++++++++++++++--------------- sql/plan/show_create_table_test.go | 5 +- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index f05480f1e..6441936c2 100644 --- a/go.mod +++ b/go.mod @@ -1,56 +1,57 @@ module gopkg.in/src-d/go-mysql-server.v0 require ( - github.com/BurntSushi/toml v0.3.1 // indirect - github.com/CAFxX/gcnotifier v0.0.0-20170518020117-39b0596a2da3 // indirect - github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895 // indirect - github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f // indirect - github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect - github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 // indirect + github.com/BurntSushi/toml v0.3.1 // indirect + github.com/CAFxX/gcnotifier v0.0.0-20170518020117-39b0596a2da3 // indirect + github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895 // indirect + github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f // indirect + github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect + github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 // indirect github.com/boltdb/bolt v1.3.1 github.com/cespare/xxhash v1.1.0 // indirect - github.com/circonus-labs/circonus-gometrics v2.2.4+incompatible // indirect - github.com/circonus-labs/circonusllhist v0.0.0-20180430145027-5eb751da55c6 // indirect - github.com/go-ole/go-ole v1.2.1 // indirect + github.com/circonus-labs/circonus-gometrics v2.2.4+incompatible // indirect + github.com/circonus-labs/circonusllhist v0.0.0-20180430145027-5eb751da55c6 // indirect + github.com/go-ole/go-ole v1.2.1 // indirect github.com/gogo/protobuf v1.1.1 // indirect - github.com/google/go-cmp v0.2.0 // indirect - github.com/gorilla/context v1.1.1 // indirect - github.com/gorilla/handlers v1.4.0 // indirect - github.com/gorilla/mux v1.6.2 // indirect - github.com/hashicorp/consul v1.2.3 // indirect - github.com/hashicorp/go-cleanhttp v0.5.0 // indirect - github.com/hashicorp/go-immutable-radix v1.0.0 // indirect - github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c // indirect - github.com/hashicorp/go-multierror v1.0.0 // indirect - github.com/hashicorp/go-retryablehttp v0.0.0-20180718195005-e651d75abec6 // indirect - github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 // indirect - github.com/hashicorp/memberlist v0.1.0 // indirect - github.com/hashicorp/serf v0.8.1 // indirect - github.com/hashicorp/yamux v0.0.0-20180917205041-7221087c3d28 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/miekg/dns v1.0.12 // indirect + github.com/google/go-cmp v0.2.0 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/gorilla/handlers v1.4.0 // indirect + github.com/gorilla/mux v1.6.2 // indirect + github.com/hashicorp/consul v1.2.3 // indirect + github.com/hashicorp/go-cleanhttp v0.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.0.0 // indirect + github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c // indirect + github.com/hashicorp/go-multierror v1.0.0 // indirect + github.com/hashicorp/go-retryablehttp v0.0.0-20180718195005-e651d75abec6 // indirect + github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 // indirect + github.com/hashicorp/memberlist v0.1.0 // indirect + github.com/hashicorp/serf v0.8.1 // indirect + github.com/hashicorp/yamux v0.0.0-20180917205041-7221087c3d28 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/miekg/dns v1.0.12 // indirect github.com/mitchellh/hashstructure v1.0.0 + github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 github.com/opentracing/opentracing-go v1.0.2 - github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c // indirect - github.com/pelletier/go-toml v1.2.0 // indirect + github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c // indirect + github.com/pelletier/go-toml v1.2.0 // indirect github.com/pilosa/pilosa v1.1.0 github.com/pkg/errors v0.8.0 // indirect - github.com/prometheus/client_golang v0.8.0 // indirect - github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 // indirect - github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e // indirect - github.com/prometheus/procfs v0.0.0-20180920065004-418d78d0b9a7 // indirect + github.com/prometheus/client_golang v0.8.0 // indirect + github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 // indirect + github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e // indirect + github.com/prometheus/procfs v0.0.0-20180920065004-418d78d0b9a7 // indirect github.com/satori/go.uuid v1.2.0 // indirect - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect - github.com/shirou/gopsutil v2.17.12+incompatible // indirect - github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect + github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect + github.com/shirou/gopsutil v2.17.12+incompatible // indirect + github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect github.com/sirupsen/logrus v1.1.0 github.com/spf13/cast v1.2.0 github.com/stretchr/testify v1.2.2 - github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 // indirect - golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3 // indirect + github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 // indirect + golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3 // indirect google.golang.org/grpc v1.15.0 // indirect gopkg.in/src-d/go-errors.v1 v1.0.0 gopkg.in/src-d/go-vitess.v1 v1.1.0 - gopkg.in/vmihailenco/msgpack.v2 v2.9.1 // indirect + gopkg.in/vmihailenco/msgpack.v2 v2.9.1 // indirect gopkg.in/yaml.v2 v2.2.1 ) diff --git a/sql/plan/show_create_table_test.go b/sql/plan/show_create_table_test.go index 8dd67ca48..9f64cccb1 100644 --- a/sql/plan/show_create_table_test.go +++ b/sql/plan/show_create_table_test.go @@ -23,7 +23,10 @@ func TestShowCreateTable(t *testing.T) { db.AddTable(table.Name(), table) - showCreateTable := NewShowCreateTable(db.Name(), &sql.Catalog{Databases: sql.Databases{db}}, table.Name()) + cat := sql.NewCatalog() + cat.AddDatabase(db) + + showCreateTable := NewShowCreateTable(db.Name(), cat, table.Name()) ctx := sql.NewEmptyContext() rowIter, _ := showCreateTable.RowIter(ctx)