diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index f7b46521b68..61fcdc05861 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -293,7 +293,7 @@ func (t *Tracker) updatedTableSchema(th *discovery.TabletHealth) bool { func (t *Tracker) updateTables(keyspace string, res map[string]string) { for tableName, tableDef := range res { - stmt, err := t.parser.Parse(tableDef) + stmt, err := t.parser.ParseStrictDDL(tableDef) if err != nil { log.Warningf("error parsing table definition for %s: %v", tableName, err) continue @@ -475,7 +475,7 @@ func (vm *viewMap) set(ks, tbl, sql string) { m = make(map[tableNameStr]sqlparser.SelectStatement) vm.m[ks] = m } - stmt, err := vm.parser.Parse(sql) + stmt, err := vm.parser.ParseStrictDDL(sql) if err != nil { log.Warningf("ignoring view '%s', parsing error in view definition: '%s'", tbl, sql) return diff --git a/go/vt/vtgate/schema/tracker_test.go b/go/vt/vtgate/schema/tracker_test.go index 1ee1aee6a0f..e8ebd0e5a5c 100644 --- a/go/vt/vtgate/schema/tracker_test.go +++ b/go/vt/vtgate/schema/tracker_test.go @@ -180,6 +180,8 @@ func TestTableTracking(t *testing.T) { "t3": "create table t3(id datetime primary key)", }, { "t4": "create table t4(name varchar(50) primary key)", + }, { + "t5": "create table t5(name varchar(50) primary key with broken syntax)", }} testcases := []testCases{{ @@ -212,6 +214,15 @@ func TestTableTracking(t *testing.T) { "t3": {{Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_DATETIME, CollationName: "binary", Size: 0, Nullable: true}}, "t4": {{Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, Size: 50, Nullable: true}}, }, + }, { + testName: "new broken table", + updTbl: []string{"t5"}, + expTbl: map[string][]vindexes.Column{ + "t1": {{Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_INT64, CollationName: "binary", Nullable: true}, {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, Size: 50, Nullable: true}, {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARCHAR, Size: 50, Nullable: false, Default: &sqlparser.Literal{Val: "a@b.com"}}}, + "T1": {{Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_VARCHAR, Size: 50, Nullable: true}, {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, Size: 50, Nullable: true}}, + "t3": {{Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_DATETIME, CollationName: "binary", Size: 0, Nullable: true}}, + "t4": {{Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, Size: 50, Nullable: true}}, + }, }} testTracker(t, schemaDefResult, testcases) @@ -231,6 +242,8 @@ func TestViewsTracking(t *testing.T) { "t3": "create view t3 as select 1 from tbl3", }, { "t4": "create view t4 as select 1 from tbl4", + }, { + "t4": "create view t5 as select 1 from tbl4 with broken syntax", }} testcases := []testCases{{ @@ -259,6 +272,14 @@ func TestViewsTracking(t *testing.T) { "V1": "select 1, 2 from tbl2", "t3": "select 1 from tbl3", "t4": "select 1 from tbl4"}, + }, { + testName: "new broken t5", + updView: []string{"t5"}, + expView: map[string]string{ + "t1": "select 1 from tbl1", + "V1": "select 1, 2 from tbl2", + "t3": "select 1 from tbl3", + "t4": "select 1 from tbl4"}, }} testTracker(t, schemaDefResult, testcases) diff --git a/go/vt/wrangler/vdiff.go b/go/vt/wrangler/vdiff.go index 70dee1261fc..65998053e9b 100644 --- a/go/vt/wrangler/vdiff.go +++ b/go/vt/wrangler/vdiff.go @@ -537,7 +537,7 @@ func findPKs(env *vtenv.Environment, table *tabletmanagerdatapb.TableDefinition, // column in the table definition leveraging MySQL's collation inheritance // rules. func getColumnCollations(venv *vtenv.Environment, table *tabletmanagerdatapb.TableDefinition) (map[string]collations.ID, error) { - createstmt, err := venv.Parser().Parse(table.Schema) + createstmt, err := venv.Parser().ParseStrictDDL(table.Schema) if err != nil { return nil, err } diff --git a/go/vt/wrangler/vdiff_test.go b/go/vt/wrangler/vdiff_test.go index 1b0071ebed7..96392c3cc0a 100644 --- a/go/vt/wrangler/vdiff_test.go +++ b/go/vt/wrangler/vdiff_test.go @@ -1277,6 +1277,13 @@ func TestGetColumnCollations(t *testing.T) { "name": collationEnv.LookupByName("utf16_icelandic_ci"), }, }, + { + name: "invalid schema", + table: &tabletmanagerdatapb.TableDefinition{ + Schema: "create table t1 (c1 varchar(10), size set('small', 'medium', 'large'), primary key(c1) with syntax error)", + }, + wantErr: true, + }, } env := vtenv.NewTestEnv() for _, tt := range tests {