diff --git a/parser/datadriven_test.go b/parser/datadriven_test.go new file mode 100644 index 0000000..8d7b626 --- /dev/null +++ b/parser/datadriven_test.go @@ -0,0 +1,217 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser_test + +import ( + "flag" + "fmt" + "os" + "path/filepath" + "reflect" + "strings" + "testing" + + "github.com/sqlc-dev/marino/format" + "github.com/sqlc-dev/marino/mysql" + "github.com/sqlc-dev/marino/parser" +) + +// TestParserData runs the file-driven parser test suite under +// testdata/parser. Each subdirectory is one test group holding two files: +// +// input.sql — the source SQL cases, separated by lines reading "-- case". +// An optional first line "-- flags: a, b" configures the +// parser for the whole group (window_func, mariadb, +// real_as_float). +// output.sql — one segment per input case, separated the same way. A +// segment is either the expected Restore() output of the +// parsed statements (joined by "; " for multi-statement +// sources), or "-- error: " with the exact error +// the parse must fail with. +// +// Every passing case is additionally round-tripped: the restored SQL is +// re-parsed and the two ASTs must be deep-equal (after CleanNodeText). +// +// Run with -update to regenerate every output.sql from current parser +// behavior: +// +// go test ./parser -run TestParserData -update +var updateParserData = flag.Bool("update", false, "regenerate testdata/parser output.sql goldens") + +const ( + parserDataDir = "testdata/parser" + caseDelimiter = "\n-- case\n" + errorMarker = "-- error: " + flagsMarker = "-- flags:" +) + +func TestParserData(t *testing.T) { + entries, err := os.ReadDir(parserDataDir) + if err != nil { + t.Fatal(err) + } + for _, e := range entries { + if !e.IsDir() { + continue + } + t.Run(e.Name(), func(t *testing.T) { + runParserDataGroup(t, filepath.Join(parserDataDir, e.Name())) + }) + } +} + +type parserDataFlags struct { + windowFunc bool + mariaDB bool + realAsFloat bool +} + +func runParserDataGroup(t *testing.T, dir string) { + inputPath := filepath.Join(dir, "input.sql") + outputPath := filepath.Join(dir, "output.sql") + + inBuf, err := os.ReadFile(inputPath) + if err != nil { + t.Fatal(err) + } + flags, srcs := decodeParserDataInput(t, string(inBuf)) + + var wants []string + if !*updateParserData { + outBuf, err := os.ReadFile(outputPath) + if err != nil { + t.Fatal(err) + } + wants = decodeParserDataSegments(string(outBuf)) + if len(wants) != len(srcs) { + t.Fatalf("%s: %d input cases but %d output segments", dir, len(srcs), len(wants)) + } + } + + // One parser is reused across the whole group, mirroring the historical + // RunTest helper; restore round-trips use fresh parsers below. + p := newParserDataParser(flags) + var gots []string + for i, src := range srcs { + comment := fmt.Sprintf("%s case %d: source %v", dir, i, src) + _, _, err := p.Parse(src, "", "") + + var got string + if err != nil { + got = errorMarker + err.Error() + } else { + got = restoreRoundTrip(t, flags, src, comment) + } + gots = append(gots, got) + + if *updateParserData { + continue + } + want := wants[i] + if errMsg, isErr := strings.CutPrefix(want, errorMarker); isErr { + if err == nil { + t.Fatalf("%v: expected error %q, but parse succeeded", comment, errMsg) + } + if err.Error() != errMsg { + t.Fatalf("%v: error mismatch\ngot: %v\nwant: %v", comment, err.Error(), errMsg) + } + continue + } + if err != nil { + t.Fatalf("%v: %v", comment, err) + } + if got != want { + t.Fatalf("%v: restore mismatch\ngot: %v\nwant: %v", comment, got, want) + } + } + + if *updateParserData { + if err := os.WriteFile(outputPath, []byte(strings.Join(gots, caseDelimiter)+"\n"), 0o644); err != nil { + t.Fatal(err) + } + } +} + +func newParserDataParser(flags parserDataFlags) *parser.Parser { + p := parser.New() + p.EnableWindowFunc(flags.windowFunc) + p.SetMariaDB(flags.mariaDB) + if flags.realAsFloat { + p.SetSQLMode(mysql.ModeRealAsFloat) + } + return p +} + +// restoreRoundTrip re-parses src with a fresh parser, restores every +// statement, verifies each restored statement parses back to a deep-equal +// AST, and returns the restored statements joined by "; ". +func restoreRoundTrip(t *testing.T, flags parserDataFlags, src, comment string) string { + p := newParserDataParser(flags) + stmts, _, err := p.Parse(src, "", "") + if err != nil { + t.Fatalf("%v: %v", comment, err) + } + var sb strings.Builder + restoreSQLs := "" + for _, stmt := range stmts { + sb.Reset() + if err := stmt.Restore(format.NewRestoreCtx(format.DefaultRestoreFlags, &sb)); err != nil { + t.Fatalf("%v: %v", comment, err) + } + restoreSQL := sb.String() + restoreStmt, err := p.ParseOneStmt(restoreSQL, "", "") + if err != nil { + t.Fatalf("%v: restore %v: %v", comment, restoreSQL, err) + } + CleanNodeText(stmt) + CleanNodeText(restoreStmt) + if !reflect.DeepEqual(stmt, restoreStmt) { + t.Fatalf("%v: restore %v: got %v, want %v", comment, restoreSQL, restoreStmt, stmt) + } + if restoreSQLs != "" { + restoreSQLs += "; " + } + restoreSQLs += restoreSQL + } + return restoreSQLs +} + +func decodeParserDataInput(t *testing.T, content string) (parserDataFlags, []string) { + var flags parserDataFlags + if strings.HasPrefix(content, flagsMarker) { + nl := strings.IndexByte(content, '\n') + if nl < 0 { + t.Fatalf("input.sql is only a flags header") + } + for _, f := range strings.Split(strings.TrimPrefix(content[:nl], flagsMarker), ",") { + switch name := strings.TrimSpace(f); name { + case "window_func": + flags.windowFunc = true + case "mariadb": + flags.mariaDB = true + case "real_as_float": + flags.realAsFloat = true + default: + t.Fatalf("unknown flag %q in input.sql header", name) + } + } + content = content[nl+1:] + } + return flags, decodeParserDataSegments(content) +} + +func decodeParserDataSegments(content string) []string { + content = strings.TrimSuffix(content, "\n") + return strings.Split(content, caseDelimiter) +} diff --git a/parser/parser_test.go b/parser/parser_test.go index 84a9240..8ae768d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -592,67 +592,6 @@ func RunRestoreTest(t *testing.T, sourceSQLs, expectSQLs string, enableWindowFun } } -func RunTestInRealAsFloatMode(t *testing.T, table []testCase, enableWindowFunc bool) { - p := parser.New() - p.EnableWindowFunc(enableWindowFunc) - p.SetSQLMode(mysql.ModeRealAsFloat) - for _, tbl := range table { - _, _, err := p.Parse(tbl.src, "", "") - comment := fmt.Sprintf("source %v", tbl.src) - if !tbl.ok { - if err == nil { - t.Fatal(comment) - } - continue - } - if err != nil { - t.Fatalf("%v: %v", comment, err) - } - // restore correctness test - if tbl.ok { - RunRestoreTestInRealAsFloatMode(t, tbl.src, tbl.restore, enableWindowFunc) - } - } -} - -func RunRestoreTestInRealAsFloatMode(t *testing.T, sourceSQLs, expectSQLs string, enableWindowFunc bool) { - var sb strings.Builder - p := parser.New() - p.EnableWindowFunc(enableWindowFunc) - p.SetSQLMode(mysql.ModeRealAsFloat) - comment := fmt.Sprintf("source %v", sourceSQLs) - stmts, _, err := p.Parse(sourceSQLs, "", "") - if err != nil { - t.Fatalf("%v: %v", comment, err) - } - restoreSQLs := "" - for _, stmt := range stmts { - sb.Reset() - err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - if err != nil { - t.Fatalf("%v: %v", comment, err) - } - restoreSQL := sb.String() - comment = fmt.Sprintf("source %v; restore %v", sourceSQLs, restoreSQL) - restoreStmt, err := p.ParseOneStmt(restoreSQL, "", "") - if err != nil { - t.Fatalf("%v: %v", comment, err) - } - CleanNodeText(stmt) - CleanNodeText(restoreStmt) - if !reflect.DeepEqual(stmt, restoreStmt) { - t.Fatalf("%v: got %v, want %v", comment, restoreStmt, stmt) - } - if restoreSQLs != "" { - restoreSQLs += "; " - } - restoreSQLs += restoreSQL - } - if !reflect.DeepEqual(expectSQLs, restoreSQLs) { - t.Fatalf("%s: got %v, want %v", fmt.Sprintf("restore %v; expect %v", restoreSQLs, expectSQLs), restoreSQLs, expectSQLs) - } -} - func RunErrMsgTest(t *testing.T, table []testErrMsgCase) { p := parser.New() for _, tbl := range table { @@ -670,1043 +609,6 @@ func RunErrMsgTest(t *testing.T, table []testErrMsgCase) { } } -func TestRecommendIndex(t *testing.T) { - table := []testCase{ - {"recommend index run", true, "RECOMMEND INDEX RUN"}, - {"recommend index run with A = 1", true, "RECOMMEND INDEX RUN WITH A = 1"}, - {"recommend index run with A = 1, B = 2", true, "RECOMMEND INDEX RUN WITH A = 1, B = 2"}, - {"recommend index run for 'select * from t where a=1'", true, - "RECOMMEND INDEX RUN FOR 'select * from t where a=1'"}, - {"recommend index run for 'select * from t where a=1' with A = 1", true, - "RECOMMEND INDEX RUN FOR 'select * from t where a=1' WITH A = 1"}, - {"recommend index run for 'select * from t where a=1' with A = 1, B = 2", true, - "RECOMMEND INDEX RUN FOR 'select * from t where a=1' WITH A = 1, B = 2"}, - {"recommend index show option", true, "RECOMMEND INDEX SHOW OPTION"}, - {"recommend index apply 1", true, "RECOMMEND INDEX APPLY 1"}, - {"recommend index ignore 1", true, "RECOMMEND INDEX IGNORE 1"}, - {"recommend index set A = 1", true, "RECOMMEND INDEX SET A = 1"}, - {"recommend index set A = 1, B = 2", true, "RECOMMEND INDEX SET A = 1, B = 2"}, - {"recommend index set A = 1, B = 2, C = 3", true, "RECOMMEND INDEX SET A = 1, B = 2, C = 3"}, - } - RunTest(t, table, false, false) -} - -func TestAdminStmt(t *testing.T) { - table := []testCase{ - {"admin show ddl;", true, "ADMIN SHOW DDL"}, - {"admin show ddl jobs;", true, "ADMIN SHOW DDL JOBS"}, - {"admin show ddl jobs where id > 0;", true, "ADMIN SHOW DDL JOBS WHERE `id`>0"}, - {"admin show ddl jobs 20 where id=0;", true, "ADMIN SHOW DDL JOBS 20 WHERE `id`=0"}, - {"admin show ddl jobs -1;", false, ""}, - {"admin show ddl job queries 1", true, "ADMIN SHOW DDL JOB QUERIES 1"}, - {"admin show ddl job queries 1, 2, 3, 4", true, "ADMIN SHOW DDL JOB QUERIES 1, 2, 3, 4"}, - {"admin show ddl job queries limit 5", true, "ADMIN SHOW DDL JOB QUERIES LIMIT 0, 5"}, - {"admin show ddl job queries limit 5, 10", true, "ADMIN SHOW DDL JOB QUERIES LIMIT 5, 10"}, - {"admin show ddl job queries limit 3 offset 2", true, "ADMIN SHOW DDL JOB QUERIES LIMIT 2, 3"}, - {"admin show ddl job queries limit 22 offset 0", true, "ADMIN SHOW DDL JOB QUERIES LIMIT 0, 22"}, - {"admin show t1 next_row_id", true, "ADMIN SHOW `t1` NEXT_ROW_ID"}, - {"admin create workload snapshot;", true, "ADMIN CREATE WORKLOAD SNAPSHOT"}, - {"admin check table t1, t2;", true, "ADMIN CHECK TABLE `t1`, `t2`"}, - {"admin check index tableName idxName;", true, "ADMIN CHECK INDEX `tableName` idxName"}, - {"admin check index tableName idxName (1, 2), (4, 5);", true, "ADMIN CHECK INDEX `tableName` idxName (1,2), (4,5)"}, - {"admin checksum table t1, t2;", true, "ADMIN CHECKSUM TABLE `t1`, `t2`"}, - {"admin cancel ddl jobs 1", true, "ADMIN CANCEL DDL JOBS 1"}, - {"admin cancel ddl jobs 1, 2", true, "ADMIN CANCEL DDL JOBS 1, 2"}, - {"admin pause ddl jobs 1, 3", true, "ADMIN PAUSE DDL JOBS 1, 3"}, - {"admin pause ddl jobs 5", true, "ADMIN PAUSE DDL JOBS 5"}, - {"admin pause ddl jobs", false, "ADMIN PAUSE DDL JOBS"}, - {"admin pause ddl jobs str_not_num", false, "ADMIN PAUSE DDL JOBS str_not_num"}, - {"admin resume ddl jobs 1, 2", true, "ADMIN RESUME DDL JOBS 1, 2"}, - {"admin resume ddl jobs 3", true, "ADMIN RESUME DDL JOBS 3"}, - {"admin resume ddl jobs", false, "ADMIN RESUME DDL JOBS"}, - {"admin resume ddl jobs str_not_num", false, "ADMIN RESUME DDL JOBS str_not_num"}, - {"admin recover index t1 idx_a", true, "ADMIN RECOVER INDEX `t1` idx_a"}, - {"admin cleanup index t1 idx_a", true, "ADMIN CLEANUP INDEX `t1` idx_a"}, - {"admin show slow top 3", true, "ADMIN SHOW SLOW TOP 3"}, - {"admin show slow top internal 7", true, "ADMIN SHOW SLOW TOP INTERNAL 7"}, - {"admin show slow top all 9", true, "ADMIN SHOW SLOW TOP ALL 9"}, - {"admin show slow recent 11", true, "ADMIN SHOW SLOW RECENT 11"}, - {"admin reload expr_pushdown_blacklist", true, "ADMIN RELOAD EXPR_PUSHDOWN_BLACKLIST"}, - {"admin plugins disable audit, whitelist", true, "ADMIN PLUGINS DISABLE audit, whitelist"}, - {"admin plugins enable audit, whitelist", true, "ADMIN PLUGINS ENABLE audit, whitelist"}, - {"admin flush bindings", true, "ADMIN FLUSH BINDINGS"}, - {"admin capture bindings", true, "ADMIN CAPTURE BINDINGS"}, - {"admin evolve bindings", true, "ADMIN EVOLVE BINDINGS"}, - {"admin reload bindings", true, "ADMIN RELOAD BINDINGS"}, - {"admin reload cluster bindings", true, "ADMIN RELOAD CLUSTER BINDINGS"}, - // Extended stats has been removed. keep this case only for syntax compatibility. - {"admin reload statistics", true, "ADMIN RELOAD STATS_EXTENDED"}, - {"admin reload stats_extended", true, "ADMIN RELOAD STATS_EXTENDED"}, - // Test for 'admin flush plan_cache' - {"admin flush instance plan_cache", true, "ADMIN FLUSH INSTANCE PLAN_CACHE"}, - {"admin flush session plan_cache", true, "ADMIN FLUSH SESSION PLAN_CACHE"}, - // We do not support the global level. We will check it in the later. - {"admin flush global plan_cache", true, "ADMIN FLUSH GLOBAL PLAN_CACHE"}, - // for BDR - {"admin set bdr role primary", true, "ADMIN SET BDR ROLE PRIMARY"}, - {"admin set bdr role secondary", true, "ADMIN SET BDR ROLE SECONDARY"}, - {"admin unset bdr role", true, "ADMIN UNSET BDR ROLE"}, - {"admin show bdr role", true, "ADMIN SHOW BDR ROLE"}, - // for alter job - {"admin alter ddl jobs 1 thread = 2", true, "ADMIN ALTER DDL JOBS 1 thread = 2"}, - {"admin alter ddl jobs 1 thread = ", false, ""}, - {"admin alter ddl jobs 1 thread", false, ""}, - {"admin alter ddl jobs 1 batch_size = 3", true, "ADMIN ALTER DDL JOBS 1 batch_size = 3"}, - {"admin alter ddl jobs 1 batch_size = ", false, ""}, - {"admin alter ddl jobs 1 batch_size", false, ""}, - {"admin alter ddl jobs 1 max_write_speed = 4", true, "ADMIN ALTER DDL JOBS 1 max_write_speed = 4"}, - {"admin alter ddl jobs 1 max_write_speed = _UTF8MB4'4MiB'", true, "ADMIN ALTER DDL JOBS 1 max_write_speed = _UTF8MB4'4MiB'"}, - {"admin alter ddl jobs 1 max_write_speed = ", false, ""}, - {"admin alter ddl jobs 1 max_write_speed", false, ""}, - } - RunTest(t, table, false, false) -} - -func TestDMLStmt(t *testing.T) { - table := []testCase{ - {"", true, ""}, - {";", true, ""}, - {"INSERT INTO foo VALUES (1234)", true, "INSERT INTO `foo` VALUES (1234)"}, - {"INSERT INTO foo VALUES (1234, 5678)", true, "INSERT INTO `foo` VALUES (1234,5678)"}, - {"INSERT INTO t1 (SELECT * FROM t2)", true, "INSERT INTO `t1` (SELECT * FROM `t2`)"}, - {"INSERT INTO t partition (p0) values(1234)", true, "INSERT INTO `t` PARTITION(`p0`) VALUES (1234)"}, - {"REPLACE INTO t partition (p0) values(1234)", true, "REPLACE INTO `t` PARTITION(`p0`) VALUES (1234)"}, - {"INSERT INTO t partition (p0, p1, p2) values(1234)", true, "INSERT INTO `t` PARTITION(`p0`, `p1`, `p2`) VALUES (1234)"}, - {"REPLACE INTO t partition (p0, p1, p2) values(1234)", true, "REPLACE INTO `t` PARTITION(`p0`, `p1`, `p2`) VALUES (1234)"}, - // 15 - {"INSERT INTO foo VALUES (1 || 2)", true, "INSERT INTO `foo` VALUES (1 OR 2)"}, - {"INSERT INTO foo VALUES (1 | 2)", true, "INSERT INTO `foo` VALUES (1|2)"}, - {"INSERT INTO foo VALUES (false || true)", true, "INSERT INTO `foo` VALUES (FALSE OR TRUE)"}, - {"INSERT INTO foo VALUES (bar(5678))", true, "INSERT INTO `foo` VALUES (BAR(5678))"}, - // 20 - {"INSERT INTO foo VALUES ()", true, "INSERT INTO `foo` VALUES ()"}, - {"SELECT * FROM t", true, "SELECT * FROM `t`"}, - {"SELECT * FROM t AS u", true, "SELECT * FROM `t` AS `u`"}, - // 25 - {"SELECT * FROM t, v", true, "SELECT * FROM (`t`) JOIN `v`"}, - {"SELECT * FROM t AS u, v", true, "SELECT * FROM (`t` AS `u`) JOIN `v`"}, - {"SELECT * FROM t, v AS w", true, "SELECT * FROM (`t`) JOIN `v` AS `w`"}, - {"SELECT * FROM t AS u, v AS w", true, "SELECT * FROM (`t` AS `u`) JOIN `v` AS `w`"}, - {"SELECT * FROM foo, bar, foo", true, "SELECT * FROM ((`foo`) JOIN `bar`) JOIN `foo`"}, - // 30 - {"SELECT DISTINCTS * FROM t", false, ""}, - {"SELECT DISTINCT * FROM t", true, "SELECT DISTINCT * FROM `t`"}, - {"SELECT DISTINCTROW * FROM t", true, "SELECT DISTINCT * FROM `t`"}, - {"SELECT ALL * FROM t", true, "SELECT ALL * FROM `t`"}, - {"SELECT DISTINCT ALL * FROM t", false, ""}, - {"SELECT DISTINCTROW ALL * FROM t", false, ""}, - {"INSERT INTO foo (a) VALUES (42)", true, "INSERT INTO `foo` (`a`) VALUES (42)"}, - {"INSERT INTO foo (a,) VALUES (42,)", false, ""}, - // 35 - {"INSERT INTO foo (a,b) VALUES (42,314)", true, "INSERT INTO `foo` (`a`,`b`) VALUES (42,314)"}, - {"INSERT INTO foo (a,b,) VALUES (42,314)", false, ""}, - {"INSERT INTO foo (a,b,) VALUES (42,314,)", false, ""}, - {"INSERT INTO foo () VALUES ()", true, "INSERT INTO `foo` () VALUES ()"}, - {"INSERT INTO foo VALUE ()", true, "INSERT INTO `foo` VALUES ()"}, - - // for issue 2402 - {"INSERT INTO tt VALUES (01000001783);", true, "INSERT INTO `tt` VALUES (1000001783)"}, - {"INSERT INTO tt VALUES (default);", true, "INSERT INTO `tt` VALUES (DEFAULT)"}, - - {"REPLACE INTO foo VALUES (1 || 2)", true, "REPLACE INTO `foo` VALUES (1 OR 2)"}, - {"REPLACE INTO foo VALUES (1 | 2)", true, "REPLACE INTO `foo` VALUES (1|2)"}, - {"REPLACE INTO foo VALUES (false || true)", true, "REPLACE INTO `foo` VALUES (FALSE OR TRUE)"}, - {"REPLACE INTO foo VALUES (bar(5678))", true, "REPLACE INTO `foo` VALUES (BAR(5678))"}, - {"REPLACE INTO foo VALUES ()", true, "REPLACE INTO `foo` VALUES ()"}, - {"REPLACE INTO foo (a,b) VALUES (42,314)", true, "REPLACE INTO `foo` (`a`,`b`) VALUES (42,314)"}, - {"REPLACE INTO foo (a,b,) VALUES (42,314)", false, ""}, - {"REPLACE INTO foo (a,b,) VALUES (42,314,)", false, ""}, - {"REPLACE INTO foo () VALUES ()", true, "REPLACE INTO `foo` () VALUES ()"}, - {"REPLACE INTO foo VALUE ()", true, "REPLACE INTO `foo` VALUES ()"}, - // 40 - {`SELECT stuff.id - FROM stuff - WHERE stuff.value >= ALL (SELECT stuff.value - FROM stuff)`, true, "SELECT `stuff`.`id` FROM `stuff` WHERE `stuff`.`value`>=ALL (SELECT `stuff`.`value` FROM `stuff`)"}, - {"BEGIN", true, "START TRANSACTION"}, - {"START TRANSACTION", true, "START TRANSACTION"}, - // 45 - {"COMMIT", true, "COMMIT"}, - {"COMMIT AND NO CHAIN", true, "COMMIT"}, - {"COMMIT NO RELEASE", true, "COMMIT"}, - {"COMMIT AND NO CHAIN NO RELEASE", true, "COMMIT"}, - {"COMMIT AND NO CHAIN RELEASE", true, "COMMIT RELEASE"}, - {"COMMIT AND CHAIN NO RELEASE", true, "COMMIT AND CHAIN"}, - {"COMMIT AND CHAIN RELEASE", false, ""}, - {"ROLLBACK", true, "ROLLBACK"}, - {"ROLLBACK AND NO CHAIN", true, "ROLLBACK"}, - {"ROLLBACK NO RELEASE", true, "ROLLBACK"}, - {"ROLLBACK AND NO CHAIN NO RELEASE", true, "ROLLBACK"}, - {"ROLLBACK AND NO CHAIN RELEASE", true, "ROLLBACK RELEASE"}, - {"ROLLBACK AND CHAIN NO RELEASE", true, "ROLLBACK AND CHAIN"}, - {"ROLLBACK AND CHAIN RELEASE", false, ""}, - {`BEGIN; - INSERT INTO foo VALUES (42, 3.14); - INSERT INTO foo VALUES (-1, 2.78); - COMMIT;`, true, "START TRANSACTION; INSERT INTO `foo` VALUES (42,3.14); INSERT INTO `foo` VALUES (-1,2.78); COMMIT"}, - {`BEGIN; - INSERT INTO tmp SELECT * from bar; - SELECT * from tmp; - ROLLBACK;`, true, "START TRANSACTION; INSERT INTO `tmp` SELECT * FROM `bar`; SELECT * FROM `tmp`; ROLLBACK"}, - {"SAVEPOINT x", true, "SAVEPOINT x"}, - {"RELEASE SAVEPOINT x", true, "RELEASE SAVEPOINT x"}, - {"ROLLBACK TO x", true, "ROLLBACK TO x"}, - {"ROLLBACK TO X", true, "ROLLBACK TO X"}, - {"ROLLBACK TO SAVEPOINT x", true, "ROLLBACK TO x"}, - - // table statement - {"TABLE t", true, "TABLE `t`"}, - {"(TABLE t)", true, "(TABLE `t`)"}, - {"TABLE t1, t2", false, ""}, - {"TABLE t ORDER BY b", true, "TABLE `t` ORDER BY `b`"}, - {"TABLE t LIMIT 3", true, "TABLE `t` LIMIT 3"}, - {"TABLE t ORDER BY b LIMIT 3", true, "TABLE `t` ORDER BY `b` LIMIT 3"}, - {"TABLE t ORDER BY b LIMIT 3 OFFSET 2", true, "TABLE `t` ORDER BY `b` LIMIT 2,3"}, - {"TABLE t ORDER BY b LIMIT 2,3", true, "TABLE `t` ORDER BY `b` LIMIT 2,3"}, - {"INSERT INTO ta TABLE tb", true, "INSERT INTO `ta` TABLE `tb`"}, - {"INSERT INTO t.a TABLE t.b", true, "INSERT INTO `t`.`a` TABLE `t`.`b`"}, - {"REPLACE INTO ta TABLE tb", true, "REPLACE INTO `ta` TABLE `tb`"}, - {"REPLACE INTO t.a TABLE t.b", true, "REPLACE INTO `t`.`a` TABLE `t`.`b`"}, - {"TABLE t1 INTO OUTFILE 'a.txt'", true, "TABLE `t1` INTO OUTFILE 'a.txt'"}, - {"TABLE t ORDER BY a INTO OUTFILE '/tmp/abc'", true, "TABLE `t` ORDER BY `a` INTO OUTFILE '/tmp/abc'"}, - {"CREATE TABLE t.a TABLE t.b", true, "CREATE TABLE `t`.`a` AS TABLE `t`.`b`"}, - {"CREATE TABLE ta TABLE tb", true, "CREATE TABLE `ta` AS TABLE `tb`"}, - {"CREATE TABLE ta (x INT) TABLE tb", true, "CREATE TABLE `ta` (`x` INT) AS TABLE `tb`"}, - {"CREATE VIEW v AS TABLE t", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS TABLE `t`"}, - {"CREATE VIEW v AS (TABLE t)", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (TABLE `t`)"}, - {"SELECT * FROM t1 WHERE a IN (TABLE t2)", true, "SELECT * FROM `t1` WHERE `a` IN (TABLE `t2`)"}, - - // values statement - {"VALUES ROW(1)", true, "VALUES ROW(1)"}, - {"VALUES ROW()", true, "VALUES ROW()"}, - {"VALUES ROW(1, default)", true, "VALUES ROW(1,DEFAULT)"}, - {"VALUES ROW(1), ROW(2,3)", true, "VALUES ROW(1), ROW(2,3)"}, - {"VALUES (1,2)", false, ""}, - {"VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8)", true, "VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8)"}, - {"VALUES ROW(1,s,3.1), ROW(5,y,9.9)", true, "VALUES ROW(1,`s`,3.1), ROW(5,`y`,9.9)"}, - {"VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) LIMIT 3", true, "VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) LIMIT 3"}, - {"VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY a", true, "VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY `a`"}, - {"VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY a LIMIT 2", true, "VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY `a` LIMIT 2"}, - {"VALUES ROW(1,-2,3), ROW(5,7,9) INTO OUTFILE 'a.txt'", true, "VALUES ROW(1,-2,3), ROW(5,7,9) INTO OUTFILE 'a.txt'"}, - {"VALUES ROW(1,-2,3), ROW(5,7,9) ORDER BY a INTO OUTFILE '/tmp/abc'", true, "VALUES ROW(1,-2,3), ROW(5,7,9) ORDER BY `a` INTO OUTFILE '/tmp/abc'"}, - {"CREATE TABLE ta VALUES ROW(1)", true, "CREATE TABLE `ta` AS VALUES ROW(1)"}, - {"CREATE TABLE ta AS VALUES ROW(1)", true, "CREATE TABLE `ta` AS VALUES ROW(1)"}, - {"CREATE VIEW a AS VALUES ROW(1)", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `a` AS VALUES ROW(1)"}, - - // qualified select - {"SELECT a.b.c FROM t", true, "SELECT `a`.`b`.`c` FROM `t`"}, - {"SELECT a.b.*.c FROM t", false, ""}, - {"SELECT a.b.* FROM t", true, "SELECT `a`.`b`.* FROM `t`"}, - {"SELECT a FROM t", true, "SELECT `a` FROM `t`"}, - {"SELECT a.b.c.d FROM t", false, ""}, - - // do statement - {"DO 1", true, "DO 1"}, - {"DO 1, sleep(1)", true, "DO 1, SLEEP(1)"}, - {"DO 1 from t", false, ""}, - - // load data - {"load data local infile '/tmp/t.csv' into table t1 fields terminated by ',' optionally enclosed by '\"' ignore 1 lines", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES"}, - {"load data infile '/tmp/t.csv' into table t", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t`"}, - {"load data infile '/tmp/t.csv' into table t character set utf8", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` CHARACTER SET utf8"}, - {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab'"}, - {"load data infile '/tmp/t.csv' into table t columns terminated by 'ab'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab'"}, - {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b'"}, - {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*'"}, - {"load data infile '/tmp/t.csv' into table t lines starting by 'ab'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` LINES STARTING BY 'ab'"}, - {"load data infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy'"}, - {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy'"}, - {"load data infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab'", false, ""}, - {"load data local infile '/tmp/t.csv' into table t", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t`"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab'"}, - {"load data local infile '/tmp/t.csv' into table t columns terminated by 'ab'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab'"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b'"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*'"}, - {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` CHARACTER SET utf8 FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*'"}, - {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab'"}, - {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy'"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy'"}, - {"load data local infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab'", false, ""}, - {"load data infile '/tmp/t.csv' into table t (a,b)", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t columns terminated by 'ab' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` CHARACTER SET utf8 FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' lines terminated by 'xy' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` CHARACTER SET utf8 FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy' (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy' (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t (a,b) fields terminated by 'ab'", false, ""}, - {"load data local infile '/tmp/t.csv' into table t ignore 1 lines", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` IGNORE 1 LINES"}, - {"load data local infile '/tmp/t.csv' into table t ignore -1 lines", false, ""}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b) ignore 1 lines", false, ""}, - {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' ignore 1 lines", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy' IGNORE 1 LINES"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' ignore 1 lines (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' IGNORE 1 LINES (`a`,`b`)"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by ''", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY ''"}, - {"load data local infile '~/1.csv' into table `t_ascii` fields terminated by X'6B6B';", true, "LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk'"}, - {"load data local infile '~/1.csv' into table `t_ascii` fields terminated by X'6B6B' enclosed by X'0D';", true, "LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk' ENCLOSED BY '\r'"}, - {"load data local infile '~/1.csv' into table `t_ascii` fields terminated by X'6B6B' enclosed by X'0D0D';", false, ""}, - {"load data local infile '~/1.csv' into table `t_ascii` fields terminated by B'110101101101011';", true, "LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk'"}, - {"load data local infile '~/1.csv' into table `t_ascii` fields terminated by B'110101101101011' enclosed by B'1101';", true, "LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk' ENCLOSED BY '\r'"}, - {"load data local infile '~/1.csv' into table `t_ascii` fields terminated by B'110101101101011' enclosed by B'110100001101';", false, ""}, - {"load data local infile '~/1.csv' into table `t_ascii` lines starting by B'110101101101011' terminated by B'110101101101011';", true, "LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` LINES STARTING BY 'kk' TERMINATED BY 'kk'"}, - {"load data local infile '~/1.csv' into table `t_ascii` lines starting by X'6B6B' terminated by X'6B6B';", true, "LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` LINES STARTING BY 'kk' TERMINATED BY 'kk'"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' enclosed by 'b'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b'"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' escaped by '' enclosed by 'b'", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY ''"}, - {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' escaped by '' enclosed by 'b' SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-3), 2, 10) AS UNSIGNED)", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '' SET `b`=CAST(CONV(MID(@`var1`, 3, LENGTH(@`var1`)-3), 2, 10) AS UNSIGNED)"}, - - {"load data infile '/tmp/t.csv' into table t fields enclosed by ''", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ENCLOSED BY ''"}, - {"load data infile '/tmp/t.csv' into table t fields enclosed by 'a'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ENCLOSED BY 'a'"}, - {"load data infile '/tmp/t.csv' into table t fields enclosed by 'aa'", false, ""}, - {"load data infile '/tmp/t.csv' into table t fields escaped by ''", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ESCAPED BY ''"}, - {"load data infile '/tmp/t.csv' into table t fields escaped by 'a'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ESCAPED BY 'a'"}, - {"load data infile '/tmp/t.csv' into table t fields escaped by 'aa'", false, ""}, - - {"LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @dummy, column2, @dummy, column3)", true, "LOAD DATA INFILE 'file.txt' INTO TABLE `t1` (`column1`,@`dummy`,`column2`,@`dummy`,`column3`)"}, - {"LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1) SET column2 = @var1/100", true, "LOAD DATA INFILE 'file.txt' INTO TABLE `t1` (`column1`,@`var1`) SET `column2`=@`var1`/100"}, - {"LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1, @var2) SET column2 = @var1/100, column3 = DEFAULT, column4=CURRENT_TIMESTAMP, column5=@var2+1", true, "LOAD DATA INFILE 'file.txt' INTO TABLE `t1` (`column1`,@`var1`,@`var2`) SET `column2`=@`var1`/100, `column3`=DEFAULT, `column4`=CURRENT_TIMESTAMP(), `column5`=@`var2`+1"}, - - {"LOAD DATA INFILE '/tmp/t.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"}, - {"LOAD DATA LOCAL INFILE '/tmp/t.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"}, - {"LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"}, - {"LOAD DATA LOCAL INFILE '/tmp/t.csv' REPLACE INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';", true, "LOAD DATA LOCAL INFILE '/tmp/t.csv' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"}, - - {"load data infile 's3://bucket-name/t.csv' into table t", true, "LOAD DATA INFILE 's3://bucket-name/t.csv' INTO TABLE `t`"}, - {"load data infile '/tmp/t.csv' into table t fields defined null by 'nil'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS DEFINED NULL BY 'nil'"}, - {"load data infile '/tmp/t.csv' into table t fields defined null by X'00'", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS DEFINED NULL BY '\x00'"}, - {"load data infile '/tmp/t.csv' into table t fields defined null by 'NULL' optionally enclosed ignore 1 lines", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS DEFINED NULL BY 'NULL' OPTIONALLY ENCLOSED IGNORE 1 LINES"}, - {"load data infile '/tmp/t.csv' format 'delimited data' into table t (column1, @var1) SET column2 = @var1/100", true, "LOAD DATA INFILE '/tmp/t.csv' FORMAT 'delimited data' INTO TABLE `t` (`column1`,@`var1`) SET `column2`=@`var1`/100"}, - {"load data local infile '/tmp/t.sql' format 'sql file' replace into table t (a,b)", true, "LOAD DATA LOCAL INFILE '/tmp/t.sql' FORMAT 'sql file' REPLACE INTO TABLE `t` (`a`,`b`)"}, - {"load data infile '/tmp/t.parquet' format 'parquet' into table t (column1, @var1) SET column2 = @var1/100", true, "LOAD DATA INFILE '/tmp/t.parquet' FORMAT 'parquet' INTO TABLE `t` (`column1`,@`var1`) SET `column2`=@`var1`/100"}, - - {"load data infile '/tmp/t.csv' into table t with detached", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` WITH detached"}, - // we must add "`" to table name, since the offset of restored sql might be different with the source - {"load data infile '/tmp/t.csv' into table `t` with threads=10", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` WITH threads=10"}, - {"load data infile '/tmp/t.csv' into table `t` with threads=10, detached", true, "LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` WITH threads=10, detached"}, - - // IMPORT INTO - {"import into t from '/file.csv'", true, "IMPORT INTO `t` FROM '/file.csv'"}, - {"import into t (a,b) from '/file.csv'", true, "IMPORT INTO `t` (`a`,`b`) FROM '/file.csv'"}, - {"import into t (a,@1) from '/file.csv'", true, "IMPORT INTO `t` (`a`,@`1`) FROM '/file.csv'"}, - {"import into t (a,@1) set b=@1+100 from '/file.csv'", true, "IMPORT INTO `t` (`a`,@`1`) SET `b`=@`1`+100 FROM '/file.csv'"}, - {"import into t from '/file.csv' format 'sql file'", true, "IMPORT INTO `t` FROM '/file.csv' FORMAT 'sql file'"}, - {"import into t from '/file.csv' with detached", true, "IMPORT INTO `t` FROM '/file.csv' WITH detached"}, - {"import into `t` from '/file.csv' with thread=1", true, "IMPORT INTO `t` FROM '/file.csv' WITH thread=1"}, - {"import into `t` from '/file.csv' with detached, thread=1", true, "IMPORT INTO `t` FROM '/file.csv' WITH detached, thread=1"}, - - // select for update/share - {"select * from t for update", true, "SELECT * FROM `t` FOR UPDATE"}, - {"select * from t for share", true, "SELECT * FROM `t` FOR SHARE"}, - {"select * from t for update nowait", true, "SELECT * FROM `t` FOR UPDATE NOWAIT"}, - {"select * from t for update wait 5", true, "SELECT * FROM `t` FOR UPDATE WAIT 5"}, - {"select * from t limit 1 for update wait 11", true, "SELECT * FROM `t` LIMIT 1 FOR UPDATE WAIT 11"}, - {"select * from t for share nowait", true, "SELECT * FROM `t` FOR SHARE NOWAIT"}, - {"select * from t for update skip locked", true, "SELECT * FROM `t` FOR UPDATE SKIP LOCKED"}, - {"select * from t for share skip locked", true, "SELECT * FROM `t` FOR SHARE SKIP LOCKED"}, - {"select * from t lock in share mode", true, "SELECT * FROM `t` FOR SHARE"}, - {"select * from t lock in share mode nowait", false, ""}, - {"select * from t lock in share mode skip locked", false, ""}, - - {"select * from t for update of t", true, "SELECT * FROM `t` FOR UPDATE OF `t`"}, - {"select * from t for share of t", true, "SELECT * FROM `t` FOR SHARE OF `t`"}, - {"select * from t for update of t nowait", true, "SELECT * FROM `t` FOR UPDATE OF `t` NOWAIT"}, - {"select * from t for update of t wait 5", true, "SELECT * FROM `t` FOR UPDATE OF `t` WAIT 5"}, - {"select * from t limit 1 for update of t wait 11", true, "SELECT * FROM `t` LIMIT 1 FOR UPDATE OF `t` WAIT 11"}, - {"select * from t for share of t nowait", true, "SELECT * FROM `t` FOR SHARE OF `t` NOWAIT"}, - {"select * from t for update of t skip locked", true, "SELECT * FROM `t` FOR UPDATE OF `t` SKIP LOCKED"}, - {"select * from t for share of t skip locked", true, "SELECT * FROM `t` FOR SHARE OF `t` SKIP LOCKED"}, - - // select into outfile - {"select a, b from t into outfile '/tmp/result.txt'", true, "SELECT `a`,`b` FROM `t` INTO OUTFILE '/tmp/result.txt'"}, - {"select a from t order by a into outfile '/tmp/abc'", true, "SELECT `a` FROM `t` ORDER BY `a` INTO OUTFILE '/tmp/abc'"}, - {"select 1 into outfile '/tmp/1.csv'", true, "SELECT 1 INTO OUTFILE '/tmp/1.csv'"}, - {"select 1 for update into outfile '/tmp/1.csv'", true, "SELECT 1 FOR UPDATE INTO OUTFILE '/tmp/1.csv'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ','", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ','"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' enclosed BY '\"'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '\"'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' optionally enclosed BY '\"'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' lines terminated BY '\n'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' LINES TERMINATED BY '\n'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' optionally enclosed BY '\"' lines terminated BY '\r'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' enclosed BY '\"' lines terminated BY '\r'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' optionally enclosed BY '\"' lines starting by 'xy' terminated BY '\r'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES STARTING BY 'xy' TERMINATED BY '\r'"}, - {"select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' enclosed BY '\"' lines starting by 'xy' terminated BY '\r'", true, "SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES STARTING BY 'xy' TERMINATED BY '\r'"}, - - // from join - {"SELECT * from t1, t2, t3", true, "SELECT * FROM ((`t1`) JOIN `t2`) JOIN `t3`"}, - {"select * from t1 join t2 left join t3 on t2.id = t3.id", true, "SELECT * FROM (`t1` JOIN `t2`) LEFT JOIN `t3` ON `t2`.`id`=`t3`.`id`"}, - {"select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id", true, "SELECT * FROM (`t1` RIGHT JOIN `t2` ON `t1`.`id`=`t2`.`id`) LEFT JOIN `t3` ON `t3`.`id`=`t2`.`id`"}, - {"select * from t1 right join t2 on t1.id = t2.id left join t3", false, ""}, - {"select * from t1 join t2 left join t3 using (id)", true, "SELECT * FROM (`t1` JOIN `t2`) LEFT JOIN `t3` USING (`id`)"}, - {"select * from t1 right join t2 using (id) left join t3 using (id)", true, "SELECT * FROM (`t1` RIGHT JOIN `t2` USING (`id`)) LEFT JOIN `t3` USING (`id`)"}, - {"select * from t1 right join t2 using (id) left join t3", false, ""}, - {"select * from t1 natural join t2", true, "SELECT * FROM `t1` NATURAL JOIN `t2`"}, - {"select * from t1 natural right join t2", true, "SELECT * FROM `t1` NATURAL RIGHT JOIN `t2`"}, - {"select * from t1 natural left outer join t2", true, "SELECT * FROM `t1` NATURAL LEFT JOIN `t2`"}, - {"select * from t1 natural inner join t2", false, ""}, - {"select * from t1 natural cross join t2", false, ""}, - {"select * from t3 join t1 join t2 on t1.a=t2.a on t3.b=t2.b", true, "SELECT * FROM `t3` JOIN (`t1` JOIN `t2` ON `t1`.`a`=`t2`.`a`) ON `t3`.`b`=`t2`.`b`"}, - - // for straight_join - {"select * from t1 straight_join t2 on t1.id = t2.id", true, "SELECT * FROM `t1` STRAIGHT_JOIN `t2` ON `t1`.`id`=`t2`.`id`"}, - {"select straight_join * from t1 join t2 on t1.id = t2.id", true, "SELECT STRAIGHT_JOIN * FROM `t1` JOIN `t2` ON `t1`.`id`=`t2`.`id`"}, - {"select straight_join * from t1 left join t2 on t1.id = t2.id", true, "SELECT STRAIGHT_JOIN * FROM `t1` LEFT JOIN `t2` ON `t1`.`id`=`t2`.`id`"}, - {"select straight_join * from t1 right join t2 on t1.id = t2.id", true, "SELECT STRAIGHT_JOIN * FROM `t1` RIGHT JOIN `t2` ON `t1`.`id`=`t2`.`id`"}, - {"select straight_join * from t1 straight_join t2 on t1.id = t2.id", true, "SELECT STRAIGHT_JOIN * FROM `t1` STRAIGHT_JOIN `t2` ON `t1`.`id`=`t2`.`id`"}, - - // delete statement - // single table syntax - {"DELETE from t1", true, "DELETE FROM `t1`"}, - {"DELETE from t1.*", false, ""}, - {"DELETE LOW_priORITY from t1", true, "DELETE LOW_PRIORITY FROM `t1`"}, - {"DELETE quick from t1", true, "DELETE QUICK FROM `t1`"}, - {"DELETE ignore from t1", true, "DELETE IGNORE FROM `t1`"}, - {"DELETE low_priority quick ignore from t1", true, "DELETE LOW_PRIORITY QUICK IGNORE FROM `t1`"}, - {"DELETE FROM t1 WHERE t1.a > 0 ORDER BY t1.a", true, "DELETE FROM `t1` WHERE `t1`.`a`>0 ORDER BY `t1`.`a`"}, - {"delete from t1 where a=26", true, "DELETE FROM `t1` WHERE `a`=26"}, - {"DELETE from t1 where a=1 limit 1", true, "DELETE FROM `t1` WHERE `a`=1 LIMIT 1"}, - {"DELETE FROM t1 WHERE t1.a > 0 ORDER BY t1.a LIMIT 1", true, "DELETE FROM `t1` WHERE `t1`.`a`>0 ORDER BY `t1`.`a` LIMIT 1"}, - {"DELETE FROM x.y z WHERE z.a > 0", true, "DELETE FROM `x`.`y` AS `z` WHERE `z`.`a`>0"}, - {"DELETE FROM t1 AS w WHERE a > 0", true, "DELETE FROM `t1` AS `w` WHERE `a`>0"}, - {"DELETE from t1 partition (p0,p1)", true, "DELETE FROM `t1` PARTITION(`p0`, `p1`)"}, - - // multi table syntax: before from - {"delete low_priority t1, t2 from t1, t2", true, "DELETE LOW_PRIORITY `t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete quick t1, t2 from t1, t2", true, "DELETE QUICK `t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete ignore t1, t2 from t1, t2", true, "DELETE IGNORE `t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete ignore t1, t2 from t1 partition (p0,p1), t2", true, "DELETE IGNORE `t1`,`t2` FROM (`t1` PARTITION(`p0`, `p1`)) JOIN `t2`"}, - {"delete low_priority quick ignore t1, t2 from t1, t2 where t1.a > 5", true, "DELETE LOW_PRIORITY QUICK IGNORE `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`a`>5"}, - {"delete t1, t2 from t1, t2", true, "DELETE `t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete t1, t2 from t1, t2 where t1.a = 1 and t2.b <> 1", true, "DELETE `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`a`=1 AND `t2`.`b`!=1"}, - {"delete t1 from t1, t2", true, "DELETE `t1` FROM (`t1`) JOIN `t2`"}, - {"delete t2 from t1, t2", true, "DELETE `t2` FROM (`t1`) JOIN `t2`"}, - {"delete t1 from t1", true, "DELETE `t1` FROM `t1`"}, - {"delete t1,t2,t3 from t1, t2, t3", true, "DELETE `t1`,`t2`,`t3` FROM ((`t1`) JOIN `t2`) JOIN `t3`"}, - {"delete t1,t2,t3 from t1, t2, t3 where t3.c < 5 and t1.a = 3", true, "DELETE `t1`,`t2`,`t3` FROM ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t3`.`c`<5 AND `t1`.`a`=3"}, - {"delete t1 from t1, t1 as t2 where t1.b = t2.b and t1.a > t2.a", true, "DELETE `t1` FROM (`t1`) JOIN `t1` AS `t2` WHERE `t1`.`b`=`t2`.`b` AND `t1`.`a`>`t2`.`a`"}, - {"delete t1.*,t2 from t1, t2", true, "DELETE `t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete t.t1.*,t2 from t1, t2", true, "DELETE `t`.`t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete t1.*, t2.* from t1, t2", true, "DELETE `t1`,`t2` FROM (`t1`) JOIN `t2`"}, - {"delete t11.*, t12.* from t11, t12 where t11.a = t12.a and t11.b <> 1", true, "DELETE `t11`,`t12` FROM (`t11`) JOIN `t12` WHERE `t11`.`a`=`t12`.`a` AND `t11`.`b`!=1"}, - - // multi table syntax: with using - {"DELETE quick FROM t1,t2 USING t1,t2", true, "DELETE QUICK FROM `t1`,`t2` USING (`t1`) JOIN `t2`"}, - {"DELETE low_priority ignore FROM t1,t2 USING t1,t2", true, "DELETE LOW_PRIORITY IGNORE FROM `t1`,`t2` USING (`t1`) JOIN `t2`"}, - {"DELETE low_priority quick ignore FROM t1,t2 USING t1,t2", true, "DELETE LOW_PRIORITY QUICK IGNORE FROM `t1`,`t2` USING (`t1`) JOIN `t2`"}, - {"DELETE FROM t1 USING t1 WHERE post='1'", true, "DELETE FROM `t1` USING `t1` WHERE `post`=_UTF8MB4'1'"}, - {"DELETE FROM t1,t2 USING t1,t2", true, "DELETE FROM `t1`,`t2` USING (`t1`) JOIN `t2`"}, - {"DELETE FROM t1,t2,t3 USING t1,t2,t3 where t3.a = 1", true, "DELETE FROM `t1`,`t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t3`.`a`=1"}, - {"DELETE FROM t2,t3 USING t1,t2,t3 where t1.a = 1", true, "DELETE FROM `t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t1`.`a`=1"}, - {"DELETE FROM t2.*,t3.* USING t1,t2,t3 where t1.a = 1", true, "DELETE FROM `t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t1`.`a`=1"}, - {"DELETE FROM t1,t2.*,t3.* USING t1,t2,t3 where t1.a = 1", true, "DELETE FROM `t1`,`t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t1`.`a`=1"}, - - // for delete statement - {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;", true, "DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, - {"DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;", true, "DELETE FROM `t1`,`t2` USING (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, - // for optimizer hint in delete statement - {"DELETE /*+ TiDB_INLJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id;", true, "DELETE /*+ TIDB_INLJ(`t1`, `t2`)*/ `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id`"}, - {"DELETE /*+ TiDB_HJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id", true, "DELETE /*+ TIDB_HJ(`t1`, `t2`)*/ `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id`"}, - {"DELETE /*+ TiDB_SMJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id", true, "DELETE /*+ TIDB_SMJ(`t1`, `t2`)*/ `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id`"}, - // for "USE INDEX" in delete statement - {"DELETE FROM t1 USE INDEX(idx_a) WHERE t1.id=1;", true, "DELETE FROM `t1` USE INDEX (`idx_a`) WHERE `t1`.`id`=1"}, - {"DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 WHERE t1.id=t2.id;", true, "DELETE `t1`,`t2` FROM `t1` USE INDEX (`idx_a`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id`"}, - {"DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 USE INDEX(idx_a) WHERE t1.id=t2.id;", true, "DELETE `t1`,`t2` FROM `t1` USE INDEX (`idx_a`) JOIN `t2` USE INDEX (`idx_a`) WHERE `t1`.`id`=`t2`.`id`"}, - - // for fail case - {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id limit 10;", false, ""}, - {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id order by t1.id;", false, ""}, - - // for on duplicate key update - {"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true, "INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"}, - {"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c:=VALUES(a)+VALUES(b);", true, "INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"}, - {"INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true, "INSERT IGNORE INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"}, - {"INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c:=VALUES(a)+VALUES(b);", true, "INSERT IGNORE INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"}, - - // row alias for ON DUPLICATE KEY UPDATE (MySQL 8.0.19+) - {"INSERT INTO odk (id, v) VALUES (1, 10) AS new ON DUPLICATE KEY UPDATE v = new.v;", true, "INSERT INTO `odk` (`id`,`v`) VALUES (1,10) AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v`"}, - {"INSERT INTO odk (id, v) VALUES (1, 10) AS new(nid, nv) ON DUPLICATE KEY UPDATE v = nv;", true, "INSERT INTO `odk` (`id`,`v`) VALUES (1,10) AS `new`(`nid`,`nv`) ON DUPLICATE KEY UPDATE `v`=`nv`"}, - {"INSERT INTO odk VALUES (1, 10) AS new ON DUPLICATE KEY UPDATE v = new.v;", true, "INSERT INTO `odk` VALUES (1,10) AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v`"}, - {"INSERT IGNORE INTO odk (id, v) VALUES (1, 10) AS new ON DUPLICATE KEY UPDATE v = new.v;", true, "INSERT IGNORE INTO `odk` (`id`,`v`) VALUES (1,10) AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v`"}, - {"INSERT INTO odk SET id = 1, v = 10 AS new ON DUPLICATE KEY UPDATE v = new.v;", true, "INSERT INTO `odk` SET `id`=1,`v`=10 AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v`"}, - // row alias is not supported with INSERT ... SELECT in marino. - {"INSERT INTO odk (id, v) SELECT id, v FROM staging AS s AS new ON DUPLICATE KEY UPDATE v = new.v;", false, ""}, - - // for insert ... set - {"INSERT INTO t SET a=1,b=2", true, "INSERT INTO `t` SET `a`=1,`b`=2"}, - {"INSERT INTO t (a) SET a=1", false, ""}, - - // for update statement - {"UPDATE LOW_PRIORITY IGNORE t SET id = id + 1 ORDER BY id DESC;", true, "UPDATE LOW_PRIORITY IGNORE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, - {"UPDATE t SET id = id + 1 ORDER BY id DESC;", true, "UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, - {"UPDATE t SET id = id + 1 ORDER BY id DESC limit 3 ;", true, "UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC LIMIT 3"}, - {"UPDATE t SET id = id + 1, name = 'jojo';", true, "UPDATE `t` SET `id`=`id`+1, `name`=_UTF8MB4'jojo'"}, - {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id;", true, "UPDATE (`items`) JOIN `month` SET `items`.`price`=`month`.`price` WHERE `items`.`id`=`month`.`id`"}, - {"UPDATE user T0 LEFT OUTER JOIN user_profile T1 ON T1.id = T0.profile_id SET T0.profile_id = 1 WHERE T0.profile_id IN (1);", true, "UPDATE `user` AS `T0` LEFT JOIN `user_profile` AS `T1` ON `T1`.`id`=`T0`.`profile_id` SET `T0`.`profile_id`=1 WHERE `T0`.`profile_id` IN (1)"}, - {"UPDATE t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true, "UPDATE (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba`"}, - // for optimizer hint in update statement - {"UPDATE /*+ TiDB_INLJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true, "UPDATE /*+ TIDB_INLJ(`t1`, `t2`)*/ (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba`"}, - {"UPDATE /*+ TiDB_SMJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true, "UPDATE /*+ TIDB_SMJ(`t1`, `t2`)*/ (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba`"}, - {"UPDATE /*+ TiDB_HJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true, "UPDATE /*+ TIDB_HJ(`t1`, `t2`)*/ (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba`"}, - // fail case for update statement - {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id LIMIT 10;", false, ""}, - {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id order by month.id;", false, ""}, - // for "USE INDEX" in delete statement - {"UPDATE t1 USE INDEX(idx_a) SET t1.price=3.25 WHERE t1.id=1;", true, "UPDATE `t1` USE INDEX (`idx_a`) SET `t1`.`price`=3.25 WHERE `t1`.`id`=1"}, - {"UPDATE t1 USE INDEX(idx_a) JOIN t2 SET t1.price=t2.price WHERE t1.id=t2.id;", true, "UPDATE `t1` USE INDEX (`idx_a`) JOIN `t2` SET `t1`.`price`=`t2`.`price` WHERE `t1`.`id`=`t2`.`id`"}, - {"UPDATE t1 USE INDEX(idx_a) JOIN t2 USE INDEX(idx_a) SET t1.price=t2.price WHERE t1.id=t2.id;", true, "UPDATE `t1` USE INDEX (`idx_a`) JOIN `t2` USE INDEX (`idx_a`) SET `t1`.`price`=`t2`.`price` WHERE `t1`.`id`=`t2`.`id`"}, - - // for select with where clause - {"SELECT * FROM t WHERE 1 = 1", true, "SELECT * FROM `t` WHERE 1=1"}, - - // for select with FETCH FIRST syntax - {"SELECT * FROM t FETCH FIRST 5 ROW ONLY", true, "SELECT * FROM `t` LIMIT 5"}, - {"SELECT * FROM t FETCH NEXT 5 ROW ONLY", true, "SELECT * FROM `t` LIMIT 5"}, - {"SELECT * FROM t FETCH FIRST 5 ROWS ONLY", true, "SELECT * FROM `t` LIMIT 5"}, - {"SELECT * FROM t FETCH NEXT 5 ROWS ONLY", true, "SELECT * FROM `t` LIMIT 5"}, - {"SELECT * FROM t FETCH FIRST ROW ONLY", true, "SELECT * FROM `t` LIMIT 1"}, - {"SELECT * FROM t FETCH NEXT ROW ONLY", true, "SELECT * FROM `t` LIMIT 1"}, - - // for dual - {"select 1 from dual", true, "SELECT 1"}, - {"select 1 from dual limit 1", true, "SELECT 1 LIMIT 1"}, - {"select 1 where exists (select 2)", true, "SELECT 1 FROM DUAL WHERE EXISTS (SELECT 2)"}, - {"select 1 from dual where not exists (select 2)", true, "SELECT 1 FROM DUAL WHERE NOT EXISTS (SELECT 2)"}, - {"select 1 as a from dual order by a", true, "SELECT 1 AS `a` ORDER BY `a`"}, - {"select 1 as a from dual where 1 < any (select 2) order by a", true, "SELECT 1 AS `a` FROM DUAL WHERE 1 0", true, "SHOW DISTRIBUTION JOBS WHERE `id`>0"}, - {"show distribution job 1 where id > 0", false, ""}, - {"show distribution job 1", true, "SHOW DISTRIBUTION JOB 1"}, - - // for cancel distribution job JOBID - {"cancel distribution job", false, ""}, - {"cancel distribution job 1", true, "CANCEL DISTRIBUTION JOB 1"}, - - // for show table next_row_id. - {"show table t1.t1 next_row_id", true, "SHOW TABLE `t1`.`t1` NEXT_ROW_ID"}, - {"show table t1 next_row_id", true, "SHOW TABLE `t1` NEXT_ROW_ID"}, - {"show table next_row_id", false, ""}, - - // for transaction mode - {"begin pessimistic", true, "BEGIN PESSIMISTIC"}, - {"begin optimistic", true, "BEGIN OPTIMISTIC"}, - - // for repair table mode. - {"ADMIN REPAIR TABLE t CREATE TABLE t (a int)", true, "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` INT)"}, - {"ADMIN REPAIR TABLE t CREATE TABLE t (a char(1))", true, "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` CHAR(1))"}, - {"ADMIN REPAIR TABLE t CREATE TABLE t (a char(1), b int)", true, "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` CHAR(1),`b` INT)"}, - {"ADMIN REPAIR TABLE t CREATE TABLE t (c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2));", true, "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2))"}, - {"ADMIN REPAIR TABLE t CREATE TABLE t (a TINYINT UNSIGNED);", true, "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` TINYINT UNSIGNED)"}, - {"ADMIN REPAIR TABLE t CREATE TABLE t (name CHAR(50) CHARACTER SET UTF8)", true, "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`name` CHAR(50) CHARACTER SET UTF8)"}, - - // for alter instance. - {"ALTER INSTANCE RELOAD TLS", true, "ALTER INSTANCE RELOAD TLS"}, - {"ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR", true, "ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR"}, - - // for alter range - {"ALTER RANGE global PLACEMENT POLICY mypolicy", true, "ALTER RANGE `global` PLACEMENT POLICY = `mypolicy`"}, - {"ALTER RANGE global PLACEMENT POLICY default", true, "ALTER RANGE `global` PLACEMENT POLICY = `default`"}, - {"ALTER RANGE meta PLACEMENT POLICY mypolicy", true, "ALTER RANGE `meta` PLACEMENT POLICY = `mypolicy`"}, - - // for create sequence with signed value especially with Two's Complement Min. - // for issue #17948 - {"CREATE SEQUENCE seq INCREMENT - 9223372036854775807", true, "CREATE SEQUENCE `seq` INCREMENT BY -9223372036854775807"}, - {"CREATE SEQUENCE seq INCREMENT - 9223372036854775808", true, "CREATE SEQUENCE `seq` INCREMENT BY -9223372036854775808"}, - {"CREATE SEQUENCE seq INCREMENT -9223372036854775808", true, "CREATE SEQUENCE `seq` INCREMENT BY -9223372036854775808"}, - {"CREATE SEQUENCE seq INCREMENT -9223372036854775809", false, ""}, - - {"select `t`.`1a`.1 from t;", true, "SELECT `t`.`1a`.`1` FROM `t`"}, - {"select * from 1db.1table;", true, "SELECT * FROM `1db`.`1table`"}, - {"select * from t where t. status = 1;", true, "SELECT * FROM `t` WHERE `t`.`status`=1"}, - - // for show placement - {"SHOW PLACEMENT", true, "SHOW PLACEMENT"}, - {"SHOW PLACEMENT LIKE 'POLICY foo%'", true, "SHOW PLACEMENT LIKE _UTF8MB4'POLICY foo%'"}, - {"SHOW PLACEMENT WHERE Target='TABLE test.t1'", true, "SHOW PLACEMENT WHERE `Target`=_UTF8MB4'TABLE test.t1'"}, - {"SHOW PLACEMENT FOR DATABASE db1", true, "SHOW PLACEMENT FOR DATABASE `db1`"}, - {"SHOW PLACEMENT FOR SCHEMA db1", true, "SHOW PLACEMENT FOR DATABASE `db1`"}, - {"SHOW PLACEMENT FOR TABLE tb1", true, "SHOW PLACEMENT FOR TABLE `tb1`"}, - {"SHOW PLACEMENT FOR TABLE db1.tb1", true, "SHOW PLACEMENT FOR TABLE `db1`.`tb1`"}, - {"SHOW PLACEMENT FOR TABLE tb1 PARTITION p1", true, "SHOW PLACEMENT FOR TABLE `tb1` PARTITION `p1`"}, - {"SHOW PLACEMENT FOR TABLE db1.tb1 PARTITION p1", true, "SHOW PLACEMENT FOR TABLE `db1`.`tb1` PARTITION `p1`"}, - {"SHOW PLACEMENT FOR", false, ""}, - {"SHOW PLACEMENT DATABASE db1", false, ""}, - {"SHOW PLACEMENT FOR DB db1", false, ""}, - {"SHOW PLACEMENT FOR DATABASE db1 TABLE tb1", false, ""}, - {"SHOW PLACEMENT FOR PARTITION p1", false, ""}, - {"SHOW PLACEMENT FOR DB LIKE '%'", false, ""}, - {"SHOW PLACEMENT FOR DB db1 LIKE '%'", false, ""}, - - // for show placement labels - {"SHOW PLACEMENT LABELS", true, "SHOW PLACEMENT LABELS"}, - {"SHOW PLACEMENT LABELS LIKE '%zone%'", true, "SHOW PLACEMENT LABELS LIKE _UTF8MB4'%zone%'"}, - {"SHOW PLACEMENT LABELS WHERE label='l123'", true, "SHOW PLACEMENT LABELS WHERE `label`=_UTF8MB4'l123'"}, - - // for show/set session_states - {"SHOW SESSION_STATES", true, "SHOW SESSION_STATES"}, - {"SET SESSION_STATES 'x'", true, "SET SESSION_STATES 'x'"}, - {"SET SESSION_STATES", false, ""}, - {"SET SESSION_STATES 1", false, ""}, - {"SET SESSION_STATES now()", false, ""}, - - // for calibrate resource - {"calibrate resource", true, "CALIBRATE RESOURCE"}, - {"calibrate resource START_TIME '2021-04-15 00:00:00'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2021-04-15 00:00:00'"}, - {"calibrate resource START_TIME '2023-04-01 13:00:00' END_TIME '2023-04-01 16:00:00'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00'"}, - {"calibrate resource START_TIME '2023-04-01 13:00:00' DURATION '20m'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' DURATION '20m'"}, - {"calibrate resource START_TIME '2023-04-01 13:00:00' END_TIME '2023-04-01 16:00:00' DURATION '20m'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00' DURATION '20m'"}, - {"calibrate resource START_TIME '2023-04-01 13:00:00',END_TIME='2023-04-01 16:00:00'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00'"}, - {"calibrate resource START_TIME '2023-04-01 13:00:00',DURATION='20m'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' DURATION '20m'"}, - {"calibrate resource DURATION='20m' START_TIME '2023-04-01 13:00:00'", true, "CALIBRATE RESOURCE DURATION '20m' START_TIME _UTF8MB4'2023-04-01 13:00:00'"}, - {"calibrate resource START_TIME '2023-04-01 13:00:00' END_TIME='2023-04-01 16:00:00',DURATION '20m'", true, "CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00' DURATION '20m'"}, - {"calibrate resource START_TIME CURRENT_TIMESTAMP() END_TIME current_timestamp()", true, "CALIBRATE RESOURCE START_TIME CURRENT_TIMESTAMP() END_TIME CURRENT_TIMESTAMP()"}, - {"calibrate resource END_TIME now()", true, "CALIBRATE RESOURCE END_TIME NOW()"}, - {"calibrate resource START_TIME now()", true, "CALIBRATE RESOURCE START_TIME NOW()"}, - {"calibrate resource START_TIME NOW() END_TIME now()", true, "CALIBRATE RESOURCE START_TIME NOW() END_TIME NOW()"}, - {"calibrate resource START_TIME CURRENT_TIMESTAMP() - interval 10 minute END_TIME now()", true, "CALIBRATE RESOURCE START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE) END_TIME NOW()"}, - {"calibrate resource START_TIME now() - 1000 END_TIME current_timestamp()", true, "CALIBRATE RESOURCE START_TIME NOW()-1000 END_TIME CURRENT_TIMESTAMP()"}, - {"calibrate resource START_TIME CURRENT_TIMESTAMP() - interval 20 minute DURATION interval 15 minute", true, "CALIBRATE RESOURCE START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE) DURATION INTERVAL 15 MINUTE"}, - {"calibrate resource START_TIME CURRENT_TIMESTAMP() - interval 20 minute DURATION '15m'", true, "CALIBRATE RESOURCE START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE) DURATION '15m'"}, - {"calibrate resource END_TIME now() START_TIME CURRENT_TIMESTAMP() - interval 20 minute", true, "CALIBRATE RESOURCE END_TIME NOW() START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE)"}, - {"calibrate resource workload", false, ""}, - {"calibrate resource workload tpcc", true, "CALIBRATE RESOURCE WORKLOAD TPCC"}, - {"calibrate resource workload oltp_read_write", true, "CALIBRATE RESOURCE WORKLOAD OLTP_READ_WRITE"}, - {"calibrate resource workload oltp_read_only", true, "CALIBRATE RESOURCE WORKLOAD OLTP_READ_ONLY"}, - {"calibrate resource workload oltp_write_only", true, "CALIBRATE RESOURCE WORKLOAD OLTP_WRITE_ONLY"}, - {"calibrate resource workload = oltp_read_write START_TIME '2023-04-01 13:00:00'", false, ""}, - - // for query watch - {"query watch add SQL DIGEST b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377 ", true, "QUERY WATCH ADD SQL DIGEST `b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377`"}, - {"query watch add SQL DIGEST b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377 ", true, "QUERY WATCH ADD SQL DIGEST `b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377`"}, - {"query watch add SQL DIGEST 'b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377' ", true, "QUERY WATCH ADD SQL DIGEST _UTF8MB4'b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377'"}, - {"query watch add PLAN DIGEST `5e3ddd388f6012e328233dbcdda5d48f404e0536c6c54d9618233210f3d5762a` ", true, "QUERY WATCH ADD PLAN DIGEST `5e3ddd388f6012e328233dbcdda5d48f404e0536c6c54d9618233210f3d5762a`"}, - {"query watch add PLAN DIGEST @digest1 ", true, "QUERY WATCH ADD PLAN DIGEST @`digest1`"}, - {"query watch add SQL TEXT SIMILAR to 'select 1'", true, "QUERY WATCH ADD SQL TEXT SIMILAR TO _UTF8MB4'select 1'"}, - {"query watch add SQL TEXT EXACT to 'select 1'", true, "QUERY WATCH ADD SQL TEXT EXACT TO _UTF8MB4'select 1'"}, - {"query watch add SQL TEXT PLAN to 'select 1'", true, "QUERY WATCH ADD SQL TEXT PLAN TO _UTF8MB4'select 1'"}, - {"query watch add resource group `default` SQL TEXT SIMILAR to 'select 1'", true, "QUERY WATCH ADD RESOURCE GROUP `default` SQL TEXT SIMILAR TO _UTF8MB4'select 1'"}, - {"query watch add resource group @rg SQL TEXT SIMILAR to @sql1", true, "QUERY WATCH ADD RESOURCE GROUP @`rg` SQL TEXT SIMILAR TO @`sql1`"}, - {"query watch add resource group rg1 SQL TEXT SIMILAR to 'select 1'", true, "QUERY WATCH ADD RESOURCE GROUP `rg1` SQL TEXT SIMILAR TO _UTF8MB4'select 1'"}, - {"query watch add SQL TEXT SIMILAR to 'select 1' resource group rg1", true, "QUERY WATCH ADD SQL TEXT SIMILAR TO _UTF8MB4'select 1' RESOURCE GROUP `rg1`"}, - {"query watch add ACTION = KILL SQL TEXT SIMILAR to 'select 1'", true, "QUERY WATCH ADD ACTION = KILL SQL TEXT SIMILAR TO _UTF8MB4'select 1'"}, - {"query watch add ACTION COOLDOWN resource group rg1 SQL TEXT SIMILAR to 'select 1'", true, "QUERY WATCH ADD ACTION = COOLDOWN RESOURCE GROUP `rg1` SQL TEXT SIMILAR TO _UTF8MB4'select 1'"}, - {"query watch add resource group `default` resource group `rg1` SQL TEXT SIMILAR to 'select 1'", false, ""}, - {"query watch add SQL SIMILAR to 'select 1'", false, ""}, - {"query watch add SQL TEXT SIMILAR 'select 1'", false, ""}, - {"query watch remove 1", true, "QUERY WATCH REMOVE 1"}, - {"query watch remove resource group rg1", true, "QUERY WATCH REMOVE RESOURCE GROUP `rg1`"}, - {"query watch remove resource group @rg", true, "QUERY WATCH REMOVE RESOURCE GROUP @`rg`"}, - {"query watch remove", false, ""}, - - // for issue 34325, "replace into" with hints - {"replace /*+ SET_VAR(sql_mode='ALLOW_INVALID_DATES') */ into t values ('2004-04-31');", true, "REPLACE /*+ SET_VAR(sql_mode = 'ALLOW_INVALID_DATES')*/ INTO `t` VALUES (_UTF8MB4'2004-04-31')"}, - } - RunTest(t, table, false, false) -} - -func TestDBAStmt(t *testing.T) { - table := []testCase{ - // for SHOW statement - {"SHOW VARIABLES LIKE 'character_set_results'", true, "SHOW SESSION VARIABLES LIKE _UTF8MB4'character_set_results'"}, - {"SHOW GLOBAL VARIABLES LIKE 'character_set_results'", true, "SHOW GLOBAL VARIABLES LIKE _UTF8MB4'character_set_results'"}, - {"SHOW SESSION VARIABLES LIKE 'character_set_results'", true, "SHOW SESSION VARIABLES LIKE _UTF8MB4'character_set_results'"}, - {"SHOW VARIABLES", true, "SHOW SESSION VARIABLES"}, - {"SHOW GLOBAL VARIABLES", true, "SHOW GLOBAL VARIABLES"}, - {"SHOW GLOBAL VARIABLES WHERE Variable_name = 'autocommit'", true, "SHOW GLOBAL VARIABLES WHERE `Variable_name`=_UTF8MB4'autocommit'"}, - {"SHOW STATUS", true, "SHOW SESSION STATUS"}, - {"SHOW GLOBAL STATUS", true, "SHOW GLOBAL STATUS"}, - {"SHOW SESSION STATUS", true, "SHOW SESSION STATUS"}, - {`SHOW STATUS LIKE 'Up%'`, true, "SHOW SESSION STATUS LIKE _UTF8MB4'Up%'"}, - {`SHOW STATUS WHERE Variable_name`, true, "SHOW SESSION STATUS WHERE `Variable_name`"}, - {`SHOW STATUS WHERE Variable_name LIKE 'Up%'`, true, "SHOW SESSION STATUS WHERE `Variable_name` LIKE _UTF8MB4'Up%'"}, - {`SHOW FULL TABLES FROM icar_qa LIKE play_evolutions`, true, "SHOW FULL TABLES IN `icar_qa` LIKE `play_evolutions`"}, - {`SHOW FULL TABLES WHERE Table_Type != 'VIEW'`, true, "SHOW FULL TABLES WHERE `Table_Type`!=_UTF8MB4'VIEW'"}, - {`SHOW GRANTS`, true, "SHOW GRANTS"}, - {`SHOW GRANTS FOR 'test'@'localhost'`, true, "SHOW GRANTS FOR `test`@`localhost`"}, - {`SHOW GRANTS FOR 'test'@'LOCALHOST'`, true, "SHOW GRANTS FOR `test`@`localhost`"}, - {`SHOW GRANTS FOR current_user()`, true, "SHOW GRANTS FOR CURRENT_USER"}, - {`SHOW GRANTS FOR current_user`, true, "SHOW GRANTS FOR CURRENT_USER"}, - {`SHOW GRANTS FOR 'u1'@'localhost' USING 'r1'`, true, "SHOW GRANTS FOR `u1`@`localhost` USING `r1`@`%`"}, - {`SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2'`, true, "SHOW GRANTS FOR `u1`@`localhost` USING `r1`@`%`, `r2`@`%`"}, - {`SHOW COLUMNS FROM City;`, true, "SHOW COLUMNS IN `City`"}, - {`SHOW COLUMNS FROM tv189.1_t_1_x;`, true, "SHOW COLUMNS IN `tv189`.`1_t_1_x`"}, - {`SHOW FIELDS FROM City;`, true, "SHOW COLUMNS IN `City`"}, - {`SHOW TRIGGERS LIKE 't'`, true, "SHOW TRIGGERS LIKE _UTF8MB4't'"}, - {`SHOW DATABASES LIKE 'test2'`, true, "SHOW DATABASES LIKE _UTF8MB4'test2'"}, - // PROCEDURE and FUNCTION are currently not supported. - // And FUNCTION reuse show procedure status process logic. - {`SHOW PROCEDURE STATUS WHERE Db='test'`, true, "SHOW PROCEDURE STATUS WHERE `Db`=_UTF8MB4'test'"}, - {`SHOW FUNCTION STATUS WHERE Db='test'`, true, "SHOW FUNCTION STATUS WHERE `Db`=_UTF8MB4'test'"}, - {`SHOW INDEX FROM t;`, true, "SHOW INDEX IN `t`"}, - {`SHOW KEYS FROM t;`, true, "SHOW INDEX IN `t`"}, - {`SHOW INDEX IN t;`, true, "SHOW INDEX IN `t`"}, - {`SHOW KEYS IN t;`, true, "SHOW INDEX IN `t`"}, - {`SHOW INDEXES IN t where true;`, true, "SHOW INDEX IN `t` WHERE TRUE"}, - {`SHOW KEYS FROM t FROM test where true;`, true, "SHOW INDEX IN `test`.`t` WHERE TRUE"}, - {`SHOW EVENTS FROM test_db WHERE definer = 'current_user'`, true, "SHOW EVENTS IN `test_db` WHERE `definer`=_UTF8MB4'current_user'"}, - {`SHOW PLUGINS`, true, "SHOW PLUGINS"}, - {`SHOW PROFILES`, true, "SHOW PROFILES"}, - {`SHOW PROFILE`, true, "SHOW PROFILE"}, - {`SHOW PROFILE FOR QUERY 1`, true, "SHOW PROFILE FOR QUERY 1"}, - {`SHOW PROFILE CPU FOR QUERY 2`, true, "SHOW PROFILE CPU FOR QUERY 2"}, - {`SHOW PROFILE CPU FOR QUERY 2 LIMIT 1,1`, true, "SHOW PROFILE CPU FOR QUERY 2 LIMIT 1,1"}, - {`SHOW PROFILE CPU, MEMORY, BLOCK IO, CONTEXT SWITCHES, PAGE FAULTS, IPC, SWAPS, SOURCE FOR QUERY 1 limit 100`, true, "SHOW PROFILE CPU, MEMORY, BLOCK IO, CONTEXT SWITCHES, PAGE FAULTS, IPC, SWAPS, SOURCE FOR QUERY 1 LIMIT 100"}, - {`SHOW MASTER STATUS`, true, "SHOW MASTER STATUS"}, - {`SHOW BINARY LOG STATUS`, true, "SHOW BINARY LOG STATUS"}, - {`SHOW PRIVILEGES`, true, "SHOW PRIVILEGES"}, - // for show character set - {"show character set;", true, "SHOW CHARSET"}, - {"show charset", true, "SHOW CHARSET"}, - // for show collation - {"show collation", true, "SHOW COLLATION"}, - {`show collation like 'utf8%'`, true, "SHOW COLLATION LIKE _UTF8MB4'utf8%'"}, - {"show collation where Charset = 'utf8' and Collation = 'utf8_bin'", true, "SHOW COLLATION WHERE `Charset`=_UTF8MB4'utf8' AND `Collation`=_UTF8MB4'utf8_bin'"}, - // for show full columns - {"show columns in t;", true, "SHOW COLUMNS IN `t`"}, - {"show full columns in t;", true, "SHOW FULL COLUMNS IN `t`"}, - // for show extended columns - {`SHOW COLUMNS FROM City;`, true, "SHOW COLUMNS IN `City`"}, - {`SHOW EXTENDED COLUMNS FROM City;`, true, "SHOW EXTENDED COLUMNS IN `City`"}, - {`SHOW EXTENDED FIELDS FROM City;`, true, "SHOW EXTENDED COLUMNS IN `City`"}, - // for show extended full columns - {`SHOW EXTENDED FULL COLUMNS FROM City;`, true, "SHOW EXTENDED FULL COLUMNS IN `City`"}, - {`SHOW EXTENDED FULL FIELDS FROM City;`, true, "SHOW EXTENDED FULL COLUMNS IN `City`"}, - // for show create table - {"show create table test.t", true, "SHOW CREATE TABLE `test`.`t`"}, - {"show create table t", true, "SHOW CREATE TABLE `t`"}, - // for show create view - {"show create view test.t", true, "SHOW CREATE VIEW `test`.`t`"}, - {"show create view t", true, "SHOW CREATE VIEW `t`"}, - // for show create database - {"show create database d1", true, "SHOW CREATE DATABASE `d1`"}, - {"show create database if not exists d1", true, "SHOW CREATE DATABASE IF NOT EXISTS `d1`"}, - // for show create sequence - {"show create sequence seq", true, "SHOW CREATE SEQUENCE `seq`"}, - {"show create sequence test.seq", true, "SHOW CREATE SEQUENCE `test`.`seq`"}, - // Extended stats has been removed. keep this case only for syntax compatibility. - {"show stats_extended", true, "SHOW STATS_EXTENDED"}, - {"show stats_extended where table_name = 't'", true, "SHOW STATS_EXTENDED WHERE `table_name`=_UTF8MB4't'"}, - // for show stats_meta. - {"show stats_meta", true, "SHOW STATS_META"}, - {"show stats_meta where table_name = 't'", true, "SHOW STATS_META WHERE `table_name`=_UTF8MB4't'"}, - // for show stats_locked. - {"show stats_locked", true, "SHOW STATS_LOCKED"}, - {"show stats_locked where table_name = 't'", true, "SHOW STATS_LOCKED WHERE `table_name`=_UTF8MB4't'"}, - // for show stats_histograms - {"show stats_histograms", true, "SHOW STATS_HISTOGRAMS"}, - {"show stats_histograms where col_name = 'a'", true, "SHOW STATS_HISTOGRAMS WHERE `col_name`=_UTF8MB4'a'"}, - // for show stats_buckets - {"show stats_buckets", true, "SHOW STATS_BUCKETS"}, - {"show stats_buckets where col_name = 'a'", true, "SHOW STATS_BUCKETS WHERE `col_name`=_UTF8MB4'a'"}, - // for show stats_healthy. - {"show stats_healthy", true, "SHOW STATS_HEALTHY"}, - {"show stats_healthy where table_name = 't'", true, "SHOW STATS_HEALTHY WHERE `table_name`=_UTF8MB4't'"}, - // for show stats_topn. - {"show stats_topn", true, "SHOW STATS_TOPN"}, - {"show stats_topn where table_name = 't'", true, "SHOW STATS_TOPN WHERE `table_name`=_UTF8MB4't'"}, - // for show histograms_in_flight. - {"show histograms_in_flight", true, "SHOW HISTOGRAMS_IN_FLIGHT"}, - // for show column_stats_usage. - {"show column_stats_usage", true, "SHOW COLUMN_STATS_USAGE"}, - {"show column_stats_usage where table_name = 't'", true, "SHOW COLUMN_STATS_USAGE WHERE `table_name`=_UTF8MB4't'"}, - // for show binding_cache status - {"show binding_cache status", true, "SHOW BINDING_CACHE STATUS"}, - {"show analyze status", true, "SHOW ANALYZE STATUS"}, - {"show analyze status where table_name = 't'", true, "SHOW ANALYZE STATUS WHERE `table_name`=_UTF8MB4't'"}, - {"show analyze status where table_name like '%'", true, "SHOW ANALYZE STATUS WHERE `table_name` LIKE _UTF8MB4'%'"}, - // for show builtins - {"show builtins", true, "SHOW BUILTINS"}, - // for show backup & restore - {"show backups", true, "SHOW BACKUPS"}, - {"show restores like 'r0001'", true, "SHOW RESTORES LIKE _UTF8MB4'r0001'"}, - {"show backups where start_time > now() - interval 10 hour", true, "SHOW BACKUPS WHERE `start_time`>DATE_SUB(NOW(), INTERVAL 10 HOUR)"}, - {"show backup", false, ""}, - {"show restore", false, ""}, - {"show replica status", true, "SHOW REPLICA STATUS"}, - {"show slave status", true, "SHOW REPLICA STATUS"}, - - // for load stats - {"load stats '/tmp/stats.json'", true, "LOAD STATS '/tmp/stats.json'"}, - // for lock stats - {"lock stats test.t", true, "LOCK STATS `test`.`t`"}, - {"lock stats t, t2", true, "LOCK STATS `t`, `t2`"}, - {"lock stats t partition (p0, p1)", true, "LOCK STATS `t` PARTITION(`p0`, `p1`)"}, - // for unlock stats - {"unlock stats test.t", true, "UNLOCK STATS `test`.`t`"}, - {"unlock stats t, t2", true, "UNLOCK STATS `t`, `t2`"}, - {"unlock stats t partition (p0, p1)", true, "UNLOCK STATS `t` PARTITION(`p0`, `p1`)"}, - // set - // user defined - {"SET @ = 1", true, "SET @``=1"}, - {"SET @' ' = 1", true, "SET @` `=1"}, - {"SET @! = 1", false, ""}, - {"SET @1 = 1", true, "SET @`1`=1"}, - {"SET @a = 1", true, "SET @`a`=1"}, - {"SET @b := 1", true, "SET @`b`=1"}, - {"SET @.c = 1", true, "SET @`.c`=1"}, - {"SET @_d = 1", true, "SET @`_d`=1"}, - {"SET @_e._$. = 1", true, "SET @`_e._$.`=1"}, - {"SET @~f = 1", false, ""}, - {"SET @`g,` = 1", true, "SET @`g,`=1"}, - {"SET", false, ""}, - {"SET @a = 1, @b := 2", true, "SET @`a`=1, @`b`=2"}, - // session system variables - {"SET SESSION autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@session.autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@SESSION.autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@GLOBAL.GTID_PURGED = '123'", true, "SET @@GLOBAL.`gtid_purged`=_UTF8MB4'123'"}, - {"SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN", true, "SET @`MYSQLDUMP_TEMP_LOG_BIN`=@@SESSION.`sql_log_bin`"}, - {"SET LOCAL autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@local.autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET autocommit = 1", true, "SET @@SESSION.`autocommit`=1"}, - // global system variables - {"SET GLOBAL autocommit = 1", true, "SET @@GLOBAL.`autocommit`=1"}, - {"SET @@global.autocommit = 1", true, "SET @@GLOBAL.`autocommit`=1"}, - // set through mysql extension assignment syntax - {"SET autocommit := 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@session.autocommit := 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @MYSQLDUMP_TEMP_LOG_BIN := @@SESSION.SQL_LOG_BIN", true, "SET @`MYSQLDUMP_TEMP_LOG_BIN`=@@SESSION.`sql_log_bin`"}, - {"SET LOCAL autocommit := 1", true, "SET @@SESSION.`autocommit`=1"}, - {"SET @@global.autocommit := default", true, "SET @@GLOBAL.`autocommit`=DEFAULT"}, - // set default value - {"SET @@global.autocommit = default", true, "SET @@GLOBAL.`autocommit`=DEFAULT"}, - {"SET @@session.autocommit = default", true, "SET @@SESSION.`autocommit`=DEFAULT"}, - // set binary value - {"SET @@character_set_results = binary", true, "SET @@SESSION.`character_set_results`=_UTF8MB4'BINARY'"}, - // SET CHARACTER SET - {"SET CHARACTER SET utf8mb4;", true, "SET CHARSET 'utf8mb4'"}, - {"SET CHARACTER SET 'utf8mb4';", true, "SET CHARSET 'utf8mb4'"}, - // set password - {"SET PASSWORD = 'password';", true, "SET PASSWORD='password'"}, - {"SET PASSWORD FOR 'root'@'localhost' = 'password';", true, "SET PASSWORD FOR `root`@`localhost`='password'"}, - // SET TRANSACTION Syntax - {"SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ", true, "SET @@SESSION.`tx_isolation`=_UTF8MB4'REPEATABLE-READ'"}, - {"SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ", true, "SET @@GLOBAL.`tx_isolation`=_UTF8MB4'REPEATABLE-READ'"}, - {"SET SESSION TRANSACTION READ WRITE", true, "SET @@SESSION.`tx_read_only`=_UTF8MB4'0'"}, - {"SET SESSION TRANSACTION READ ONLY", true, "SET @@SESSION.`tx_read_only`=_UTF8MB4'1'"}, - {"SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", true, "SET @@SESSION.`tx_isolation`=_UTF8MB4'READ-COMMITTED'"}, - {"SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", true, "SET @@SESSION.`tx_isolation`=_UTF8MB4'READ-UNCOMMITTED'"}, - {"SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE", true, "SET @@SESSION.`tx_isolation`=_UTF8MB4'SERIALIZABLE'"}, - {"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ", true, "SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'REPEATABLE-READ'"}, - {"SET TRANSACTION READ WRITE", true, "SET @@SESSION.`tx_read_only`=_UTF8MB4'0'"}, - {"SET TRANSACTION READ ONLY", true, "SET @@SESSION.`tx_read_only`=_UTF8MB4'1'"}, - {"SET TRANSACTION ISOLATION LEVEL READ COMMITTED", true, "SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'READ-COMMITTED'"}, - {"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", true, "SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'READ-UNCOMMITTED'"}, - {"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE", true, "SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'SERIALIZABLE'"}, - // for set names - {"set names utf8", true, "SET NAMES 'utf8'"}, - {"set names utf8 collate utf8_unicode_ci", true, "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"}, - {"set names binary", true, "SET NAMES 'binary'"}, - - // for set character set | name default - {"set names default", true, "SET NAMES DEFAULT"}, - {"set character set default", true, "SET CHARSET DEFAULT"}, - {"set charset default", true, "SET CHARSET DEFAULT"}, - {"set char set default", true, "SET CHARSET DEFAULT"}, - - {"set role `role1`", true, "SET ROLE `role1`@`%`"}, - {"SET ROLE DEFAULT", true, "SET ROLE DEFAULT"}, - {"SET ROLE ALL", true, "SET ROLE ALL"}, - {"SET ROLE ALL EXCEPT `role1`, `role2`", true, "SET ROLE ALL EXCEPT `role1`@`%`, `role2`@`%`"}, - {"SET DEFAULT ROLE administrator, developer TO `joe`@`10.0.0.1`", true, "SET DEFAULT ROLE `administrator`@`%`, `developer`@`%` TO `joe`@`10.0.0.1`"}, - // for set names and set vars - {"set names utf8, @@session.sql_mode=1;", true, "SET NAMES 'utf8', @@SESSION.`sql_mode`=1"}, - {"set @@session.sql_mode=1, names utf8, charset utf8;", true, "SET @@SESSION.`sql_mode`=1, NAMES 'utf8', CHARSET 'utf8'"}, - - // for set/show config - {"set config TIKV LOG.LEVEL='info'", true, "SET CONFIG TIKV LOG.LEVEL = _UTF8MB4'info'"}, - {"set config PD LOG.LEVEL='info'", true, "SET CONFIG PD LOG.LEVEL = _UTF8MB4'info'"}, - {"set config TIDB LOG.LEVEL='info'", true, "SET CONFIG TIDB LOG.LEVEL = _UTF8MB4'info'"}, - {"set config '127.0.0.1:3306' LOG.LEVEL='info'", true, "SET CONFIG '127.0.0.1:3306' LOG.LEVEL = _UTF8MB4'info'"}, - {"set config '127.0.0.1:3306' AUTO-COMPACTION-MODE=TRUE", true, "SET CONFIG '127.0.0.1:3306' AUTO-COMPACTION-MODE = TRUE"}, - {"set config '127.0.0.1:3306' LABEL-PROPERTY.REJECT-LEADER.KEY='zone'", true, "SET CONFIG '127.0.0.1:3306' LABEL-PROPERTY.REJECT-LEADER.KEY = _UTF8MB4'zone'"}, - {"show config", true, "SHOW CONFIG"}, - {"show config where type='tidb'", true, "SHOW CONFIG WHERE `type`=_UTF8MB4'tidb'"}, - {"show config where instance='127.0.0.1:3306'", true, "SHOW CONFIG WHERE `instance`=_UTF8MB4'127.0.0.1:3306'"}, - {"create table CONFIG (a int)", true, "CREATE TABLE `CONFIG` (`a` INT)"}, // check that `CONFIG` is unreserved keyword - - // for FLUSH statement - {"flush no_write_to_binlog tables tbl1 with read lock", true, "FLUSH NO_WRITE_TO_BINLOG TABLES `tbl1` WITH READ LOCK"}, - {"flush table", true, "FLUSH TABLES"}, - {"flush tables", true, "FLUSH TABLES"}, - {"flush tables tbl1", true, "FLUSH TABLES `tbl1`"}, - {"flush no_write_to_binlog tables tbl1", true, "FLUSH NO_WRITE_TO_BINLOG TABLES `tbl1`"}, - {"flush local tables tbl1", true, "FLUSH NO_WRITE_TO_BINLOG TABLES `tbl1`"}, - {"flush table with read lock", true, "FLUSH TABLES WITH READ LOCK"}, - {"flush tables tbl1, tbl2, tbl3", true, "FLUSH TABLES `tbl1`, `tbl2`, `tbl3`"}, - {"flush tables tbl1, tbl2, tbl3 with read lock", true, "FLUSH TABLES `tbl1`, `tbl2`, `tbl3` WITH READ LOCK"}, - {"flush privileges", true, "FLUSH PRIVILEGES"}, - {"flush status", true, "FLUSH STATUS"}, - {"flush tidb plugins plugin1", true, "FLUSH TIDB PLUGINS plugin1"}, - {"flush tidb plugins plugin1, plugin2", true, "FLUSH TIDB PLUGINS plugin1, plugin2"}, - {"flush hosts", true, "FLUSH HOSTS"}, - {"flush logs", true, "FLUSH LOGS"}, - {"flush binary logs", true, "FLUSH BINARY LOGS"}, - {"flush engine logs", true, "FLUSH ENGINE LOGS"}, - {"flush error logs", true, "FLUSH ERROR LOGS"}, - {"flush general logs", true, "FLUSH GENERAL LOGS"}, - {"flush slow logs", true, "FLUSH SLOW LOGS"}, - {"flush client_errors_summary", true, "FLUSH CLIENT_ERRORS_SUMMARY"}, - {"flush stats_delta", false, ""}, - {"flush stats_delta cluster", true, "FLUSH STATS_DELTA `cluster`"}, - {"flush stats_delta cluster cluster", true, "FLUSH STATS_DELTA `cluster` CLUSTER"}, - {"flush stats_delta *.*", true, "FLUSH STATS_DELTA *.*"}, - {"flush stats_delta *.* cluster", true, "FLUSH STATS_DELTA *.* CLUSTER"}, - {"flush stats_delta db1.*", true, "FLUSH STATS_DELTA `db1`.*"}, - {"flush stats_delta db1.* cluster", true, "FLUSH STATS_DELTA `db1`.* CLUSTER"}, - {"flush stats_delta t1", true, "FLUSH STATS_DELTA `t1`"}, - {"flush stats_delta db1.t1", true, "FLUSH STATS_DELTA `db1`.`t1`"}, - {"flush stats_delta db1.t1 cluster", true, "FLUSH STATS_DELTA `db1`.`t1` CLUSTER"}, - {"flush stats_delta db1.t1, db2.*", true, "FLUSH STATS_DELTA `db1`.`t1`, `db2`.*"}, - {"flush stats_delta db1.t1, db2.* cluster", true, "FLUSH STATS_DELTA `db1`.`t1`, `db2`.* CLUSTER"}, - - // for call statement - {"call ", false, ""}, - {"call test", true, "CALL `test`()"}, - {"call test()", true, "CALL `test`()"}, - {"call test(1, 'test', true)", true, "CALL `test`(1, _UTF8MB4'test', TRUE)"}, - {"call x.y;", true, "CALL `x`.`y`()"}, - {"call x.y();", true, "CALL `x`.`y`()"}, - {"call x.y('p', 'q', 'r');", true, "CALL `x`.`y`(_UTF8MB4'p', _UTF8MB4'q', _UTF8MB4'r')"}, - {"call `x`.`y`;", true, "CALL `x`.`y`()"}, - {"call `x`.`y`();", true, "CALL `x`.`y`()"}, - {"call `x`.`y`('p', 'q', 'r');", true, "CALL `x`.`y`(_UTF8MB4'p', _UTF8MB4'q', _UTF8MB4'r')"}, - } - RunTest(t, table, false, false) -} - func TestSetVariable(t *testing.T) { table := []struct { Input string @@ -1806,823 +708,6 @@ func TestFlushPrivileges(t *testing.T) { } } -func TestExpression(t *testing.T) { - table := []testCase{ - // sign expression - {"SELECT ++1", true, "SELECT ++1"}, - {"SELECT -*1", false, "SELECT -*1"}, - {"SELECT -+1", true, "SELECT -+1"}, - {"SELECT -1", true, "SELECT -1"}, - {"SELECT --1", true, "SELECT --1"}, - - // for string literal - {`select '''a''', """a"""`, true, "SELECT _UTF8MB4'''a''',_UTF8MB4'\"a\"'"}, - {`select ''a''`, false, ""}, - {`select ""a""`, false, ""}, - {`select '''a''';`, true, "SELECT _UTF8MB4'''a'''"}, - {`select '\'a\'';`, true, "SELECT _UTF8MB4'''a'''"}, - {`select "\"a\"";`, true, "SELECT _UTF8MB4'\"a\"'"}, - {`select """a""";`, true, "SELECT _UTF8MB4'\"a\"'"}, - {`select _utf8"string";`, true, "SELECT _UTF8'string'"}, - {`select _binary"string";`, true, "SELECT _BINARY'string'"}, - {"select N'string'", true, "SELECT _UTF8'string'"}, - {"select n'string'", true, "SELECT _UTF8'string'"}, - {"select _utf8 0xD0B1;", true, "SELECT _UTF8 x'd0b1'"}, - {"select _utf8 X'D0B1';", true, "SELECT _UTF8 x'd0b1'"}, - {"select _utf8 0b1101000010110001;", true, "SELECT _UTF8 b'1101000010110001'"}, - {"select _utf8 B'1101000010110001';", true, "SELECT _UTF8 b'1101000010110001'"}, - // for comparison - {"select 1 <=> 0, 1 <=> null, 1 = null", true, "SELECT 1<=>0,1<=>NULL,1=NULL"}, - // for date literal - {"select date'1989-09-10'", true, "SELECT DATE '1989-09-10'"}, - {"select date 19890910", false, ""}, - // for time literal - {"select time '00:00:00.111'", true, "SELECT TIME '00:00:00.111'"}, - {"select time 19890910", false, ""}, - // for timestamp literal - {"select timestamp '1989-09-10 11:11:11'", true, "SELECT TIMESTAMP '1989-09-10 11:11:11'"}, - {"select timestamp 19890910", false, ""}, - - // The ODBC syntax for time/date/timestamp literal. - // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html - {"select {ts '1989-09-10 11:11:11'}", true, "SELECT TIMESTAMP '1989-09-10 11:11:11'"}, - {"select {d '1989-09-10'}", true, "SELECT DATE '1989-09-10'"}, - {"select {t '00:00:00.111'}", true, "SELECT TIME '00:00:00.111'"}, - {"select * from t where a > {ts '1989-09-10 11:11:11'}", true, "SELECT * FROM `t` WHERE `a`>TIMESTAMP '1989-09-10 11:11:11'"}, - {"select * from t where a > {ts {abc '1989-09-10 11:11:11'}}", true, "SELECT * FROM `t` WHERE `a`>TIMESTAMP '1989-09-10 11:11:11'"}, - // If the identifier is not in (t, d, ts), we just ignore it and consider the following expression as the value. - // See: https://dev.mysql.com/doc/refman/5.7/en/expressions.html - {"select {ts123 '1989-09-10 11:11:11'}", true, "SELECT _UTF8MB4'1989-09-10 11:11:11'"}, - {"select {ts123 123}", true, "SELECT 123"}, - {"select {ts123 1 xor 1}", true, "SELECT 1 XOR 1"}, - {"select * from t where a > {ts123 '1989-09-10 11:11:11'}", true, "SELECT * FROM `t` WHERE `a`>_UTF8MB4'1989-09-10 11:11:11'"}, - {"select .t.a from t", false, ""}, - } - - RunTest(t, table, false, false) -} - -func TestBuiltin(t *testing.T) { - table := []testCase{ - // for builtin functions - {"SELECT POW(1, 2)", true, "SELECT POW(1, 2)"}, - {"SELECT POW(1, 2, 1)", true, "SELECT POW(1, 2, 1)"}, // illegal number of arguments shall pass too - {"SELECT POW(1, 0.5)", true, "SELECT POW(1, 0.5)"}, - {"SELECT POW(1, -1)", true, "SELECT POW(1, -1)"}, - {"SELECT POW(-1, 1)", true, "SELECT POW(-1, 1)"}, - {"SELECT RAND();", true, "SELECT RAND()"}, - {"SELECT RAND(1);", true, "SELECT RAND(1)"}, - {"SELECT MOD(10, 2);", true, "SELECT 10%2"}, - {"SELECT ROUND(-1.23);", true, "SELECT ROUND(-1.23)"}, - {"SELECT ROUND(1.23, 1);", true, "SELECT ROUND(1.23, 1)"}, - {"SELECT ROUND(1.23, 1, 1);", true, "SELECT ROUND(1.23, 1, 1)"}, - {"SELECT CEIL(-1.23);", true, "SELECT CEIL(-1.23)"}, - {"SELECT CEILING(1.23);", true, "SELECT CEILING(1.23)"}, - {"SELECT FLOOR(-1.23);", true, "SELECT FLOOR(-1.23)"}, - {"SELECT LN(1);", true, "SELECT LN(1)"}, - {"SELECT LN(1, 2);", true, "SELECT LN(1, 2)"}, - {"SELECT LOG(-2);", true, "SELECT LOG(-2)"}, - {"SELECT LOG(2, 65536);", true, "SELECT LOG(2, 65536)"}, - {"SELECT LOG(2, 65536, 1);", true, "SELECT LOG(2, 65536, 1)"}, - {"SELECT LOG2(2);", true, "SELECT LOG2(2)"}, - {"SELECT LOG2(2, 2);", true, "SELECT LOG2(2, 2)"}, - {"SELECT LOG10(10);", true, "SELECT LOG10(10)"}, - {"SELECT LOG10(10, 1);", true, "SELECT LOG10(10, 1)"}, - {"SELECT ABS(10, 1);", true, "SELECT ABS(10, 1)"}, - {"SELECT ABS(10);", true, "SELECT ABS(10)"}, - {"SELECT ABS();", true, "SELECT ABS()"}, - {"SELECT CONV(10+'10'+'10'+X'0a',10,10);", true, "SELECT CONV(10+_UTF8MB4'10'+_UTF8MB4'10'+x'0a', 10, 10)"}, - {"SELECT CONV();", true, "SELECT CONV()"}, - {"SELECT CRC32('MySQL');", true, "SELECT CRC32(_UTF8MB4'MySQL')"}, - {"SELECT CRC32();", true, "SELECT CRC32()"}, - {"SELECT SIGN();", true, "SELECT SIGN()"}, - {"SELECT SIGN(0);", true, "SELECT SIGN(0)"}, - {"SELECT SQRT(0);", true, "SELECT SQRT(0)"}, - {"SELECT SQRT();", true, "SELECT SQRT()"}, - {"SELECT ACOS();", true, "SELECT ACOS()"}, - {"SELECT ACOS(1);", true, "SELECT ACOS(1)"}, - {"SELECT ACOS(1, 2);", true, "SELECT ACOS(1, 2)"}, - {"SELECT ASIN();", true, "SELECT ASIN()"}, - {"SELECT ASIN(1);", true, "SELECT ASIN(1)"}, - {"SELECT ASIN(1, 2);", true, "SELECT ASIN(1, 2)"}, - {"SELECT ATAN(0), ATAN(1), ATAN(1, 2);", true, "SELECT ATAN(0),ATAN(1),ATAN(1, 2)"}, - {"SELECT ATAN2(), ATAN2(1,2);", true, "SELECT ATAN2(),ATAN2(1, 2)"}, - {"SELECT COS(0);", true, "SELECT COS(0)"}, - {"SELECT COS(1);", true, "SELECT COS(1)"}, - {"SELECT COS(1, 2);", true, "SELECT COS(1, 2)"}, - {"SELECT COT();", true, "SELECT COT()"}, - {"SELECT COT(1);", true, "SELECT COT(1)"}, - {"SELECT COT(1, 2);", true, "SELECT COT(1, 2)"}, - {"SELECT DEGREES();", true, "SELECT DEGREES()"}, - {"SELECT DEGREES(0);", true, "SELECT DEGREES(0)"}, - {"SELECT EXP();", true, "SELECT EXP()"}, - {"SELECT EXP(1);", true, "SELECT EXP(1)"}, - {"SELECT PI();", true, "SELECT PI()"}, - {"SELECT PI(1);", true, "SELECT PI(1)"}, - {"SELECT RADIANS();", true, "SELECT RADIANS()"}, - {"SELECT RADIANS(1);", true, "SELECT RADIANS(1)"}, - {"SELECT SIN();", true, "SELECT SIN()"}, - {"SELECT SIN(1);", true, "SELECT SIN(1)"}, - {"SELECT TAN(1);", true, "SELECT TAN(1)"}, - {"SELECT TAN();", true, "SELECT TAN()"}, - {"SELECT TRUNCATE(1.223,1);", true, "SELECT TRUNCATE(1.223, 1)"}, - {"SELECT TRUNCATE();", true, "SELECT TRUNCATE()"}, - - {"SELECT SUBSTR('Quadratically',5);", true, "SELECT SUBSTR(_UTF8MB4'Quadratically', 5)"}, - {"SELECT SUBSTR('Quadratically',5, 3);", true, "SELECT SUBSTR(_UTF8MB4'Quadratically', 5, 3)"}, - {"SELECT SUBSTR('Quadratically' FROM 5);", true, "SELECT SUBSTR(_UTF8MB4'Quadratically', 5)"}, - {"SELECT SUBSTR('Quadratically' FROM 5 FOR 3);", true, "SELECT SUBSTR(_UTF8MB4'Quadratically', 5, 3)"}, - - {"SELECT SUBSTRING('Quadratically',5);", true, "SELECT SUBSTRING(_UTF8MB4'Quadratically', 5)"}, - {"SELECT SUBSTRING('Quadratically',5, 3);", true, "SELECT SUBSTRING(_UTF8MB4'Quadratically', 5, 3)"}, - {"SELECT SUBSTRING('Quadratically' FROM 5);", true, "SELECT SUBSTRING(_UTF8MB4'Quadratically', 5)"}, - {"SELECT SUBSTRING('Quadratically' FROM 5 FOR 3);", true, "SELECT SUBSTRING(_UTF8MB4'Quadratically', 5, 3)"}, - - {"SELECT CONVERT('111', SIGNED);", true, "SELECT CONVERT(_UTF8MB4'111', SIGNED)"}, - - {"SELECT LEAST(), LEAST(1, 2, 3);", true, "SELECT LEAST(),LEAST(1, 2, 3)"}, - - {"SELECT INTERVAL(1, 0, 1, 2)", true, "SELECT INTERVAL(1, 0, 1, 2)"}, - {"SELECT (INTERVAL(1, 0, 1, 2)+5)*7+INTERVAL(1, 0, 1, 2)/2", true, "SELECT (INTERVAL(1, 0, 1, 2)+5)*7+INTERVAL(1, 0, 1, 2)/2"}, - {"SELECT INTERVAL(0, (1*5)/2)+INTERVAL(5, 4, 3)", true, "SELECT INTERVAL(0, (1*5)/2)+INTERVAL(5, 4, 3)"}, - {"SELECT DATE_ADD('2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY);", true, "SELECT DATE_ADD(_UTF8MB4'2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY)"}, - - // information functions - {"SELECT DATABASE();", true, "SELECT DATABASE()"}, - {"SELECT SCHEMA();", true, "SELECT SCHEMA()"}, - {"SELECT USER();", true, "SELECT USER()"}, - {"SELECT USER(1);", true, "SELECT USER(1)"}, - {"SELECT CURRENT_USER();", true, "SELECT CURRENT_USER()"}, - {"SELECT CURRENT_ROLE();", true, "SELECT CURRENT_ROLE()"}, - {"SELECT CURRENT_USER;", true, "SELECT CURRENT_USER()"}, - {"SELECT CONNECTION_ID();", true, "SELECT CONNECTION_ID()"}, - {"SELECT VERSION();", true, "SELECT VERSION()"}, - {"SELECT CURRENT_RESOURCE_GROUP();", true, "SELECT CURRENT_RESOURCE_GROUP()"}, - {"SELECT BENCHMARK(1000000, AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));", true, "SELECT BENCHMARK(1000000, AES_ENCRYPT(_UTF8MB4'text', UNHEX(_UTF8MB4'F3229A0B371ED2D9441B830D21A390C3')))"}, - {"SELECT BENCHMARK(AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));", true, "SELECT BENCHMARK(AES_ENCRYPT(_UTF8MB4'text', UNHEX(_UTF8MB4'F3229A0B371ED2D9441B830D21A390C3')))"}, - {"SELECT CHARSET('abc');", true, "SELECT CHARSET(_UTF8MB4'abc')"}, - {"SELECT COERCIBILITY('abc');", true, "SELECT COERCIBILITY(_UTF8MB4'abc')"}, - {"SELECT COERCIBILITY('abc', 'a');", true, "SELECT COERCIBILITY(_UTF8MB4'abc', _UTF8MB4'a')"}, - {"SELECT COLLATION('abc');", true, "SELECT COLLATION(_UTF8MB4'abc')"}, - {"SELECT ROW_COUNT();", true, "SELECT ROW_COUNT()"}, - {"SELECT SESSION_USER();", true, "SELECT SESSION_USER()"}, - {"SELECT SYSTEM_USER();", true, "SELECT SYSTEM_USER()"}, - {"SELECT FORMAT_BYTES(512);", true, "SELECT FORMAT_BYTES(512)"}, - {"SELECT FORMAT_NANO_TIME(3501);", true, "SELECT FORMAT_NANO_TIME(3501)"}, - - {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);", true, "SELECT SUBSTRING_INDEX(_UTF8MB4'www.mysql.com', _UTF8MB4'.', 2)"}, - {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);", true, "SELECT SUBSTRING_INDEX(_UTF8MB4'www.mysql.com', _UTF8MB4'.', -2)"}, - - {`SELECT ASCII(), ASCII(""), ASCII("A"), ASCII(1);`, true, "SELECT ASCII(),ASCII(_UTF8MB4''),ASCII(_UTF8MB4'A'),ASCII(1)"}, - - {`SELECT LOWER("A"), UPPER("a")`, true, "SELECT LOWER(_UTF8MB4'A'),UPPER(_UTF8MB4'a')"}, - {`SELECT LCASE("A"), UCASE("a")`, true, "SELECT LCASE(_UTF8MB4'A'),UCASE(_UTF8MB4'a')"}, - - {`SELECT REPLACE('www.mysql.com', 'w', 'Ww')`, true, "SELECT REPLACE(_UTF8MB4'www.mysql.com', _UTF8MB4'w', _UTF8MB4'Ww')"}, - - {`SELECT LOCATE('bar', 'foobarbar');`, true, "SELECT LOCATE(_UTF8MB4'bar', _UTF8MB4'foobarbar')"}, - {`SELECT LOCATE('bar', 'foobarbar', 5);`, true, "SELECT LOCATE(_UTF8MB4'bar', _UTF8MB4'foobarbar', 5)"}, - - {`SELECT tidb_version();`, true, "SELECT TIDB_VERSION()"}, - {`SELECT tidb_is_ddl_owner();`, true, "SELECT TIDB_IS_DDL_OWNER()"}, - {`SELECT tidb_decode_plan();`, true, "SELECT TIDB_DECODE_PLAN()"}, - {`SELECT tidb_decode_key('abc');`, true, "SELECT TIDB_DECODE_KEY(_UTF8MB4'abc')"}, - {`SELECT tidb_decode_base64_key('abc');`, true, "SELECT TIDB_DECODE_BASE64_KEY(_UTF8MB4'abc')"}, - {`SELECT tidb_decode_sql_digests('[]');`, true, "SELECT TIDB_DECODE_SQL_DIGESTS(_UTF8MB4'[]')"}, - - // for time fsp - {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true, "CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2))"}, - - // for row - {"select row(1)", false, ""}, - {"select row(1, 1,)", false, ""}, - {"select (1, 1,)", false, ""}, - {"select row(1, 1) > row(1, 1), row(1, 1, 1) > row(1, 1, 1)", true, "SELECT ROW(1,1)>ROW(1,1),ROW(1,1,1)>ROW(1,1,1)"}, - {"Select (1, 1) > (1, 1)", true, "SELECT ROW(1,1)>ROW(1,1)"}, - {"create table t (`row` int)", true, "CREATE TABLE `t` (`row` INT)"}, - {"create table t (row int)", false, ""}, - - // for cast with charset - {"SELECT *, CAST(data AS CHAR CHARACTER SET utf8) FROM t;", true, "SELECT *,CAST(`data` AS CHAR CHARSET UTF8) FROM `t`"}, - {"SELECT CAST(data AS CHARACTER);", true, "SELECT CAST(`data` AS CHAR)"}, - {"SELECT CAST(data AS CHARACTER(10) CHARACTER SET utf8);", true, "SELECT CAST(`data` AS CHAR(10) CHARSET UTF8)"}, - {"SELECT CAST(data AS BINARY)", true, "SELECT CAST(`data` AS BINARY)"}, - - // for cast as JSON - {"SELECT *, CAST(data AS JSON) FROM t;", true, "SELECT *,CAST(`data` AS JSON) FROM `t`"}, - - // for JSON_SUM_CRC32 - {"SELECT *, JSON_SUM_CRC32(data AS UNSIGNED ARRAY) FROM t;", true, "SELECT *,JSON_SUM_CRC32(`data` AS UNSIGNED ARRAY) FROM `t`"}, - {"SELECT *, JSON_SUM_CRC32(data AS DOUBLE ARRAY) FROM t;", true, "SELECT *,JSON_SUM_CRC32(`data` AS DOUBLE ARRAY) FROM `t`"}, - {"SELECT *, JSON_SUM_CRC32(data AS DOUBLE) FROM t;", false, ""}, - {"SELECT *, JSON_SUM_CRC32(data) FROM t;", false, ""}, - - // for cast as signed int, fix issue #3691. - {"select cast(1 as signed int);", true, "SELECT CAST(1 AS SIGNED)"}, - - // for cast as double - {"select cast(1 as double);", true, "SELECT CAST(1 AS DOUBLE)"}, - - // for cast as float - {"select cast(1 as float);", true, "SELECT CAST(1 AS FLOAT)"}, - {"select cast(1 as float(0));", true, "SELECT CAST(1 AS FLOAT)"}, - {"select cast(1 as float(24));", true, "SELECT CAST(1 AS FLOAT)"}, - {"select cast(1 as float(25));", true, "SELECT CAST(1 AS DOUBLE)"}, - {"select cast(1 as float(53));", true, "SELECT CAST(1 AS DOUBLE)"}, - {"select cast(1 as float(54));", false, ""}, - - {"select cast(1 as real);", true, "SELECT CAST(1 AS DOUBLE)"}, - {"select cast('2000' as year);", true, "SELECT CAST(_UTF8MB4'2000' AS YEAR)"}, - {"select cast(time '2000' as year);", true, "SELECT CAST(TIME '2000' AS YEAR)"}, - - {"select cast(b as signed array);", true, "SELECT CAST(`b` AS SIGNED ARRAY)"}, - {"select cast(b as char(10) array);", true, "SELECT CAST(`b` AS CHAR(10) ARRAY)"}, - - // for last_insert_id - {"SELECT last_insert_id();", true, "SELECT LAST_INSERT_ID()"}, - {"SELECT last_insert_id(1);", true, "SELECT LAST_INSERT_ID(1)"}, - - // for binary operator - {"SELECT binary 'a';", true, "SELECT BINARY _UTF8MB4'a'"}, - - // for bit_count - {`SELECT BIT_COUNT(1);`, true, "SELECT BIT_COUNT(1)"}, - - // select time - {"select current_timestamp", true, "SELECT CURRENT_TIMESTAMP()"}, - {"select current_timestamp()", true, "SELECT CURRENT_TIMESTAMP()"}, - {"select current_timestamp(6)", true, "SELECT CURRENT_TIMESTAMP(6)"}, - {"select current_timestamp(null)", false, ""}, - {"select current_timestamp(-1)", false, ""}, - {"select current_timestamp(1.0)", false, ""}, - {"select current_timestamp('2')", false, ""}, - {"select now()", true, "SELECT NOW()"}, - {"select now(6)", true, "SELECT NOW(6)"}, - {"select sysdate(), sysdate(6)", true, "SELECT SYSDATE(),SYSDATE(6)"}, - {"SELECT time('01:02:03');", true, "SELECT TIME(_UTF8MB4'01:02:03')"}, - {"SELECT time('01:02:03.1')", true, "SELECT TIME(_UTF8MB4'01:02:03.1')"}, - {"SELECT time('20.1')", true, "SELECT TIME(_UTF8MB4'20.1')"}, - {"SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');", true, "SELECT TIMEDIFF(_UTF8MB4'2000:01:01 00:00:00', _UTF8MB4'2000:01:01 00:00:00.000001')"}, - {"SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');", true, "SELECT TIMESTAMPDIFF(MONTH, _UTF8MB4'2003-02-01', _UTF8MB4'2003-05-01')"}, - {"SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');", true, "SELECT TIMESTAMPDIFF(YEAR, _UTF8MB4'2002-05-01', _UTF8MB4'2001-01-01')"}, - {"SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');", true, "SELECT TIMESTAMPDIFF(MINUTE, _UTF8MB4'2003-02-01', _UTF8MB4'2003-05-01 12:05:55')"}, - - // select current_time - {"select current_time", true, "SELECT CURRENT_TIME()"}, - {"select current_time()", true, "SELECT CURRENT_TIME()"}, - {"select current_time(6)", true, "SELECT CURRENT_TIME(6)"}, - {"select current_time(-1)", false, ""}, - {"select current_time(1.0)", false, ""}, - {"select current_time('1')", false, ""}, - {"select current_time(null)", false, ""}, - {"select curtime()", true, "SELECT CURTIME()"}, - {"select curtime(6)", true, "SELECT CURTIME(6)"}, - {"select curtime(-1)", false, ""}, - {"select curtime(1.0)", false, ""}, - {"select curtime('1')", false, ""}, - {"select curtime(null)", false, ""}, - - // select utc_timestamp - {"select utc_timestamp", true, "SELECT UTC_TIMESTAMP()"}, - {"select utc_timestamp()", true, "SELECT UTC_TIMESTAMP()"}, - {"select utc_timestamp(6)", true, "SELECT UTC_TIMESTAMP(6)"}, - {"select utc_timestamp(-1)", false, ""}, - {"select utc_timestamp(1.0)", false, ""}, - {"select utc_timestamp('1')", false, ""}, - {"select utc_timestamp(null)", false, ""}, - - // select utc_time - {"select utc_time", true, "SELECT UTC_TIME()"}, - {"select utc_time()", true, "SELECT UTC_TIME()"}, - {"select utc_time(6)", true, "SELECT UTC_TIME(6)"}, - {"select utc_time(-1)", false, ""}, - {"select utc_time(1.0)", false, ""}, - {"select utc_time('1')", false, ""}, - {"select utc_time(null)", false, ""}, - - // for microsecond, second, minute, hour - {"SELECT MICROSECOND('2009-12-31 23:59:59.000010');", true, "SELECT MICROSECOND(_UTF8MB4'2009-12-31 23:59:59.000010')"}, - {"SELECT SECOND('10:05:03');", true, "SELECT SECOND(_UTF8MB4'10:05:03')"}, - {"SELECT MINUTE('2008-02-03 10:05:03');", true, "SELECT MINUTE(_UTF8MB4'2008-02-03 10:05:03')"}, - {"SELECT HOUR(), HOUR('10:05:03');", true, "SELECT HOUR(),HOUR(_UTF8MB4'10:05:03')"}, - - // for date, day, weekday - {"SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE()", true, "SELECT CURRENT_DATE(),CURRENT_DATE(),CURDATE()"}, - {"SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE(1)", false, ""}, - {"SELECT DATEDIFF('2003-12-31', '2003-12-30');", true, "SELECT DATEDIFF(_UTF8MB4'2003-12-31', _UTF8MB4'2003-12-30')"}, - {"SELECT DATE('2003-12-31 01:02:03');", true, "SELECT DATE(_UTF8MB4'2003-12-31 01:02:03')"}, - {"SELECT DATE();", true, "SELECT DATE()"}, - {"SELECT DATE('2003-12-31 01:02:03', '');", true, "SELECT DATE(_UTF8MB4'2003-12-31 01:02:03', _UTF8MB4'')"}, - {`SELECT DATE_FORMAT('2003-12-31 01:02:03', '%W %M %Y');`, true, "SELECT DATE_FORMAT(_UTF8MB4'2003-12-31 01:02:03', _UTF8MB4'%W %M %Y')"}, - {"SELECT DAY('2007-02-03');", true, "SELECT DAY(_UTF8MB4'2007-02-03')"}, - {"SELECT DAYOFMONTH('2007-02-03');", true, "SELECT DAYOFMONTH(_UTF8MB4'2007-02-03')"}, - {"SELECT DAYOFWEEK('2007-02-03');", true, "SELECT DAYOFWEEK(_UTF8MB4'2007-02-03')"}, - {"SELECT DAYOFYEAR('2007-02-03');", true, "SELECT DAYOFYEAR(_UTF8MB4'2007-02-03')"}, - {"SELECT DAYNAME('2007-02-03');", true, "SELECT DAYNAME(_UTF8MB4'2007-02-03')"}, - {"SELECT FROM_DAYS(1423);", true, "SELECT FROM_DAYS(1423)"}, - {"SELECT WEEKDAY('2007-02-03');", true, "SELECT WEEKDAY(_UTF8MB4'2007-02-03')"}, - - // for utc_date - {"SELECT UTC_DATE, UTC_DATE();", true, "SELECT UTC_DATE(),UTC_DATE()"}, - {"SELECT UTC_DATE(), UTC_DATE()+0", true, "SELECT UTC_DATE(),UTC_DATE()+0"}, - - // for week, month, year - {"SELECT WEEK();", true, "SELECT WEEK()"}, - {"SELECT WEEK('2007-02-03');", true, "SELECT WEEK(_UTF8MB4'2007-02-03')"}, - {"SELECT WEEK('2007-02-03', 0);", true, "SELECT WEEK(_UTF8MB4'2007-02-03', 0)"}, - {"SELECT WEEKOFYEAR('2007-02-03');", true, "SELECT WEEKOFYEAR(_UTF8MB4'2007-02-03')"}, - {"SELECT MONTH('2007-02-03');", true, "SELECT MONTH(_UTF8MB4'2007-02-03')"}, - {"SELECT MONTHNAME('2007-02-03');", true, "SELECT MONTHNAME(_UTF8MB4'2007-02-03')"}, - {"SELECT YEAR('2007-02-03');", true, "SELECT YEAR(_UTF8MB4'2007-02-03')"}, - {"SELECT YEARWEEK('2007-02-03');", true, "SELECT YEARWEEK(_UTF8MB4'2007-02-03')"}, - {"SELECT YEARWEEK('2007-02-03', 0);", true, "SELECT YEARWEEK(_UTF8MB4'2007-02-03', 0)"}, - - // for ADDTIME, SUBTIME - {"SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');", true, "SELECT ADDTIME(_UTF8MB4'01:00:00.999999', _UTF8MB4'02:00:00.999998')"}, - {"SELECT ADDTIME('02:00:00.999998');", true, "SELECT ADDTIME(_UTF8MB4'02:00:00.999998')"}, - {"SELECT ADDTIME();", true, "SELECT ADDTIME()"}, - {"SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');", true, "SELECT SUBTIME(_UTF8MB4'01:00:00.999999', _UTF8MB4'02:00:00.999998')"}, - - // for CONVERT_TZ - {"SELECT CONVERT_TZ();", true, "SELECT CONVERT_TZ()"}, - {"SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');", true, "SELECT CONVERT_TZ(_UTF8MB4'2004-01-01 12:00:00', _UTF8MB4'+00:00', _UTF8MB4'+10:00')"}, - {"SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00', '+10:00');", true, "SELECT CONVERT_TZ(_UTF8MB4'2004-01-01 12:00:00', _UTF8MB4'+00:00', _UTF8MB4'+10:00', _UTF8MB4'+10:00')"}, - - // for GET_FORMAT - {"SELECT GET_FORMAT(DATE, 'USA');", true, "SELECT GET_FORMAT(DATE, _UTF8MB4'USA')"}, - {"SELECT GET_FORMAT(DATETIME, 'USA');", true, "SELECT GET_FORMAT(DATETIME, _UTF8MB4'USA')"}, - {"SELECT GET_FORMAT(TIME, 'USA');", true, "SELECT GET_FORMAT(TIME, _UTF8MB4'USA')"}, - {"SELECT GET_FORMAT(TIMESTAMP, 'USA');", true, "SELECT GET_FORMAT(DATETIME, _UTF8MB4'USA')"}, - - // for LOCALTIME, LOCALTIMESTAMP - {"SELECT LOCALTIME(), LOCALTIME(1)", true, "SELECT LOCALTIME(),LOCALTIME(1)"}, - {"SELECT LOCALTIMESTAMP(), LOCALTIMESTAMP(2)", true, "SELECT LOCALTIMESTAMP(),LOCALTIMESTAMP(2)"}, - - // for MAKEDATE, MAKETIME - {"SELECT MAKEDATE(2011,31);", true, "SELECT MAKEDATE(2011, 31)"}, - {"SELECT MAKETIME(12,15,30);", true, "SELECT MAKETIME(12, 15, 30)"}, - {"SELECT MAKEDATE();", true, "SELECT MAKEDATE()"}, - {"SELECT MAKETIME();", true, "SELECT MAKETIME()"}, - - // for PERIOD_ADD, PERIOD_DIFF - {"SELECT PERIOD_ADD(200801,2)", true, "SELECT PERIOD_ADD(200801, 2)"}, - {"SELECT PERIOD_DIFF(200802,200703)", true, "SELECT PERIOD_DIFF(200802, 200703)"}, - - // for QUARTER - {"SELECT QUARTER('2008-04-01');", true, "SELECT QUARTER(_UTF8MB4'2008-04-01')"}, - - // for SEC_TO_TIME - {"SELECT SEC_TO_TIME(2378)", true, "SELECT SEC_TO_TIME(2378)"}, - - // for TIME_FORMAT - {`SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l')`, true, "SELECT TIME_FORMAT(_UTF8MB4'100:00:00', _UTF8MB4'%H %k %h %I %l')"}, - - // for TIME_TO_SEC - {"SELECT TIME_TO_SEC('22:23:00')", true, "SELECT TIME_TO_SEC(_UTF8MB4'22:23:00')"}, - - // for TIMESTAMPADD - {"SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(WEEK, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_SECOND,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(SECOND, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_MINUTE,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(MINUTE, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_HOUR,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(HOUR, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_DAY,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(DAY, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_WEEK,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(WEEK, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_MONTH,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(MONTH, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_QUARTER,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(QUARTER, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_YEAR,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(YEAR, 1, _UTF8MB4'2003-01-02')"}, - {"SELECT TIMESTAMPADD(SQL_TSI_MICROSECOND,1,'2003-01-02');", false, ""}, - {"SELECT TIMESTAMPADD(MICROSECOND,1,'2003-01-02');", true, "SELECT TIMESTAMPADD(MICROSECOND, 1, _UTF8MB4'2003-01-02')"}, - - // for TO_DAYS, TO_SECONDS - {"SELECT TO_DAYS('2007-10-07')", true, "SELECT TO_DAYS(_UTF8MB4'2007-10-07')"}, - {"SELECT TO_SECONDS('2009-11-29')", true, "SELECT TO_SECONDS(_UTF8MB4'2009-11-29')"}, - - // for LAST_DAY - {"SELECT LAST_DAY('2003-02-05');", true, "SELECT LAST_DAY(_UTF8MB4'2003-02-05')"}, - - // for UTC_TIME - {"SELECT UTC_TIME(), UTC_TIME(1)", true, "SELECT UTC_TIME(),UTC_TIME(1)"}, - - // for time extract - {`select extract(microsecond from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(second from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(minute from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(MINUTE FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(hour from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(HOUR FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(day from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(DAY FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(week from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(WEEK FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(month from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(MONTH FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(quarter from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(QUARTER FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(year from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(YEAR FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(second_microsecond from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(SECOND_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(minute_microsecond from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(MINUTE_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(minute_second from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(MINUTE_SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(hour_microsecond from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(HOUR_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(hour_second from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(HOUR_SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(hour_minute from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(HOUR_MINUTE FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(day_microsecond from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(DAY_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(day_second from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(DAY_SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(day_minute from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(DAY_MINUTE FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(day_hour from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(DAY_HOUR FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - {`select extract(year_month from "2011-11-11 10:10:10.123456")`, true, "SELECT EXTRACT(YEAR_MONTH FROM _UTF8MB4'2011-11-11 10:10:10.123456')"}, - - // for from_unixtime - {`select from_unixtime(1447430881)`, true, "SELECT FROM_UNIXTIME(1447430881)"}, - {`select from_unixtime(1447430881.123456)`, true, "SELECT FROM_UNIXTIME(1447430881.123456)"}, - {`select from_unixtime(1447430881.1234567)`, true, "SELECT FROM_UNIXTIME(1447430881.1234567)"}, - {`select from_unixtime(1447430881.9999999)`, true, "SELECT FROM_UNIXTIME(1447430881.9999999)"}, - {`select from_unixtime(1447430881, "%Y %D %M %h:%i:%s %x")`, true, "SELECT FROM_UNIXTIME(1447430881, _UTF8MB4'%Y %D %M %h:%i:%s %x')"}, - {`select from_unixtime(1447430881.123456, "%Y %D %M %h:%i:%s %x")`, true, "SELECT FROM_UNIXTIME(1447430881.123456, _UTF8MB4'%Y %D %M %h:%i:%s %x')"}, - {`select from_unixtime(1447430881.1234567, "%Y %D %M %h:%i:%s %x")`, true, "SELECT FROM_UNIXTIME(1447430881.1234567, _UTF8MB4'%Y %D %M %h:%i:%s %x')"}, - - // for issue 224 - {`SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;`, true, "SELECT CAST(_UTF8MB4'test collated returns' AS CHAR CHARSET UTF8) COLLATE utf8_bin"}, - - // for string functions - // trim - {`SELECT TRIM(' bar ');`, true, "SELECT TRIM(_UTF8MB4' bar ')"}, - {`SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');`, true, "SELECT TRIM(LEADING _UTF8MB4'x' FROM _UTF8MB4'xxxbarxxx')"}, - {`SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');`, true, "SELECT TRIM(BOTH _UTF8MB4'x' FROM _UTF8MB4'xxxbarxxx')"}, - {`SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');`, true, "SELECT TRIM(TRAILING _UTF8MB4'xyz' FROM _UTF8MB4'barxxyz')"}, - {`SELECT LTRIM(' foo ');`, true, "SELECT LTRIM(_UTF8MB4' foo ')"}, - {`SELECT RTRIM(' bar ');`, true, "SELECT RTRIM(_UTF8MB4' bar ')"}, - - {`SELECT RPAD('hi', 6, 'c');`, true, "SELECT RPAD(_UTF8MB4'hi', 6, _UTF8MB4'c')"}, - {`SELECT BIT_LENGTH('hi');`, true, "SELECT BIT_LENGTH(_UTF8MB4'hi')"}, - {`SELECT CHAR(65);`, true, "SELECT CHAR_FUNC(65, NULL)"}, - {`SELECT CHAR_LENGTH('abc');`, true, "SELECT CHAR_LENGTH(_UTF8MB4'abc')"}, - {`SELECT CHARACTER_LENGTH('abc');`, true, "SELECT CHARACTER_LENGTH(_UTF8MB4'abc')"}, - {`SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');`, true, "SELECT FIELD(_UTF8MB4'ej', _UTF8MB4'Hej', _UTF8MB4'ej', _UTF8MB4'Heja', _UTF8MB4'hej', _UTF8MB4'foo')"}, - {`SELECT FIND_IN_SET('foo', 'foo,bar')`, true, "SELECT FIND_IN_SET(_UTF8MB4'foo', _UTF8MB4'foo,bar')"}, - {`SELECT FIND_IN_SET('foo')`, true, "SELECT FIND_IN_SET(_UTF8MB4'foo')"}, // illegal number of argument still pass - {`SELECT MAKE_SET(1,'a'), MAKE_SET(1,'a','b','c')`, true, "SELECT MAKE_SET(1, _UTF8MB4'a'),MAKE_SET(1, _UTF8MB4'a', _UTF8MB4'b', _UTF8MB4'c')"}, - {`SELECT MID('Sakila', -5, 3)`, true, "SELECT MID(_UTF8MB4'Sakila', -5, 3)"}, - {`SELECT OCT(12)`, true, "SELECT OCT(12)"}, - {`SELECT OCTET_LENGTH('text')`, true, "SELECT OCTET_LENGTH(_UTF8MB4'text')"}, - {`SELECT ORD('2')`, true, "SELECT ORD(_UTF8MB4'2')"}, - {`SELECT POSITION('bar' IN 'foobarbar')`, true, "SELECT POSITION(_UTF8MB4'bar' IN _UTF8MB4'foobarbar')"}, - {`SELECT QUOTE('Don\'t!')`, true, "SELECT QUOTE(_UTF8MB4'Don''t!')"}, - {`SELECT BIN(12)`, true, "SELECT BIN(12)"}, - {`SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo')`, true, "SELECT ELT(1, _UTF8MB4'ej', _UTF8MB4'Heja', _UTF8MB4'hej', _UTF8MB4'foo')"}, - {`SELECT EXPORT_SET(5,'Y','N'), EXPORT_SET(5,'Y','N',','), EXPORT_SET(5,'Y','N',',',4)`, true, "SELECT EXPORT_SET(5, _UTF8MB4'Y', _UTF8MB4'N'),EXPORT_SET(5, _UTF8MB4'Y', _UTF8MB4'N', _UTF8MB4','),EXPORT_SET(5, _UTF8MB4'Y', _UTF8MB4'N', _UTF8MB4',', 4)"}, - {`SELECT FORMAT(), FORMAT(12332.2,2,'de_DE'), FORMAT(12332.123456, 4)`, true, "SELECT FORMAT(),FORMAT(12332.2, 2, _UTF8MB4'de_DE'),FORMAT(12332.123456, 4)"}, - {`SELECT FROM_BASE64('abc')`, true, "SELECT FROM_BASE64(_UTF8MB4'abc')"}, - {`SELECT TO_BASE64('abc')`, true, "SELECT TO_BASE64(_UTF8MB4'abc')"}, - {`SELECT INSERT(), INSERT('Quadratic', 3, 4, 'What'), INSTR('foobarbar', 'bar')`, true, "SELECT INSERT_FUNC(),INSERT_FUNC(_UTF8MB4'Quadratic', 3, 4, _UTF8MB4'What'),INSTR(_UTF8MB4'foobarbar', _UTF8MB4'bar')"}, - {`SELECT LOAD_FILE('/tmp/picture')`, true, "SELECT LOAD_FILE(_UTF8MB4'/tmp/picture')"}, - {`SELECT LPAD('hi',4,'??')`, true, "SELECT LPAD(_UTF8MB4'hi', 4, _UTF8MB4'??')"}, - {`SELECT LEFT("foobar", 3)`, true, "SELECT LEFT(_UTF8MB4'foobar', 3)"}, - {`SELECT RIGHT("foobar", 3)`, true, "SELECT RIGHT(_UTF8MB4'foobar', 3)"}, - - // repeat - {`SELECT REPEAT("a", 10);`, true, "SELECT REPEAT(_UTF8MB4'a', 10)"}, - - // for miscellaneous functions - {`SELECT SLEEP(10);`, true, "SELECT SLEEP(10)"}, - {`SELECT ANY_VALUE(@arg);`, true, "SELECT ANY_VALUE(@`arg`)"}, - {`SELECT INET_ATON('10.0.5.9');`, true, "SELECT INET_ATON(_UTF8MB4'10.0.5.9')"}, - {`SELECT INET_NTOA(167773449);`, true, "SELECT INET_NTOA(167773449)"}, - {`SELECT INET6_ATON('fdfe::5a55:caff:fefa:9089');`, true, "SELECT INET6_ATON(_UTF8MB4'fdfe::5a55:caff:fefa:9089')"}, - {`SELECT INET6_NTOA(INET_NTOA(167773449));`, true, "SELECT INET6_NTOA(INET_NTOA(167773449))"}, - {`SELECT IS_FREE_LOCK(@str);`, true, "SELECT IS_FREE_LOCK(@`str`)"}, - {`SELECT IS_IPV4('10.0.5.9');`, true, "SELECT IS_IPV4(_UTF8MB4'10.0.5.9')"}, - {`SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));`, true, "SELECT IS_IPV4_COMPAT(INET6_ATON(_UTF8MB4'::10.0.5.9'))"}, - {`SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9'));`, true, "SELECT IS_IPV4_MAPPED(INET6_ATON(_UTF8MB4'::10.0.5.9'))"}, - {`SELECT IS_IPV6('10.0.5.9');`, true, "SELECT IS_IPV6(_UTF8MB4'10.0.5.9')"}, - {`SELECT IS_USED_LOCK(@str);`, true, "SELECT IS_USED_LOCK(@`str`)"}, - {`SELECT NAME_CONST('myname', 14);`, true, "SELECT NAME_CONST(_UTF8MB4'myname', 14)"}, - {`SELECT RELEASE_ALL_LOCKS();`, true, "SELECT RELEASE_ALL_LOCKS()"}, - {`SELECT UUID();`, true, "SELECT UUID()"}, - {`SELECT UUID_SHORT()`, true, "SELECT UUID_SHORT()"}, - {`SELECT UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db')`, true, "SELECT UUID_TO_BIN(_UTF8MB4'6ccd780c-baba-1026-9564-5b8c656024db')"}, - {`SELECT UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db', 1)`, true, "SELECT UUID_TO_BIN(_UTF8MB4'6ccd780c-baba-1026-9564-5b8c656024db', 1)"}, - {`SELECT BIN_TO_UUID(0x6ccd780cbaba102695645b8c656024db)`, true, "SELECT BIN_TO_UUID(x'6ccd780cbaba102695645b8c656024db')"}, - {`SELECT BIN_TO_UUID(0x6ccd780cbaba102695645b8c656024db, 1)`, true, "SELECT BIN_TO_UUID(x'6ccd780cbaba102695645b8c656024db', 1)"}, - // test illegal arguments - {`SELECT SLEEP();`, true, "SELECT SLEEP()"}, - {`SELECT ANY_VALUE();`, true, "SELECT ANY_VALUE()"}, - {`SELECT INET_ATON();`, true, "SELECT INET_ATON()"}, - {`SELECT INET_NTOA();`, true, "SELECT INET_NTOA()"}, - {`SELECT INET6_ATON();`, true, "SELECT INET6_ATON()"}, - {`SELECT INET6_NTOA(INET_NTOA());`, true, "SELECT INET6_NTOA(INET_NTOA())"}, - {`SELECT IS_FREE_LOCK();`, true, "SELECT IS_FREE_LOCK()"}, - {`SELECT IS_IPV4();`, true, "SELECT IS_IPV4()"}, - {`SELECT IS_IPV4_COMPAT(INET6_ATON());`, true, "SELECT IS_IPV4_COMPAT(INET6_ATON())"}, - {`SELECT IS_IPV4_MAPPED(INET6_ATON());`, true, "SELECT IS_IPV4_MAPPED(INET6_ATON())"}, - {`SELECT IS_IPV6()`, true, "SELECT IS_IPV6()"}, - {`SELECT IS_USED_LOCK();`, true, "SELECT IS_USED_LOCK()"}, - {`SELECT NAME_CONST();`, true, "SELECT NAME_CONST()"}, - {`SELECT RELEASE_ALL_LOCKS(1);`, true, "SELECT RELEASE_ALL_LOCKS(1)"}, - {`SELECT UUID(1);`, true, "SELECT UUID(1)"}, - {`SELECT UUID_SHORT(1)`, true, "SELECT UUID_SHORT(1)"}, - // interval - {`select "2011-11-11 10:10:10.123456" + interval 10 second`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select "2011-11-11 10:10:10.123456" - interval 10 second`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select interval 10 second + "2011-11-11 10:10:10.123456"`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - // for date_add - {`select date_add("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 second)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 minute)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 hour)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 day)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 week)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 month)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 quarter)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 year)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH)"}, - {`select date_add("2011-11-11 10:10:10.123456", 10)`, false, ""}, - {`select date_add("2011-11-11 10:10:10.123456", 0.10)`, false, ""}, - {`select date_add("2011-11-11 10:10:10.123456", "11,11")`, false, ""}, - - {`select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_microsecond)`, false, ""}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_second)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_minute)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_hour)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_day)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_week)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_month)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_quarter)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER)"}, - {`select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_year)`, true, "SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR)"}, - - // for strcmp - {`select strcmp('abc', 'def')`, true, "SELECT STRCMP(_UTF8MB4'abc', _UTF8MB4'def')"}, - - // for adddate - {`select adddate("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 10 second)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 10 minute)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 10 hour)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 10 day)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 1 week)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 1 month)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 1 quarter)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 1 year)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR)"}, - {`select adddate("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH)"}, - {`select adddate("2011-11-11 10:10:10.123456", 10)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select adddate("2011-11-11 10:10:10.123456", 0.10)`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 0.10 DAY)"}, - {`select adddate("2011-11-11 10:10:10.123456", "11,11")`, true, "SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11,11' DAY)"}, - - // for date_sub - {`select date_sub("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 10 second)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 10 minute)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 10 hour)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 10 day)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 1 week)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 1 month)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 1 quarter)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 1 year)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR)"}, - {`select date_sub("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true, "SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH)"}, - {`select date_sub("2011-11-11 10:10:10.123456", 10)`, false, ""}, - {`select date_sub("2011-11-11 10:10:10.123456", 0.10)`, false, ""}, - {`select date_sub("2011-11-11 10:10:10.123456", "11,11")`, false, ""}, - - // for subdate - {`select subdate("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 10 second)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 10 minute)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 10 hour)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 10 day)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 1 week)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 1 month)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 1 quarter)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 1 year)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR)"}, - {`select subdate("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH)"}, - {`select subdate("2011-11-11 10:10:10.123456", 10)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY)"}, - {`select subdate("2011-11-11 10:10:10.123456", 0.10)`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 0.10 DAY)"}, - {`select subdate("2011-11-11 10:10:10.123456", "11,11")`, true, "SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11,11' DAY)"}, - - // for unix_timestamp - {`select unix_timestamp()`, true, "SELECT UNIX_TIMESTAMP()"}, - {`select unix_timestamp('2015-11-13 10:20:19.012')`, true, "SELECT UNIX_TIMESTAMP(_UTF8MB4'2015-11-13 10:20:19.012')"}, - - // for misc functions - {`SELECT GET_LOCK('lock1',10);`, true, "SELECT GET_LOCK(_UTF8MB4'lock1', 10)"}, - {`SELECT RELEASE_LOCK('lock1');`, true, "SELECT RELEASE_LOCK(_UTF8MB4'lock1')"}, - - // for aggregate functions - {`select avg(), avg(c1,c2) from t;`, false, "SELECT AVG(),AVG(`c1`, `c2`) FROM `t`"}, - {`select avg(distinct c1) from t;`, true, "SELECT AVG(DISTINCT `c1`) FROM `t`"}, - {`select avg(distinctrow c1) from t;`, true, "SELECT AVG(DISTINCT `c1`) FROM `t`"}, - {`select avg(distinct all c1) from t;`, true, "SELECT AVG(DISTINCT `c1`) FROM `t`"}, - {`select avg(distinctrow all c1) from t;`, true, "SELECT AVG(DISTINCT `c1`) FROM `t`"}, - {`select avg(c2) from t;`, true, "SELECT AVG(`c2`) FROM `t`"}, - {`select bit_and(c1) from t;`, true, "SELECT BIT_AND(`c1`) FROM `t`"}, - {`select bit_and(all c1) from t;`, true, "SELECT BIT_AND(`c1`) FROM `t`"}, - {`select bit_and(distinct c1) from t;`, false, ""}, - {`select bit_and(distinctrow c1) from t;`, false, ""}, - {`select bit_and(distinctrow all c1) from t;`, false, ""}, - {`select bit_and(distinct all c1) from t;`, false, ""}, - {`select bit_and(), bit_and(distinct c1) from t;`, false, ""}, - {`select bit_and(), bit_and(distinctrow c1) from t;`, false, ""}, - {`select bit_and(), bit_and(all c1) from t;`, false, ""}, - {`select bit_or(c1) from t;`, true, "SELECT BIT_OR(`c1`) FROM `t`"}, - {`select bit_or(all c1) from t;`, true, "SELECT BIT_OR(`c1`) FROM `t`"}, - {`select bit_or(distinct c1) from t;`, false, ""}, - {`select bit_or(distinctrow c1) from t;`, false, ""}, - {`select bit_or(distinctrow all c1) from t;`, false, ""}, - {`select bit_or(distinct all c1) from t;`, false, ""}, - {`select bit_or(), bit_or(distinct c1) from t;`, false, ""}, - {`select bit_or(), bit_or(distinctrow c1) from t;`, false, ""}, - {`select bit_or(), bit_or(all c1) from t;`, false, ""}, - {`select bit_xor(c1) from t;`, true, "SELECT BIT_XOR(`c1`) FROM `t`"}, - {`select bit_xor(all c1) from t;`, true, "SELECT BIT_XOR(`c1`) FROM `t`"}, - {`select bit_xor(distinct c1) from t;`, false, ""}, - {`select bit_xor(distinctrow c1) from t;`, false, ""}, - {`select bit_xor(distinctrow all c1) from t;`, false, ""}, - {`select bit_xor(), bit_xor(distinct c1) from t;`, false, ""}, - {`select bit_xor(), bit_xor(distinctrow c1) from t;`, false, ""}, - {`select bit_xor(), bit_xor(all c1) from t;`, false, ""}, - {`select max(c1,c2) from t;`, false, ""}, - {`select max(distinct c1) from t;`, true, "SELECT MAX(DISTINCT `c1`) FROM `t`"}, - {`select max(distinctrow c1) from t;`, true, "SELECT MAX(DISTINCT `c1`) FROM `t`"}, - {`select max(distinct all c1) from t;`, true, "SELECT MAX(DISTINCT `c1`) FROM `t`"}, - {`select max(distinctrow all c1) from t;`, true, "SELECT MAX(DISTINCT `c1`) FROM `t`"}, - {`select max(c2) from t;`, true, "SELECT MAX(`c2`) FROM `t`"}, - {`select min(c1,c2) from t;`, false, ""}, - {`select min(distinct c1) from t;`, true, "SELECT MIN(DISTINCT `c1`) FROM `t`"}, - {`select min(distinctrow c1) from t;`, true, "SELECT MIN(DISTINCT `c1`) FROM `t`"}, - {`select min(distinct all c1) from t;`, true, "SELECT MIN(DISTINCT `c1`) FROM `t`"}, - {`select min(distinctrow all c1) from t;`, true, "SELECT MIN(DISTINCT `c1`) FROM `t`"}, - {`select min(c2) from t;`, true, "SELECT MIN(`c2`) FROM `t`"}, - {`select sum(c1,c2) from t;`, false, ""}, - {`select sum(distinct c1) from t;`, true, "SELECT SUM(DISTINCT `c1`) FROM `t`"}, - {`select sum(distinctrow c1) from t;`, true, "SELECT SUM(DISTINCT `c1`) FROM `t`"}, - {`select sum(distinct all c1) from t;`, true, "SELECT SUM(DISTINCT `c1`) FROM `t`"}, - {`select sum(distinctrow all c1) from t;`, true, "SELECT SUM(DISTINCT `c1`) FROM `t`"}, - {`select sum(c2) from t;`, true, "SELECT SUM(`c2`) FROM `t`"}, - {`select count(c1) from t;`, true, "SELECT COUNT(`c1`) FROM `t`"}, - {`select count(distinct *) from t;`, false, ""}, - {`select count(distinctrow *) from t;`, false, ""}, - {`select count(*) from t;`, true, "SELECT COUNT(1) FROM `t`"}, - {`select count(distinct c1, c2) from t;`, true, "SELECT COUNT(DISTINCT `c1`, `c2`) FROM `t`"}, - {`select count(distinctrow c1, c2) from t;`, true, "SELECT COUNT(DISTINCT `c1`, `c2`) FROM `t`"}, - {`select count(c1, c2) from t;`, false, ""}, - {`select count(all c1) from t;`, true, "SELECT COUNT(`c1`) FROM `t`"}, - {`select count(distinct all c1) from t;`, false, ""}, - {`select count(distinctrow all c1) from t;`, false, ""}, - {`select approx_count_distinct(c1) from t;`, true, "SELECT APPROX_COUNT_DISTINCT(`c1`) FROM `t`"}, - {`select approx_count_distinct(c1, c2) from t;`, true, "SELECT APPROX_COUNT_DISTINCT(`c1`, `c2`) FROM `t`"}, - {`select approx_count_distinct(c1, 123) from t;`, true, "SELECT APPROX_COUNT_DISTINCT(`c1`, 123) FROM `t`"}, - {`select approx_percentile(c1) from t;`, true, "SELECT APPROX_PERCENTILE(`c1`) FROM `t`"}, - {`select approx_percentile(c1, c2) from t;`, true, "SELECT APPROX_PERCENTILE(`c1`, `c2`) FROM `t`"}, - {`select approx_percentile(c1, 123) from t;`, true, "SELECT APPROX_PERCENTILE(`c1`, 123) FROM `t`"}, - {`select group_concat(c2,c1) from t group by c1;`, true, "SELECT GROUP_CONCAT(`c2`, `c1` SEPARATOR ',') FROM `t` GROUP BY `c1`"}, - {`select group_concat(c2,c1 SEPARATOR ';') from t group by c1;`, true, "SELECT GROUP_CONCAT(`c2`, `c1` SEPARATOR ';') FROM `t` GROUP BY `c1`"}, - {`select group_concat(distinct c2,c1) from t group by c1;`, true, "SELECT GROUP_CONCAT(DISTINCT `c2`, `c1` SEPARATOR ',') FROM `t` GROUP BY `c1`"}, - {`select group_concat(distinctrow c2,c1) from t group by c1;`, true, "SELECT GROUP_CONCAT(DISTINCT `c2`, `c1` SEPARATOR ',') FROM `t` GROUP BY `c1`"}, - {`SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;`, true, "SELECT `student_name`,GROUP_CONCAT(DISTINCT `test_score` ORDER BY `test_score` DESC SEPARATOR ' ') FROM `student` GROUP BY `student_name`"}, - {`select std(c1), std(all c1), std(distinct c1) from t`, true, "SELECT STDDEV_POP(`c1`),STDDEV_POP(`c1`),STDDEV_POP(DISTINCT `c1`) FROM `t`"}, - {`select std(c1, c2) from t`, false, ""}, - {`select stddev(c1), stddev(all c1), stddev(distinct c1) from t`, true, "SELECT STDDEV_POP(`c1`),STDDEV_POP(`c1`),STDDEV_POP(DISTINCT `c1`) FROM `t`"}, - {`select stddev(c1, c2) from t`, false, ""}, - {`select stddev_pop(c1), stddev_pop(all c1), stddev_pop(distinct c1) from t`, true, "SELECT STDDEV_POP(`c1`),STDDEV_POP(`c1`),STDDEV_POP(DISTINCT `c1`) FROM `t`"}, - {`select stddev_pop(c1, c2) from t`, false, ""}, - {`select stddev_samp(c1), stddev_samp(all c1), stddev_samp(distinct c1) from t`, true, "SELECT STDDEV_SAMP(`c1`),STDDEV_SAMP(`c1`),STDDEV_SAMP(DISTINCT `c1`) FROM `t`"}, - {`select stddev_samp(c1, c2) from t`, false, ""}, - {`select variance(c1), variance(all c1), variance(distinct c1) from t`, true, "SELECT VAR_POP(`c1`),VAR_POP(`c1`),VAR_POP(DISTINCT `c1`) FROM `t`"}, - {`select variance(c1, c2) from t`, false, ""}, - {`select var_pop(c1), var_pop(all c1), var_pop(distinct c1) from t`, true, "SELECT VAR_POP(`c1`),VAR_POP(`c1`),VAR_POP(DISTINCT `c1`) FROM `t`"}, - {`select var_pop(c1, c2) from t`, false, ""}, - {`select var_samp(c1), var_samp(all c1), var_samp(distinct c1) from t`, true, "SELECT VAR_SAMP(`c1`),VAR_SAMP(`c1`),VAR_SAMP(DISTINCT `c1`) FROM `t`"}, - {`select var_samp(c1, c2) from t`, false, ""}, - {`select json_arrayagg(c2) from t group by c1`, true, "SELECT JSON_ARRAYAGG(`c2`) FROM `t` GROUP BY `c1`"}, - {`select json_arrayagg(c1, c2) from t group by c1`, false, ""}, - {`select json_arrayagg(distinct c2) from t group by c1`, false, "SELECT JSON_ARRAYAGG(DISTINCT `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_arrayagg(all c2) from t group by c1`, true, "SELECT JSON_ARRAYAGG(`c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(c1, c2) from t group by c1`, true, "SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(c1, c2, c3) from t group by c1`, false, ""}, - {`select json_objectagg(distinct c1, c2) from t group by c1`, false, "SELECT JSON_OBJECTAGG(DISTINCT `c1`, `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(c1, distinct c2) from t group by c1`, false, "SELECT JSON_OBJECTAGG(`c1`, DISTINCT `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(distinct c1, distinct c2) from t group by c1`, false, "SELECT JSON_OBJECTAGG(DISTINCT `c1`, DISTINCT `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(all c1, c2) from t group by c1`, true, "SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(c1, all c2) from t group by c1`, true, "SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1`"}, - {`select json_objectagg(all c1, all c2) from t group by c1`, true, "SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1`"}, - - // for encryption and compression functions - {`select AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3'))`, true, "SELECT AES_ENCRYPT(_UTF8MB4'text', UNHEX(_UTF8MB4'F3229A0B371ED2D9441B830D21A390C3'))"}, - {`select AES_DECRYPT(@crypt_str,@key_str)`, true, "SELECT AES_DECRYPT(@`crypt_str`, @`key_str`)"}, - {`select AES_DECRYPT(@crypt_str,@key_str,@init_vector);`, true, "SELECT AES_DECRYPT(@`crypt_str`, @`key_str`, @`init_vector`)"}, - {`SELECT COMPRESS('');`, true, "SELECT COMPRESS(_UTF8MB4'')"}, - {`SELECT DECODE(@crypt_str, @pass_str);`, true, "SELECT DECODE(@`crypt_str`, @`pass_str`)"}, - {`SELECT DES_DECRYPT(@crypt_str), DES_DECRYPT(@crypt_str, @key_str);`, true, "SELECT DES_DECRYPT(@`crypt_str`),DES_DECRYPT(@`crypt_str`, @`key_str`)"}, - {`SELECT DES_ENCRYPT(@str), DES_ENCRYPT(@key_num);`, true, "SELECT DES_ENCRYPT(@`str`),DES_ENCRYPT(@`key_num`)"}, - {`SELECT ENCODE('cleartext', CONCAT('my_random_salt','my_secret_password'));`, true, "SELECT ENCODE(_UTF8MB4'cleartext', CONCAT(_UTF8MB4'my_random_salt', _UTF8MB4'my_secret_password'))"}, - {`SELECT ENCRYPT('hello'), ENCRYPT('hello', @salt);`, true, "SELECT ENCRYPT(_UTF8MB4'hello'),ENCRYPT(_UTF8MB4'hello', @`salt`)"}, - {`SELECT MD5('testing');`, true, "SELECT MD5(_UTF8MB4'testing')"}, - {`SELECT OLD_PASSWORD(@str);`, true, "SELECT OLD_PASSWORD(@`str`)"}, - {`SELECT PASSWORD(@str);`, true, "SELECT PASSWORD(@`str`)"}, - {`SELECT RANDOM_BYTES(@len);`, true, "SELECT RANDOM_BYTES(@`len`)"}, - {`SELECT SHA1('abc');`, true, "SELECT SHA1(_UTF8MB4'abc')"}, - {`SELECT SHA('abc');`, true, "SELECT SHA(_UTF8MB4'abc')"}, - {`SELECT SHA2('abc', 224);`, true, "SELECT SHA2(_UTF8MB4'abc', 224)"}, - {`SELECT SM3('abc');`, true, "SELECT SM3(_UTF8MB4'abc')"}, - {`SELECT UNCOMPRESS('any string');`, true, "SELECT UNCOMPRESS(_UTF8MB4'any string')"}, - {`SELECT UNCOMPRESSED_LENGTH(@compressed_string);`, true, "SELECT UNCOMPRESSED_LENGTH(@`compressed_string`)"}, - {`SELECT VALIDATE_PASSWORD_STRENGTH(@str);`, true, "SELECT VALIDATE_PASSWORD_STRENGTH(@`str`)"}, - - // For JSON functions. - {`SELECT JSON_EXTRACT();`, true, "SELECT JSON_EXTRACT()"}, - {`SELECT JSON_UNQUOTE();`, true, "SELECT JSON_UNQUOTE()"}, - {`SELECT JSON_TYPE('[123]');`, true, "SELECT JSON_TYPE(_UTF8MB4'[123]')"}, - {`SELECT JSON_TYPE();`, true, "SELECT JSON_TYPE()"}, - - // For two json grammar sugar. - {`SELECT a->'$.a' FROM t`, true, "SELECT JSON_EXTRACT(`a`, _UTF8MB4'$.a') FROM `t`"}, - {`SELECT a->>'$.a' FROM t`, true, "SELECT JSON_UNQUOTE(JSON_EXTRACT(`a`, _UTF8MB4'$.a')) FROM `t`"}, - {`SELECT '{}'->'$.a' FROM t`, false, ""}, - {`SELECT '{}'->>'$.a' FROM t`, false, ""}, - {`SELECT a->3 FROM t`, false, ""}, - {`SELECT a->>3 FROM t`, false, ""}, - - {`SELECT 1 member of (a)`, true, "SELECT 1 MEMBER OF (`a`)"}, - {`SELECT 1 member of a`, false, ""}, - {`SELECT 1 member a`, false, ""}, - {`SELECT 1 not member of a`, false, ""}, - {`SELECT 1 member of (1+1)`, false, ""}, - {`SELECT concat('a') member of (cast(1 as char(1)))`, true, "SELECT CONCAT(_UTF8MB4'a') MEMBER OF (CAST(1 AS CHAR(1)))"}, - - // Test that quoted identifier can be a function name. - {"SELECT `uuid`()", true, "SELECT UUID()"}, - - // Test sequence function. - {"select nextval(seq)", true, "SELECT NEXTVAL(`seq`)"}, - {"select lastval(seq)", true, "SELECT LASTVAL(`seq`)"}, - {"select setval(seq, 100)", true, "SELECT SETVAL(`seq`, 100)"}, - {"select next value for seq", true, "SELECT NEXTVAL(`seq`)"}, - {"select next value for sequence", true, "SELECT NEXTVAL(`sequence`)"}, - {"select NeXt vAluE for seQuEncE2", true, "SELECT NEXTVAL(`seQuEncE2`)"}, - - // Test regexp functions - {"select regexp_like('aBc', 'abc', 'im');", true, "SELECT REGEXP_LIKE(_UTF8MB4'aBc', _UTF8MB4'abc', _UTF8MB4'im')"}, - {"select regexp_substr('aBc', 'abc', 1, 1, 'im');", true, "SELECT REGEXP_SUBSTR(_UTF8MB4'aBc', _UTF8MB4'abc', 1, 1, _UTF8MB4'im')"}, - {"select regexp_instr('aBc', 'abc', 1, 1, 0, 'im');", true, "SELECT REGEXP_INSTR(_UTF8MB4'aBc', _UTF8MB4'abc', 1, 1, 0, _UTF8MB4'im')"}, - {"select regexp_replace('aBc', 'abc', 'def', 1, 1, 'i');", true, "SELECT REGEXP_REPLACE(_UTF8MB4'aBc', _UTF8MB4'abc', _UTF8MB4'def', 1, 1, _UTF8MB4'i')"}, - - // Test ilike functions - {"select 'aBc' ilike 'abc';", true, "SELECT _UTF8MB4'aBc' ILIKE _UTF8MB4'abc'"}, - } - RunTest(t, table, false, false) - - // Test in REAL_AS_FLOAT SQL mode. - table2 := []testCase{ - // for cast as float - {"select cast(1 as float);", true, "SELECT CAST(1 AS FLOAT)"}, - {"select cast(1 as float(0));", true, "SELECT CAST(1 AS FLOAT)"}, - {"select cast(1 as float(24));", true, "SELECT CAST(1 AS FLOAT)"}, - {"select cast(1 as float(25));", true, "SELECT CAST(1 AS DOUBLE)"}, - {"select cast(1 as float(53));", true, "SELECT CAST(1 AS DOUBLE)"}, - {"select cast(1 as float(54));", false, ""}, - - // for cast as real - {"select cast(1 as real);", true, "SELECT CAST(1 AS FLOAT)"}, - } - RunTestInRealAsFloatMode(t, table2, false) -} - func TestIdentifier(t *testing.T) { table := []testCase{ // for quote identifier @@ -2788,1700 +873,6 @@ func TestBuiltinFuncAsIdentifier(t *testing.T) { runTests(true) } -func TestDDL(t *testing.T) { - table := []testCase{ - {"CREATE", false, ""}, - {"CREATE TABLE", false, ""}, - {"CREATE TABLE foo (", false, ""}, - {"CREATE TABLE foo ()", false, ""}, - {"CREATE TABLE foo ();", false, ""}, - {"CREATE TABLE foo.* (a varchar(50), b int);", false, ""}, - {"CREATE TABLE foo (a varchar(50), b int);", true, "CREATE TABLE `foo` (`a` VARCHAR(50),`b` INT)"}, - {"CREATE TABLE foo (a TINYINT UNSIGNED);", true, "CREATE TABLE `foo` (`a` TINYINT UNSIGNED)"}, - {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED)", true, "CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED)"}, - {"CREATE TABLE foo (a bigint unsigned, b bool);", true, "CREATE TABLE `foo` (`a` BIGINT UNSIGNED,`b` TINYINT(1))"}, - {"CREATE TABLE foo (a TINYINT, b SMALLINT) CREATE TABLE bar (x INT, y int64)", false, ""}, - {"CREATE TABLE foo (a int, b float); CREATE TABLE bar (x double, y float)", true, "CREATE TABLE `foo` (`a` INT,`b` FLOAT); CREATE TABLE `bar` (`x` DOUBLE,`y` FLOAT)"}, - {"CREATE TABLE foo (a bytes)", false, ""}, - {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED)", true, "CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED)"}, - {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) -- foo", true, "CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED)"}, - {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) // foo", false, ""}, - {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true, "CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED)"}, - {"CREATE TABLE foo /* foo */ (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true, "CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED)"}, - {"CREATE TABLE foo (name CHAR(50) BINARY);", true, "CREATE TABLE `foo` (`name` CHAR(50) BINARY)"}, - {"CREATE TABLE foo (name CHAR(50) COLLATE utf8_bin)", true, "CREATE TABLE `foo` (`name` CHAR(50) COLLATE utf8_bin)"}, - {"CREATE TABLE foo (id varchar(50) collate utf8_bin);", true, "CREATE TABLE `foo` (`id` VARCHAR(50) COLLATE utf8_bin)"}, - {"CREATE TABLE foo (name CHAR(50) CHARACTER SET UTF8)", true, "CREATE TABLE `foo` (`name` CHAR(50) CHARACTER SET UTF8)"}, - {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY)", true, "CREATE TABLE `foo` (`name` CHAR(50) BINARY CHARACTER SET UTF8)"}, - {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY CHARACTER set utf8)", false, ""}, - {"CREATE TABLE foo (name CHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin)", true, "CREATE TABLE `foo` (`name` CHAR(50) BINARY CHARACTER SET UTF8 COLLATE utf8_bin)"}, - {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 COLLATE utf8_bin COLLATE ascii_bin)", false, ""}, - {"CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin COLLATE latin1_bin)", false, ""}, - {"CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin PRIMARY KEY COLLATE latin1_bin)", false, ""}, - {"CREATE TABLE foo (a.b, b);", false, ""}, - {"CREATE TABLE foo (a, b.c);", false, ""}, - {"CREATE TABLE (name CHAR(50) BINARY)", false, ""}, - {"CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin PRIMARY KEY COLLATE latin1_bin, INDEX (name ASC))", false, ""}, - {"CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin PRIMARY KEY COLLATE latin1_bin, INDEX (name DESC))", false, ""}, - // test enable or disable cached table - {"ALTER TABLE tmp CACHE", true, "ALTER TABLE `tmp` CACHE"}, - {"ALTER TABLE tmp NOCACHE", true, "ALTER TABLE `tmp` NOCACHE"}, - // for create temporary table - {"CREATE TEMPORARY TABLE t (a varchar(50), b int);", true, "CREATE TEMPORARY TABLE `t` (`a` VARCHAR(50),`b` INT)"}, - {"CREATE TEMPORARY TABLE t LIKE t1", true, "CREATE TEMPORARY TABLE `t` LIKE `t1`"}, - {"DROP TEMPORARY TABLE t", true, "DROP TEMPORARY TABLE `t`"}, - {"create global temporary table t (a int, b varchar(255)) on commit delete rows", true, "CREATE GLOBAL TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) ON COMMIT DELETE ROWS"}, - {"create temporary table t (a int, b varchar(255))", true, "CREATE TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255))"}, - {"create global temporary table t (a int, b varchar(255))", false, ""}, // missing on commit delete rows - {"create temporary table t (a int, b varchar(255)) on commit delete rows", false, ""}, - {"create table t (a int, b varchar(255)) on commit delete rows", false, ""}, - {"create global temporary table t (a int, b varchar(255)) partition by hash(a) partitions 10 on commit delete rows", true, "CREATE GLOBAL TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) PARTITION BY HASH (`a`) PARTITIONS 10 ON COMMIT DELETE ROWS"}, - {"create global temporary table t (a int, b varchar(255)) on commit preserve rows", true, "CREATE GLOBAL TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) ON COMMIT PRESERVE ROWS"}, - {"drop global temporary table t", true, "DROP GLOBAL TEMPORARY TABLE `t`"}, - {"drop temporary table t", true, "DROP TEMPORARY TABLE `t`"}, - // test use key word as column name - {"CREATE TABLE foo (node_id varchar(50), b int);", true, "CREATE TABLE `foo` (`node_id` VARCHAR(50),`b` INT)"}, - {"CREATE TABLE foo (node_state varchar(50), b int);", true, "CREATE TABLE `foo` (`node_state` VARCHAR(50),`b` INT)"}, - // for table option - {"create table t (c int) avg_row_length = 3", true, "CREATE TABLE `t` (`c` INT) AVG_ROW_LENGTH = 3"}, - {"create table t (c int) avg_row_length 3", true, "CREATE TABLE `t` (`c` INT) AVG_ROW_LENGTH = 3"}, - {"create table t (c int) checksum = 0", true, "CREATE TABLE `t` (`c` INT) CHECKSUM = 0"}, - {"create table t (c int) checksum 1", true, "CREATE TABLE `t` (`c` INT) CHECKSUM = 1"}, - {"create table t (c int) table_checksum = 0", true, "CREATE TABLE `t` (`c` INT) TABLE_CHECKSUM = 0"}, - {"create table t (c int) table_checksum 1", true, "CREATE TABLE `t` (`c` INT) TABLE_CHECKSUM = 1"}, - {"create table t (c int) compression = 'NONE'", true, "CREATE TABLE `t` (`c` INT) COMPRESSION = 'NONE'"}, - {"create table t (c int) compression 'lz4'", true, "CREATE TABLE `t` (`c` INT) COMPRESSION = 'lz4'"}, - {"create table t (c int) connection = 'abc'", true, "CREATE TABLE `t` (`c` INT) CONNECTION = 'abc'"}, - {"create table t (c int) connection 'abc'", true, "CREATE TABLE `t` (`c` INT) CONNECTION = 'abc'"}, - {"create table t (c int) key_block_size = 1024", true, "CREATE TABLE `t` (`c` INT) KEY_BLOCK_SIZE = 1024"}, - {"create table t (c int) key_block_size 1024", true, "CREATE TABLE `t` (`c` INT) KEY_BLOCK_SIZE = 1024"}, - {"create table t (c int) max_rows = 1000", true, "CREATE TABLE `t` (`c` INT) MAX_ROWS = 1000"}, - {"create table t (c int) max_rows 1000", true, "CREATE TABLE `t` (`c` INT) MAX_ROWS = 1000"}, - {"create table t (c int) min_rows = 1000", true, "CREATE TABLE `t` (`c` INT) MIN_ROWS = 1000"}, - {"create table t (c int) min_rows 1000", true, "CREATE TABLE `t` (`c` INT) MIN_ROWS = 1000"}, - {"create table t (c int) password = 'abc'", true, "CREATE TABLE `t` (`c` INT) PASSWORD = 'abc'"}, - {"create table t (c int) password 'abc'", true, "CREATE TABLE `t` (`c` INT) PASSWORD = 'abc'"}, - {"create table t (c int) DELAY_KEY_WRITE=1", true, "CREATE TABLE `t` (`c` INT) DELAY_KEY_WRITE = 1"}, - {"create table t (c int) DELAY_KEY_WRITE 1", true, "CREATE TABLE `t` (`c` INT) DELAY_KEY_WRITE = 1"}, - {"create table t (c int) ROW_FORMAT = default", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = DEFAULT"}, - {"create table t (c int) ROW_FORMAT default", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = DEFAULT"}, - {"create table t (c int) ROW_FORMAT = fixed", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = FIXED"}, - {"create table t (c int) ROW_FORMAT = compressed", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = COMPRESSED"}, - {"create table t (c int) ROW_FORMAT = compact", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = COMPACT"}, - {"create table t (c int) ROW_FORMAT = redundant", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = REDUNDANT"}, - {"create table t (c int) ROW_FORMAT = dynamic", true, "CREATE TABLE `t` (`c` INT) ROW_FORMAT = DYNAMIC"}, - {"create table t (c int) STATS_PERSISTENT = default", true, "CREATE TABLE `t` (`c` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ "}, - {"create table t (c int) STATS_PERSISTENT = 0", true, "CREATE TABLE `t` (`c` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ "}, - {"create table t (c int) STATS_PERSISTENT = 1", true, "CREATE TABLE `t` (`c` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ "}, - {"create table t (c int) STATS_SAMPLE_PAGES 0", true, "CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = 0"}, - {"create table t (c int) STATS_SAMPLE_PAGES 10", true, "CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = 10"}, - {"create table t (c int) STATS_SAMPLE_PAGES = 10", true, "CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = 10"}, - {"create table t (c int) STATS_SAMPLE_PAGES = default", true, "CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = DEFAULT"}, - {"create table t (c int) PACK_KEYS = 1", true, "CREATE TABLE `t` (`c` INT) PACK_KEYS = DEFAULT /* TableOptionPackKeys is not supported */ "}, - {"create table t (c int) PACK_KEYS = 0", true, "CREATE TABLE `t` (`c` INT) PACK_KEYS = DEFAULT /* TableOptionPackKeys is not supported */ "}, - {"create table t (c int) PACK_KEYS = DEFAULT", true, "CREATE TABLE `t` (`c` INT) PACK_KEYS = DEFAULT /* TableOptionPackKeys is not supported */ "}, - {"create table t (c int) STORAGE DISK", true, "CREATE TABLE `t` (`c` INT) STORAGE DISK"}, - {"create table t (c int) STORAGE MEMORY", true, "CREATE TABLE `t` (`c` INT) STORAGE MEMORY"}, - {"create table t (c int) SECONDARY_ENGINE null", true, "CREATE TABLE `t` (`c` INT) SECONDARY_ENGINE = NULL"}, - {"create table t (c int) SECONDARY_ENGINE = innodb", true, "CREATE TABLE `t` (`c` INT) SECONDARY_ENGINE = 'innodb'"}, - {"create table t (c int) SECONDARY_ENGINE 'null'", true, "CREATE TABLE `t` (`c` INT) SECONDARY_ENGINE = 'null'"}, - {`create table testTableCompression (c VARCHAR(15000)) compression="ZLIB";`, true, "CREATE TABLE `testTableCompression` (`c` VARCHAR(15000)) COMPRESSION = 'ZLIB'"}, - {`create table t1 (c1 int) compression="zlib";`, true, "CREATE TABLE `t1` (`c1` INT) COMPRESSION = 'zlib'"}, - {`create table t1 (c1 int) collate=binary;`, true, "CREATE TABLE `t1` (`c1` INT) DEFAULT COLLATE = BINARY"}, - {`create table t1 (c1 int) collate=utf8mb4_0900_as_cs;`, true, "CREATE TABLE `t1` (`c1` INT) DEFAULT COLLATE = UTF8MB4_0900_AS_CS"}, - {`create table t1 (c1 int) default charset=binary collate=binary;`, true, "CREATE TABLE `t1` (`c1` INT) DEFAULT CHARACTER SET = BINARY DEFAULT COLLATE = BINARY"}, - {`create table t1 (c1 int) autoextend_size=4M`, true, "CREATE TABLE `t1` (`c1` INT) AUTOEXTEND_SIZE = 4M"}, - - // for table option `UNION` - {"ALTER TABLE t_n UNION ( ), KEY_BLOCK_SIZE = 1", true, "ALTER TABLE `t_n` UNION = (), KEY_BLOCK_SIZE = 1"}, - {"ALTER TABLE d_n.t_n UNION ( t_n ) REMOVE PARTITIONING", true, "ALTER TABLE `d_n`.`t_n` UNION = (`t_n`) REMOVE PARTITIONING"}, - {"ALTER TABLE d_n.t_n LOCK DEFAULT , UNION = ( t_n , d_n.t_n ) REMOVE PARTITIONING", true, "ALTER TABLE `d_n`.`t_n` LOCK = DEFAULT, UNION = (`t_n`,`d_n`.`t_n`) REMOVE PARTITIONING"}, - {"ALTER TABLE d_n.t_n ALGORITHM = DEFAULT , MAX_ROWS 10, UNION ( d_n.t_n ) , ROW_FORMAT REDUNDANT, STATS_PERSISTENT = DEFAULT", true, "ALTER TABLE `d_n`.`t_n` ALGORITHM = DEFAULT, MAX_ROWS = 10, UNION = (`d_n`.`t_n`), ROW_FORMAT = REDUNDANT, STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ "}, - - // partition option - {"create table t (b int) partition by range columns (b) (partition p0 values less than (not 3), partition p2 values less than (20));", false, ""}, - {"create table t (b int) partition by range columns (b) (partition p0 values less than (1 or 3), partition p2 values less than (20));", false, ""}, - {"create table t (b int) partition by range columns (b) (partition p0 values less than (3 is null), partition p2 values less than (20));", false, ""}, - {"create table t (b int) partition by range (b is null) (partition p0 values less than (10));", false, ""}, - {"create table t (b int) partition by list (not b) (partition p0 values in (10, 20));", false, ""}, - {"create table t (b int) partition by hash ( not b );", false, ""}, - {"create table t (b int) partition by range columns (b) (partition p0 values less than (3 in (3, 4, 5)), partition p2 values less than (20));", false, ""}, - {"CREATE TABLE t (id int) ENGINE = INNDB PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20));", true, "CREATE TABLE `t` (`id` INT) ENGINE = INNDB PARTITION BY RANGE (`id`) (PARTITION `p0` VALUES LESS THAN (10),PARTITION `p1` VALUES LESS THAN (20))"}, - {"create table t (c int) PARTITION BY HASH (c) PARTITIONS 32;", true, "CREATE TABLE `t` (`c` INT) PARTITION BY HASH (`c`) PARTITIONS 32"}, - {"create table t (c int) PARTITION BY HASH (Year(VDate)) (PARTITION p1980 VALUES LESS THAN (1980) ENGINE = MyISAM, PARTITION p1990 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION pothers VALUES LESS THAN MAXVALUE ENGINE = MyISAM)", false, ""}, - {"create table t (c int) PARTITION BY RANGE (Year(VDate)) (PARTITION p1980 VALUES LESS THAN (1980) ENGINE = MyISAM, PARTITION p1990 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION pothers VALUES LESS THAN MAXVALUE ENGINE = MyISAM)", true, "CREATE TABLE `t` (`c` INT) PARTITION BY RANGE (YEAR(`VDate`)) (PARTITION `p1980` VALUES LESS THAN (1980) ENGINE = MyISAM,PARTITION `p1990` VALUES LESS THAN (1990) ENGINE = MyISAM,PARTITION `pothers` VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM)"}, - {"create table t (c int, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '') PARTITION BY RANGE (UNIX_TIMESTAMP(create_time)) (PARTITION p201610 VALUES LESS THAN(1477929600), PARTITION p201611 VALUES LESS THAN(1480521600),PARTITION p201612 VALUES LESS THAN(1483200000),PARTITION p201701 VALUES LESS THAN(1485878400),PARTITION p201702 VALUES LESS THAN(1488297600),PARTITION p201703 VALUES LESS THAN(1490976000))", true, "CREATE TABLE `t` (`c` INT,`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '') PARTITION BY RANGE (UNIX_TIMESTAMP(`create_time`)) (PARTITION `p201610` VALUES LESS THAN (1477929600),PARTITION `p201611` VALUES LESS THAN (1480521600),PARTITION `p201612` VALUES LESS THAN (1483200000),PARTITION `p201701` VALUES LESS THAN (1485878400),PARTITION `p201702` VALUES LESS THAN (1488297600),PARTITION `p201703` VALUES LESS THAN (1490976000))"}, - {"CREATE TABLE `md_product_shop` (`shopCode` varchar(4) DEFAULT NULL COMMENT '地点') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*!50100 PARTITION BY KEY (shopCode) PARTITIONS 19 */;", true, "CREATE TABLE `md_product_shop` (`shopCode` VARCHAR(4) DEFAULT NULL COMMENT '地点') ENGINE = InnoDB DEFAULT CHARACTER SET = UTF8MB4 PARTITION BY KEY (`shopCode`) PARTITIONS 19"}, - {"CREATE TABLE `payinfo1` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `oderTime` datetime NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=641533032 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 /*!50500 PARTITION BY RANGE COLUMNS(oderTime) (PARTITION P2011 VALUES LESS THAN ('2012-01-01 00:00:00') ENGINE = InnoDB, PARTITION P1201 VALUES LESS THAN ('2012-02-01 00:00:00') ENGINE = InnoDB, PARTITION PMAX VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)*/;", true, "CREATE TABLE `payinfo1` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`oderTime` DATETIME NOT NULL) ENGINE = InnoDB AUTO_INCREMENT = 641533032 DEFAULT CHARACTER SET = UTF8 ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 PARTITION BY RANGE COLUMNS (`oderTime`) (PARTITION `P2011` VALUES LESS THAN (_UTF8MB4'2012-01-01 00:00:00') ENGINE = InnoDB,PARTITION `P1201` VALUES LESS THAN (_UTF8MB4'2012-02-01 00:00:00') ENGINE = InnoDB,PARTITION `PMAX` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)"}, - {`CREATE TABLE app_channel_daily_report (id bigint(20) NOT NULL AUTO_INCREMENT, app_version varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'default', gmt_create datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=33703438 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci -/*!50100 PARTITION BY RANGE (month(gmt_create)-1) -(PARTITION part0 VALUES LESS THAN (1) COMMENT = '1月份' ENGINE = InnoDB, - PARTITION part1 VALUES LESS THAN (2) COMMENT = '2月份' ENGINE = InnoDB, - PARTITION part2 VALUES LESS THAN (3) COMMENT = '3月份' ENGINE = InnoDB, - PARTITION part3 VALUES LESS THAN (4) COMMENT = '4月份' ENGINE = InnoDB, - PARTITION part4 VALUES LESS THAN (5) COMMENT = '5月份' ENGINE = InnoDB, - PARTITION part5 VALUES LESS THAN (6) COMMENT = '6月份' ENGINE = InnoDB, - PARTITION part6 VALUES LESS THAN (7) COMMENT = '7月份' ENGINE = InnoDB, - PARTITION part7 VALUES LESS THAN (8) COMMENT = '8月份' ENGINE = InnoDB, - PARTITION part8 VALUES LESS THAN (9) COMMENT = '9月份' ENGINE = InnoDB, - PARTITION part9 VALUES LESS THAN (10) COMMENT = '10月份' ENGINE = InnoDB, - PARTITION part10 VALUES LESS THAN (11) COMMENT = '11月份' ENGINE = InnoDB, - PARTITION part11 VALUES LESS THAN (12) COMMENT = '12月份' ENGINE = InnoDB) */ ;`, true, "CREATE TABLE `app_channel_daily_report` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`app_version` VARCHAR(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT _UTF8MB4'default',`gmt_create` DATETIME NOT NULL COMMENT '创建时间',PRIMARY KEY(`id`)) ENGINE = InnoDB AUTO_INCREMENT = 33703438 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_UNICODE_CI PARTITION BY RANGE (MONTH(`gmt_create`)-1) (PARTITION `part0` VALUES LESS THAN (1) COMMENT = '1月份' ENGINE = InnoDB,PARTITION `part1` VALUES LESS THAN (2) COMMENT = '2月份' ENGINE = InnoDB,PARTITION `part2` VALUES LESS THAN (3) COMMENT = '3月份' ENGINE = InnoDB,PARTITION `part3` VALUES LESS THAN (4) COMMENT = '4月份' ENGINE = InnoDB,PARTITION `part4` VALUES LESS THAN (5) COMMENT = '5月份' ENGINE = InnoDB,PARTITION `part5` VALUES LESS THAN (6) COMMENT = '6月份' ENGINE = InnoDB,PARTITION `part6` VALUES LESS THAN (7) COMMENT = '7月份' ENGINE = InnoDB,PARTITION `part7` VALUES LESS THAN (8) COMMENT = '8月份' ENGINE = InnoDB,PARTITION `part8` VALUES LESS THAN (9) COMMENT = '9月份' ENGINE = InnoDB,PARTITION `part9` VALUES LESS THAN (10) COMMENT = '10月份' ENGINE = InnoDB,PARTITION `part10` VALUES LESS THAN (11) COMMENT = '11月份' ENGINE = InnoDB,PARTITION `part11` VALUES LESS THAN (12) COMMENT = '12月份' ENGINE = InnoDB)"}, - - // for placement option - // 1. create table - {`create table t (c int) primary_region="us";`, false, ""}, - {`create table t (c int) regions="us,3";`, false, ""}, - {`create table t (c int) followers="us,3";`, false, ""}, - {`create table t (c int) followers=3;`, false, ""}, - {`create table t (c int) followers=0;`, false, ""}, - {`create table t (c int) voters=3;`, false, ""}, - {`create table t (c int) learners="us,3";`, false, ""}, - {`create table t (c int) learners=3;`, false, ""}, - {`create table t (c int) schedule="even";`, false, ""}, - {`create table t (c int) constraints="ww";`, false, ""}, - {`create table t (c int) leader_constraints="ww";`, false, ""}, - {`create table t (c int) follower_constraints="ww";`, false, ""}, - {`create table t (c int) voter_constraints="ww";`, false, ""}, - {`create table t (c int) learner_constraints="ww";`, false, ""}, - {`create table t (c int) survival_preference="ww";`, false, ""}, - {`create table t (c int) /*T![placement] primary_region="us" */;`, false, ""}, - {`create table t (c int) /*T![placement] regions="us,3" */;`, false, ""}, - {`create table t (c int) /*T![placement] followers="us,3 */";`, false, ""}, - {`create table t (c int) /*T![placement] followers=3 */;`, false, ""}, - {`create table t (c int) /*T![placement] followers=0 */;`, false, ""}, - {`create table t (c int) /*T![placement] voters="us,3" */;`, false, ""}, - {`create table t (c int) /*T![placement] primary_region="us" regions="us,3" */;`, false, ""}, - {`create table t (c int) placement policy="ww";`, true, "CREATE TABLE `t` (`c` INT) PLACEMENT POLICY = `ww`"}, - {"create table t (c int) /*T![placement] placement policy=`x` */;", true, "CREATE TABLE `t` (`c` INT) PLACEMENT POLICY = `x`"}, - {`create table t (c int) /*T![placement] placement policy="y" */;`, true, "CREATE TABLE `t` (`c` INT) PLACEMENT POLICY = `y`"}, - // 2. alter table - {`alter table t primary_region="us";`, false, ""}, - {`alter table t regions="us,3";`, false, ""}, - {`alter table t followers=3;`, false, ""}, - {`alter table t followers=0;`, false, ""}, - {`alter table t voters=3;`, false, ""}, - {`alter table t learners=3;`, false, ""}, - {`alter table t schedule="even";`, false, ""}, - {`alter table t constraints="ww";`, false, ""}, - {`alter table t leader_constraints="ww";`, false, ""}, - {`alter table t follower_constraints="ww";`, false, ""}, - {`alter table t voter_constraints="ww";`, false, ""}, - {`alter table t learner_constraints="ww";`, false, ""}, - {`alter table t /*T![placement] primary_region="us" */;`, false, ""}, - {`alter table t placement policy="ww";`, true, "ALTER TABLE `t` PLACEMENT POLICY = `ww`"}, - {`alter table t /*T![placement] placement policy="ww" */;`, true, "ALTER TABLE `t` PLACEMENT POLICY = `ww`"}, - {`alter table t compact;`, true, "ALTER TABLE `t` COMPACT"}, - {`alter table t compact tiflash replica;`, true, "ALTER TABLE `t` COMPACT TIFLASH REPLICA"}, - {`alter table t compact partition p1,p2;`, true, "ALTER TABLE `t` COMPACT PARTITION `p1`,`p2`"}, - {`alter table t compact partition p1,p2 tiflash replica;`, true, "ALTER TABLE `t` COMPACT PARTITION `p1`,`p2` TIFLASH REPLICA"}, - // 3. create db - {`create database t primary_region="us";`, false, ""}, - {`create database t regions="us,3";`, false, ""}, - {`create database t followers=3;`, false, ""}, - {`create database t followers=0;`, false, ""}, - {`create database t voters=3;`, false, ""}, - {`create database t learners=3;`, false, ""}, - {`create database t schedule="even";`, false, ""}, - {`create database t constraints="ww";`, false, ""}, - {`create database t leader_constraints="ww";`, false, ""}, - {`create database t follower_constraints="ww";`, false, ""}, - {`create database t voter_constraints="ww";`, false, ""}, - {`create database t learner_constraints="ww";`, false, ""}, - {`create database t /*T![placement] primary_region="us" */;`, false, ""}, - {`create database t placement policy="ww";`, true, "CREATE DATABASE `t` PLACEMENT POLICY = `ww`"}, - {`create database t default placement policy="ww";`, true, "CREATE DATABASE `t` PLACEMENT POLICY = `ww`"}, - {`create database t /*T![placement] placement policy="ww" */;`, true, "CREATE DATABASE `t` PLACEMENT POLICY = `ww`"}, - // 4. alter db - {`alter database t primary_region="us";`, false, ""}, - {`alter database t regions="us,3";`, false, ""}, - {`alter database t followers=3;`, false, ""}, - {`alter database t followers=0;`, false, ""}, - {`alter database t voters=3;`, false, ""}, - {`alter database t learners=3;`, false, ""}, - {`alter database t schedule="even";`, false, ""}, - {`alter database t constraints="ww";`, false, ""}, - {`alter database t leader_constraints="ww";`, false, ""}, - {`alter database t follower_constraints="ww";`, false, ""}, - {`alter database t voter_constraints="ww";`, false, ""}, - {`alter database t learner_constraints="ww";`, false, ""}, - {`alter database t /*T![placement] primary_region="us" */;`, false, ""}, - {`alter database t placement policy="ww";`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `ww`"}, - {`alter database t default placement policy="ww";`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `ww`"}, - {`alter database t PLACEMENT POLICY='DEFAULT';`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT`"}, - {`alter database t PLACEMENT POLICY=DEFAULT;`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT`"}, - {`alter database t PLACEMENT POLICY = DEFAULT;`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT`"}, - {`alter database t PLACEMENT POLICY SET DEFAULT`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT`"}, - {"alter database t PLACEMENT POLICY=`DEFAULT`;", true, "ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT`"}, - {`alter database t /*T![placement] PLACEMENT POLICY='DEFAULT' */;`, true, "ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT`"}, - // 5. create partition - {`create table m (c int) partition by range (c) (partition p1 values less than (200) primary_region="us");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) regions="us,3");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) followers=3);`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) voters=3);`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) learners=3);`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) schedule="even");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) constraints="ww");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) leader_constraints="ww");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) follower_constraints="ww");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) voter_constraints="ww");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) learner_constraints="ww");`, false, ""}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) placement policy="ww");`, true, "CREATE TABLE `m` (`c` INT) PARTITION BY RANGE (`c`) (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`)"}, - {`create table m (c int) partition by range (c) (partition p1 values less than (200) /*T![placement] placement policy="ww" */);`, true, "CREATE TABLE `m` (`c` INT) PARTITION BY RANGE (`c`) (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`)"}, - // 6. alter partition - {`alter table m partition t primary_region="us";`, false, ""}, - {`alter table m partition t regions="us,3";`, false, ""}, - {`alter table m partition t followers=3;`, false, ""}, - {`alter table m partition t primary_region="us" followers=3;`, false, ""}, - {`alter table m partition t voters=3;`, false, ""}, - {`alter table m partition t learners=3;`, false, ""}, - {`alter table m partition t schedule="even";`, false, ""}, - {`alter table m partition t constraints="ww";`, false, ""}, - {`alter table m partition t leader_constraints="ww";`, false, ""}, - {`alter table m partition t follower_constraints="ww";`, false, ""}, - {`alter table m partition t voter_constraints="ww";`, false, ""}, - {`alter table m partition t learner_constraints="ww";`, false, ""}, - {`alter table m partition t placement policy="ww";`, true, "ALTER TABLE `m` PARTITION `t` PLACEMENT POLICY = `ww`"}, - {`alter table m partition t /*T![placement] placement policy="ww" */;`, true, "ALTER TABLE `m` PARTITION `t` PLACEMENT POLICY = `ww`"}, - // 7. add partition - {`alter table m add partition (partition p1 values less than (200) primary_region="us");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) regions="us,3");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) followers=3);`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) voters=3);`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) learners=3);`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) schedule="even");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) constraints="ww");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) leader_constraints="ww");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) follower_constraints="ww");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) voter_constraints="ww");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) learner_constraints="ww");`, false, ""}, - {`alter table m add partition (partition p1 values less than (200) placement policy="ww");`, true, "ALTER TABLE `m` ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`)"}, - {`alter table m add partition (partition p1 values less than (200) /*T![placement] placement policy="ww" */);`, true, "ALTER TABLE `m` ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`)"}, - {`alter table m add column a int, add partition (partition p1 values less than (200))`, true, "ALTER TABLE `m` ADD COLUMN `a` INT, ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200))"}, - // TODO: Do not allow this order! - {`alter table m add partition (partition p1 values less than (200)), add column a int`, true, "ALTER TABLE `m` ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200)), ADD COLUMN `a` INT"}, - // for check clause - {"create table t (c1 bool, c2 bool, check (c1 in (0, 1)) not enforced, check (c2 in (0, 1)))", true, "CREATE TABLE `t` (`c1` TINYINT(1),`c2` TINYINT(1),CHECK(`c1` IN (0,1)) NOT ENFORCED,CHECK(`c2` IN (0,1)) ENFORCED)"}, - {"CREATE TABLE Customer (SD integer CHECK (SD > 0), First_Name varchar(30));", true, "CREATE TABLE `Customer` (`SD` INT CHECK(`SD`>0) ENFORCED,`First_Name` VARCHAR(30))"}, - {"CREATE TABLE Customer (SD integer CHECK (SD > 0) not enforced, SS varchar(30) check(ss='test') enforced);", true, "CREATE TABLE `Customer` (`SD` INT CHECK(`SD`>0) NOT ENFORCED,`SS` VARCHAR(30) CHECK(`ss`=_UTF8MB4'test') ENFORCED)"}, - {"CREATE TABLE Customer (SD integer CHECK (SD > 0) not null, First_Name varchar(30) comment 'string' not null);", true, "CREATE TABLE `Customer` (`SD` INT CHECK(`SD`>0) ENFORCED NOT NULL,`First_Name` VARCHAR(30) COMMENT 'string' NOT NULL)"}, - {"CREATE TABLE Customer (SD integer comment 'string' CHECK (SD > 0) not null);", true, "CREATE TABLE `Customer` (`SD` INT COMMENT 'string' CHECK(`SD`>0) ENFORCED NOT NULL)"}, - {"CREATE TABLE Customer (SD integer comment 'string' not enforced, First_Name varchar(30));", false, ""}, - {"CREATE TABLE Customer (SD integer not enforced, First_Name varchar(30));", false, ""}, - - {"create database xxx", true, "CREATE DATABASE `xxx`"}, - {"create database if exists xxx", false, ""}, - {"create database if not exists xxx", true, "CREATE DATABASE IF NOT EXISTS `xxx`"}, - - // for create database with encryption - {"create database xxx encryption = 'N'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'N'"}, - {"create database xxx encryption 'N'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'N'"}, - {"create database xxx default encryption = 'N'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'N'"}, - {"create database xxx default encryption 'N'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'N'"}, - {"create database xxx encryption = 'Y'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'Y'"}, - {"create database xxx encryption 'Y'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'Y'"}, - {"create database xxx default encryption = 'Y'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'Y'"}, - {"create database xxx default encryption 'Y'", true, "CREATE DATABASE `xxx` ENCRYPTION = 'Y'"}, - {"create database xxx encryption = N", false, ""}, - - {"create schema xxx", true, "CREATE DATABASE `xxx`"}, - {"create schema if exists xxx", false, ""}, - {"create schema if not exists xxx", true, "CREATE DATABASE IF NOT EXISTS `xxx`"}, - // for drop database/schema/table/view/stats - {"drop database xxx", true, "DROP DATABASE `xxx`"}, - {"drop database if exists xxx", true, "DROP DATABASE IF EXISTS `xxx`"}, - {"drop database if not exists xxx", false, ""}, - {"drop schema xxx", true, "DROP DATABASE `xxx`"}, - {"drop schema if exists xxx", true, "DROP DATABASE IF EXISTS `xxx`"}, - {"drop schema if not exists xxx", false, ""}, - {"drop table", false, ""}, - {"drop table if exists t'xyz", false, ""}, - {"drop table if exists t'", false, ""}, - {"drop table if exists t`", false, ""}, - {`drop table if exists t'`, false, ""}, - {`drop table if exists t"`, false, ""}, - {"drop table xxx", true, "DROP TABLE `xxx`"}, - {"drop table xxx, yyy", true, "DROP TABLE `xxx`, `yyy`"}, - {"drop tables xxx", true, "DROP TABLE `xxx`"}, - {"drop tables xxx, yyy", true, "DROP TABLE `xxx`, `yyy`"}, - {"drop table if exists xxx", true, "DROP TABLE IF EXISTS `xxx`"}, - {"drop table if exists xxx, yyy", true, "DROP TABLE IF EXISTS `xxx`, `yyy`"}, - {"drop table if not exists xxx", false, ""}, - {"drop table xxx restrict", true, "DROP TABLE `xxx`"}, - {"drop table xxx, yyy cascade", true, "DROP TABLE `xxx`, `yyy`"}, - {"drop table if exists xxx restrict", true, "DROP TABLE IF EXISTS `xxx`"}, - {"drop view", false, "DROP VIEW"}, - {"drop view xxx", true, "DROP VIEW `xxx`"}, - {"drop view xxx, yyy", true, "DROP VIEW `xxx`, `yyy`"}, - {"drop view if exists xxx", true, "DROP VIEW IF EXISTS `xxx`"}, - {"drop view if exists xxx, yyy", true, "DROP VIEW IF EXISTS `xxx`, `yyy`"}, - {"drop stats t", true, "DROP STATS `t`"}, - {"drop stats t1, t2, t3", true, "DROP STATS `t1`, `t2`, `t3`"}, - {"drop stats t global", true, "DROP STATS `t` GLOBAL"}, - {"drop stats t partition p0", true, "DROP STATS `t` PARTITION `p0`"}, - {"drop stats t partition p0, p1, p2", true, "DROP STATS `t` PARTITION `p0`,`p1`,`p2`"}, - // for issue 974 - {`CREATE TABLE address ( - id bigint(20) NOT NULL AUTO_INCREMENT, - create_at datetime NOT NULL, - deleted tinyint(1) NOT NULL, - update_at datetime NOT NULL, - version bigint(20) DEFAULT NULL, - address varchar(128) NOT NULL, - address_detail varchar(128) NOT NULL, - cellphone varchar(16) NOT NULL, - latitude double NOT NULL, - longitude double NOT NULL, - name varchar(16) NOT NULL, - sex tinyint(1) NOT NULL, - user_id bigint(20) NOT NULL, - PRIMARY KEY (id), - CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), - INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' - ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true, "CREATE TABLE `address` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(128) NOT NULL,`address_detail` VARCHAR(128) NOT NULL,`cellphone` VARCHAR(16) NOT NULL,`latitude` DOUBLE NOT NULL,`longitude` DOUBLE NOT NULL,`name` VARCHAR(16) NOT NULL,`sex` TINYINT(1) NOT NULL,`user_id` BIGINT(20) NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `FK_7rod8a71yep5vxasb0ms3osbg` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`),INDEX `FK_7rod8a71yep5vxasb0ms3osbg`(`user_id`)) ENGINE = InnoDB AUTO_INCREMENT = 30 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0"}, - // for issue 975 - {`CREATE TABLE test_data ( - id bigint(20) NOT NULL AUTO_INCREMENT, - create_at datetime NOT NULL, - deleted tinyint(1) NOT NULL, - update_at datetime NOT NULL, - version bigint(20) DEFAULT NULL, - address varchar(255) NOT NULL, - amount decimal(19,2) DEFAULT NULL, - charge_id varchar(32) DEFAULT NULL, - paid_amount decimal(19,2) DEFAULT NULL, - transaction_no varchar(64) DEFAULT NULL, - wx_mp_app_id varchar(32) DEFAULT NULL, - contacts varchar(50) DEFAULT NULL, - deliver_fee decimal(19,2) DEFAULT NULL, - deliver_info varchar(255) DEFAULT NULL, - deliver_time varchar(255) DEFAULT NULL, - description varchar(255) DEFAULT NULL, - invoice varchar(255) DEFAULT NULL, - order_from int(11) DEFAULT NULL, - order_state int(11) NOT NULL, - packing_fee decimal(19,2) DEFAULT NULL, - payment_time datetime DEFAULT NULL, - payment_type int(11) DEFAULT NULL, - phone varchar(50) NOT NULL, - store_employee_id bigint(20) DEFAULT NULL, - store_id bigint(20) NOT NULL, - user_id bigint(20) NOT NULL, - payment_mode int(11) NOT NULL, - current_latitude double NOT NULL, - current_longitude double NOT NULL, - address_latitude double NOT NULL, - address_longitude double NOT NULL, - PRIMARY KEY (id), - CONSTRAINT food_order_ibfk_1 FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), - CONSTRAINT food_order_ibfk_2 FOREIGN KEY (store_id) REFERENCES waimaiqa.store (id), - CONSTRAINT food_order_ibfk_3 FOREIGN KEY (store_employee_id) REFERENCES waimaiqa.store_employee (id), - UNIQUE FK_UNIQUE_charge_id USING BTREE (charge_id) comment '', - INDEX FK_eqst2x1xisn3o0wbrlahnnqq8 USING BTREE (store_employee_id) comment '', - INDEX FK_8jcmec4kb03f4dod0uqwm54o9 USING BTREE (store_id) comment '', - INDEX FK_a3t0m9apja9jmrn60uab30pqd USING BTREE (user_id) comment '' - ) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARACTER SET utf8 COLLATE UTF8_GENERAL_CI ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true, "CREATE TABLE `test_data` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(255) NOT NULL,`amount` DECIMAL(19,2) DEFAULT NULL,`charge_id` VARCHAR(32) DEFAULT NULL,`paid_amount` DECIMAL(19,2) DEFAULT NULL,`transaction_no` VARCHAR(64) DEFAULT NULL,`wx_mp_app_id` VARCHAR(32) DEFAULT NULL,`contacts` VARCHAR(50) DEFAULT NULL,`deliver_fee` DECIMAL(19,2) DEFAULT NULL,`deliver_info` VARCHAR(255) DEFAULT NULL,`deliver_time` VARCHAR(255) DEFAULT NULL,`description` VARCHAR(255) DEFAULT NULL,`invoice` VARCHAR(255) DEFAULT NULL,`order_from` INT(11) DEFAULT NULL,`order_state` INT(11) NOT NULL,`packing_fee` DECIMAL(19,2) DEFAULT NULL,`payment_time` DATETIME DEFAULT NULL,`payment_type` INT(11) DEFAULT NULL,`phone` VARCHAR(50) NOT NULL,`store_employee_id` BIGINT(20) DEFAULT NULL,`store_id` BIGINT(20) NOT NULL,`user_id` BIGINT(20) NOT NULL,`payment_mode` INT(11) NOT NULL,`current_latitude` DOUBLE NOT NULL,`current_longitude` DOUBLE NOT NULL,`address_latitude` DOUBLE NOT NULL,`address_longitude` DOUBLE NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `food_order_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`),CONSTRAINT `food_order_ibfk_2` FOREIGN KEY (`store_id`) REFERENCES `waimaiqa`.`store`(`id`),CONSTRAINT `food_order_ibfk_3` FOREIGN KEY (`store_employee_id`) REFERENCES `waimaiqa`.`store_employee`(`id`),UNIQUE `FK_UNIQUE_charge_id`(`charge_id`) USING BTREE,INDEX `FK_eqst2x1xisn3o0wbrlahnnqq8`(`store_employee_id`) USING BTREE,INDEX `FK_8jcmec4kb03f4dod0uqwm54o9`(`store_id`) USING BTREE,INDEX `FK_a3t0m9apja9jmrn60uab30pqd`(`user_id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 95 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0"}, - {`create table t (c int KEY);`, true, "CREATE TABLE `t` (`c` INT PRIMARY KEY)"}, - {`CREATE TABLE address ( - id bigint(20) NOT NULL AUTO_INCREMENT, - create_at datetime NOT NULL, - deleted tinyint(1) NOT NULL, - update_at datetime NOT NULL, - version bigint(20) DEFAULT NULL, - address varchar(128) NOT NULL, - address_detail varchar(128) NOT NULL, - cellphone varchar(16) NOT NULL, - latitude double NOT NULL, - longitude double NOT NULL, - name varchar(16) NOT NULL, - sex tinyint(1) NOT NULL, - user_id bigint(20) NOT NULL, - PRIMARY KEY (id), - CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION, - INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' - ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE UTF8_GENERAL_CI ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true, "CREATE TABLE `address` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(128) NOT NULL,`address_detail` VARCHAR(128) NOT NULL,`cellphone` VARCHAR(16) NOT NULL,`latitude` DOUBLE NOT NULL,`longitude` DOUBLE NOT NULL,`name` VARCHAR(16) NOT NULL,`sex` TINYINT(1) NOT NULL,`user_id` BIGINT(20) NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `FK_7rod8a71yep5vxasb0ms3osbg` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION,INDEX `FK_7rod8a71yep5vxasb0ms3osbg`(`user_id`)) ENGINE = InnoDB AUTO_INCREMENT = 30 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0"}, - {"CREATE TABLE address (\r\nid bigint(20) NOT NULL AUTO_INCREMENT,\r\ncreate_at datetime NOT NULL,\r\ndeleted tinyint(1) NOT NULL,\r\nupdate_at datetime NOT NULL,\r\nversion bigint(20) DEFAULT NULL,\r\naddress varchar(128) NOT NULL,\r\naddress_detail varchar(128) NOT NULL,\r\ncellphone varchar(16) NOT NULL,\r\nlatitude double NOT NULL,\r\nlongitude double NOT NULL,\r\nname varchar(16) NOT NULL,\r\nsex tinyint(1) NOT NULL,\r\nuser_id bigint(20) NOT NULL,\r\nPRIMARY KEY (id),\r\nCONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION,\r\nINDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment ''\r\n) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;", true, "CREATE TABLE `address` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(128) NOT NULL,`address_detail` VARCHAR(128) NOT NULL,`cellphone` VARCHAR(16) NOT NULL,`latitude` DOUBLE NOT NULL,`longitude` DOUBLE NOT NULL,`name` VARCHAR(16) NOT NULL,`sex` TINYINT(1) NOT NULL,`user_id` BIGINT(20) NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `FK_7rod8a71yep5vxasb0ms3osbg` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION,INDEX `FK_7rod8a71yep5vxasb0ms3osbg`(`user_id`)) ENGINE = InnoDB AUTO_INCREMENT = 30 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0"}, - // for issue 1802 - {`CREATE TABLE t1 ( - accout_id int(11) DEFAULT '0', - summoner_id int(11) DEFAULT '0', - union_name varbinary(52) NOT NULL, - union_id int(11) DEFAULT '0', - PRIMARY KEY (union_name)) ENGINE=MyISAM DEFAULT CHARSET=binary;`, true, "CREATE TABLE `t1` (`accout_id` INT(11) DEFAULT _UTF8MB4'0',`summoner_id` INT(11) DEFAULT _UTF8MB4'0',`union_name` VARBINARY(52) NOT NULL,`union_id` INT(11) DEFAULT _UTF8MB4'0',PRIMARY KEY(`union_name`)) ENGINE = MyISAM DEFAULT CHARACTER SET = BINARY"}, - // for issue pingcap/parser#310 - {`CREATE TABLE t (a DECIMAL(20,0), b DECIMAL(30), c FLOAT(25,0))`, true, "CREATE TABLE `t` (`a` DECIMAL(20,0),`b` DECIMAL(30),`c` FLOAT(25,0))"}, - // Create table with multiple index options. - {`create table t (c int, index ci (c) USING BTREE COMMENT "123");`, true, "CREATE TABLE `t` (`c` INT,INDEX `ci`(`c`) USING BTREE COMMENT '123')"}, - // for default value - {"CREATE TABLE sbtest (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, k integer UNSIGNED DEFAULT '0' NOT NULL, c char(120) DEFAULT '' NOT NULL, pad char(60) DEFAULT '' NOT NULL, PRIMARY KEY (id) )", true, "CREATE TABLE `sbtest` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`k` INT UNSIGNED DEFAULT _UTF8MB4'0' NOT NULL,`c` CHAR(120) DEFAULT _UTF8MB4'' NOT NULL,`pad` CHAR(60) DEFAULT _UTF8MB4'' NOT NULL,PRIMARY KEY(`id`))"}, - {"create table test (create_date TIMESTAMP NOT NULL COMMENT '创建日期 create date' DEFAULT now());", true, "CREATE TABLE `test` (`create_date` TIMESTAMP NOT NULL COMMENT '创建日期 create date' DEFAULT CURRENT_TIMESTAMP())"}, - {"create table ts (t int, v timestamp(3) default CURRENT_TIMESTAMP(3));", true, "CREATE TABLE `ts` (`t` INT,`v` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3))"}, // TODO: The number yacc in parentheses has not been implemented yet. - // Create table with primary key name. - {"create table if not exists `t` (`id` int not null auto_increment comment '消息ID', primary key `pk_id` (`id`) );", true, "CREATE TABLE IF NOT EXISTS `t` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '消息ID',PRIMARY KEY `pk_id`(`id`))"}, - // Create table with like. - {"create table a like b", true, "CREATE TABLE `a` LIKE `b`"}, - {"create table a (id int REFERENCES a (id) ON delete NO ACTION )", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON DELETE NO ACTION)"}, - {"create table a (id int REFERENCES a (id) ON update set default )", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON UPDATE SET DEFAULT)"}, - {"create table a (id int REFERENCES a (id) ON delete set null on update CASCADE)", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON DELETE SET NULL ON UPDATE CASCADE)"}, - {"create table a (id int REFERENCES a (id) ON update set default on delete RESTRICT)", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON DELETE RESTRICT ON UPDATE SET DEFAULT)"}, - {"create table a (id int REFERENCES a (id) MATCH FULL ON delete NO ACTION )", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) MATCH FULL ON DELETE NO ACTION)"}, - {"create table a (id int REFERENCES a (id) MATCH PARTIAL ON update NO ACTION )", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) MATCH PARTIAL ON UPDATE NO ACTION)"}, - {"create table a (id int REFERENCES a (id) MATCH SIMPLE ON update NO ACTION )", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) MATCH SIMPLE ON UPDATE NO ACTION)"}, - {"create table a (id int REFERENCES a (id) ON update set default )", true, "CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON UPDATE SET DEFAULT)"}, - {"create table a (id int REFERENCES a (id) ON update set default on update CURRENT_TIMESTAMP)", false, ""}, - {"create table a (id int REFERENCES a (id) ON delete set default on update CURRENT_TIMESTAMP)", false, ""}, - {"create table a (like b)", true, "CREATE TABLE `a` LIKE `b`"}, - {"create table if not exists a like b", true, "CREATE TABLE IF NOT EXISTS `a` LIKE `b`"}, - {"create table if not exists a (like b)", true, "CREATE TABLE IF NOT EXISTS `a` LIKE `b`"}, - {"create table if not exists a like (b)", false, ""}, - {"create table a (t int) like b", false, ""}, - {"create table a (t int) like (b)", false, ""}, - // Create table with select statement - {"create table a select * from b", true, "CREATE TABLE `a` AS SELECT * FROM `b`"}, - {"create table a as select * from b", true, "CREATE TABLE `a` AS SELECT * FROM `b`"}, - {"create table a (m int, n datetime) as select * from b", true, "CREATE TABLE `a` (`m` INT,`n` DATETIME) AS SELECT * FROM `b`"}, - {"create table a (unique(n)) as select n from b", true, "CREATE TABLE `a` (UNIQUE(`n`)) AS SELECT `n` FROM `b`"}, - {"create table a ignore as select n from b", true, "CREATE TABLE `a` IGNORE AS SELECT `n` FROM `b`"}, - {"create table a replace as select n from b", true, "CREATE TABLE `a` REPLACE AS SELECT `n` FROM `b`"}, - {"create table a (m int) replace as (select n as m from b union select n+1 as m from c group by 1 limit 2)", true, "CREATE TABLE `a` (`m` INT) REPLACE AS (SELECT `n` AS `m` FROM `b` UNION SELECT `n`+1 AS `m` FROM `c` GROUP BY 1 LIMIT 2)"}, - - // Create table with no option is valid for parser - {"create table a", true, "CREATE TABLE `a`"}, - - {"create table t (a timestamp default now)", false, ""}, - {"create table t (a timestamp default now())", true, "CREATE TABLE `t` (`a` TIMESTAMP DEFAULT CURRENT_TIMESTAMP())"}, - {"create table t (a timestamp default (((now()))))", true, "CREATE TABLE `t` (`a` TIMESTAMP DEFAULT CURRENT_TIMESTAMP())"}, - {"create table t (a timestamp default now() on update now)", false, ""}, - {"create table t (a timestamp default now() on update now())", true, "CREATE TABLE `t` (`a` TIMESTAMP DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP())"}, - {"create table t (a timestamp default now() on update (now()))", false, ""}, - {"CREATE TABLE t (c TEXT) default CHARACTER SET utf8, default COLLATE utf8_general_ci;", true, "CREATE TABLE `t` (`c` TEXT) DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI"}, - {"CREATE TABLE t (c TEXT) shard_row_id_bits = 1;", true, "CREATE TABLE `t` (`c` TEXT) SHARD_ROW_ID_BITS = 1"}, - {"CREATE TABLE t (c TEXT) shard_row_id_bits = 1, PRE_SPLIT_REGIONS = 1;", true, "CREATE TABLE `t` (`c` TEXT) SHARD_ROW_ID_BITS = 1 PRE_SPLIT_REGIONS = 1"}, - // Create table with ON UPDATE CURRENT_TIMESTAMP(6), specify fraction part. - {"CREATE TABLE IF NOT EXISTS `general_log` (`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` mediumtext NOT NULL,`thread_id` bigint(20) unsigned NOT NULL,`server_id` int(10) unsigned NOT NULL,`command_type` varchar(64) NOT NULL,`argument` mediumblob NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'", true, "CREATE TABLE IF NOT EXISTS `general_log` (`event_time` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` MEDIUMTEXT NOT NULL,`thread_id` BIGINT(20) UNSIGNED NOT NULL,`server_id` INT(10) UNSIGNED NOT NULL,`command_type` VARCHAR(64) NOT NULL,`argument` MEDIUMBLOB NOT NULL) ENGINE = CSV DEFAULT CHARACTER SET = UTF8 COMMENT = 'General log'"}, // TODO: The number yacc in parentheses has not been implemented yet. - // For reference_definition in column_definition. - {"CREATE TABLE followers ( f1 int NOT NULL REFERENCES user_profiles (uid) );", true, "CREATE TABLE `followers` (`f1` INT NOT NULL REFERENCES `user_profiles`(`uid`))"}, - - // For column default expression - {"create table t (a int default rand())", true, "CREATE TABLE `t` (`a` INT DEFAULT (RAND()))"}, - {"create table t (a int default rand(1))", true, "CREATE TABLE `t` (`a` INT DEFAULT (RAND(1)))"}, - {"create table t (a int default (rand()))", true, "CREATE TABLE `t` (`a` INT DEFAULT (RAND()))"}, - {"create table t (a int default (rand(1)))", true, "CREATE TABLE `t` (`a` INT DEFAULT (RAND(1)))"}, - {"create table t (a int default (((rand()))))", true, "CREATE TABLE `t` (`a` INT DEFAULT (RAND()))"}, - {"create table t (a int default (((rand(1)))))", true, "CREATE TABLE `t` (`a` INT DEFAULT (RAND(1)))"}, - {"create table t (d date default current_date())", true, "CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE()))"}, - {"create table t (d date default current_date)", true, "CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE()))"}, - {"create table t (d date default (current_date()))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE()))"}, - {"create table t (d date default (curdate()))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE()))"}, - {"create table t (d date default curdate())", true, "CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE()))"}, - {"create table t (d date default current_date())", true, "CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE()))"}, - {"create table t (d date default date_format(now(),'%Y-%m'))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m')))"}, - {"create table t (d date default (date_format(now(),'%Y-%m')))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m')))"}, - {"create table t (d date default date_format(now(),'%Y-%m-%d'))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m-%d')))"}, - {"create table t (d date default date_format(now(),'%Y-%m-%d %H.%i.%s'))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m-%d %H.%i.%s')))"}, - {"create table t (d date default date_format(now(),'%Y-%m-%d %H:%i:%s'))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m-%d %H:%i:%s')))"}, - {"create table t (d date default date_format(now(),'%b %d %Y %h:%i %p'))", true, "CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%b %d %Y %h:%i %p')))"}, - {"create table t (a varchar(32) default (replace(upper(uuid()), '-', '')))", true, "CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(UPPER(UUID()), _UTF8MB4'-', _UTF8MB4'')))"}, - {"create table t (a varchar(32) default replace(upper(uuid()), '-', ''))", true, "CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(UPPER(UUID()), _UTF8MB4'-', _UTF8MB4'')))"}, - {"create table t (a varchar(32) default (replace(convert(upper(uuid()) using utf8mb4), '-', '')))", true, "CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(CONVERT(UPPER(UUID()) USING 'utf8mb4'), _UTF8MB4'-', _UTF8MB4'')))"}, - {"create table t (a varchar(32) default replace(convert(upper(uuid()) using utf8mb4), '-', ''))", true, "CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(CONVERT(UPPER(UUID()) USING 'utf8mb4'), _UTF8MB4'-', _UTF8MB4'')))"}, - {"create table t (a int default upper(substring_index(user(),'@',1)))", true, "CREATE TABLE `t` (`a` INT DEFAULT (UPPER(SUBSTRING_INDEX(USER(), _UTF8MB4'@', 1))))"}, - {"create table t (a int default (upper(substring_index(user(),'@',1))))", true, "CREATE TABLE `t` (`a` INT DEFAULT (UPPER(SUBSTRING_INDEX(USER(), _UTF8MB4'@', 1))))"}, - {"create table t (a varchar(32) default (str_to_date('1980-01-01','%Y-%m-%d')))", true, "CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (STR_TO_DATE(_UTF8MB4'1980-01-01', _UTF8MB4'%Y-%m-%d')))"}, - {"create table t (a varchar(32) default str_to_date('1980-01-01','%Y-%m-%d'))", true, "CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (STR_TO_DATE(_UTF8MB4'1980-01-01', _UTF8MB4'%Y-%m-%d')))"}, - {"create table t (j json default (json_object()))", true, "CREATE TABLE `t` (`j` JSON DEFAULT (JSON_OBJECT()))"}, - {"create table t (j json default (json_array()))", true, "CREATE TABLE `t` (`j` JSON DEFAULT (JSON_ARRAY()))"}, - {"create table t (j json default (json_quote()))", true, "CREATE TABLE `t` (`j` JSON DEFAULT (JSON_QUOTE()))"}, - {"create table t (j json default (json_object('foo', 5, 'bar', 'barfoo')))", true, "CREATE TABLE `t` (`j` JSON DEFAULT (JSON_OBJECT(_UTF8MB4'foo', 5, _UTF8MB4'bar', _UTF8MB4'barfoo')))"}, - {"create table t (j json default (json_array(1,2,3)))", true, "CREATE TABLE `t` (`j` JSON DEFAULT (JSON_ARRAY(1, 2, 3)))"}, - {"create table t (j json default (json_quote('foobar')))", true, "CREATE TABLE `t` (`j` JSON DEFAULT (JSON_QUOTE(_UTF8MB4'foobar')))"}, - {"create table t (c char(33) default (nonexistingfunc('foobar')))", true, "CREATE TABLE `t` (`c` CHAR(33) DEFAULT (NONEXISTINGFUNC(_UTF8MB4'foobar')))"}, - {"create table t (c char(33) default 'foobar')", true, "CREATE TABLE `t` (`c` CHAR(33) DEFAULT _UTF8MB4'foobar')"}, - {"create table t (c char(33) default ('foobar'))", true, "CREATE TABLE `t` (`c` CHAR(33) DEFAULT _UTF8MB4'foobar')"}, - {"create table t (i int default (0))", true, "CREATE TABLE `t` (`i` INT DEFAULT 0)"}, - {"create table t (i int default (-1))", true, "CREATE TABLE `t` (`i` INT DEFAULT -1)"}, - {"create table t (i int default (+1))", true, "CREATE TABLE `t` (`i` INT DEFAULT +1)"}, - // For column default expression with column reference - {"create table t (a int, b int, c char(33) default (b))", true, "CREATE TABLE `t` (`a` INT,`b` INT,`c` CHAR(33) DEFAULT (`b`))"}, - {"create table t (a int, b int, c char(33) default `b`)", false, ""}, - - // For table option `ENCRYPTION` - {"create table t (a int) encryption = 'n';", true, "CREATE TABLE `t` (`a` INT) ENCRYPTION = 'n'"}, - {"create table t (a int) encryption 'n';", true, "CREATE TABLE `t` (`a` INT) ENCRYPTION = 'n'"}, - {"alter table t encryption = 'y';", true, "ALTER TABLE `t` ENCRYPTION = 'y'"}, - {"alter table t encryption 'y';", true, "ALTER TABLE `t` ENCRYPTION = 'y'"}, - - // For GLOBAL/LOCAL index - {"create table t (a int key global)", true, "CREATE TABLE `t` (`a` INT PRIMARY KEY GLOBAL)"}, - {"create table t (a int key local)", true, "CREATE TABLE `t` (`a` INT PRIMARY KEY)"}, - {"create table t (a int primary key local)", true, "CREATE TABLE `t` (`a` INT PRIMARY KEY)"}, - {"create table t (a int primary key global)", true, "CREATE TABLE `t` (`a` INT PRIMARY KEY GLOBAL)"}, - {"create table t (a int UNIQUE local)", true, "CREATE TABLE `t` (`a` INT UNIQUE KEY)"}, - {"create table t (a int UNIQUE global)", true, "CREATE TABLE `t` (`a` INT UNIQUE KEY GLOBAL)"}, - {"create table t (a int UNIQUE key local)", true, "CREATE TABLE `t` (`a` INT UNIQUE KEY)"}, - {"create table t (a int UNIQUE key global)", true, "CREATE TABLE `t` (`a` INT UNIQUE KEY GLOBAL)"}, - {"alter table t add index (a)", true, "ALTER TABLE `t` ADD INDEX(`a`)"}, - {"alter table t add index (a) local", true, "ALTER TABLE `t` ADD INDEX(`a`)"}, - {"alter table t add index (a) global", true, "ALTER TABLE `t` ADD INDEX(`a`) GLOBAL"}, - {"alter table t add unique (a)", true, "ALTER TABLE `t` ADD UNIQUE(`a`)"}, - {"alter table t add unique (a) local", true, "ALTER TABLE `t` ADD UNIQUE(`a`)"}, - {"alter table t add unique (a) global", true, "ALTER TABLE `t` ADD UNIQUE(`a`) GLOBAL"}, - {"alter table t add unique key (a) global", true, "ALTER TABLE `t` ADD UNIQUE(`a`) GLOBAL"}, - {"alter table t add unique key (a)", true, "ALTER TABLE `t` ADD UNIQUE(`a`)"}, - {"alter table t add unique key (a) local", true, "ALTER TABLE `t` ADD UNIQUE(`a`)"}, - {"alter table t add primary key (a) global", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`) GLOBAL"}, - {"alter table t add primary key (a)", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`)"}, - {"alter table t add primary key (a) local", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`)"}, - {"create index i on t (a)", true, "CREATE INDEX `i` ON `t` (`a`)"}, - {"create index i on t (a) local", true, "CREATE INDEX `i` ON `t` (`a`)"}, - {"create index i on t (a) global", true, "CREATE INDEX `i` ON `t` (`a`) GLOBAL"}, - - // for alter database/schema/table - {"ALTER DATABASE t CHARACTER SET = 'utf8'", true, "ALTER DATABASE `t` CHARACTER SET = utf8"}, - {"ALTER DATABASE CHARACTER SET = 'utf8'", true, "ALTER DATABASE CHARACTER SET = utf8"}, - {"ALTER DATABASE t DEFAULT CHARACTER SET = 'utf8'", true, "ALTER DATABASE `t` CHARACTER SET = utf8"}, - {"ALTER SCHEMA t DEFAULT CHARACTER SET = 'utf8'", true, "ALTER DATABASE `t` CHARACTER SET = utf8"}, - {"ALTER SCHEMA DEFAULT CHARACTER SET = 'utf8'", true, "ALTER DATABASE CHARACTER SET = utf8"}, - {"ALTER SCHEMA t DEFAULT CHARSET = 'UTF8'", true, "ALTER DATABASE `t` CHARACTER SET = utf8"}, - - {"ALTER DATABASE t COLLATE = binary", true, "ALTER DATABASE `t` COLLATE = binary"}, - {"ALTER DATABASE t CHARSET=binary COLLATE = binary", true, "ALTER DATABASE `t` CHARACTER SET = binary COLLATE = binary"}, - - {"ALTER DATABASE t COLLATE = 'utf8_bin'", true, "ALTER DATABASE `t` COLLATE = utf8_bin"}, - {"ALTER DATABASE COLLATE = 'utf8_bin'", true, "ALTER DATABASE COLLATE = utf8_bin"}, - {"ALTER DATABASE t DEFAULT COLLATE = 'utf8_bin'", true, "ALTER DATABASE `t` COLLATE = utf8_bin"}, - {"ALTER SCHEMA t DEFAULT COLLATE = 'UTF8_BiN'", true, "ALTER DATABASE `t` COLLATE = utf8_bin"}, - {"ALTER SCHEMA DEFAULT COLLATE = 'UTF8_BiN'", true, "ALTER DATABASE COLLATE = utf8_bin"}, - {"ALTER SCHEMA `` DEFAULT COLLATE = 'UTF8_BiN'", true, "ALTER DATABASE `` COLLATE = utf8_bin"}, - - {"ALTER DATABASE t CHARSET = 'utf8mb4' COLLATE = 'utf8_bin'", true, "ALTER DATABASE `t` CHARACTER SET = utf8mb4 COLLATE = utf8_bin"}, - { - "ALTER DATABASE t DEFAULT CHARSET = 'utf8mb4' DEFAULT COLLATE = 'utf8mb4_general_ci' CHARACTER SET = 'utf8' COLLATE = 'utf8mb4_bin'", - true, - "ALTER DATABASE `t` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci CHARACTER SET = utf8 COLLATE = utf8mb4_bin", - }, - {"ALTER DATABASE DEFAULT CHARSET = 'utf8mb4' COLLATE = 'utf8_bin'", true, "ALTER DATABASE CHARACTER SET = utf8mb4 COLLATE = utf8_bin"}, - { - "ALTER DATABASE DEFAULT CHARSET = 'utf8mb4' DEFAULT COLLATE = 'utf8mb4_general_ci' CHARACTER SET = 'utf8' COLLATE = 'utf8mb4_bin'", - true, - "ALTER DATABASE CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci CHARACTER SET = utf8 COLLATE = utf8mb4_bin", - }, - - {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED)", true, "ALTER TABLE `t` ADD COLUMN (`a` SMALLINT UNSIGNED)"}, - {"ALTER TABLE t.* ADD COLUMN (a SMALLINT UNSIGNED)", false, ""}, - {"ALTER TABLE t ADD COLUMN IF NOT EXISTS (a SMALLINT UNSIGNED)", true, "ALTER TABLE `t` ADD COLUMN IF NOT EXISTS (`a` SMALLINT UNSIGNED)"}, - {"ALTER TABLE ADD COLUMN (a SMALLINT UNSIGNED)", false, ""}, - {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED, b varchar(255))", true, "ALTER TABLE `t` ADD COLUMN (`a` SMALLINT UNSIGNED, `b` VARCHAR(255))"}, - {"ALTER TABLE t ADD COLUMN IF NOT EXISTS (a SMALLINT UNSIGNED, b varchar(255))", true, "ALTER TABLE `t` ADD COLUMN IF NOT EXISTS (`a` SMALLINT UNSIGNED, `b` VARCHAR(255))"}, - {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED FIRST)", false, ""}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED FIRST", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED FIRST"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED AFTER b", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED AFTER `b`"}, - {"ALTER TABLE t ADD COLUMN IF NOT EXISTS a SMALLINT UNSIGNED AFTER b", true, "ALTER TABLE `t` ADD COLUMN IF NOT EXISTS `a` SMALLINT UNSIGNED AFTER `b`"}, - {"ALTER TABLE employees ADD PARTITION", true, "ALTER TABLE `employees` ADD PARTITION"}, - {"ALTER TABLE employees ADD PARTITION ( PARTITION P1 VALUES LESS THAN (2010))", true, "ALTER TABLE `employees` ADD PARTITION (PARTITION `P1` VALUES LESS THAN (2010))"}, - {"ALTER TABLE employees ADD PARTITION ( PARTITION P2 VALUES LESS THAN MAXVALUE)", true, "ALTER TABLE `employees` ADD PARTITION (PARTITION `P2` VALUES LESS THAN (MAXVALUE))"}, - {"ALTER TABLE employees ADD PARTITION IF NOT EXISTS ( PARTITION P2 VALUES LESS THAN MAXVALUE)", true, "ALTER TABLE `employees` ADD PARTITION IF NOT EXISTS (PARTITION `P2` VALUES LESS THAN (MAXVALUE))"}, - {"ALTER TABLE employees ADD PARTITION IF NOT EXISTS PARTITIONS 5", true, "ALTER TABLE `employees` ADD PARTITION IF NOT EXISTS PARTITIONS 5"}, - {`ALTER TABLE employees ADD PARTITION ( - PARTITION P1 VALUES LESS THAN (2010), - PARTITION P2 VALUES LESS THAN (2015), - PARTITION P3 VALUES LESS THAN MAXVALUE)`, true, "ALTER TABLE `employees` ADD PARTITION (PARTITION `P1` VALUES LESS THAN (2010), PARTITION `P2` VALUES LESS THAN (2015), PARTITION `P3` VALUES LESS THAN (MAXVALUE))"}, - {"alter table t add partition (partition x values in ((3, 4), (5, 6)))", true, "ALTER TABLE `t` ADD PARTITION (PARTITION `x` VALUES IN ((3, 4), (5, 6)))"}, - {"ALTER TABLE employees ADD PARTITION NO_WRITE_TO_BINLOG", true, "ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG"}, - {"ALTER TABLE employees ADD PARTITION NO_WRITE_TO_BINLOG PARTITIONS 10", true, "ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG PARTITIONS 10"}, - // LOCAL is alias to NO_WRITE_TO_BINLOG - {"ALTER TABLE employees ADD PARTITION LOCAL", true, "ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG"}, - {"ALTER TABLE employees ADD PARTITION LOCAL PARTITIONS 10", true, "ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG PARTITIONS 10"}, - - // For rebuild table partition statement. - {"ALTER TABLE t_n REBUILD PARTITION ALL", true, "ALTER TABLE `t_n` REBUILD PARTITION ALL"}, - {"ALTER TABLE d_n.t_n REBUILD PARTITION LOCAL ALL", true, "ALTER TABLE `d_n`.`t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG ALL"}, - {"ALTER TABLE t_n REBUILD PARTITION LOCAL ident", true, "ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `ident`"}, - {"ALTER TABLE t_n REBUILD PARTITION NO_WRITE_TO_BINLOG ident , ident", true, "ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `ident`,`ident`"}, - // The first `LOCAL` should be recognized as unreserved keyword `LOCAL` (alias to `NO_WRITE_TO_BINLOG`), - // and the remains should re recognized as identifier, used as partition name here. - {"ALTER TABLE t_n REBUILD PARTITION LOCAL", false, ""}, - {"ALTER TABLE t_n REBUILD PARTITION LOCAL local", true, "ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `local`"}, - {"ALTER TABLE t_n REBUILD PARTITION LOCAL local, local", true, "ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `local`,`local`"}, - - // For drop table partition statement. - {"alter table t drop partition p1;", true, "ALTER TABLE `t` DROP PARTITION `p1`"}, - {"alter table t drop partition p2;", true, "ALTER TABLE `t` DROP PARTITION `p2`"}, - {"alter table t drop partition if exists p2;", true, "ALTER TABLE `t` DROP PARTITION IF EXISTS `p2`"}, - {"alter table t drop partition p1, p2;", true, "ALTER TABLE `t` DROP PARTITION `p1`,`p2`"}, - {"alter table t drop partition if exists p1, p2;", true, "ALTER TABLE `t` DROP PARTITION IF EXISTS `p1`,`p2`"}, - // For check table partition statement - {"alter table t check partition all;", true, "ALTER TABLE `t` CHECK PARTITION ALL"}, - {"alter table t check partition p;", true, "ALTER TABLE `t` CHECK PARTITION `p`"}, - {"alter table t check partition p1, p2;", true, "ALTER TABLE `t` CHECK PARTITION `p1`,`p2`"}, - {"alter table employees add partition partitions 1;", true, "ALTER TABLE `employees` ADD PARTITION PARTITIONS 1"}, - {"alter table employees add partition partitions 2;", true, "ALTER TABLE `employees` ADD PARTITION PARTITIONS 2"}, - {"alter table clients coalesce partition 3;", true, "ALTER TABLE `clients` COALESCE PARTITION 3"}, - {"alter table clients coalesce partition 4;", true, "ALTER TABLE `clients` COALESCE PARTITION 4"}, - {"alter table clients coalesce partition no_write_to_binlog 4;", true, "ALTER TABLE `clients` COALESCE PARTITION NO_WRITE_TO_BINLOG 4"}, - {"alter table clients coalesce partition local 4;", true, "ALTER TABLE `clients` COALESCE PARTITION NO_WRITE_TO_BINLOG 4"}, - {"ALTER TABLE t DISABLE KEYS", true, "ALTER TABLE `t` DISABLE KEYS"}, - {"ALTER TABLE t ENABLE KEYS", true, "ALTER TABLE `t` ENABLE KEYS"}, - {"ALTER TABLE t MODIFY COLUMN a varchar(255)", true, "ALTER TABLE `t` MODIFY COLUMN `a` VARCHAR(255)"}, - {"ALTER TABLE t MODIFY COLUMN IF EXISTS a varchar(255)", true, "ALTER TABLE `t` MODIFY COLUMN IF EXISTS `a` VARCHAR(255)"}, - {"ALTER TABLE t CHANGE COLUMN a b varchar(255)", true, "ALTER TABLE `t` CHANGE COLUMN `a` `b` VARCHAR(255)"}, - {"ALTER TABLE t CHANGE COLUMN IF EXISTS a b varchar(255)", true, "ALTER TABLE `t` CHANGE COLUMN IF EXISTS `a` `b` VARCHAR(255)"}, - {"ALTER TABLE t CHANGE COLUMN a b varchar(255) CHARACTER SET UTF8 BINARY", true, "ALTER TABLE `t` CHANGE COLUMN `a` `b` VARCHAR(255) BINARY CHARACTER SET UTF8"}, - {"ALTER TABLE t CHANGE COLUMN a b varchar(255) FIRST", true, "ALTER TABLE `t` CHANGE COLUMN `a` `b` VARCHAR(255) FIRST"}, - - // For alter table rename statement. - {"ALTER TABLE db.t RENAME to db1.t1", true, "ALTER TABLE `db`.`t` RENAME AS `db1`.`t1`"}, - {"ALTER TABLE db.t RENAME db1.t1", true, "ALTER TABLE `db`.`t` RENAME AS `db1`.`t1`"}, - {"ALTER TABLE db.t RENAME = db1.t1", true, "ALTER TABLE `db`.`t` RENAME AS `db1`.`t1`"}, - {"ALTER TABLE db.t RENAME as db1.t1", true, "ALTER TABLE `db`.`t` RENAME AS `db1`.`t1`"}, - {"ALTER TABLE t RENAME to t1", true, "ALTER TABLE `t` RENAME AS `t1`"}, - {"ALTER TABLE t RENAME t1", true, "ALTER TABLE `t` RENAME AS `t1`"}, - {"ALTER TABLE t RENAME = t1", true, "ALTER TABLE `t` RENAME AS `t1`"}, - {"ALTER TABLE t RENAME as t1", true, "ALTER TABLE `t` RENAME AS `t1`"}, - - // For #499, alter table order by - {"ALTER TABLE t_n ORDER BY ident", true, "ALTER TABLE `t_n` ORDER BY `ident`"}, - {"ALTER TABLE t_n ORDER BY ident ASC", true, "ALTER TABLE `t_n` ORDER BY `ident`"}, - {"ALTER TABLE t_n ORDER BY ident DESC", true, "ALTER TABLE `t_n` ORDER BY `ident` DESC"}, - {"ALTER TABLE t_n ORDER BY ident1, ident2", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`"}, - {"ALTER TABLE t_n ORDER BY ident1 ASC, ident2", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`"}, - {"ALTER TABLE t_n ORDER BY ident1 ASC, ident2 ASC", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`"}, - {"ALTER TABLE t_n ORDER BY ident1 ASC, ident2 DESC", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2` DESC"}, - {"ALTER TABLE t_n ORDER BY ident1 DESC, ident2", true, "ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2`"}, - {"ALTER TABLE t_n ORDER BY ident1 DESC, ident2 ASC", true, "ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2`"}, - {"ALTER TABLE t_n ORDER BY ident1 DESC, ident2 DESC", true, "ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2` DESC"}, - {"ALTER TABLE t_n ORDER BY ident1, ident2, ident3", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3`"}, - {"ALTER TABLE t_n ORDER BY ident1, ident2, ident3 ASC", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3`"}, - {"ALTER TABLE t_n ORDER BY ident1, ident2, ident3 DESC", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3` DESC"}, - {"ALTER TABLE t_n ORDER BY ident1 ASC, ident2 ASC, ident3 ASC", true, "ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3`"}, - {"ALTER TABLE t_n ORDER BY ident1 DESC, ident2 DESC, ident3 DESC", true, "ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2` DESC,`ident3` DESC"}, - - // For alter table rename column statement. - {"ALTER TABLE t RENAME COLUMN a TO b", true, "ALTER TABLE `t` RENAME COLUMN `a` TO `b`"}, - {"ALTER TABLE t RENAME COLUMN t.a TO t.b", false, ""}, - {"ALTER TABLE t RENAME COLUMN a TO t.b", false, ""}, - {"ALTER TABLE t RENAME COLUMN t.a TO b", false, ""}, - - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT 1", true, "ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT 1"}, - {"ALTER TABLE t ALTER a SET DEFAULT 1", true, "ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT 1"}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT CURRENT_TIMESTAMP", false, ""}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT NOW()", false, ""}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT 1+1", false, ""}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT (CURRENT_TIMESTAMP())", true, "ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT (CURRENT_TIMESTAMP())"}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT (NOW())", true, "ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT (NOW())"}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT (1+1)", true, "ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT (1+1)"}, - {"ALTER TABLE t ALTER COLUMN a SET DEFAULT (1)", true, "ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT 1"}, - {"ALTER TABLE t ALTER COLUMN a DROP DEFAULT", true, "ALTER TABLE `t` ALTER COLUMN `a` DROP DEFAULT"}, - {"ALTER TABLE t ALTER a DROP DEFAULT", true, "ALTER TABLE `t` ALTER COLUMN `a` DROP DEFAULT"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=none", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = NONE"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=default", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = DEFAULT"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=shared", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = SHARED"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=exclusive", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = EXCLUSIVE"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock none", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = NONE"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock default", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = DEFAULT"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock shared", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = SHARED"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock exclusive", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = EXCLUSIVE"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=NONE", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = NONE"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=DEFAULT", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = DEFAULT"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=SHARED", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = SHARED"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=EXCLUSIVE", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = EXCLUSIVE"}, - {"ALTER TABLE t ADD FULLTEXT KEY `FullText` (`name` ASC)", true, "ALTER TABLE `t` ADD FULLTEXT `FullText`(`name`)"}, - {"ALTER TABLE t ADD FULLTEXT `FullText` (`name` ASC)", true, "ALTER TABLE `t` ADD FULLTEXT `FullText`(`name`)"}, - {"ALTER TABLE t ADD FULLTEXT INDEX `FullText` (`name` ASC)", true, "ALTER TABLE `t` ADD FULLTEXT `FullText`(`name`)"}, - {"ALTER TABLE t ADD INDEX (a) USING BTREE COMMENT 'a'", true, "ALTER TABLE `t` ADD INDEX(`a`) USING BTREE COMMENT 'a'"}, - {"ALTER TABLE t ADD INDEX IF NOT EXISTS (a) USING BTREE COMMENT 'a'", true, "ALTER TABLE `t` ADD INDEX IF NOT EXISTS(`a`) USING BTREE COMMENT 'a'"}, - {"ALTER TABLE t ADD INDEX (a) USING RTREE COMMENT 'a'", true, "ALTER TABLE `t` ADD INDEX(`a`) USING RTREE COMMENT 'a'"}, - {"ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = 4", true, "ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = 4"}, - {"ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS 4", true, "ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = 4"}, - {"ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = 'a'", false, ""}, - {"ALTER TABLE t ADD PRIMARY KEY (a) CLUSTERED PRE_SPLIT_REGIONS = 4", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`) CLUSTERED PRE_SPLIT_REGIONS = 4"}, - {"ALTER TABLE t ADD PRIMARY KEY (a) PRE_SPLIT_REGIONS = 4 NONCLUSTERED", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`) NONCLUSTERED PRE_SPLIT_REGIONS = 4"}, - {"ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = (between (1, 'a') and (2, 'b') regions 4);", true, "ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = (BETWEEN (1,_UTF8MB4'a') AND (2,_UTF8MB4'b') REGIONS 4)"}, - {"ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = (by (1, 'a'), (2, 'b'), (3, 'c'));", true, "ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = (BY (1,_UTF8MB4'a'),(2,_UTF8MB4'b'),(3,_UTF8MB4'c'))"}, - {"ALTER TABLE t ADD INDEX (a) comment 'a' PRE_SPLIT_REGIONS = (between (1, 'a') and (2, 'b') regions 4);", true, "ALTER TABLE `t` ADD INDEX(`a`) COMMENT 'a' PRE_SPLIT_REGIONS = (BETWEEN (1,_UTF8MB4'a') AND (2,_UTF8MB4'b') REGIONS 4)"}, - {"CREATE INDEX idx ON t (a, b) pre_split_regions = 100", true, "CREATE INDEX `idx` ON `t` (`a`, `b`) PRE_SPLIT_REGIONS = 100"}, - {"CREATE INDEX idx ON t (a, b) PRE_SPLIT_REGIONS = (between (1, 'a') and (2, 'b') regions 4);", true, "CREATE INDEX `idx` ON `t` (`a`, `b`) PRE_SPLIT_REGIONS = (BETWEEN (1,_UTF8MB4'a') AND (2,_UTF8MB4'b') REGIONS 4)"}, - {"ALTER TABLE t ADD INDEX idx(a) pre_split_regions = 100, ADD INDEX idx2(b) pre_split_regions = (by(1),(2),(3))", true, "ALTER TABLE `t` ADD INDEX `idx`(`a`) PRE_SPLIT_REGIONS = 100, ADD INDEX `idx2`(`b`) PRE_SPLIT_REGIONS = (BY (1),(2),(3))"}, - {"ALTER TABLE t ADD KEY (a) USING HASH COMMENT 'a'", true, "ALTER TABLE `t` ADD INDEX(`a`) USING HASH COMMENT 'a'"}, - {"ALTER TABLE t ADD INDEX (a) USING BTREE /*T![global_index] GLOBAL */ COMMENT 'a'", true, "ALTER TABLE `t` ADD INDEX(`a`) USING BTREE COMMENT 'a' GLOBAL"}, - {"ALTER TABLE t ADD UNIQUE INDEX (a) /*T![global_index] GLOBAL */", true, "ALTER TABLE `t` ADD UNIQUE(`a`) GLOBAL"}, - {"ALTER TABLE t ADD UNIQUE INDEX (a) LOCAL", true, "ALTER TABLE `t` ADD UNIQUE(`a`)"}, - {"ALTER TABLE t ADD KEY IF NOT EXISTS (a) USING HASH COMMENT 'a'", true, "ALTER TABLE `t` ADD INDEX IF NOT EXISTS(`a`) USING HASH COMMENT 'a'"}, - {"ALTER TABLE t ADD PRIMARY KEY ident USING RTREE ( a DESC , b )", true, "ALTER TABLE `t` ADD PRIMARY KEY `ident`(`a` DESC, `b`) USING RTREE"}, - {"ALTER TABLE t ADD KEY USING RTREE ( a ) ", true, "ALTER TABLE `t` ADD INDEX(`a`) USING RTREE"}, - {"ALTER TABLE t ADD KEY USING RTREE ( ident ASC , ident ( 123 ) )", true, "ALTER TABLE `t` ADD INDEX(`ident`, `ident`(123)) USING RTREE"}, - {"ALTER TABLE t ADD PRIMARY KEY (a) COMMENT 'a'", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`) COMMENT 'a'"}, - {"ALTER TABLE t ADD UNIQUE (a) COMMENT 'a'", true, "ALTER TABLE `t` ADD UNIQUE(`a`) COMMENT 'a'"}, - {"ALTER TABLE t ADD UNIQUE KEY (a) COMMENT 'a'", true, "ALTER TABLE `t` ADD UNIQUE(`a`) COMMENT 'a'"}, - {"ALTER TABLE t ADD UNIQUE INDEX (a) COMMENT 'a'", true, "ALTER TABLE `t` ADD UNIQUE(`a`) COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR (a) USING HNSW COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD VECTOR (VEC_COSINE_DISTANCE(a)) USING HNSW COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD VECTOR ((VEC_COSINE_DISTANCE(a))) USING HASH COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD VECTOR ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD VECTOR KEY ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`, `b`))) USING HNSW COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX ((lower(a))) USING HNSW COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX((LOWER(`a`))) USING HNSW COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a), a)) USING HNSW COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD VECTOR INDEX (a, (VEC_COSINE_DISTANCE(a))) USING HNSW COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX(`a`, (VEC_COSINE_DISTANCE(`a`))) USING HNSW COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a))) USING HYPO COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`))) USING HYPO COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a))) COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`))) COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a))) USING HNSW COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`))) USING HNSW COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX IF NOT EXISTS ((VEC_COSINE_DISTANCE(a))) USING HNSW COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX IF NOT EXISTS((VEC_COSINE_DISTANCE(`a`))) USING HNSW COMMENT 'a'"}, - {"ALTER TABLE t ADD VECTOR INDEX IF NOT EXISTS ((VEC_COSINE_DISTANCE(a))) ADD_COLUMNAR_REPLICA_ON_DEMAND USING HNSW COMMENT 'a'", true, "ALTER TABLE `t` ADD VECTOR INDEX IF NOT EXISTS((VEC_COSINE_DISTANCE(`a`))) ADD_COLUMNAR_REPLICA_ON_DEMAND USING HNSW COMMENT 'a'"}, - {"ALTER TABLE t ADD COLUMNAR (a) USING INVERTED COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD COLUMNAR ((a - 1)) USING INVERTED COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD COLUMNAR (a) USING HASH COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD COLUMNAR (a, b) USING INVERTED COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD COLUMNAR KEY (a, b) USING INVERTED COMMENT 'a'", false, ""}, - {"ALTER TABLE t ADD COLUMNAR INDEX (a, b) USING INVERTED COMMENT 'a'", true, "ALTER TABLE `t` ADD COLUMNAR INDEX(`a`, `b`) USING INVERTED COMMENT 'a'"}, - {"ALTER TABLE t ADD COLUMNAR INDEX (a) USING INVERTED COMMENT 'a'", true, "ALTER TABLE `t` ADD COLUMNAR INDEX(`a`) USING INVERTED COMMENT 'a'"}, - {"ALTER TABLE t ADD COLUMNAR INDEX (a) USING HYPO COMMENT 'a'", true, "ALTER TABLE `t` ADD COLUMNAR INDEX(`a`) USING HYPO COMMENT 'a'"}, - {"ALTER TABLE t ADD COLUMNAR INDEX ((a - 1)) USING HYPO COMMENT 'a'", true, "ALTER TABLE `t` ADD COLUMNAR INDEX((`a`-1)) USING HYPO COMMENT 'a'"}, - {"ALTER TABLE t ADD COLUMNAR INDEX IF NOT EXISTS (a) USING INVERTED COMMENT 'a'", true, "ALTER TABLE `t` ADD COLUMNAR INDEX IF NOT EXISTS(`a`) USING INVERTED COMMENT 'a'"}, - {"ALTER TABLE t ADD CONSTRAINT fk_t2_id FOREIGN KEY (t2_id) REFERENCES t(id)", true, "ALTER TABLE `t` ADD CONSTRAINT `fk_t2_id` FOREIGN KEY (`t2_id`) REFERENCES `t`(`id`)"}, - {"ALTER TABLE t ADD CONSTRAINT fk_t2_id FOREIGN KEY IF NOT EXISTS (t2_id) REFERENCES t(id)", true, "ALTER TABLE `t` ADD CONSTRAINT `fk_t2_id` FOREIGN KEY IF NOT EXISTS (`t2_id`) REFERENCES `t`(`id`)"}, - {"ALTER TABLE t ADD CONSTRAINT c_1 CHECK (1+1) NOT ENFORCED, ADD UNIQUE (a)", true, "ALTER TABLE `t` ADD CONSTRAINT `c_1` CHECK(1+1) NOT ENFORCED, ADD UNIQUE(`a`)"}, - {"ALTER TABLE t ADD CONSTRAINT c_1 CHECK (1+1) ENFORCED, ADD UNIQUE (a)", true, "ALTER TABLE `t` ADD CONSTRAINT `c_1` CHECK(1+1) ENFORCED, ADD UNIQUE(`a`)"}, - {"ALTER TABLE t ADD CONSTRAINT c_1 CHECK (1+1), ADD UNIQUE (a)", true, "ALTER TABLE `t` ADD CONSTRAINT `c_1` CHECK(1+1) ENFORCED, ADD UNIQUE(`a`)"}, - {"ALTER TABLE t ENGINE ''", true, "ALTER TABLE `t` ENGINE = ''"}, - {"ALTER TABLE t ENGINE = ''", true, "ALTER TABLE `t` ENGINE = ''"}, - {"ALTER TABLE t ENGINE = 'innodb'", true, "ALTER TABLE `t` ENGINE = innodb"}, - {"ALTER TABLE t ENGINE = innodb", true, "ALTER TABLE `t` ENGINE = innodb"}, - {"ALTER TABLE `db`.`t` ENGINE = ``", true, "ALTER TABLE `db`.`t` ENGINE = ''"}, - {"ALTER TABLE t INSERT_METHOD = FIRST", true, "ALTER TABLE `t` INSERT_METHOD = FIRST"}, - {"ALTER TABLE t INSERT_METHOD LAST", true, "ALTER TABLE `t` INSERT_METHOD = LAST"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, ADD COLUMN a SMALLINT", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, ADD COLUMN `a` SMALLINT"}, - {"ALTER TABLE t ADD COLUMN a SMALLINT, ENGINE = '', default COLLATE = UTF8_GENERAL_CI", true, "ALTER TABLE `t` ADD COLUMN `a` SMALLINT, ENGINE = '', DEFAULT COLLATE = UTF8_GENERAL_CI"}, - {"ALTER TABLE t ENGINE = '', COMMENT='', default COLLATE = UTF8_GENERAL_CI", true, "ALTER TABLE `t` ENGINE = '', COMMENT = '', DEFAULT COLLATE = UTF8_GENERAL_CI"}, - {"ALTER TABLE t ENGINE = '', ADD COLUMN a SMALLINT", true, "ALTER TABLE `t` ENGINE = '', ADD COLUMN `a` SMALLINT"}, - {"ALTER TABLE t default COLLATE = UTF8_GENERAL_CI, ENGINE = '', ADD COLUMN a SMALLINT", true, "ALTER TABLE `t` DEFAULT COLLATE = UTF8_GENERAL_CI, ENGINE = '', ADD COLUMN `a` SMALLINT"}, - {"ALTER TABLE t shard_row_id_bits = 1", true, "ALTER TABLE `t` SHARD_ROW_ID_BITS = 1"}, - {"ALTER TABLE t AUTO_INCREMENT 3", true, "ALTER TABLE `t` AUTO_INCREMENT = 3"}, - {"ALTER TABLE t AUTO_INCREMENT = 3", true, "ALTER TABLE `t` AUTO_INCREMENT = 3"}, - {"ALTER TABLE t FORCE AUTO_INCREMENT 3", true, "ALTER TABLE `t` FORCE AUTO_INCREMENT = 3"}, - {"ALTER TABLE t FORCE AUTO_INCREMENT = 3", true, "ALTER TABLE `t` FORCE AUTO_INCREMENT = 3"}, - {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL , ALGORITHM = DEFAULT;", true, "ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = DEFAULT"}, - {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL , ALGORITHM = INPLACE;", true, "ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = INPLACE"}, - {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL , ALGORITHM = COPY;", true, "ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = COPY"}, - {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL, ALGORITHM = INSTANT;", true, "ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = INSTANT"}, - {"ALTER TABLE t CONVERT TO CHARACTER SET UTF8;", true, "ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8"}, - {"ALTER TABLE t CONVERT TO CHARSET UTF8;", true, "ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8"}, - {"ALTER TABLE t CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_BIN;", true, "ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_BIN"}, - {"ALTER TABLE t CONVERT TO CHARSET UTF8 COLLATE UTF8_BIN;", true, "ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_BIN"}, - - // alter table convert to character set default, issue #498 - {"alter table d_n.t_n convert to character set default", true, "ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT"}, - {"alter table d_n.t_n convert to charset default", true, "ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT"}, - {"alter table d_n.t_n convert to char set default", true, "ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT"}, - {"alter table d_n.t_n convert to character set default collate utf8mb4_0900_ai_ci", true, "ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT COLLATE UTF8MB4_0900_AI_CI"}, - - {"ALTER TABLE t FORCE", true, "ALTER TABLE `t` FORCE /* AlterTableForce is not supported */ "}, - {"ALTER TABLE t DROP INDEX;", false, "ALTER TABLE `t` DROP INDEX"}, - {"ALTER TABLE t DROP INDEX a", true, "ALTER TABLE `t` DROP INDEX `a`"}, - {"ALTER TABLE t DROP INDEX IF EXISTS a", true, "ALTER TABLE `t` DROP INDEX IF EXISTS `a`"}, - - // For alter table alter index statement - {"ALTER TABLE t ALTER INDEX a INVISIBLE", true, "ALTER TABLE `t` ALTER INDEX `a` INVISIBLE"}, - {"ALTER TABLE t ALTER INDEX a VISIBLE", true, "ALTER TABLE `t` ALTER INDEX `a` VISIBLE"}, - - {"ALTER TABLE t DROP FOREIGN KEY a", true, "ALTER TABLE `t` DROP FOREIGN KEY `a`"}, - {"ALTER TABLE t DROP COLUMN a CASCADE", true, "ALTER TABLE `t` DROP COLUMN `a`"}, - {"ALTER TABLE t DROP COLUMN IF EXISTS a CASCADE", true, "ALTER TABLE `t` DROP COLUMN IF EXISTS `a`"}, - {`ALTER TABLE testTableCompression COMPRESSION="LZ4";`, true, "ALTER TABLE `testTableCompression` COMPRESSION = 'LZ4'"}, - {`ALTER TABLE t1 COMPRESSION="zlib";`, true, "ALTER TABLE `t1` COMPRESSION = 'zlib'"}, - {"ALTER TABLE t1", true, "ALTER TABLE `t1`"}, - {"ALTER TABLE t1 ,", false, ""}, - - // For #6405 - {"ALTER TABLE t RENAME KEY a TO b;", true, "ALTER TABLE `t` RENAME INDEX `a` TO `b`"}, - {"ALTER TABLE t RENAME INDEX a TO b;", true, "ALTER TABLE `t` RENAME INDEX `a` TO `b`"}, - - // For #497, support `ALTER TABLE ALTER CHECK` and `ALTER TABLE DROP CHECK` syntax - {"ALTER TABLE d_n.t_n DROP CHECK ident;", true, "ALTER TABLE `d_n`.`t_n` DROP CHECK `ident`"}, - {"ALTER TABLE t_n LOCK = DEFAULT , DROP CHECK ident;", true, "ALTER TABLE `t_n` LOCK = DEFAULT, DROP CHECK `ident`"}, - {"ALTER TABLE t_n ALTER CHECK ident ENFORCED;", true, "ALTER TABLE `t_n` ALTER CHECK `ident` ENFORCED"}, - {"ALTER TABLE t_n ALTER CHECK ident NOT ENFORCED;", true, "ALTER TABLE `t_n` ALTER CHECK `ident` NOT ENFORCED"}, - {"ALTER TABLE t_n DROP CONSTRAINT ident", true, "ALTER TABLE `t_n` DROP CHECK `ident`"}, - {"ALTER TABLE t_n DROP CHECK ident", true, "ALTER TABLE `t_n` DROP CHECK `ident`"}, - {"ALTER TABLE t_n ALTER CONSTRAINT ident", false, ""}, - {"ALTER TABLE t_n ALTER CONSTRAINT ident enforced", true, "ALTER TABLE `t_n` ALTER CHECK `ident` ENFORCED"}, - {"ALTER TABLE t_n ALTER CHECK ident not enforced", true, "ALTER TABLE `t_n` ALTER CHECK `ident` NOT ENFORCED"}, - - {"alter table t analyze partition a", true, "ANALYZE TABLE `t` PARTITION `a`"}, - {"alter table t analyze partition a with 4 buckets", true, "ANALYZE TABLE `t` PARTITION `a` WITH 4 BUCKETS"}, - {"alter table t analyze partition a index b", true, "ANALYZE TABLE `t` PARTITION `a` INDEX `b`"}, - {"alter table t analyze partition a index b with 4 buckets", true, "ANALYZE TABLE `t` PARTITION `a` INDEX `b` WITH 4 BUCKETS"}, - - {"alter table t partition by hash(a)", true, "ALTER TABLE `t` PARTITION BY HASH (`a`) PARTITIONS 1"}, - {"alter table t add column a int partition by hash(a)", true, "ALTER TABLE `t` ADD COLUMN `a` INT PARTITION BY HASH (`a`) PARTITIONS 1"}, - {"alter table t add column a int partition by hash(a) update indexes (idx_a global)", true, "ALTER TABLE `t` ADD COLUMN `a` INT PARTITION BY HASH (`a`) PARTITIONS 1 UPDATE INDEXES (`idx_a` GLOBAL)"}, - {"alter table t add column a int partition by hash(a) update indexes (idx_a global, idx_b local)", true, "ALTER TABLE `t` ADD COLUMN `a` INT PARTITION BY HASH (`a`) PARTITIONS 1 UPDATE INDEXES (`idx_a` GLOBAL,`idx_b` LOCAL)"}, - {"alter table t add column a int partition by hash(a) update indexes (idx_a normal)", false, ""}, - {"alter table t add column a int partition by hash(a) update indexes (global)", false, ""}, - {"alter table t partition by range(a)", false, ""}, - {"alter table t partition by range(a) update indexes (a local)", false, ""}, - {"alter table t partition by range(a) (partition x values less than (75))", true, "ALTER TABLE `t` PARTITION BY RANGE (`a`) (PARTITION `x` VALUES LESS THAN (75))"}, - {"alter table t add column a int, partition by range(a) (partition x values less than (75))", false, ""}, - {"alter table t comment 'cmt' partition by hash(a)", true, "ALTER TABLE `t` COMMENT = 'cmt' PARTITION BY HASH (`a`) PARTITIONS 1"}, - {"alter table t enable keys, comment = 'cmt' partition by hash(a)", true, "ALTER TABLE `t` ENABLE KEYS, COMMENT = 'cmt' PARTITION BY HASH (`a`) PARTITIONS 1"}, - {"alter table t enable keys, comment = 'cmt', partition by hash(a)", false, ""}, - {"alter table t partition by hash(a) enable keys", false, ""}, - {"alter table t partition by hash(a), enable keys", false, ""}, - - // Test keyword `FIELDS` - {"alter table t partition by range FIELDS(a) (partition x values less than maxvalue)", true, "ALTER TABLE `t` PARTITION BY RANGE COLUMNS (`a`) (PARTITION `x` VALUES LESS THAN (MAXVALUE))"}, - {"alter table t partition by list FIELDS(a) (PARTITION p0 VALUES IN (5, 10, 15))", true, "ALTER TABLE `t` PARTITION BY LIST COLUMNS (`a`) (PARTITION `p0` VALUES IN (5, 10, 15))"}, - {"alter table t partition by range FIELDS(a,b,c) (partition p1 values less than (1,1,1));", true, "ALTER TABLE `t` PARTITION BY RANGE COLUMNS (`a`,`b`,`c`) (PARTITION `p1` VALUES LESS THAN (1, 1, 1))"}, - {"alter table t partition by list FIELDS(a,b,c) (PARTITION p0 VALUES IN ((5, 10, 15)))", true, "ALTER TABLE `t` PARTITION BY LIST COLUMNS (`a`,`b`,`c`) (PARTITION `p0` VALUES IN ((5, 10, 15)))"}, - - {"alter table t with validation, add column b int as (a + 1)", true, "ALTER TABLE `t` WITH VALIDATION, ADD COLUMN `b` INT GENERATED ALWAYS AS(`a`+1) VIRTUAL"}, - {"alter table t without validation, add column b int as (a + 1)", true, "ALTER TABLE `t` WITHOUT VALIDATION, ADD COLUMN `b` INT GENERATED ALWAYS AS(`a`+1) VIRTUAL"}, - {"alter table t without validation, with validation, add column b int as (a + 1)", true, "ALTER TABLE `t` WITHOUT VALIDATION, WITH VALIDATION, ADD COLUMN `b` INT GENERATED ALWAYS AS(`a`+1) VIRTUAL"}, - {"alter table t with validation, modify column b int as (a + 2) ", true, "ALTER TABLE `t` WITH VALIDATION, MODIFY COLUMN `b` INT GENERATED ALWAYS AS(`a`+2) VIRTUAL"}, - {"alter table t with validation, change column b c int as (a + 2)", true, "ALTER TABLE `t` WITH VALIDATION, CHANGE COLUMN `b` `c` INT GENERATED ALWAYS AS(`a`+2) VIRTUAL"}, - - {"ALTER TABLE d_n.t_n ADD PARTITION NO_WRITE_TO_BINLOG", true, "ALTER TABLE `d_n`.`t_n` ADD PARTITION NO_WRITE_TO_BINLOG"}, - {"ALTER TABLE d_n.t_n ADD PARTITION LOCAL", true, "ALTER TABLE `d_n`.`t_n` ADD PARTITION NO_WRITE_TO_BINLOG"}, - - {"alter table t with validation, exchange partition p with table nt without validation;", true, "ALTER TABLE `t` WITH VALIDATION, EXCHANGE PARTITION `p` WITH TABLE `nt` WITHOUT VALIDATION"}, - {"alter table t exchange partition p with table nt with validation;", true, "ALTER TABLE `t` EXCHANGE PARTITION `p` WITH TABLE `nt`"}, - - // For reorganize partition statement - {"alter table t reorganize partition;", true, "ALTER TABLE `t` REORGANIZE PARTITION"}, - {"alter table t reorganize partition local;", true, "ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG"}, - {"alter table t reorganize partition no_write_to_binlog;", true, "ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG"}, - {"ALTER TABLE members REORGANIZE PARTITION n0 INTO (PARTITION s0 VALUES LESS THAN (1960), PARTITION s1 VALUES LESS THAN (1970));", true, "ALTER TABLE `members` REORGANIZE PARTITION `n0` INTO (PARTITION `s0` VALUES LESS THAN (1960), PARTITION `s1` VALUES LESS THAN (1970))"}, - {"ALTER TABLE members REORGANIZE PARTITION LOCAL n0 INTO (PARTITION s0 VALUES LESS THAN (1960), PARTITION s1 VALUES LESS THAN (1970));", true, "ALTER TABLE `members` REORGANIZE PARTITION NO_WRITE_TO_BINLOG `n0` INTO (PARTITION `s0` VALUES LESS THAN (1960), PARTITION `s1` VALUES LESS THAN (1970))"}, - {"ALTER TABLE members REORGANIZE PARTITION p1,p2,p3 INTO ( PARTITION s0 VALUES LESS THAN (1960), PARTITION s1 VALUES LESS THAN (1970));", true, "ALTER TABLE `members` REORGANIZE PARTITION `p1`,`p2`,`p3` INTO (PARTITION `s0` VALUES LESS THAN (1960), PARTITION `s1` VALUES LESS THAN (1970))"}, - {"alter table t reorganize partition remove partition;", false, ""}, - {"alter table t reorganize partition no_write_to_binlog remove into (partition p0 VALUES LESS THAN (1991));", true, "ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG `remove` INTO (PARTITION `p0` VALUES LESS THAN (1991))"}, - - // alter attributes - {"ALTER TABLE t ATTRIBUTES='str'", true, "ALTER TABLE `t` ATTRIBUTES='str'"}, - {"ALTER TABLE t ATTRIBUTES='str1,str2'", true, "ALTER TABLE `t` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t ATTRIBUTES=\"str1,str2\"", true, "ALTER TABLE `t` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t ATTRIBUTES 'str1,str2'", true, "ALTER TABLE `t` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t ATTRIBUTES \"str1,str2\"", true, "ALTER TABLE `t` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t ATTRIBUTES=DEFAULT", true, "ALTER TABLE `t` ATTRIBUTES=DEFAULT"}, - {"ALTER TABLE t ATTRIBUTES=default", true, "ALTER TABLE `t` ATTRIBUTES=DEFAULT"}, - {"ALTER TABLE t ATTRIBUTES=DeFaUlT", true, "ALTER TABLE `t` ATTRIBUTES=DEFAULT"}, - {"ALTER TABLE t ATTRIBUTES", false, ""}, - {"ALTER TABLE t PARTITION p ATTRIBUTES='str'", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str'"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES='str1,str2'", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES=\"str1,str2\"", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES 'str1,str2'", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES \"str1,str2\"", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2'"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES=DEFAULT", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES=DEFAULT"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES=default", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES=DEFAULT"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES=DeFaUlT", true, "ALTER TABLE `t` PARTITION `p` ATTRIBUTES=DEFAULT"}, - {"ALTER TABLE t PARTITION p ATTRIBUTES", false, ""}, - // For https://github.com/pingcap/tidb/issues/26778 - {"CREATE TABLE t1 (attributes int);", true, "CREATE TABLE `t1` (`attributes` INT)"}, - - // For create index statement - {"CREATE INDEX idx ON t (a)", true, "CREATE INDEX `idx` ON `t` (`a`)"}, - {"CREATE INDEX IF NOT EXISTS idx ON t (a)", true, "CREATE INDEX IF NOT EXISTS `idx` ON `t` (`a`)"}, - {"CREATE UNIQUE INDEX idx ON t (a)", true, "CREATE UNIQUE INDEX `idx` ON `t` (`a`)"}, - {"CREATE UNIQUE INDEX IF NOT EXISTS idx ON t (a)", true, "CREATE UNIQUE INDEX IF NOT EXISTS `idx` ON `t` (`a`)"}, - {"CREATE UNIQUE INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE BTREE", true, "CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING BTREE"}, - {"CREATE UNIQUE INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE HASH", true, "CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING HASH"}, - {"CREATE UNIQUE INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE RTREE", true, "CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING RTREE"}, - {"CREATE UNIQUE INDEX ident TYPE BTREE ON d_n.t_n ( ident , ident ASC )", true, "CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING BTREE"}, - {"CREATE UNIQUE INDEX ident USING BTREE ON d_n.t_n ( ident , ident ASC )", true, "CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING BTREE"}, - {"CREATE SPATIAL INDEX idx ON t (a)", true, "CREATE SPATIAL INDEX `idx` ON `t` (`a`)"}, - {"CREATE SPATIAL INDEX IF NOT EXISTS idx ON t (a)", true, "CREATE SPATIAL INDEX IF NOT EXISTS `idx` ON `t` (`a`)"}, - {"CREATE FULLTEXT INDEX idx ON t (a)", true, "CREATE FULLTEXT INDEX `idx` ON `t` (`a`)"}, - {"CREATE FULLTEXT INDEX IF NOT EXISTS idx ON t (a)", true, "CREATE FULLTEXT INDEX IF NOT EXISTS `idx` ON `t` (`a`)"}, - {"CREATE FULLTEXT INDEX idx ON t (a) WITH PARSER ident", true, "CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident`"}, - {"CREATE FULLTEXT INDEX idx ON t (a) WITH PARSER ident comment 'string'", true, "CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` COMMENT 'string'"}, - {"CREATE FULLTEXT INDEX idx ON t (a) comment 'string' with parser ident", true, "CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` COMMENT 'string'"}, - {"CREATE FULLTEXT INDEX idx ON t (a) WITH PARSER ident comment 'string' lock default", true, "CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` COMMENT 'string'"}, - {"CREATE INDEX idx ON t (a) USING HASH", true, "CREATE INDEX `idx` ON `t` (`a`) USING HASH"}, - {"CREATE INDEX idx ON t (a) COMMENT 'foo'", true, "CREATE INDEX `idx` ON `t` (`a`) COMMENT 'foo'"}, - {"CREATE INDEX idx ON t (a) USING HASH COMMENT 'foo'", true, "CREATE INDEX `idx` ON `t` (`a`) USING HASH COMMENT 'foo'"}, - {"CREATE INDEX idx ON t (a) LOCK=NONE", true, "CREATE INDEX `idx` ON `t` (`a`) LOCK = NONE"}, - {"CREATE INDEX idx USING BTREE ON t (a) USING HASH COMMENT 'foo'", true, "CREATE INDEX `idx` ON `t` (`a`) USING HASH COMMENT 'foo'"}, - {"CREATE INDEX idx USING BTREE ON t (a)", true, "CREATE INDEX `idx` ON `t` (`a`) USING BTREE"}, - {"CREATE INDEX idx ON t ( a ) VISIBLE", true, "CREATE INDEX `idx` ON `t` (`a`) VISIBLE"}, - {"CREATE INDEX idx ON t ( a ) INVISIBLE", true, "CREATE INDEX `idx` ON `t` (`a`) INVISIBLE"}, - {"CREATE INDEX idx ON t ( a ) INVISIBLE VISIBLE", true, "CREATE INDEX `idx` ON `t` (`a`) VISIBLE"}, - {"CREATE INDEX idx ON t ( a ) VISIBLE INVISIBLE", true, "CREATE INDEX `idx` ON `t` (`a`) INVISIBLE"}, - {"CREATE INDEX idx ON t ( a ) USING HASH VISIBLE", true, "CREATE INDEX `idx` ON `t` (`a`) USING HASH VISIBLE"}, - {"CREATE INDEX idx ON t ( a ) USING HASH INVISIBLE", true, "CREATE INDEX `idx` ON `t` (`a`) USING HASH INVISIBLE"}, - - // For create vector index statement - {"CREATE VECTOR INDEX idx ON t (a) USING HNSW ", true, "CREATE VECTOR INDEX `idx` ON `t` (`a`) USING HNSW"}, - {"CREATE VECTOR INDEX idx ON t (a, b) USING HNSW ", true, "CREATE VECTOR INDEX `idx` ON `t` (`a`, `b`) USING HNSW"}, - {"CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a)))", true, "CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`)))"}, - {"CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a))) TYPE BTREE", true, "CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING BTREE"}, - {"CREATE VECTOR INDEX idx ON t USING HNSW ((VEC_COSINE_DISTANCE(a)))", false, ""}, - {"CREATE VECTOR idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW", false, ""}, - {"CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a)), a) USING HNSW", true, "CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`)), `a`) USING HNSW"}, - {"CREATE VECTOR INDEX idx ON t (a, (VEC_COSINE_DISTANCE(a))) USING HNSW", true, "CREATE VECTOR INDEX `idx` ON `t` (`a`, (VEC_COSINE_DISTANCE(`a`))) USING HNSW"}, - {"CREATE VECTOR KEY idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW", false, ""}, - {"CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW", true, "CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW"}, - {"CREATE VECTOR INDEX IF NOT EXISTS idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW", true, "CREATE VECTOR INDEX IF NOT EXISTS `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW"}, - {"CREATE VECTOR INDEX IF NOT EXISTS idx ON t ((VEC_COSINE_DISTANCE(a))) TYPE HNSW", true, "CREATE VECTOR INDEX IF NOT EXISTS `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW"}, - {"CREATE VECTOR INDEX ident TYPE HNSW ON d_n.t_n ((VEC_COSINE_DISTANCE(a)))", true, "CREATE VECTOR INDEX `ident` ON `d_n`.`t_n` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW"}, - {"CREATE VECTOR INDEX idx USING HNSW ON t ((VEC_COSINE_DISTANCE(a)))", true, "CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW"}, - {"CREATE VECTOR INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE HNSW", true, "CREATE VECTOR INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING HNSW"}, - {"CREATE UNIQUE INDEX ident USING HNSW ON d_n.t_n ( ident , ident ASC )", true, "CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING HNSW"}, - - // For create index with algorithm - {"CREATE INDEX idx ON t ( a ) ALGORITHM = DEFAULT", true, "CREATE INDEX `idx` ON `t` (`a`)"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM DEFAULT", true, "CREATE INDEX `idx` ON `t` (`a`)"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM = INPLACE", true, "CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM INPLACE", true, "CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM = COPY", true, "CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = COPY"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM COPY", true, "CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = COPY"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM = DEFAULT LOCK = DEFAULT", true, "CREATE INDEX `idx` ON `t` (`a`)"}, - {"CREATE INDEX idx ON t ( a ) LOCK = DEFAULT ALGORITHM = DEFAULT", true, "CREATE INDEX `idx` ON `t` (`a`)"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM = INPLACE LOCK = EXCLUSIVE", true, "CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE LOCK = EXCLUSIVE"}, - {"CREATE INDEX idx ON t ( a ) LOCK = EXCLUSIVE ALGORITHM = INPLACE", true, "CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE LOCK = EXCLUSIVE"}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM = ident", false, ""}, - {"CREATE INDEX idx ON t ( a ) ALGORITHM ident", false, ""}, - - // For dorp index statement - {"drop index a on t", true, "DROP INDEX `a` ON `t`"}, - {"drop index a on db.t", true, "DROP INDEX `a` ON `db`.`t`"}, - {"drop index a on db.`tb-ttb`", true, "DROP INDEX `a` ON `db`.`tb-ttb`"}, - {"drop index if exists a on t", true, "DROP INDEX IF EXISTS `a` ON `t`"}, - {"drop index if exists a on db.t", true, "DROP INDEX IF EXISTS `a` ON `db`.`t`"}, - {"drop index if exists a on db.`tb-ttb`", true, "DROP INDEX IF EXISTS `a` ON `db`.`tb-ttb`"}, - {"drop index idx on t algorithm = default", true, "DROP INDEX `idx` ON `t`"}, - {"drop index idx on t algorithm default", true, "DROP INDEX `idx` ON `t`"}, - {"drop index idx on t algorithm = inplace", true, "DROP INDEX `idx` ON `t` ALGORITHM = INPLACE"}, - {"drop index idx on t algorithm inplace", true, "DROP INDEX `idx` ON `t` ALGORITHM = INPLACE"}, - {"drop index idx on t lock = default", true, "DROP INDEX `idx` ON `t`"}, - {"drop index idx on t lock default", true, "DROP INDEX `idx` ON `t`"}, - {"drop index idx on t lock = shared", true, "DROP INDEX `idx` ON `t` LOCK = SHARED"}, - {"drop index idx on t lock shared", true, "DROP INDEX `idx` ON `t` LOCK = SHARED"}, - {"drop index idx on t algorithm = default lock = default", true, "DROP INDEX `idx` ON `t`"}, - {"drop index idx on t lock = default algorithm = default", true, "DROP INDEX `idx` ON `t`"}, - {"drop index idx on t algorithm = inplace lock = exclusive", true, "DROP INDEX `idx` ON `t` ALGORITHM = INPLACE LOCK = EXCLUSIVE"}, - {"drop index idx on t lock = exclusive algorithm = inplace", true, "DROP INDEX `idx` ON `t` ALGORITHM = INPLACE LOCK = EXCLUSIVE"}, - {"drop index idx on t algorithm = algorithm_type", false, ""}, - {"drop index idx on t algorithm algorithm_type", false, ""}, - {"drop index idx on t lock = lock_type", false, ""}, - {"drop index idx on t lock lock_type", false, ""}, - - // for rename table statement - {"RENAME TABLE t TO t1", true, "RENAME TABLE `t` TO `t1`"}, - {"RENAME TABLE t t1", false, "RENAME TABLE `t` TO `t1`"}, - {"RENAME TABLE d.t TO d1.t1", true, "RENAME TABLE `d`.`t` TO `d1`.`t1`"}, - {"RENAME TABLE t1 TO t2, t3 TO t4", true, "RENAME TABLE `t1` TO `t2`, `t3` TO `t4`"}, - - // for truncate statement - {"TRUNCATE TABLE t1", true, "TRUNCATE TABLE `t1`"}, - {"TRUNCATE t1", true, "TRUNCATE TABLE `t1`"}, - - // for empty alert table index - {"ALTER TABLE t ADD INDEX () ", false, ""}, - {"ALTER TABLE t ADD UNIQUE ()", false, ""}, - {"ALTER TABLE t ADD UNIQUE INDEX ()", false, ""}, - {"ALTER TABLE t ADD UNIQUE KEY ()", false, ""}, - - // for keyword `SECONDARY_LOAD`, `SECONDARY_UNLOAD` - {"ALTER TABLE d_n.t_n SECONDARY_LOAD", true, "ALTER TABLE `d_n`.`t_n` SECONDARY_LOAD"}, - {"ALTER TABLE d_n.t_n SECONDARY_UNLOAD", true, "ALTER TABLE `d_n`.`t_n` SECONDARY_UNLOAD"}, - {"ALTER TABLE t_n LOCK = DEFAULT , SECONDARY_LOAD", true, "ALTER TABLE `t_n` LOCK = DEFAULT, SECONDARY_LOAD"}, - {"ALTER TABLE d_n.t_n ALGORITHM = DEFAULT , SECONDARY_LOAD", true, "ALTER TABLE `d_n`.`t_n` ALGORITHM = DEFAULT, SECONDARY_LOAD"}, - {"ALTER TABLE d_n.t_n ALGORITHM = DEFAULT , SECONDARY_UNLOAD", true, "ALTER TABLE `d_n`.`t_n` ALGORITHM = DEFAULT, SECONDARY_UNLOAD"}, - - // for issue 4538 - {"create table a (process double)", true, "CREATE TABLE `a` (`process` DOUBLE)"}, - - // for issue 4740 - {"create table t (a int1, b int2, c int3, d int4, e int8)", true, "CREATE TABLE `t` (`a` TINYINT,`b` SMALLINT,`c` MEDIUMINT,`d` INT,`e` BIGINT)"}, - - // for issue 5918 - {"create table t (lv long varchar null)", true, "CREATE TABLE `t` (`lv` MEDIUMTEXT NULL)"}, - - // special table name - {"CREATE TABLE cdp_test.`test2-1` (id int(11) DEFAULT NULL,key(id));", true, "CREATE TABLE `cdp_test`.`test2-1` (`id` INT(11) DEFAULT NULL,INDEX(`id`))"}, - {"CREATE TABLE miantiao (`扁豆焖面` INT(11));", true, "CREATE TABLE `miantiao` (`扁豆焖面` INT(11))"}, - - // for create table select - {"CREATE TABLE bar (m INT) SELECT n FROM foo;", true, "CREATE TABLE `bar` (`m` INT) AS SELECT `n` FROM `foo`"}, - {"CREATE TABLE bar (m INT) IGNORE SELECT n FROM foo;", true, "CREATE TABLE `bar` (`m` INT) IGNORE AS SELECT `n` FROM `foo`"}, - {"CREATE TABLE bar (m INT) REPLACE SELECT n FROM foo;", true, "CREATE TABLE `bar` (`m` INT) REPLACE AS SELECT `n` FROM `foo`"}, - - // for generated column definition - {"create table t (a timestamp, b timestamp as (a) not null on update current_timestamp);", false, ""}, - {"create table t (a bigint, b bigint as (a) primary key auto_increment);", false, ""}, - {"create table t (a bigint, b bigint as (a) not null default 10);", false, ""}, - {"create table t (a bigint, b bigint as (a+1) not null);", true, "CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL)"}, - {"create table t (a bigint, b bigint as (a+1) not null);", true, "CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL)"}, - {"create table t (a bigint, b bigint as (a+1) not null comment 'ttt');", true, "CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL COMMENT 'ttt')"}, - {"create table t(a int, index idx((cast(a as binary(1)))));", true, "CREATE TABLE `t` (`a` INT,INDEX `idx`((CAST(`a` AS BINARY(1)))))"}, - {"alter table t add column (f timestamp as (a+1) default '2019-01-01 11:11:11');", false, ""}, - {"alter table t modify column f int as (a+1) default 55;", false, ""}, - - // for column format - {"create table t (a int column_format fixed)", true, "CREATE TABLE `t` (`a` INT COLUMN_FORMAT FIXED)"}, - {"create table t (a int column_format default)", true, "CREATE TABLE `t` (`a` INT COLUMN_FORMAT DEFAULT)"}, - {"create table t (a int column_format dynamic)", true, "CREATE TABLE `t` (`a` INT COLUMN_FORMAT DYNAMIC)"}, - {"alter table t modify column a bigint column_format default", true, "ALTER TABLE `t` MODIFY COLUMN `a` BIGINT COLUMN_FORMAT DEFAULT"}, - - // for recover table - {"recover table by job 11", true, "RECOVER TABLE BY JOB 11"}, - {"recover table by job 11,12,13", false, ""}, - {"recover table by job", false, ""}, - {"recover table by job 0", true, "RECOVER TABLE BY JOB 0"}, - {"recover table t1", true, "RECOVER TABLE `t1`"}, - {"recover table t1,t2", false, ""}, - {"recover table ", false, ""}, - {"recover table t1 100", true, "RECOVER TABLE `t1` 100"}, - {"recover table t1 abc", false, ""}, - - // for flashback table. - {"flashback table t", true, "FLASHBACK TABLE `t`"}, - {"flashback table t TO t1", true, "FLASHBACK TABLE `t` TO `t1`"}, - {"flashback table t TO timestamp", true, "FLASHBACK TABLE `t` TO `timestamp`"}, - - // for flashback database. - {"flashback database db1", true, "FLASHBACK DATABASE `db1`"}, - {"flashback schema db1", true, "FLASHBACK DATABASE `db1`"}, - {"flashback database db1 to db2", true, "FLASHBACK DATABASE `db1` TO `db2`"}, - {"flashback schema db1 to db2", true, "FLASHBACK DATABASE `db1` TO `db2`"}, - - // for flashback to timestamp - {"flashback cluster to timestamp '2021-05-26 16:45:26'", true, "FLASHBACK CLUSTER TO TIMESTAMP '2021-05-26 16:45:26'"}, - {"flashback table t to timestamp '2021-05-26 16:45:26'", true, "FLASHBACK TABLE `t` TO TIMESTAMP '2021-05-26 16:45:26'"}, - {"flashback table t,t1 to timestamp '2021-05-26 16:45:26'", true, "FLASHBACK TABLE `t`, `t1` TO TIMESTAMP '2021-05-26 16:45:26'"}, - {"flashback database test to timestamp '2021-05-26 16:45:26'", true, "FLASHBACK DATABASE `test` TO TIMESTAMP '2021-05-26 16:45:26'"}, - {"flashback schema test to timestamp '2021-05-26 16:45:26'", true, "FLASHBACK DATABASE `test` TO TIMESTAMP '2021-05-26 16:45:26'"}, - {"flashback cluster to timestamp TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())", false, ""}, - {"flashback cluster to timestamp DATE_SUB(NOW(), INTERVAL 3 SECOND)", false, ""}, - {"flashback table to timestamp '2021-05-26 16:45:26'", false, ""}, - {"flashback database to timestamp '2021-05-26 16:45:26'", false, ""}, - - // for flashback to tso - {"flashback cluster to tso 445494955052105721", true, "FLASHBACK CLUSTER TO TSO 445494955052105721"}, - {"flashback table t to tso 445494955052105722", true, "FLASHBACK TABLE `t` TO TSO 445494955052105722"}, - {"flashback table t,t1 to tso 445494955052105723", true, "FLASHBACK TABLE `t`, `t1` TO TSO 445494955052105723"}, - {"flashback database test to tso 445494955052105724", true, "FLASHBACK DATABASE `test` TO TSO 445494955052105724"}, - {"flashback schema test to tso 445494955052105725", true, "FLASHBACK DATABASE `test` TO TSO 445494955052105725"}, - {"flashback table to tso 445494955052105726", false, ""}, - {"flashback database to tso 445494955052105727", false, ""}, - {"flashback schema test to tso 0", false, ""}, - {"flashback schema test to tso -100", false, ""}, - - // for remove partitioning - {"alter table t remove partitioning", true, "ALTER TABLE `t` REMOVE PARTITIONING"}, - {"alter table db.ident remove partitioning", true, "ALTER TABLE `db`.`ident` REMOVE PARTITIONING"}, - {"alter table t lock = default remove partitioning", true, "ALTER TABLE `t` LOCK = DEFAULT REMOVE PARTITIONING"}, - {"alter table t add column a int remove partitioning", true, "ALTER TABLE `t` ADD COLUMN `a` INT REMOVE PARTITIONING"}, - {"alter table t add column a int, add index (c) remove partitioning", true, "ALTER TABLE `t` ADD COLUMN `a` INT, ADD INDEX(`c`) REMOVE PARTITIONING"}, - {"alter table t add column a int, remove partitioning", false, ""}, - {"alter table t add column a int, add index (c), remove partitioning", false, ""}, - {"alter table t remove partitioning add column a int", false, ""}, - {"alter table t remove partitioning, add column a int", false, ""}, - - // for references without IndexColNameList - {"alter table t add column a double (4,2) zerofill references b match full on update set null first", true, "ALTER TABLE `t` ADD COLUMN `a` DOUBLE(4,2) UNSIGNED ZEROFILL REFERENCES `b` MATCH FULL ON UPDATE SET NULL FIRST"}, - {"alter table d_n.t_n add constraint foreign key ident (ident(1)) references d_n.t_n match full on delete set null", true, "ALTER TABLE `d_n`.`t_n` ADD CONSTRAINT `ident` FOREIGN KEY (`ident`(1)) REFERENCES `d_n`.`t_n` MATCH FULL ON DELETE SET NULL"}, - {"alter table t_n add constraint ident foreign key (ident,ident(1)) references t_n match full on update set null on delete restrict", true, "ALTER TABLE `t_n` ADD CONSTRAINT `ident` FOREIGN KEY (`ident`, `ident`(1)) REFERENCES `t_n` MATCH FULL ON DELETE RESTRICT ON UPDATE SET NULL"}, - {"alter table d_n.t_n add foreign key ident (ident, ident(1) asc) references t_n match partial on delete cascade remove partitioning", true, "ALTER TABLE `d_n`.`t_n` ADD CONSTRAINT `ident` FOREIGN KEY (`ident`, `ident`(1)) REFERENCES `t_n` MATCH PARTIAL ON DELETE CASCADE REMOVE PARTITIONING"}, - {"alter table d_n.t_n add constraint foreign key (ident asc) references d_n.t_n match simple on update cascade on delete cascade", true, "ALTER TABLE `d_n`.`t_n` ADD CONSTRAINT FOREIGN KEY (`ident`) REFERENCES `d_n`.`t_n` MATCH SIMPLE ON DELETE CASCADE ON UPDATE CASCADE"}, - - // for character vary syntax - {"create table t (a character varying(1));", true, "CREATE TABLE `t` (`a` VARCHAR(1))"}, - {"create table t (a character varying(255));", true, "CREATE TABLE `t` (`a` VARCHAR(255))"}, - {"create table t (a char varying(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a varcharacter(1));", true, "CREATE TABLE `t` (`a` VARCHAR(1))"}, - {"create table t (a varcharacter(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a varcharacter(1), b varcharacter(255));", true, "CREATE TABLE `t` (`a` VARCHAR(1),`b` VARCHAR(255))"}, - {"create table t (a char);", true, "CREATE TABLE `t` (`a` CHAR)"}, - {"create table t (a character);", true, "CREATE TABLE `t` (`a` CHAR)"}, - {"create table t (a character varying(50), b int);", true, "CREATE TABLE `t` (`a` VARCHAR(50),`b` INT)"}, - {"create table t (a character, b int);", true, "CREATE TABLE `t` (`a` CHAR,`b` INT)"}, - {"create table t (a national character varying(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a national char varying(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a national char);", true, "CREATE TABLE `t` (`a` CHAR)"}, - {"create table t (a national character);", true, "CREATE TABLE `t` (`a` CHAR)"}, - {"create table t (a nchar);", true, "CREATE TABLE `t` (`a` CHAR)"}, - {"create table t (a nchar varchar(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a nchar varcharacter(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a national varchar);", false, ""}, - {"create table t (a national varchar(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a national varcharacter(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a nchar varying(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table t (a nvarchar(50));", true, "CREATE TABLE `t` (`a` VARCHAR(50))"}, - {"create table nchar (a int);", true, "CREATE TABLE `nchar` (`a` INT)"}, - {"create table nchar (a int, b nchar);", true, "CREATE TABLE `nchar` (`a` INT,`b` CHAR)"}, - {"create table nchar (a int, b nchar(50));", true, "CREATE TABLE `nchar` (`a` INT,`b` CHAR(50))"}, - {"alter table t_n storage disk , modify ident national varcharacter(12) column_format fixed first;", true, "ALTER TABLE `t_n` STORAGE DISK, MODIFY COLUMN `ident` VARCHAR(12) COLUMN_FORMAT FIXED FIRST"}, - - // Test keyword `SERIAL` - {"create table t (a serial);", true, "CREATE TABLE `t` (`a` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY)"}, - {"create table t (a serial null);", true, "CREATE TABLE `t` (`a` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY NULL)"}, - {"create table t (b int, a serial);", true, "CREATE TABLE `t` (`b` INT,`a` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY)"}, - {"create table t (a int serial default value);", true, "CREATE TABLE `t` (`a` INT NOT NULL AUTO_INCREMENT UNIQUE KEY)"}, - {"create table t (a int serial default value null);", true, "CREATE TABLE `t` (`a` INT NOT NULL AUTO_INCREMENT UNIQUE KEY NULL)"}, - {"create table t (a bigint serial default value);", true, "CREATE TABLE `t` (`a` BIGINT NOT NULL AUTO_INCREMENT UNIQUE KEY)"}, - {"create table t (a smallint serial default value);", true, "CREATE TABLE `t` (`a` SMALLINT NOT NULL AUTO_INCREMENT UNIQUE KEY)"}, - - // for LONG syntax - {"create table t (a long);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT)"}, - {"create table t (a long varchar);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT)"}, - {"create table t (a long varcharacter);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT)"}, - {"create table t (a long char varying);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT)"}, - {"create table t (a long character varying);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT)"}, - {"create table t (a mediumtext, b long varchar, c long, d long varcharacter, e long char varying, f long character varying, g long);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT,`b` MEDIUMTEXT,`c` MEDIUMTEXT,`d` MEDIUMTEXT,`e` MEDIUMTEXT,`f` MEDIUMTEXT,`g` MEDIUMTEXT)"}, - {"create table t (a long varbinary);", true, "CREATE TABLE `t` (`a` MEDIUMBLOB)"}, - {"create table t (a long char varying, b long varbinary);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT,`b` MEDIUMBLOB)"}, - {"create table t (a long char set utf8);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8)"}, - {"create table t (a long char varying char set utf8);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8)"}, - {"create table t (a long character set utf8);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8)"}, - {"create table t (a long character varying character set utf8);", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8)"}, - {"alter table d_n.t_n modify column ident long after ident remove partitioning", true, "ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING"}, - {"alter table d_n.t_n modify column ident long char varying after ident remove partitioning", true, "ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING"}, - {"alter table d_n.t_n modify column ident long character varying after ident remove partitioning", true, "ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING"}, - {"alter table d_n.t_n modify column ident long varchar after ident remove partitioning", true, "ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING"}, - {"alter table d_n.t_n modify column ident long varcharacter after ident remove partitioning", true, "ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING"}, - {"alter table t_n change column ident ident long char varying binary charset utf8 first , tablespace ident", true, "ALTER TABLE `t_n` CHANGE COLUMN `ident` `ident` MEDIUMTEXT BINARY CHARACTER SET UTF8 FIRST, TABLESPACE = `ident`"}, - {"alter table t_n change column ident ident long character varying binary charset utf8 first , tablespace ident", true, "ALTER TABLE `t_n` CHANGE COLUMN `ident` `ident` MEDIUMTEXT BINARY CHARACTER SET UTF8 FIRST, TABLESPACE = `ident`"}, - - // for STATS_AUTO_RECALC syntax - {"create table t (a int) stats_auto_recalc 2;", false, ""}, - {"create table t (a int) stats_auto_recalc = 10;", false, ""}, - {"create table t (a int) stats_auto_recalc 0;", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 0"}, - {"create table t (a int) stats_auto_recalc default;", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = DEFAULT"}, - {"create table t (a int) stats_auto_recalc = 0;", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 0"}, - {"create table t (a int) stats_auto_recalc = 1;", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1"}, - {"create table t (a int) stats_auto_recalc=default;", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = DEFAULT"}, - {"create table t (a int) stats_persistent = 1, stats_auto_recalc = 1;", true, "CREATE TABLE `t` (`a` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ STATS_AUTO_RECALC = 1"}, - {"create table t (a int) stats_auto_recalc = 1, stats_sample_pages = 25;", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1 STATS_SAMPLE_PAGES = 25"}, - {"alter table t modify a bigint, ENGINE=InnoDB, stats_auto_recalc = 0", true, "ALTER TABLE `t` MODIFY COLUMN `a` BIGINT, ENGINE = InnoDB, STATS_AUTO_RECALC = 0"}, - {"create table stats_auto_recalc (a int);", true, "CREATE TABLE `stats_auto_recalc` (`a` INT)"}, - {"create table stats_auto_recalc (a int) stats_auto_recalc=1;", true, "CREATE TABLE `stats_auto_recalc` (`a` INT) STATS_AUTO_RECALC = 1"}, - - // for TYPE/USING syntax - {"create table t (a int, primary key type type btree (a));", true, "CREATE TABLE `t` (`a` INT,PRIMARY KEY `type`(`a`) USING BTREE)"}, - {"create table t (a int, primary key type btree (a));", false, ""}, - {"create table t (a int, primary key using btree (a));", true, "CREATE TABLE `t` (`a` INT,PRIMARY KEY(`a`) USING BTREE)"}, - {"create table t (a int, primary key (a) type btree);", true, "CREATE TABLE `t` (`a` INT,PRIMARY KEY(`a`) USING BTREE)"}, - {"create table t (a int, primary key (a) using btree);", true, "CREATE TABLE `t` (`a` INT,PRIMARY KEY(`a`) USING BTREE)"}, - {"create table t (a int, unique index type type btree (a));", true, "CREATE TABLE `t` (`a` INT,UNIQUE `type`(`a`) USING BTREE)"}, - {"create table t (a int, unique index type using btree (a));", true, "CREATE TABLE `t` (`a` INT,UNIQUE `type`(`a`) USING BTREE)"}, - {"create table t (a int, unique index type btree (a));", false, ""}, - {"create table t (a int, unique index using btree (a));", true, "CREATE TABLE `t` (`a` INT,UNIQUE(`a`) USING BTREE)"}, - {"create table t (a int, unique index (a) using btree);", true, "CREATE TABLE `t` (`a` INT,UNIQUE(`a`) USING BTREE)"}, - {"create table t (a int, unique key (a) using btree);", true, "CREATE TABLE `t` (`a` INT,UNIQUE(`a`) USING BTREE)"}, - {"create table t (a int, index type type btree (a));", true, "CREATE TABLE `t` (`a` INT,INDEX `type`(`a`) USING BTREE)"}, - {"create table t (a int, index type btree (a));", false, ""}, - {"create table t (a int, index type using btree (a));", true, "CREATE TABLE `t` (`a` INT,INDEX `type`(`a`) USING BTREE)"}, - {"create table t (a int, index using btree (a));", true, "CREATE TABLE `t` (`a` INT,INDEX(`a`) USING BTREE)"}, - - // for issue 500 - {`ALTER TABLE d_n.t_n WITHOUT VALIDATION , ADD PARTITION ( PARTITION ident VALUES LESS THAN ( MAXVALUE ) STORAGE ENGINE text_string MAX_ROWS 12 )`, true, "ALTER TABLE `d_n`.`t_n` WITHOUT VALIDATION, ADD PARTITION (PARTITION `ident` VALUES LESS THAN (MAXVALUE) ENGINE = text_string MAX_ROWS = 12)"}, - {`ALTER TABLE d_n.t_n WITH VALIDATION , ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION ident VALUES LESS THAN MAXVALUE STORAGE ENGINE = text_string, PARTITION ident VALUES LESS THAN ( MAXVALUE ) (SUBPARTITION text_string MIN_ROWS 11))`, true, "ALTER TABLE `d_n`.`t_n` WITH VALIDATION, ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION `ident` VALUES LESS THAN (MAXVALUE) ENGINE = text_string, PARTITION `ident` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `text_string` MIN_ROWS = 11))"}, - // for test VALUE IN - {`ALTER TABLE d_n.t_n WITHOUT VALIDATION , ADD PARTITION ( PARTITION ident VALUES IN ( DEFAULT ) STORAGE ENGINE text_string MAX_ROWS 12 )`, true, "ALTER TABLE `d_n`.`t_n` WITHOUT VALIDATION, ADD PARTITION (PARTITION `ident` DEFAULT ENGINE = text_string MAX_ROWS = 12)"}, - {`ALTER TABLE d_n.t_n WITH VALIDATION , ADD PARTITION NO_WRITE_TO_BINLOG ( PARTITION ident VALUES IN ( DEFAULT ) STORAGE ENGINE text_string MAX_ROWS 12 )`, true, "ALTER TABLE `d_n`.`t_n` WITH VALIDATION, ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION `ident` DEFAULT ENGINE = text_string MAX_ROWS = 12)"}, - {`ALTER TABLE d_n.t_n ADD PARTITION ( PARTITION ident VALUES IN ( DEFAULT ), partition ptext values in ('default') )`, true, "ALTER TABLE `d_n`.`t_n` ADD PARTITION (PARTITION `ident` DEFAULT, PARTITION `ptext` VALUES IN (_UTF8MB4'default'))"}, - {`ALTER TABLE d_n.t_n WITH VALIDATION , ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION ident VALUES LESS THAN MAXVALUE STORAGE ENGINE = text_string, PARTITION ident VALUES IN ( DEFAULT ) (SUBPARTITION text_string MIN_ROWS 11))`, true, "ALTER TABLE `d_n`.`t_n` WITH VALIDATION, ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION `ident` VALUES LESS THAN (MAXVALUE) ENGINE = text_string, PARTITION `ident` DEFAULT (SUBPARTITION `text_string` MIN_ROWS = 11))"}, - {`ALTER TABLE d_n.t_n ADD PARTITION (PARTITION ident VALUES IN ( DEFAULT ))`, true, "ALTER TABLE `d_n`.`t_n` ADD PARTITION (PARTITION `ident` DEFAULT)"}, - {`ALTER TABLE d_n.t_n ADD PARTITION (PARTITION ident VALUES IN (1, default ))`, true, "ALTER TABLE `d_n`.`t_n` ADD PARTITION (PARTITION `ident` VALUES IN (1, DEFAULT))"}, - // for issue 501 - {"ALTER TABLE t IMPORT TABLESPACE;", true, "ALTER TABLE `t` IMPORT TABLESPACE"}, - {"ALTER TABLE t DISCARD TABLESPACE;", true, "ALTER TABLE `t` DISCARD TABLESPACE"}, - {"ALTER TABLE db.t IMPORT TABLESPACE;", true, "ALTER TABLE `db`.`t` IMPORT TABLESPACE"}, - {"ALTER TABLE db.t DISCARD TABLESPACE;", true, "ALTER TABLE `db`.`t` DISCARD TABLESPACE"}, - - // for CONSTRAINT syntax, see issue 413 - {"ALTER TABLE t ADD ( CHECK ( true ) )", true, "ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED)"}, - {"ALTER TABLE t ADD ( CONSTRAINT CHECK ( true ) )", true, "ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED)"}, - {"ALTER TABLE t ADD COLUMN ( CONSTRAINT ident CHECK ( 1>2 ) NOT ENFORCED )", true, "ALTER TABLE `t` ADD COLUMN (CONSTRAINT `ident` CHECK(1>2) NOT ENFORCED)"}, - {"alter table t add column (b int, constraint c unique key (b))", true, "ALTER TABLE `t` ADD COLUMN (`b` INT, UNIQUE `c`(`b`))"}, - {"ALTER TABLE t ADD COLUMN ( CONSTRAINT CHECK ( true ) )", true, "ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED)"}, - {"ALTER TABLE t ADD COLUMN ( CONSTRAINT CHECK ( true ) ENFORCED , CHECK ( true ) )", true, "ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED, CHECK(TRUE) ENFORCED)"}, - {"ALTER TABLE t ADD COLUMN (a1 int, CONSTRAINT b1 CHECK (a1>0))", true, "ALTER TABLE `t` ADD COLUMN (`a1` INT, CONSTRAINT `b1` CHECK(`a1`>0) ENFORCED)"}, - {"ALTER TABLE t ADD COLUMN (a1 int, a2 int, CONSTRAINT b1 CHECK (a1>0), CONSTRAINT b2 CHECK (a2<10))", true, "ALTER TABLE `t` ADD COLUMN (`a1` INT, `a2` INT, CONSTRAINT `b1` CHECK(`a1`>0) ENFORCED, CONSTRAINT `b2` CHECK(`a2`<10) ENFORCED)"}, - {"ALTER TABLE `t` ADD COLUMN (`a1` INT, PRIMARY KEY (`a1`))", true, "ALTER TABLE `t` ADD COLUMN (`a1` INT, PRIMARY KEY(`a1`))"}, - {"ALTER TABLE t ADD (a1 int, CONSTRAINT PRIMARY KEY (a1))", true, "ALTER TABLE `t` ADD COLUMN (`a1` INT, PRIMARY KEY(`a1`))"}, - {"ALTER TABLE t ADD (a1 int, a2 int, PRIMARY KEY (a1), UNIQUE (a2))", true, "ALTER TABLE `t` ADD COLUMN (`a1` INT, `a2` INT, PRIMARY KEY(`a1`), UNIQUE(`a2`))"}, - {"ALTER TABLE t ADD (a1 int, a2 int, PRIMARY KEY (a1), CONSTRAINT b2 UNIQUE (a2))", true, "ALTER TABLE `t` ADD COLUMN (`a1` INT, `a2` INT, PRIMARY KEY(`a1`), UNIQUE `b2`(`a2`))"}, - {"ALTER TABLE ident ADD ( CONSTRAINT FOREIGN KEY ident ( EXECUTE ( 123 ) ) REFERENCES t ( a ) MATCH SIMPLE ON DELETE CASCADE ON UPDATE SET NULL )", true, "ALTER TABLE `ident` ADD COLUMN (CONSTRAINT `ident` FOREIGN KEY (`EXECUTE`(123)) REFERENCES `t`(`a`) MATCH SIMPLE ON DELETE CASCADE ON UPDATE SET NULL)"}, - // for CONSTRAINT cont'd, the following tests are for another aspect of the incompatibility - {"ALTER TABLE t ADD COLUMN a DATE CHECK ( a > 0 ) FIRST", true, "ALTER TABLE `t` ADD COLUMN `a` DATE CHECK(`a`>0) ENFORCED FIRST"}, - {"ALTER TABLE t ADD a1 int CONSTRAINT ident CHECK ( a1 > 1 ) REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE;", true, "ALTER TABLE `t` ADD COLUMN `a1` INT CONSTRAINT `ident` CHECK(`a1`>1) ENFORCED REFERENCES `b` ON DELETE CASCADE ON UPDATE CASCADE"}, - {"ALTER TABLE t ADD COLUMN a DATE CONSTRAINT CHECK ( a > 0 ) FIRST", true, "ALTER TABLE `t` ADD COLUMN `a` DATE CHECK(`a`>0) ENFORCED FIRST"}, - {"ALTER TABLE t ADD a TINYBLOB CONSTRAINT ident CHECK ( 1>2 ) REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE", true, "ALTER TABLE `t` ADD COLUMN `a` TINYBLOB CONSTRAINT `ident` CHECK(1>2) ENFORCED REFERENCES `b` ON DELETE CASCADE ON UPDATE CASCADE"}, - {"ALTER TABLE t ADD a2 int CONSTRAINT ident CHECK (a2 > 1) ENFORCED", true, "ALTER TABLE `t` ADD COLUMN `a2` INT CONSTRAINT `ident` CHECK(`a2`>1) ENFORCED"}, - {"ALTER TABLE t ADD a2 int CONSTRAINT ident CHECK (a2 > 1) NOT ENFORCED", true, "ALTER TABLE `t` ADD COLUMN `a2` INT CONSTRAINT `ident` CHECK(`a2`>1) NOT ENFORCED"}, - {"ALTER TABLE t ADD a2 int CONSTRAINT ident primary key REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE;", false, ""}, - {"ALTER TABLE t ADD a2 int CONSTRAINT ident primary key (a2))", false, ""}, - {"ALTER TABLE t ADD a2 int CONSTRAINT ident unique key (a2))", false, ""}, - - {"ALTER TABLE t SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", true, "ALTER TABLE `t` SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b'"}, - {"ALTER TABLE t SET TIFLASH REPLICA 0", true, "ALTER TABLE `t` SET TIFLASH REPLICA 0"}, - {"ALTER DATABASE t SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", true, "ALTER DATABASE `t` SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b'"}, - {"ALTER DATABASE t SET TIFLASH REPLICA 0", true, "ALTER DATABASE `t` SET TIFLASH REPLICA 0"}, - {"ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", true, "ALTER DATABASE `t` SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b'"}, - {"ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2", true, "ALTER DATABASE `t` SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2"}, - {"ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2", true, "ALTER DATABASE `t` SET TIFLASH REPLICA 1 LOCATION LABELS 'a', 'b' SET TIFLASH REPLICA 2"}, - {"ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b'", true, "ALTER DATABASE `t` SET TIFLASH REPLICA 1 LOCATION LABELS 'a', 'b' SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b'"}, - - // for issue 537 - {"CREATE TABLE IF NOT EXISTS table_ident (a SQL_TSI_YEAR(4), b SQL_TSI_YEAR);", true, "CREATE TABLE IF NOT EXISTS `table_ident` (`a` YEAR(4),`b` YEAR)"}, - {`CREATE TABLE IF NOT EXISTS table_ident (ident1 BOOL COMMENT "text_string" unique, ident2 SQL_TSI_YEAR(4) ZEROFILL);`, true, "CREATE TABLE IF NOT EXISTS `table_ident` (`ident1` TINYINT(1) COMMENT 'text_string' UNIQUE KEY,`ident2` YEAR(4))"}, - {"create table t (y sql_tsi_year(4), y1 sql_tsi_year)", true, "CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR)"}, - {"create table t (y sql_tsi_year(4) unsigned zerofill zerofill, y1 sql_tsi_year signed unsigned zerofill)", true, "CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR)"}, - - // for issue 549 - {"insert into t set a = default", true, "INSERT INTO `t` SET `a`=DEFAULT"}, - {"insert into t set a := default", true, "INSERT INTO `t` SET `a`=DEFAULT"}, - {"replace t set a = default", true, "REPLACE INTO `t` SET `a`=DEFAULT"}, - {"update t set a = default", true, "UPDATE `t` SET `a`=DEFAULT"}, - {"insert into t set a = default on duplicate key update a = default", true, "INSERT INTO `t` SET `a`=DEFAULT ON DUPLICATE KEY UPDATE `a`=DEFAULT"}, - - // for issue 529 - {"create table t (a text byte ascii)", false, ""}, - {"create table t (a text byte charset latin1)", false, ""}, - {"create table t (a longtext ascii)", true, "CREATE TABLE `t` (`a` LONGTEXT CHARACTER SET LATIN1)"}, - {"create table t (a mediumtext ascii)", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET LATIN1)"}, - {"create table t (a tinytext ascii)", true, "CREATE TABLE `t` (`a` TINYTEXT CHARACTER SET LATIN1)"}, - {"create table t (a text byte)", true, "CREATE TABLE `t` (`a` BLOB)"}, - {"create table t (a long byte, b text ascii)", true, "CREATE TABLE `t` (`a` MEDIUMBLOB,`b` TEXT CHARACTER SET LATIN1)"}, - {"create table t (a text ascii, b mediumtext ascii, c int)", true, "CREATE TABLE `t` (`a` TEXT CHARACTER SET LATIN1,`b` MEDIUMTEXT CHARACTER SET LATIN1,`c` INT)"}, - {"create table t (a int, b text ascii, c mediumtext ascii)", true, "CREATE TABLE `t` (`a` INT,`b` TEXT CHARACTER SET LATIN1,`c` MEDIUMTEXT CHARACTER SET LATIN1)"}, - {"create table t (a long ascii, b long ascii)", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET LATIN1,`b` MEDIUMTEXT CHARACTER SET LATIN1)"}, - {"create table t (a long character set utf8mb4, b long charset utf8mb4, c long char set utf8mb4)", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8MB4,`b` MEDIUMTEXT CHARACTER SET UTF8MB4,`c` MEDIUMTEXT CHARACTER SET UTF8MB4)"}, - - {"create table t (a int STORAGE MEMORY, b varchar(255) STORAGE MEMORY)", true, "CREATE TABLE `t` (`a` INT STORAGE MEMORY,`b` VARCHAR(255) STORAGE MEMORY)"}, - {"create table t (a int storage DISK, b varchar(255) STORAGE DEFAULT)", true, "CREATE TABLE `t` (`a` INT STORAGE DISK,`b` VARCHAR(255) STORAGE DEFAULT)"}, - {"create table t (a int STORAGE DEFAULT, b varchar(255) STORAGE DISK)", true, "CREATE TABLE `t` (`a` INT STORAGE DEFAULT,`b` VARCHAR(255) STORAGE DISK)"}, - - // for issue 555 - {"create table t (a fixed(6, 3), b fixed key)", true, "CREATE TABLE `t` (`a` DECIMAL(6,3),`b` DECIMAL PRIMARY KEY)"}, - {"create table t (a numeric, b fixed(6))", true, "CREATE TABLE `t` (`a` DECIMAL,`b` DECIMAL(6))"}, - {"create table t (a fixed(65, 30) zerofill, b numeric, c fixed(65) unsigned zerofill)", true, "CREATE TABLE `t` (`a` DECIMAL(65,30) UNSIGNED ZEROFILL,`b` DECIMAL,`c` DECIMAL(65) UNSIGNED ZEROFILL)"}, - - // create table with expression index - {"create table a(a int, key(lower(a)));", false, ""}, - {"create table a(a int, key(a+1));", false, ""}, - {"create table a(a int, key(a, a+1));", false, ""}, - {"create table a(a int, b int, key((a+1), (b+1)));", true, "CREATE TABLE `a` (`a` INT,`b` INT,INDEX((`a`+1), (`b`+1)))"}, - {"create table a(a int, b int, key(a, (b+1)));", true, "CREATE TABLE `a` (`a` INT,`b` INT,INDEX(`a`, (`b`+1)))"}, - {"create table a(a int, b int, key((a+1), b));", true, "CREATE TABLE `a` (`a` INT,`b` INT,INDEX((`a`+1), `b`))"}, - {"create table a(a int, b int, key((a + 1) desc));", true, "CREATE TABLE `a` (`a` INT,`b` INT,INDEX((`a`+1) DESC))"}, - - // for create sequence - {"create sequence sequence", true, "CREATE SEQUENCE `sequence`"}, - {"create sequence seq", true, "CREATE SEQUENCE `seq`"}, - {"create sequence if not exists seq", true, "CREATE SEQUENCE IF NOT EXISTS `seq`"}, - {"create sequence seq", true, "CREATE SEQUENCE `seq`"}, - {"create sequence seq", true, "CREATE SEQUENCE `seq`"}, - {"create sequence if not exists seq", true, "CREATE SEQUENCE IF NOT EXISTS `seq`"}, - {"create sequence if not exists seq", true, "CREATE SEQUENCE IF NOT EXISTS `seq`"}, - {"create sequence if not exists seq increment", false, ""}, - {"create sequence if not exists seq increment 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1"}, - {"create sequence if not exists seq increment = 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1"}, - {"create sequence if not exists seq increment by 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1"}, - {"create sequence if not exists seq minvalue", false, ""}, - {"create sequence if not exists seq minvalue 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` MINVALUE 1"}, - {"create sequence if not exists seq minvalue = 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` MINVALUE 1"}, - {"create sequence if not exists seq no", false, ""}, - {"create sequence if not exists seq nominvalue", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NO MINVALUE"}, - {"create sequence if not exists seq no minvalue", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NO MINVALUE"}, - {"create sequence if not exists seq maxvalue", false, ""}, - {"create sequence if not exists seq maxvalue 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` MAXVALUE 1"}, - {"create sequence if not exists seq maxvalue = 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` MAXVALUE 1"}, - {"create sequence if not exists seq no", false, ""}, - {"create sequence if not exists seq nomaxvalue", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NO MAXVALUE"}, - {"create sequence if not exists seq no maxvalue", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NO MAXVALUE"}, - {"create sequence if not exists seq start", false, ""}, - {"create sequence if not exists seq start with", false, ""}, - {"create sequence if not exists seq start =", false, ""}, - {"create sequence if not exists seq start with", false, ""}, - {"create sequence if not exists seq start 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` START WITH 1"}, - {"create sequence if not exists seq start = 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` START WITH 1"}, - {"create sequence if not exists seq start with 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` START WITH 1"}, - {"create sequence if not exists seq cache", false, ""}, - {"create sequence if not exists seq cache 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` CACHE 1"}, - {"create sequence if not exists seq cache = 1", true, "CREATE SEQUENCE IF NOT EXISTS `seq` CACHE 1"}, - {"create sequence if not exists seq nocache", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NOCACHE"}, - {"create sequence if not exists seq no cache", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NOCACHE"}, - {"create sequence if not exists seq cycle", true, "CREATE SEQUENCE IF NOT EXISTS `seq` CYCLE"}, - {"create sequence if not exists seq nocycle", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NOCYCLE"}, - {"create sequence if not exists seq no cycle", true, "CREATE SEQUENCE IF NOT EXISTS `seq` NOCYCLE"}, - {"create sequence seq increment 1 start with 0 minvalue 0 maxvalue 1000", true, "CREATE SEQUENCE `seq` INCREMENT BY 1 START WITH 0 MINVALUE 0 MAXVALUE 1000"}, - {"create sequence seq increment 1 start with 0 minvalue 0 maxvalue 1000", true, "CREATE SEQUENCE `seq` INCREMENT BY 1 START WITH 0 MINVALUE 0 MAXVALUE 1000"}, - // TODO : support or replace if need : care for it will conflict on temporary. - {"create sequence seq increment 10 start with 0 minvalue 0 maxvalue 1000", true, "CREATE SEQUENCE `seq` INCREMENT BY 10 START WITH 0 MINVALUE 0 MAXVALUE 1000"}, - {"create sequence if not exists seq cache 1 increment 1 start with -1 minvalue 0 maxvalue 1000", true, "CREATE SEQUENCE IF NOT EXISTS `seq` CACHE 1 INCREMENT BY 1 START WITH -1 MINVALUE 0 MAXVALUE 1000"}, - {"create sequence sEq start with 0 minvalue 0 maxvalue 1000", true, "CREATE SEQUENCE `sEq` START WITH 0 MINVALUE 0 MAXVALUE 1000"}, - {"create sequence if not exists seq increment 1 start with 0 minvalue -2 maxvalue 1000", true, "CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1 START WITH 0 MINVALUE -2 MAXVALUE 1000"}, - {"create sequence seq increment -1 start with -1 minvalue -1 maxvalue -1000 cache = 10 nocycle", true, "CREATE SEQUENCE `seq` INCREMENT BY -1 START WITH -1 MINVALUE -1 MAXVALUE -1000 CACHE 10 NOCYCLE"}, - - // test sequence is not a reserved keyword - {"create table sequence (a int)", true, "CREATE TABLE `sequence` (`a` INT)"}, - {"create table t (sequence int)", true, "CREATE TABLE `t` (`sequence` INT)"}, - - // test drop sequence - {"drop sequence", false, ""}, - {"drop sequence seq", true, "DROP SEQUENCE `seq`"}, - {"drop sequence if exists seq", true, "DROP SEQUENCE IF EXISTS `seq`"}, - {"drop sequence seq", true, "DROP SEQUENCE `seq`"}, - {"drop sequence if exists seq", true, "DROP SEQUENCE IF EXISTS `seq`"}, - {"drop sequence if exists seq, seq2, seq3", true, "DROP SEQUENCE IF EXISTS `seq`, `seq2`, `seq3`"}, - {"drop sequence seq seq2", false, ""}, - {"drop sequence seq, seq2", true, "DROP SEQUENCE `seq`, `seq2`"}, - - // for auto_random - {"create table t (a bigint auto_random(3) primary key, b varchar(255))", true, "CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(3) PRIMARY KEY,`b` VARCHAR(255))"}, - {"create table t (a bigint auto_random primary key, b varchar(255))", true, "CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM PRIMARY KEY,`b` VARCHAR(255))"}, - {"create table t (a bigint primary key auto_random(4), b varchar(255))", true, "CREATE TABLE `t` (`a` BIGINT PRIMARY KEY AUTO_RANDOM(4),`b` VARCHAR(255))"}, - {"create table t (a bigint primary key auto_random(3) primary key unique, b varchar(255))", true, "CREATE TABLE `t` (`a` BIGINT PRIMARY KEY AUTO_RANDOM(3) PRIMARY KEY UNIQUE KEY,`b` VARCHAR(255))"}, - {"create table t (a bigint auto_random(5, 53) primary key, b varchar(255))", true, "CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(5, 53) PRIMARY KEY,`b` VARCHAR(255))"}, - {"create table t (a bigint auto_random(15, 32) primary key, b varchar(255))", true, "CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(15, 32) PRIMARY KEY,`b` VARCHAR(255))"}, - - // for auto_id_cache - {"create table t (a int) auto_id_cache=1", true, "CREATE TABLE `t` (`a` INT) AUTO_ID_CACHE = 1"}, - {"create table t (a int auto_increment key) auto_id_cache 10", true, "CREATE TABLE `t` (`a` INT AUTO_INCREMENT PRIMARY KEY) AUTO_ID_CACHE = 10"}, - {"create table t (a bigint, b varchar(255)) auto_id_cache 50", true, "CREATE TABLE `t` (`a` BIGINT,`b` VARCHAR(255)) AUTO_ID_CACHE = 50"}, - - // for auto_random_id - {"create table t (a bigint auto_random(3) primary key) auto_random_base = 10", true, "CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(3) PRIMARY KEY) AUTO_RANDOM_BASE = 10"}, - {"create table t (a bigint primary key auto_random(4), b varchar(100)) auto_random_base 200", true, "CREATE TABLE `t` (`a` BIGINT PRIMARY KEY AUTO_RANDOM(4),`b` VARCHAR(100)) AUTO_RANDOM_BASE = 200"}, - {"alter table t auto_random_base = 50", true, "ALTER TABLE `t` AUTO_RANDOM_BASE = 50"}, - {"alter table t auto_increment 30, auto_random_base 40", true, "ALTER TABLE `t` AUTO_INCREMENT = 30, AUTO_RANDOM_BASE = 40"}, - {"alter table t force auto_random_base = 50", true, "ALTER TABLE `t` FORCE AUTO_RANDOM_BASE = 50"}, - {"alter table t auto_increment 30, force auto_random_base 40", true, "ALTER TABLE `t` AUTO_INCREMENT = 30, FORCE AUTO_RANDOM_BASE = 40"}, - - // for alter sequence - {"alter sequence seq", false, ""}, - {"alter sequence seq comment=\"haha\"", false, ""}, - {"alter sequence seq start = 1", true, "ALTER SEQUENCE `seq` START WITH 1"}, - {"alter sequence seq start with 1 increment by 1", true, "ALTER SEQUENCE `seq` START WITH 1 INCREMENT BY 1"}, - {"alter sequence seq start with 1 increment by 2 minvalue 0 maxvalue 100", true, "ALTER SEQUENCE `seq` START WITH 1 INCREMENT BY 2 MINVALUE 0 MAXVALUE 100"}, - {"alter sequence seq increment -1 start with -1 minvalue -1 maxvalue -1000 cache = 10 nocycle", true, "ALTER SEQUENCE `seq` INCREMENT BY -1 START WITH -1 MINVALUE -1 MAXVALUE -1000 CACHE 10 NOCYCLE"}, - {"alter sequence if exists seq2 increment = 2", true, "ALTER SEQUENCE IF EXISTS `seq2` INCREMENT BY 2"}, - {"alter sequence seq restart", true, "ALTER SEQUENCE `seq` RESTART"}, - {"alter sequence seq start with 3 restart with 5", true, "ALTER SEQUENCE `seq` START WITH 3 RESTART WITH 5"}, - {"alter sequence seq restart = 5", true, "ALTER SEQUENCE `seq` RESTART WITH 5"}, - {"create sequence seq restart = 5", false, ""}, - - // for issue 18149 - {"create table t (a int, index ``(a))", true, "CREATE TABLE `t` (`a` INT,INDEX ``(`a`))"}, - - // for clustered index - {"create table t (a int, b varchar(255), primary key(b, a) clustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) CLUSTERED)"}, - {"create table t (a int, b varchar(255), primary key(b, a) nonclustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) NONCLUSTERED)"}, - {"create table t (a int primary key nonclustered, b varchar(255))", true, "CREATE TABLE `t` (`a` INT PRIMARY KEY NONCLUSTERED,`b` VARCHAR(255))"}, - {"create table t (a int, b varchar(255) primary key clustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255) PRIMARY KEY CLUSTERED)"}, - {"create table t (a int, b varchar(255) default 'a' primary key clustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255) DEFAULT _UTF8MB4'a' PRIMARY KEY CLUSTERED)"}, - {"create table t (a int, b varchar(255) primary key nonclustered, primary key(b, a) nonclustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255) PRIMARY KEY NONCLUSTERED,PRIMARY KEY(`b`, `a`) NONCLUSTERED)"}, - {"create table t (a int, b varchar(255), primary key(b, a) using RTREE nonclustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) NONCLUSTERED USING RTREE)"}, - {"create table t (a int, b varchar(255), primary key(b, a) using RTREE clustered nonclustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) NONCLUSTERED USING RTREE)"}, - {"create table t (a int, b varchar(255), primary key(b, a) using RTREE nonclustered clustered)", true, "CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) CLUSTERED USING RTREE)"}, - {"create table t (a int, b varchar(255) clustered primary key)", false, ""}, - {"create table t (a int, b varchar(255) primary key nonclustered clustered)", false, ""}, - {"alter table t add primary key (`a`, `b`) clustered", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`, `b`) CLUSTERED"}, - {"alter table t add primary key (`a`, `b`) nonclustered", true, "ALTER TABLE `t` ADD PRIMARY KEY(`a`, `b`) NONCLUSTERED"}, - - // for create table with vector index - {"create table t(a int, b vector(3), vector index(b) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX(`b`) USING HNSW)"}, - {"create table t(a int, b vector(3), vector index(a, b) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX(`a`, `b`) USING HNSW)"}, - {"create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b))));", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`))))"}, - {"create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b))) USING HASH);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`))) USING HASH)"}, - {"create table t(a int, b vector(3), vector index(a, (VEC_COSINE_DISTANCE(b))) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX(`a`, (VEC_COSINE_DISTANCE(`b`))) USING HNSW)"}, - {"create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b)), a) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`)), `a`) USING HNSW)"}, - {"create table t(a int, b vector(3), vector index(VEC_COSINE_DISTANCE(b)) USING HNSW);", false, ""}, - {"create table t(a int, b vector(3), vector key((VEC_COSINE_DISTANCE(b))) TYPE HNSW);", false, ""}, - {"create table t(a int, b vector(3), vector index((b+1)) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((`b`+1)) USING HNSW)"}, - {"create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(a, b))) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`a`, `b`))) USING HNSW)"}, - {"create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b))) USING HNSW);", true, "CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`))) USING HNSW)"}, - - // for drop placement policy - {"drop placement policy x", true, "DROP PLACEMENT POLICY `x`"}, - {"drop placement policy x, y", false, ""}, - {"drop placement policy if exists x", true, "DROP PLACEMENT POLICY IF EXISTS `x`"}, - {"drop placement policy if exists x, y", false, ""}, - // for show create placement policy - {"show create placement policy x", true, "SHOW CREATE PLACEMENT POLICY `x`"}, - {"show create placement policy if exists x", false, ""}, - {"show create placement policy x, y", false, ""}, - {"show create placement policy `placement`", true, "SHOW CREATE PLACEMENT POLICY `placement`"}, - // for create placement policy - {"create placement policy x primary_region='us'", true, "CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'us'"}, - {"create placement policy x region='us, 3'", false, ""}, - {"create placement policy x followers=3", true, "CREATE PLACEMENT POLICY `x` FOLLOWERS = 3"}, - {"create placement policy x followers=0", false, ""}, - {"create placement policy x voters=3", true, "CREATE PLACEMENT POLICY `x` VOTERS = 3"}, - {"create placement policy x learners=3", true, "CREATE PLACEMENT POLICY `x` LEARNERS = 3"}, - {"create placement policy x schedule='even'", true, "CREATE PLACEMENT POLICY `x` SCHEDULE = 'even'"}, - {"create placement policy x constraints='ww'", true, "CREATE PLACEMENT POLICY `x` CONSTRAINTS = 'ww'"}, - {"create placement policy x leader_constraints='ww'", true, "CREATE PLACEMENT POLICY `x` LEADER_CONSTRAINTS = 'ww'"}, - {"create placement policy x follower_constraints='ww'", true, "CREATE PLACEMENT POLICY `x` FOLLOWER_CONSTRAINTS = 'ww'"}, - {"create placement policy x voter_constraints='ww'", true, "CREATE PLACEMENT POLICY `x` VOTER_CONSTRAINTS = 'ww'"}, - {"create placement policy x learner_constraints='ww'", true, "CREATE PLACEMENT POLICY `x` LEARNER_CONSTRAINTS = 'ww'"}, - {"create placement policy x primary_region='cn' regions='us' schedule='even'", true, "CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' REGIONS = 'us' SCHEDULE = 'even'"}, - {"create placement policy x primary_region='cn', leader_constraints='ww', leader_constraints='yy'", true, "CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' LEADER_CONSTRAINTS = 'ww' LEADER_CONSTRAINTS = 'yy'"}, - {"create placement policy if not exists x regions = 'us', follower_constraints='yy'", true, "CREATE PLACEMENT POLICY IF NOT EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy'"}, - {"create or replace placement policy x regions='us'", true, "CREATE OR REPLACE PLACEMENT POLICY `x` REGIONS = 'us'"}, - {"create placement policy x placement policy y", false, ""}, - - // for masking policy - {"create table masking (id int)", true, "CREATE TABLE `masking` (`id` INT)"}, - {"select masking from t", true, "SELECT `masking` FROM `t`"}, - {"alter table t add masking int", true, "ALTER TABLE `t` ADD COLUMN `masking` INT"}, - {"alter table t drop masking", true, "ALTER TABLE `t` DROP COLUMN `masking`"}, - {"alter table t modify masking int", true, "ALTER TABLE `t` MODIFY COLUMN `masking` INT"}, - {"create masking policy p on t(c) as c", true, "CREATE MASKING POLICY `p` ON `t` (`c`) AS `c`"}, - {"create masking policy p on t(c) as c enable", true, "CREATE MASKING POLICY `p` ON `t` (`c`) AS `c` ENABLE"}, - {"create masking policy if not exists p on t(c) as c disable", true, "CREATE MASKING POLICY IF NOT EXISTS `p` ON `t` (`c`) AS `c` DISABLE"}, - {"create or replace masking policy p on t(c) as c", true, "CREATE OR REPLACE MASKING POLICY `p` ON `t` (`c`) AS `c`"}, - {"create masking policy p on t(c) as c restrict on none", true, "CREATE MASKING POLICY `p` ON `t` (`c`) AS `c`"}, - {"create or replace masking policy if not exists p on t(c) as c", false, ""}, - {"create masking policy p on t(c) as case when current_user() = 'root' then c else 'xxx' end enable", true, "CREATE MASKING POLICY `p` ON `t` (`c`) AS CASE WHEN CURRENT_USER()=_UTF8MB4'root' THEN `c` ELSE _UTF8MB4'xxx' END ENABLE"}, - {"create masking policy p on t(c) as c restrict on (insert_into_select, delete_select) enable", true, "CREATE MASKING POLICY `p` ON `t` (`c`) AS `c` RESTRICT ON (INSERT_INTO_SELECT, DELETE_SELECT) ENABLE"}, - {"create masking policy p on t(c) as case when current_user() not in ('root@%', 'u@%') then 'x' else c end", true, "CREATE MASKING POLICY `p` ON `t` (`c`) AS CASE WHEN CURRENT_USER() NOT IN (_UTF8MB4'root@%',_UTF8MB4'u@%') THEN _UTF8MB4'x' ELSE `c` END"}, - {"alter table t add masking policy p on (c) as c", true, "ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c`"}, - {"alter table t add masking policy p on (c) as c restrict on none", true, "ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c`"}, - {"alter table t add masking policy p on (c) as c disable", true, "ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c` DISABLE"}, - {"alter table t add masking policy p on (c) as c restrict on (update_select, ctas) disable", true, "ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c` RESTRICT ON (UPDATE_SELECT, CTAS) DISABLE"}, - {"alter table t modify masking policy p set expression = case when current_role() in ('r1', 'r2') then c else 'x' end", true, "ALTER TABLE `t` MODIFY MASKING POLICY `p` SET EXPRESSION = CASE WHEN CURRENT_ROLE() IN (_UTF8MB4'r1',_UTF8MB4'r2') THEN `c` ELSE _UTF8MB4'x' END"}, - {"alter table t modify masking policy p set expression case when current_role() in ('r1', 'r2') then c else 'x' end", false, ""}, - {"alter table t modify masking policy p set restrict on (insert_into_select, update_select, delete_select, ctas)", true, "ALTER TABLE `t` MODIFY MASKING POLICY `p` SET RESTRICT ON (INSERT_INTO_SELECT, UPDATE_SELECT, DELETE_SELECT, CTAS)"}, - {"alter table t modify masking policy p set restrict on none", true, "ALTER TABLE `t` MODIFY MASKING POLICY `p` SET RESTRICT ON NONE"}, - {"alter table t enable masking policy p", true, "ALTER TABLE `t` ENABLE MASKING POLICY `p`"}, - {"alter table t disable masking policy p", true, "ALTER TABLE `t` DISABLE MASKING POLICY `p`"}, - {"alter table t drop masking policy p", true, "ALTER TABLE `t` DROP MASKING POLICY `p`"}, - {"show masking policies for t", true, "SHOW MASKING POLICIES FOR `t`"}, - {"show masking policies for t where column_name = 'c'", true, "SHOW MASKING POLICIES FOR `t` WHERE `column_name`=_UTF8MB4'c'"}, - - {"alter placement policy x primary_region='us'", true, "ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'us'"}, - {"alter placement policy x region='us, 3'", false, ""}, - {"alter placement policy x followers=3", true, "ALTER PLACEMENT POLICY `x` FOLLOWERS = 3"}, - {"alter placement policy x voters=3", true, "ALTER PLACEMENT POLICY `x` VOTERS = 3"}, - {"alter placement policy x learners=3", true, "ALTER PLACEMENT POLICY `x` LEARNERS = 3"}, - {"alter placement policy x schedule='even'", true, "ALTER PLACEMENT POLICY `x` SCHEDULE = 'even'"}, - {"alter placement policy x constraints='ww'", true, "ALTER PLACEMENT POLICY `x` CONSTRAINTS = 'ww'"}, - {"alter placement policy x leader_constraints='ww'", true, "ALTER PLACEMENT POLICY `x` LEADER_CONSTRAINTS = 'ww'"}, - {"alter placement policy x follower_constraints='ww'", true, "ALTER PLACEMENT POLICY `x` FOLLOWER_CONSTRAINTS = 'ww'"}, - {"alter placement policy x voter_constraints='ww'", true, "ALTER PLACEMENT POLICY `x` VOTER_CONSTRAINTS = 'ww'"}, - {"alter placement policy x learner_constraints='ww'", true, "ALTER PLACEMENT POLICY `x` LEARNER_CONSTRAINTS = 'ww'"}, - {"alter placement policy x primary_region='cn' regions='us' schedule='even'", true, "ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' REGIONS = 'us' SCHEDULE = 'even'"}, - {"alter placement policy x primary_region='cn', leader_constraints='ww', leader_constraints='yy'", true, "ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' LEADER_CONSTRAINTS = 'ww' LEADER_CONSTRAINTS = 'yy'"}, - {"alter placement policy if exists x regions = 'us', follower_constraints='yy'", true, "ALTER PLACEMENT POLICY IF EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy'"}, - {"alter placement policy x placement policy y", false, ""}, - - // for create resource group - {"create resource group x cpu ='8c'", false, ""}, - {"create resource group x region ='us, 3'", false, ""}, - {"create resource group x cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s'", false, ""}, - {"create resource group x ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 2000"}, - {"create resource group x ru_per_sec=200000", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 200000"}, - {"create resource group x ru_per_sec=UNLIMITED", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED"}, - {"create resource group x ru_per_sec=unlimited", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED"}, - {"create resource group x ru_per_sec='check'", false, ""}, - {"create resource group x followers=0", false, ""}, - {"create resource group x burstable=true", false, ""}, - {"create resource group x burstable=false", false, ""}, - {"create resource group x burstable=disable", false, ""}, - {"create resource group x ru_per_sec=1000, burstable", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = MODERATED"}, - {"create resource group x burstable, ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 2000"}, - {"create resource group x ru_per_sec=3000 burstable", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 3000, BURSTABLE = MODERATED"}, - {"create resource group x burstable ru_per_sec=4000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000"}, - {"create resource group x BURSTABLE = UNLIMITED ru_per_sec=4000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 4000"}, - {"create resource group x BURSTABLE = MODERATED ru_per_sec=4000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000"}, - {"create resource group x BURSTABLE = OFF ru_per_sec=4000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 4000"}, - {"create resource group x ru_per_sec=20, priority=LOW, burstable", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = LOW, BURSTABLE = MODERATED"}, - {"create resource group default ru_per_sec=20, priority=LOW, burstable", true, "CREATE RESOURCE GROUP `default` RU_PER_SEC = 20, PRIORITY = LOW, BURSTABLE = MODERATED"}, - {"create resource group default ru_per_sec=UNLIMITED, priority=LOW, burstable", true, "CREATE RESOURCE GROUP `default` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = MODERATED"}, - {"create resource group x ru_per_sec=1000", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000"}, - {"create resource group x ru_per_sec=1000 burstable=unlimited", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = UNLIMITED"}, - {"create resource group x ru_per_sec=1000 burstable=off", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = OFF"}, - {"create resource group x ru_per_sec=1000 burstable=moderated", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = MODERATED"}, - {"create resource group x burstable=unlimited, ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 2000"}, - {"create resource group x burstable=off, ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 2000"}, - {"create resource group x burstable=moderated, ru_per_sec=2000", true, "CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 2000"}, - {"create resource group x ru_per_sec=1000 ,burstable=unlimited", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = UNLIMITED"}, - {"create resource group x ru_per_sec=1000 ,burstable=off", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = OFF"}, - {"create resource group x ru_per_sec=1000 ,burstable=moderated", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = MODERATED"}, - {"create resource group x ru_per_sec=1000 , priority=LOW,burstable=unlimited", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, PRIORITY = LOW, BURSTABLE = UNLIMITED"}, - {"create resource group x ru_per_sec=1000 , priority=LOW,burstable=off", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, PRIORITY = LOW, BURSTABLE = OFF"}, - {"create resource group x ru_per_sec=1000 , priority=LOW,burstable=moderated", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, PRIORITY = LOW, BURSTABLE = MODERATED"}, - {"create resource group x ru_per_sec=UNLIMITED , priority=LOW,burstable=unlimited", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = UNLIMITED"}, - {"create resource group x ru_per_sec=UNLIMITED , priority=LOW,burstable=off", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = OFF"}, - {"create resource group x ru_per_sec=UNLIMITED , priority=LOW,burstable=moderated", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = MODERATED"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION DRYRUN)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = DRYRUN)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10m' ACTION COOLDOWN)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10m' ACTION = COOLDOWN)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=(ACTION KILL EXEC_ELAPSED='10m')", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (ACTION = KILL EXEC_ELAPSED = '10m')"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' WATCH=SIMILAR DURATION '10m' ACTION COOLDOWN)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' WATCH = SIMILAR DURATION = '10m' ACTION = COOLDOWN)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED \"10s\" ACTION COOLDOWN WATCH EXACT DURATION='10m')", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m')"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '9s' ACTION COOLDOWN WATCH EXACT)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '9s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '8s' ACTION COOLDOWN WATCH EXACT DURATION = UNLIMITED)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '8s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '7s' ACTION COOLDOWN WATCH EXACT DURATION UNLIMITED)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '7s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '7s' ACTION COOLDOWN WATCH EXACT DURATION 'UNLIMITED')", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '7s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' RU 100 ACTION DRYRUN)", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' RU = 100 ACTION = DRYRUN)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' PROCESSED_KEYS 100 ACTION DRYRUN)", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' PROCESSED_KEYS = 100 ACTION = DRYRUN)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' WATCH SIMILAR DURATION '10m' ACTION COOLDOWN)", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' WATCH = SIMILAR DURATION = '10m' ACTION = COOLDOWN)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION COOLDOWN WATCH EXACT DURATION '10m')", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m')"}, - {"create resource group x ru_per_sec=1000 background = (task_types='')", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (TASK_TYPES = '')"}, - {"create resource group x ru_per_sec=1000 background = (UTILIZATION_LIMIT=50)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (UTILIZATION_LIMIT = 50)"}, - {"create resource group x ru_per_sec=1000 background = (UTILIZATION_LIMIT=\"NAN\")", false, ""}, - {"create resource group x ru_per_sec=1000 background (task_types='br,lightning')", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (TASK_TYPES = 'br,lightning')"}, - {"create resource group x ru_per_sec=1000 background (task_types='br,lightning',utilization_limit=50)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (TASK_TYPES = 'br,lightning', UTILIZATION_LIMIT = 50)"}, - {`create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH EXACT DURATION='10m') background (task_types 'br,lightning')`, true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning')"}, - {`create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH PLAN DURATION='10m') background (task_types 'br,lightning')`, true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = PLAN DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning')"}, - {`create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH PLAN DURATION='10m') background (task_types 'br,lightning', utilization_limit 10)`, true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = PLAN DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning', UTILIZATION_LIMIT = 10)"}, - {`create resource group x ru_per_sec=UNLIMITED QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH PLAN DURATION='10m') background (task_types 'br,lightning')`, true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = PLAN DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning')"}, - // This case is expected in parser test but not in actual ddl job. - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s')", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s')"}, - {"create resource group x ru_per_sec=1000 QUERY=(EXEC_ELAPSED '10s')", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=EXEC_ELAPSED '10s'", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s'", false, ""}, - {"create resource group x ru_per_sec=1000 LIMIT=(EXEC_ELAPSED '10s')", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' ACTION DRYRUN ACTION KILL)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (PROCESSED_KEYS=100)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (PROCESSED_KEYS = 100)"}, - {"create resource group x ru_per_sec=1000 QUERY=(PROCESSED_KEYS 100)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=PROCESSED_KEYS 100", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (PROCESSED_KEYS 100", false, ""}, - {"create resource group x ru_per_sec=1000 LIMIT=(PROCESSED_KEYS 100)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (PROCESSED_KEYS 100 ACTION DRYRUN ACTION KILL)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (RU=100)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (RU = 100)"}, - {"create resource group x ru_per_sec=1000 QUERY=(RU 100)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT=RU 100", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (RU 100", false, ""}, - {"create resource group x ru_per_sec=1000 LIMIT=(RU 100)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (RU 100 ACTION DRYRUN ACTION KILL)", false, ""}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED='10s' PROCESSED_KEYS=100)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' PROCESSED_KEYS = 100)"}, - {"create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED='10s', PROCESSED_KEYS=100, RU=100)", true, "CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' PROCESSED_KEYS = 100 RU = 100)"}, - - {"alter resource group x cpu ='8c'", false, ""}, - {"alter resource group x region ='us, 3'", false, ""}, - {"alter resource group x burstable=true", false, ""}, - {"alter resource group x burstable=false", false, ""}, - {"alter resource group x burstable=disable", false, ""}, - {"alter resource group default priority = high", true, "ALTER RESOURCE GROUP `default` PRIORITY = HIGH"}, - {"alter resource group x cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s'", false, ""}, - {"alter resource group x ru_per_sec=1000", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000"}, - {"alter resource group x ru_per_sec=2000, BURSTABLE", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=UNLIMITED", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED"}, - {"alter resource group x ru_per_sec=UNLIMITED, BURSTABLE", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=unlimited, BURSTABLE", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec='check', BURSTABLE", false, ""}, - {"alter resource group x BURSTABLE, ru_per_sec=3000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 3000"}, - {"alter resource group x BURSTABLE ru_per_sec=4000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000"}, - {"alter resource group x ru_per_sec=2000, BURSTABLE=unlimited", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = UNLIMITED"}, - {"alter resource group x ru_per_sec=2000, BURSTABLE=moderated", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=2000, BURSTABLE=off", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = OFF"}, - {"alter resource group x ru_per_sec=UNLIMITED", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED"}, - {"alter resource group x ru_per_sec=UNLIMITED, BURSTABLE=unlimited", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = UNLIMITED"}, - {"alter resource group x ru_per_sec=UNLIMITED, BURSTABLE=moderated", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=unlimited, BURSTABLE=off", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = OFF"}, - {"alter resource group x ru_per_sec='check', BURSTABLE", false, ""}, - {"alter resource group x ru_per_sec=2000, BURSTABLE=yes", false, ""}, - {"alter resource group x BURSTABLE=unlimited, ru_per_sec=3000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 3000"}, - {"alter resource group x BURSTABLE=moderated, ru_per_sec=3000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 3000"}, - {"alter resource group x BURSTABLE=off, ru_per_sec=3000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 3000"}, - {"alter resource group x BURSTABLE=unlimited ru_per_sec=4000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 4000"}, - {"alter resource group x BURSTABLE=moderated ru_per_sec=4000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000"}, - {"alter resource group x BURSTABLE=off ru_per_sec=4000", true, "ALTER RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 4000"}, - // This case is expected in parser test but not in actual ddl job. - // Todo: support patch setting(not cover all). - {"alter resource group x BURSTABLE", true, "ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=200000 BURSTABLE", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = MODERATED"}, - {"alter resource group x followers=0", false, ""}, - {"alter resource group x ru_per_sec=20 priority=MID BURSTABLE", false, ""}, - {"alter resource group x BURSTABLE=unlimited", true, "ALTER RESOURCE GROUP `x` BURSTABLE = UNLIMITED"}, - {"alter resource group x BURSTABLE=moderated", true, "ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED"}, - {"alter resource group x BURSTABLE=off", true, "ALTER RESOURCE GROUP `x` BURSTABLE = OFF"}, - {"alter resource group x ru_per_sec=200000 BURSTABLE=unlimited", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = UNLIMITED"}, - {"alter resource group x ru_per_sec=200000 BURSTABLE=moderated", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=200000 BURSTABLE=off", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = OFF"}, - {"alter resource group x followers=0", false, ""}, - {"alter resource group x ru_per_sec=20 priority=MID", false, ""}, - {"alter resource group x ru_per_sec=20 priority=HIGH BURSTABLE=unlimited", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = HIGH, BURSTABLE = UNLIMITED"}, - {"alter resource group x ru_per_sec=20 priority=HIGH BURSTABLE=moderated", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = HIGH, BURSTABLE = MODERATED"}, - {"alter resource group x ru_per_sec=20 priority=HIGH BURSTABLE=off", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = HIGH, BURSTABLE = OFF"}, - - {"alter resource group x QUERY_LIMIT=NULL", true, "ALTER RESOURCE GROUP `x` QUERY_LIMIT = NULL"}, - {"alter resource group x QUERY_LIMIT=()", true, "ALTER RESOURCE GROUP `x` QUERY_LIMIT = NULL"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION DRYRUN)", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = DRYRUN)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=()", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = NULL"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10m' ACTION COOLDOWN)", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10m' ACTION = COOLDOWN)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=( ACTION KILL EXEC_ELAPSED '10m')", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (ACTION = KILL EXEC_ELAPSED = '10m')"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' WATCH SIMILAR DURATION '10m' ACTION COOLDOWN)", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' WATCH = SIMILAR DURATION = '10m' ACTION = COOLDOWN)"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION COOLDOWN WATCH EXACT DURATION '10m')", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m')"}, - {"alter resource group x ru_per_sec=UNLIMITED QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION COOLDOWN WATCH EXACT DURATION '10m')", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m')"}, - // This case is expected in parser test but not in actual ddl job. - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s')", true, "ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s')"}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT EXEC_ELAPSED '10s'", false, ""}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' ACTION DRYRUN ACTION KILL)", false, ""}, - {"alter resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' ACTION DRYRUN WATCH SIMILAR DURATION '10m' ACTION COOLDOWN)", false, ""}, - {"alter resource group x background=()", true, "ALTER RESOURCE GROUP `x` BACKGROUND = NULL"}, - {"alter resource group x background NULL", true, "ALTER RESOURCE GROUP `x` BACKGROUND = NULL"}, - {"alter resource group default priority=low background = ( task_types \"ttl\" )", true, "ALTER RESOURCE GROUP `default` PRIORITY = LOW, BACKGROUND = (TASK_TYPES = 'ttl')"}, - {"alter resource group default burstable=unlimited background ( task_types = 'a,b,c' )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = UNLIMITED, BACKGROUND = (TASK_TYPES = 'a,b,c')"}, - {"alter resource group default burstable=moderated background ( task_types = 'a,b,c' )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = MODERATED, BACKGROUND = (TASK_TYPES = 'a,b,c')"}, - {"alter resource group default burstable=off background ( task_types = 'a,b,c' )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = OFF, BACKGROUND = (TASK_TYPES = 'a,b,c')"}, - {"alter resource group default burstable=unlimited background ( utilization_limit = 20 )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = UNLIMITED, BACKGROUND = (UTILIZATION_LIMIT = 20)"}, - {"alter resource group default burstable=moderated background ( utilization_limit = 20 )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = MODERATED, BACKGROUND = (UTILIZATION_LIMIT = 20)"}, - {"alter resource group default burstable=off background ( utilization_limit = 20 )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = OFF, BACKGROUND = (UTILIZATION_LIMIT = 20)"}, - {"alter resource group default burstable=unlimited background ( task_types = 'a,b,c', utilization_limit = 20 )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = UNLIMITED, BACKGROUND = (TASK_TYPES = 'a,b,c', UTILIZATION_LIMIT = 20)"}, - {"alter resource group default burstable=moderated background ( task_types = 'a,b,c', utilization_limit = 20 )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = MODERATED, BACKGROUND = (TASK_TYPES = 'a,b,c', UTILIZATION_LIMIT = 20)"}, - {"alter resource group default burstable=off background ( task_types = 'a,b,c', utilization_limit = 20 )", true, "ALTER RESOURCE GROUP `default` BURSTABLE = OFF, BACKGROUND = (TASK_TYPES = 'a,b,c', UTILIZATION_LIMIT = 20)"}, - {"alter resource group default burstable=unlimited background ( utilization_limit = 'abc' )", false, ""}, - {"alter resource group default burstable=moderated background ( utilization_limit = 'abc' )", false, ""}, - {"alter resource group default burstable=off background ( utilization_limit = 'abc' )", false, ""}, - - {"drop resource group x;", true, "DROP RESOURCE GROUP `x`"}, - {"drop resource group DEFAULT;", true, "DROP RESOURCE GROUP `DEFAULT`"}, - {"drop resource group if exists x;", true, "DROP RESOURCE GROUP IF EXISTS `x`"}, - {"drop resource group x,y", false, ""}, - {"drop resource group if exists x,y", false, ""}, - - {"set resource group x;", true, "SET RESOURCE GROUP `x`"}, - {"set resource group ``;", true, "SET RESOURCE GROUP ``"}, - {"set resource group `default`;", true, "SET RESOURCE GROUP `default`"}, - {"set resource group default;", true, "SET RESOURCE GROUP `default`"}, - {"set resource group x y", false, ""}, - - {"CREATE ROLE `RESOURCE`", true, "CREATE ROLE `RESOURCE`@`%`"}, - {"CREATE ROLE RESOURCE", false, ""}, - - // for table stats options - // 1. create table with options - {"CREATE TABLE t (a int) STATS_BUCKETS=1", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1"}, - {"CREATE TABLE t (a int) STATS_BUCKETS='abc'", false, ""}, - {"CREATE TABLE t (a int) STATS_BUCKETS=", false, ""}, - {"CREATE TABLE t (a int) STATS_TOPN=1", true, "CREATE TABLE `t` (`a` INT) STATS_TOPN = 1"}, - {"CREATE TABLE t (a int) STATS_TOPN='abc'", false, ""}, - {"CREATE TABLE t (a int) STATS_AUTO_RECALC=1", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1"}, - {"CREATE TABLE t (a int) STATS_AUTO_RECALC='abc'", false, ""}, - {"CREATE TABLE t(a int) STATS_SAMPLE_RATE=0.1", true, "CREATE TABLE `t` (`a` INT) STATS_SAMPLE_RATE = 0.1"}, - {"CREATE TABLE t (a int) STATS_SAMPLE_RATE='abc'", false, ""}, - {"CREATE TABLE t (a int) STATS_COL_CHOICE='all'", true, "CREATE TABLE `t` (`a` INT) STATS_COL_CHOICE = 'all'"}, - {"CREATE TABLE t (a int) STATS_COL_CHOICE='list'", true, "CREATE TABLE `t` (`a` INT) STATS_COL_CHOICE = 'list'"}, - {"CREATE TABLE t (a int) STATS_COL_CHOICE=1", false, ""}, - {"CREATE TABLE t (a int, b int) STATS_COL_LIST='a,b'", true, "CREATE TABLE `t` (`a` INT,`b` INT) STATS_COL_LIST = 'a,b'"}, - {"CREATE TABLE t (a int, b int) STATS_COL_LIST=1", false, ""}, - {"CREATE TABLE t (a int) STATS_BUCKETS=1,STATS_TOPN=1", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 STATS_TOPN = 1"}, - // 2. create partition table with options - {"CREATE TABLE t (a int) STATS_BUCKETS=1,STATS_TOPN=1 PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (200))", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 STATS_TOPN = 1 PARTITION BY RANGE (`a`) (PARTITION `p1` VALUES LESS THAN (200))"}, - // 3. alter table with options - {"ALTER TABLE t STATS_OPTIONS='str'", true, "ALTER TABLE `t` STATS_OPTIONS='str'"}, - {"ALTER TABLE t STATS_OPTIONS='str1,str2'", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, - {"ALTER TABLE t STATS_OPTIONS=\"str1,str2\"", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, - {"ALTER TABLE t STATS_OPTIONS 'str1,str2'", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, - {"ALTER TABLE t STATS_OPTIONS \"str1,str2\"", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, - {"ALTER TABLE t STATS_OPTIONS=DEFAULT", true, "ALTER TABLE `t` STATS_OPTIONS=DEFAULT"}, - {"ALTER TABLE t STATS_OPTIONS=default", true, "ALTER TABLE `t` STATS_OPTIONS=DEFAULT"}, - {"ALTER TABLE t STATS_OPTIONS=DeFaUlT", true, "ALTER TABLE `t` STATS_OPTIONS=DEFAULT"}, - {"ALTER TABLE t STATS_OPTIONS", false, ""}, - - // Restore INSERT_METHOD table option - {"CREATE TABLE t (a int) INSERT_METHOD=FIRST", true, "CREATE TABLE `t` (`a` INT) INSERT_METHOD = FIRST"}, - } - RunTest(t, table, false, false) -} - func TestHintError(t *testing.T) { p := parser.New() stmt, warns, err := p.Parse("select /*+ tidb_unknown(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") @@ -6290,247 +2681,6 @@ func TestOptimizerHints(t *testing.T) { } } -func TestType(t *testing.T) { - table := []testCase{ - // for time fsp - {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true, "CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2))"}, - - // for hexadecimal - {"select x'0a', X'11', 0x11", true, "SELECT x'0a',x'11',x'11'"}, - {"select x'13181C76734725455A'", true, "SELECT x'13181c76734725455a'"}, - {"select x'0xaa'", false, ""}, - {"select 0X11", false, ""}, - {"select 0x4920616D2061206C6F6E672068657820737472696E67", true, "SELECT x'4920616d2061206c6f6e672068657820737472696e67'"}, - - // for bit - {"select 0b01, 0b0, b'11', B'11'", true, "SELECT b'1',b'0',b'11',b'11'"}, - // 0B01 and 0b21 are identifiers, the following two statement could parse. - // {"select 0B01", false, ""}, - // {"select 0b21", false, ""}, - - // for enum and set type - {"create table t (c1 enum('a', 'b'), c2 set('a', 'b'))", true, "CREATE TABLE `t` (`c1` ENUM('a','b'),`c2` SET('a','b'))"}, - {"create table t (c1 enum('a ', 'b\t'), c2 set('a ', 'b\t'))", true, "CREATE TABLE `t` (`c1` ENUM('a','b\t'),`c2` SET('a','b\t'))"}, - {"create table t (c1 enum('a', 'b') binary, c2 set('a', 'b') binary)", true, "CREATE TABLE `t` (`c1` ENUM('a','b') BINARY,`c2` SET('a','b') BINARY)"}, - {"create table t (c1 enum(0x61, 'b'), c2 set(0x61, 'b'))", true, "CREATE TABLE `t` (`c1` ENUM('a','b'),`c2` SET('a','b'))"}, - {"create table t (c1 enum(0b01100001, 'b'), c2 set(0b01100001, 'b'))", true, "CREATE TABLE `t` (`c1` ENUM('a','b'),`c2` SET('a','b'))"}, - {"create table t (c1 enum)", false, ""}, - {"create table t (c1 set)", false, ""}, - - // for blob and text field length - {"create table t (c1 blob(1024), c2 text(1024))", true, "CREATE TABLE `t` (`c1` BLOB(1024),`c2` TEXT(1024))"}, - - // for year - {"create table t (y year(4), y1 year)", true, "CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR)"}, - {"create table t (y year(4) unsigned zerofill zerofill, y1 year signed unsigned zerofill)", true, "CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR)"}, - - // for national - {"create table t (c1 national char(2), c2 national varchar(2))", true, "CREATE TABLE `t` (`c1` CHAR(2),`c2` VARCHAR(2))"}, - - // for json type - {`create table t (a JSON);`, true, "CREATE TABLE `t` (`a` JSON)"}, - } - RunTest(t, table, false, false) -} - -func TestPrivilege(t *testing.T) { - table := []testCase{ - // for create user - {`CREATE USER 'ttt' REQUIRE X509;`, true, "CREATE USER `ttt`@`%` REQUIRE X509"}, - {`CREATE USER 'ttt' REQUIRE SSL;`, true, "CREATE USER `ttt`@`%` REQUIRE SSL"}, - {`CREATE USER 'ttt' REQUIRE NONE;`, true, "CREATE USER `ttt`@`%` REQUIRE NONE"}, - {`CREATE USER 'ttt' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';`, true, "CREATE USER `ttt`@`%` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA'"}, - {`CREATE USER 'ttt' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' CIPHER 'EDH-RSA-DES-CBC3-SHA' SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com';`, true, "CREATE USER `ttt`@`%` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA' AND SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com'"}, - {`CREATE USER 'ttt' REQUIRE SAN 'DNS:mysql-user, URI:spiffe://example.org/myservice'`, true, "CREATE USER `ttt`@`%` REQUIRE SAN 'DNS:mysql-user, URI:spiffe://example.org/myservice'"}, - {`CREATE USER 'ttt' WITH MAX_QUERIES_PER_HOUR 2;`, true, "CREATE USER `ttt`@`%` WITH MAX_QUERIES_PER_HOUR 2"}, - {`CREATE USER 'ttt'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;`, true, "CREATE USER `ttt`@`localhost` REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK"}, - {`CREATE USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ;`, true, "CREATE USER `u1`@`%` IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK"}, - {`CREATE USER 'test'`, true, "CREATE USER `test`@`%`"}, - {`CREATE USER test`, true, "CREATE USER `test`@`%`"}, - {"CREATE USER `test`", true, "CREATE USER `test`@`%`"}, - {"CREATE USER test-user", false, ""}, - {"CREATE USER test.user", false, ""}, - {"CREATE USER 'test-user'", true, "CREATE USER `test-user`@`%`"}, - {"CREATE USER `test-user`", true, "CREATE USER `test-user`@`%`"}, - {"CREATE USER test.user", false, ""}, - {"CREATE USER 'test.user'", true, "CREATE USER `test.user`@`%`"}, - {"CREATE USER `test.user`", true, "CREATE USER `test.user`@`%`"}, - {"CREATE USER uesr1@LOCALhost", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER `uesr1`@localhost", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER uesr1@`localhost`", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER `uesr1`@`localhost`", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER 'uesr1'@localhost", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER uesr1@'localhost'", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER 'uesr1'@'localhost'", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER 'uesr1'@`localhost`", true, "CREATE USER `uesr1`@`localhost`"}, - {"CREATE USER `uesr1`@'localhost'", true, "CREATE USER `uesr1`@`localhost`"}, - {"create user 'test@localhost' password expire;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE"}, - {"create user 'test@localhost' password expire never;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE NEVER"}, - {"create user 'test@localhost' password expire default;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE DEFAULT"}, - {"create user 'test@localhost' password expire interval 3 day;", true, "CREATE USER `test@localhost`@`%` PASSWORD EXPIRE INTERVAL 3 DAY"}, - {"create user 'test@localhost' identified by 'password' failed_login_attempts 3 password_lock_time 3;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3"}, - {"create user 'test@localhost' identified by 'password' failed_login_attempts 3 password_lock_time unbounded;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED"}, - {"create user 'test@localhost' identified by 'password' failed_login_attempts 3;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3"}, - {"create user 'test@localhost' identified by 'password' password_lock_time 3;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' PASSWORD_LOCK_TIME 3"}, - {"create user 'test@localhost' identified by 'password' password_lock_time unbounded;", true, "CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' PASSWORD_LOCK_TIME UNBOUNDED"}, - {"CREATE USER 'sha_test'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY 'sha_test'", true, "CREATE USER `sha_test`@`localhost` IDENTIFIED WITH 'caching_sha2_password' BY 'sha_test'"}, - {"CREATE USER 'sha_test3'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x24412430303524255B03496C662C1055127B3B654A2F04207D01485276703644704B76303247474564416A516662346C5868646D32764C6B514F43585A473779565947514F34", true, "CREATE USER `sha_test3`@`localhost` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[\x03Ilf,\x10U\x12{;eJ/\x04 }\x01HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4'"}, - {"CREATE USER 'sha_test4'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[\x03Ilf,\x10U\x12{;eJ/\x04 }\x01HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4'", true, "CREATE USER `sha_test4`@`localhost` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[\x03Ilf,\x10U\x12{;eJ/\x04 }\x01HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4'"}, - {"CREATE USER `user@pingcap.com`@'localhost' IDENTIFIED WITH 'tidb_auth_token' REQUIRE token_issuer 'issuer-abc' ATTRIBUTE '{\"email\": \"user@pingcap.com\"}'", true, "CREATE USER `user@pingcap.com`@`localhost` IDENTIFIED WITH 'tidb_auth_token' REQUIRE TOKEN_ISSUER 'issuer-abc' ATTRIBUTE '{\"email\": \"user@pingcap.com\"}'"}, - {"CREATE USER 'nopwd_native'@'localhost' IDENTIFIED WITH 'mysql_native_password'", true, "CREATE USER `nopwd_native`@`localhost` IDENTIFIED WITH 'mysql_native_password'"}, - {"CREATE USER 'nopwd_sha'@'localhost' IDENTIFIED WITH 'caching_sha2_password'", true, "CREATE USER `nopwd_sha`@`localhost` IDENTIFIED WITH 'caching_sha2_password'"}, - {"CREATE ROLE `test-role`, `role1`@'localhost'", true, "CREATE ROLE `test-role`@`%`, `role1`@`localhost`"}, - {"CREATE ROLE `test-role`", true, "CREATE ROLE `test-role`@`%`"}, - {"CREATE ROLE role1", true, "CREATE ROLE `role1`@`%`"}, - {"CREATE ROLE `role1`@'localhost'", true, "CREATE ROLE `role1`@`localhost`"}, - {"create user 'bug19354014user'@'%' identified WITH mysql_native_password", true, "CREATE USER `bug19354014user`@`%` IDENTIFIED WITH 'mysql_native_password'"}, - {"create user 'bug19354014user'@'%' identified WITH mysql_native_password by 'new-password'", true, "CREATE USER `bug19354014user`@`%` IDENTIFIED WITH 'mysql_native_password' BY 'new-password'"}, - {"create user 'bug19354014user'@'%' identified WITH mysql_native_password as 'hashstring'", true, "CREATE USER `bug19354014user`@`%` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, - {`CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "CREATE USER IF NOT EXISTS `root`@`localhost` IDENTIFIED BY 'new-password'"}, - {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "CREATE USER `root`@`localhost` IDENTIFIED BY 'new-password'"}, - {`CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true, "CREATE USER `root`@`localhost` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, - {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true, "CREATE USER `root`@`localhost` IDENTIFIED BY 'new-password', `root`@`127.0.0.1` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, - {`CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'hashstring' RESOURCE GROUP rg1`, true, "CREATE USER `root`@`127.0.0.1` IDENTIFIED BY 'hashstring' RESOURCE GROUP `rg1`"}, - {`ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "ALTER USER IF EXISTS `root`@`localhost` IDENTIFIED BY 'new-password'"}, - {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true, "ALTER USER `root`@`localhost` IDENTIFIED BY 'new-password'"}, - {`ALTER USER 'root'@'localhost' RESOURCE GROUP rg2`, true, "ALTER USER `root`@`localhost` RESOURCE GROUP `rg2`"}, - {`ALTER USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true, "ALTER USER `root`@`localhost` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, - {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true, "ALTER USER `root`@`localhost` IDENTIFIED BY 'new-password', `root`@`127.0.0.1` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring'"}, - {`ALTER USER USER() IDENTIFIED BY 'new-password'`, true, "ALTER USER USER() IDENTIFIED BY 'new-password'"}, - {`ALTER USER IF EXISTS USER() IDENTIFIED BY 'new-password'`, true, "ALTER USER IF EXISTS USER() IDENTIFIED BY 'new-password'"}, - {"alter user 'test@localhost' password expire;", true, "ALTER USER `test@localhost`@`%` PASSWORD EXPIRE"}, - {"alter user 'test@localhost' password expire never;", true, "ALTER USER `test@localhost`@`%` PASSWORD EXPIRE NEVER"}, - {"alter user 'test@localhost' password expire default;", true, "ALTER USER `test@localhost`@`%` PASSWORD EXPIRE DEFAULT"}, - {"alter user 'test@localhost' password expire interval 3 day;", true, "ALTER USER `test@localhost`@`%` PASSWORD EXPIRE INTERVAL 3 DAY"}, - {"ALTER USER 'ttt' REQUIRE X509;", true, "ALTER USER `ttt`@`%` REQUIRE X509"}, - {"ALTER USER 'ttt' REQUIRE SSL;", true, "ALTER USER `ttt`@`%` REQUIRE SSL"}, - {"ALTER USER 'ttt' REQUIRE NONE;", true, "ALTER USER `ttt`@`%` REQUIRE NONE"}, - {"ALTER USER 'ttt' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';", true, "ALTER USER `ttt`@`%` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA'"}, - {"ALTER USER 'ttt' WITH MAX_QUERIES_PER_HOUR 2;", true, "ALTER USER `ttt`@`%` WITH MAX_QUERIES_PER_HOUR 2"}, - {"ALTER USER 'ttt' WITH MAX_UPDATES_PER_HOUR 2;", true, "ALTER USER `ttt`@`%` WITH MAX_UPDATES_PER_HOUR 2"}, - {"ALTER USER 'ttt' WITH MAX_CONNECTIONS_PER_HOUR 2;", true, "ALTER USER `ttt`@`%` WITH MAX_CONNECTIONS_PER_HOUR 2"}, - {"ALTER USER 'ttt' WITH MAX_USER_CONNECTIONS 2;", true, "ALTER USER `ttt`@`%` WITH MAX_USER_CONNECTIONS 2"}, - {"ALTER USER 'ttt'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;", true, "ALTER USER `ttt`@`localhost` REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK"}, - {`DROP USER 'root'@'localhost', 'root1'@'localhost'`, true, "DROP USER `root`@`localhost`, `root1`@`localhost`"}, - {`DROP USER IF EXISTS 'root'@'localhost'`, true, "DROP USER IF EXISTS `root`@`localhost`"}, - {`RENAME USER 'root'@'localhost' TO 'root'@'%'`, true, "RENAME USER `root`@`localhost` TO `root`@`%`"}, - {`RENAME USER 'fred' TO 'barry'`, true, "RENAME USER `fred`@`%` TO `barry`@`%`"}, - {`RENAME USER u1 to u2, u3 to u4`, true, "RENAME USER `u1`@`%` TO `u2`@`%`, `u3`@`%` TO `u4`@`%`"}, - {`DROP ROLE 'role'@'localhost', 'role1'@'localhost'`, true, "DROP ROLE `role`@`localhost`, `role1`@`localhost`"}, - {`DROP ROLE 'administrator', 'developer';`, true, "DROP ROLE `administrator`@`%`, `developer`@`%`"}, - {`DROP ROLE IF EXISTS 'role'@'localhost'`, true, "DROP ROLE IF EXISTS `role`@`localhost`"}, - - // for grant statement - {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost' REQUIRE X509;", true, "GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE X509"}, - {"GRANT ALL ON db1.* TO 'jeffrey'@'LOCALhost' REQUIRE SSL;", true, "GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE SSL"}, - {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost' REQUIRE NONE;", true, "GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE NONE"}, - {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';", true, "GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA'"}, - {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost';", true, "GRANT ALL ON `db1`.* TO `jeffrey`@`localhost`"}, - {"GRANT ALL ON TABLE db1.* TO 'jeffrey'@'localhost';", true, "GRANT ALL ON TABLE `db1`.* TO `jeffrey`@`localhost`"}, - {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost' WITH GRANT OPTION;", true, "GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` WITH GRANT OPTION"}, - {"GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';", true, "GRANT SELECT ON `db2`.`invoice` TO `jeffrey`@`localhost`"}, - {"GRANT ALL ON *.* TO 'someuser'@'somehost';", true, "GRANT ALL ON *.* TO `someuser`@`somehost`"}, - {"GRANT ALL ON *.* TO 'SOMEuser'@'SOMEhost';", true, "GRANT ALL ON *.* TO `SOMEuser`@`somehost`"}, - {"GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';", true, "GRANT SELECT, INSERT ON *.* TO `someuser`@`somehost`"}, - {"GRANT ALL ON mydb.* TO 'someuser'@'somehost';", true, "GRANT ALL ON `mydb`.* TO `someuser`@`somehost`"}, - {"GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';", true, "GRANT SELECT, INSERT ON `mydb`.* TO `someuser`@`somehost`"}, - {"GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';", true, "GRANT ALL ON `mydb`.`mytbl` TO `someuser`@`somehost`"}, - {"GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';", true, "GRANT SELECT, INSERT ON `mydb`.`mytbl` TO `someuser`@`somehost`"}, - {"GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';", true, "GRANT SELECT (`col1`), INSERT (`col1`,`col2`) ON `mydb`.`mytbl` TO `someuser`@`somehost`"}, - {"grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'password';", true, "GRANT ALL ON `zabbix`.* TO `zabbix`@`localhost` IDENTIFIED BY 'password'"}, - {"GRANT SELECT ON test.* to 'test'", true, "GRANT SELECT ON `test`.* TO `test`@`%`"}, // For issue 2654. - {"grant PROCESS,usage, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'xxxxxxxxxx'@'%' identified by password 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'", true, "GRANT PROCESS, USAGE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `xxxxxxxxxx`@`%` IDENTIFIED WITH 'mysql_native_password' AS 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'"}, - {"/* rds internal mark */ GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, RELOAD, PROCESS, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER on *.* to 'root2'@'%' identified by password '*sdsadsdsadssadsadsadsadsada' with grant option", true, "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, RELOAD, PROCESS, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO `root2`@`%` IDENTIFIED WITH 'mysql_native_password' AS '*sdsadsdsadssadsadsadsadsada' WITH GRANT OPTION"}, - {"GRANT 'role1', 'role2' TO 'user1'@'LOCalhost', 'user2'@'LOcalhost';", true, "GRANT `role1`@`%`, `role2`@`%` TO `user1`@`localhost`, `user2`@`localhost`"}, - {"GRANT 'u1' TO 'u1';", true, "GRANT `u1`@`%` TO `u1`@`%`"}, - {"GRANT 'app_read'@'%','app_write'@'%' TO 'rw_user1'@'localhost'", true, "GRANT `app_read`@`%`, `app_write`@`%` TO `rw_user1`@`localhost`"}, - {"GRANT 'app_developer' TO 'dev1'@'localhost';", true, "GRANT `app_developer`@`%` TO `dev1`@`localhost`"}, - {"GRANT SHUTDOWN ON *.* TO 'dev1'@'localhost';", true, "GRANT SHUTDOWN ON *.* TO `dev1`@`localhost`"}, - {"GRANT CONFIG ON *.* TO 'dev1'@'localhost';", true, "GRANT CONFIG ON *.* TO `dev1`@`localhost`"}, - {"GRANT CREATE ON *.* TO 'dev1'@'localhost';", true, "GRANT CREATE ON *.* TO `dev1`@`localhost`"}, - {"GRANT CREATE TABLESPACE ON *.* TO 'dev1'@'localhost';", true, "GRANT CREATE TABLESPACE ON *.* TO `dev1`@`localhost`"}, - {"GRANT EXECUTE ON FUNCTION db1.anomaly_score TO 'user1'@'domain-or-ip-address1'", true, "GRANT EXECUTE ON FUNCTION `db1`.`anomaly_score` TO `user1`@`domain-or-ip-address1`"}, - {"GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost'", true, "GRANT EXECUTE ON PROCEDURE `mydb`.`myproc` TO `someuser`@`somehost`"}, - {"GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN ON *.* TO 'root'@'localhost'", true, "GRANT APPLICATION_PASSWORD_ADMIN, AUDIT_ADMIN ON *.* TO `root`@`localhost`"}, - {"GRANT LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA, INVOKE SAGEMAKER, INVOKE COMPREHEND ON *.* TO 'root'@'localhost'", true, "GRANT LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA, INVOKE SAGEMAKER, INVOKE COMPREHEND ON *.* TO `root`@`localhost`"}, - {"GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost'", true, "GRANT PROXY ON `localuser`@`localhost` TO `externaluser`@`somehost`"}, - {"GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION", true, "GRANT PROXY ON ``@`` TO `root`@`localhost` WITH GRANT OPTION"}, - {"GRANT PROXY ON 'proxied_user' TO 'proxy_user1', 'proxy_user2'", true, "GRANT PROXY ON `proxied_user`@`%` TO `proxy_user1`@`%`, `proxy_user2`@`%`"}, - {"grant grant option on *.* to u1", true, "GRANT GRANT OPTION ON *.* TO `u1`@`%`"}, // not typical syntax, but supported - - // for revoke statement - {"REVOKE ALL ON db1.* FROM 'jeffrey'@'LOCalhost';", true, "REVOKE ALL ON `db1`.* FROM `jeffrey`@`localhost`"}, - {"REVOKE SELECT ON db2.invoice FROM 'jeffrey'@'localhost';", true, "REVOKE SELECT ON `db2`.`invoice` FROM `jeffrey`@`localhost`"}, - {"REVOKE ALL ON *.* FROM 'someuser'@'somehost';", true, "REVOKE ALL ON *.* FROM `someuser`@`somehost`"}, - {"REVOKE SELECT, INSERT ON *.* FROM 'someuser'@'somehost';", true, "REVOKE SELECT, INSERT ON *.* FROM `someuser`@`somehost`"}, - {"REVOKE ALL ON mydb.* FROM 'someuser'@'somehost';", true, "REVOKE ALL ON `mydb`.* FROM `someuser`@`somehost`"}, - {"REVOKE SELECT, INSERT ON mydb.* FROM 'someuser'@'somehost';", true, "REVOKE SELECT, INSERT ON `mydb`.* FROM `someuser`@`somehost`"}, - {"REVOKE ALL ON mydb.mytbl FROM 'someuser'@'somehost';", true, "REVOKE ALL ON `mydb`.`mytbl` FROM `someuser`@`somehost`"}, - {"REVOKE SELECT, INSERT ON mydb.mytbl FROM 'someuser'@'somehost';", true, "REVOKE SELECT, INSERT ON `mydb`.`mytbl` FROM `someuser`@`somehost`"}, - {"REVOKE SELECT (col1), INSERT (col1,col2) ON mydb.mytbl FROM 'someuser'@'somehost';", true, "REVOKE SELECT (`col1`), INSERT (`col1`,`col2`) ON `mydb`.`mytbl` FROM `someuser`@`somehost`"}, - {"REVOKE all privileges on zabbix.* FROM 'zabbix'@'localhost' identified by 'password';", true, "REVOKE ALL ON `zabbix`.* FROM `zabbix`@`localhost` IDENTIFIED BY 'password'"}, - {"REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';", true, "REVOKE `role1`@`%`, `role2`@`%` FROM `user1`@`localhost`, `user2`@`localhost`"}, - {"REVOKE SHUTDOWN ON *.* FROM 'dev1'@'localhost';", true, "REVOKE SHUTDOWN ON *.* FROM `dev1`@`localhost`"}, - {"REVOKE CONFIG ON *.* FROM 'dev1'@'localhost';", true, "REVOKE CONFIG ON *.* FROM `dev1`@`localhost`"}, - {"REVOKE EXECUTE ON FUNCTION db.func FROM 'user'@'localhost'", true, "REVOKE EXECUTE ON FUNCTION `db`.`func` FROM `user`@`localhost`"}, - {"REVOKE EXECUTE ON PROCEDURE db.func FROM 'user'@'localhost'", true, "REVOKE EXECUTE ON PROCEDURE `db`.`func` FROM `user`@`localhost`"}, - {"REVOKE APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN ON *.* FROM 'root'@'localhost'", true, "REVOKE APPLICATION_PASSWORD_ADMIN, AUDIT_ADMIN ON *.* FROM `root`@`localhost`"}, - {"revoke all privileges, grant option from u1", true, "REVOKE ALL, GRANT OPTION ON *.* FROM `u1`@`%`"}, // special case syntax - {"revoke all privileges, grant option from u1, u2, u3", true, "REVOKE ALL, GRANT OPTION ON *.* FROM `u1`@`%`, `u2`@`%`, `u3`@`%`"}, // special case syntax - } - RunTest(t, table, false, false) -} - -func TestPrivilegeMariaDBEnabled(t *testing.T) { - // Test with additional MariaDB syntax ENABLED (arg three for RunTest==true) - table := []testCase{ - {"GRANT BINLOG MONITOR ON *.* TO 'user1'@'localhost'", true, "GRANT REPLICATION CLIENT ON *.* TO `user1`@`localhost`"}, - } - RunTest(t, table, false, true) -} - -func TestPrivilegeMariaDBDisabled(t *testing.T) { - // Test with additional MariaDB syntax DISABLED (arg three for RunTest==false) - table := []testCase{ - {"GRANT BINLOG MONITOR ON *.* TO 'user1'@'localhost'", false, "GRANT REPLICATION CLIENT ON *.* TO `user1`@`localhost`"}, - } - RunTest(t, table, false, false) -} - -func TestComment(t *testing.T) { - table := []testCase{ - {"create table t (c int comment 'comment')", true, "CREATE TABLE `t` (`c` INT COMMENT 'comment')"}, - {"create table t (c int) comment = 'comment'", true, "CREATE TABLE `t` (`c` INT) COMMENT = 'comment'"}, - {"create table t (c int) comment 'comment'", true, "CREATE TABLE `t` (`c` INT) COMMENT = 'comment'"}, - {"create table t (c int) comment comment", false, ""}, - {"create table t (comment text)", true, "CREATE TABLE `t` (`comment` TEXT)"}, - {"START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */", true, "START TRANSACTION"}, - // for comment in query - {"/*comment*/ /*comment*/ select c /* this is a comment */ from t;", true, "SELECT `c` FROM `t`"}, - // for unclosed comment - {"delete from t where a = 7 or 1=1/*' and b = 'p'", false, ""}, - - {"create table t (ssl int)", false, ""}, - {"create table t (require int)", false, ""}, - {"create table t (account int)", true, "CREATE TABLE `t` (`account` INT)"}, - {"create table t (expire int)", true, "CREATE TABLE `t` (`expire` INT)"}, - {"create table t (cipher int)", true, "CREATE TABLE `t` (`cipher` INT)"}, - {"create table t (issuer int)", true, "CREATE TABLE `t` (`issuer` INT)"}, - {"create table t (never int)", true, "CREATE TABLE `t` (`never` INT)"}, - {"create table t (subject int)", true, "CREATE TABLE `t` (`subject` INT)"}, - {"create table t (x509 int)", true, "CREATE TABLE `t` (`x509` INT)"}, - - // COMMENT/ATTRIBUTE in CREATE/ALTER USER - {"create user commentUser COMMENT '123456' '{\"name\": \"Tom\", \"age\", 19}", false, ""}, - {"alter user commentUser COMMENT '123456' '{\"name\": \"Tom\", \"age\", 19}", false, ""}, - {"create user commentUser COMMENT '123456'", true, "CREATE USER `commentUser`@`%` COMMENT '123456'"}, - {"alter user commentUser COMMENT '123456'", true, "ALTER USER `commentUser`@`%` COMMENT '123456'"}, - {"create user commentUser ATTRIBUTE '{\"name\": \"Tom\", \"age\", 19}'", true, "CREATE USER `commentUser`@`%` ATTRIBUTE '{\"name\": \"Tom\", \"age\", 19}'"}, - {"alter user commentUser ATTRIBUTE '{\"name\": \"Tom\", \"age\", 19}'", true, "ALTER USER `commentUser`@`%` ATTRIBUTE '{\"name\": \"Tom\", \"age\", 19}'"}, - } - RunTest(t, table, false, false) -} - func TestParserErrMsg(t *testing.T) { commentMsgCases := []testErrMsgCase{ {"delete from t where a = 7 or 1=1/*' and b = 'p'", errors.New("near '/*' and b = 'p'' at line 1")}, @@ -6568,39 +2718,6 @@ func (sc *subqueryChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) { } func TestSubquery(t *testing.T) { - table := []testCase{ - // for compare subquery - {"SELECT 1 > (select 1)", true, "SELECT 1>(SELECT 1)"}, - {"SELECT 1 > ANY (select 1)", true, "SELECT 1>ANY (SELECT 1)"}, - {"SELECT 1 > ALL (select 1)", true, "SELECT 1>ALL (SELECT 1)"}, - {"SELECT 1 > SOME (select 1)", true, "SELECT 1>ANY (SELECT 1)"}, - - // for exists subquery - {"SELECT EXISTS select 1", false, ""}, - {"SELECT EXISTS (select 1)", true, "SELECT EXISTS (SELECT 1)"}, - {"SELECT + EXISTS (select 1)", true, "SELECT +EXISTS (SELECT 1)"}, - {"SELECT - EXISTS (select 1)", true, "SELECT -EXISTS (SELECT 1)"}, - {"SELECT NOT EXISTS (select 1)", true, "SELECT NOT EXISTS (SELECT 1)"}, - {"SELECT + NOT EXISTS (select 1)", false, ""}, - {"SELECT - NOT EXISTS (select 1)", false, ""}, - {"SELECT * FROM t where t.a in (select a from t limit 1, 10)", true, "SELECT * FROM `t` WHERE `t`.`a` IN (SELECT `a` FROM `t` LIMIT 1,10)"}, - {"SELECT * FROM t where t.a in ((select a from t limit 1, 10))", true, "SELECT * FROM `t` WHERE `t`.`a` IN ((SELECT `a` FROM `t` LIMIT 1,10))"}, - {"SELECT * FROM t where t.a in ((select a from t limit 1, 10), 1)", true, "SELECT * FROM `t` WHERE `t`.`a` IN ((SELECT `a` FROM `t` LIMIT 1,10),1)"}, - {"select * from ((select a from t) t1 join t t2) join t3", true, "SELECT * FROM ((SELECT `a` FROM `t`) AS `t1` JOIN `t` AS `t2`) JOIN `t3`"}, - {"SELECT t1.a AS a FROM ((SELECT a FROM t) AS t1)", true, "SELECT `t1`.`a` AS `a` FROM (SELECT `a` FROM `t`) AS `t1`"}, - {"select count(*) from (select a, b from x1 union all select a, b from x3 union all (select x1.a, x3.b from (select * from x3 union all select * from x2) x3 left join x1 on x3.a = x1.b))", true, "SELECT COUNT(1) FROM (SELECT `a`,`b` FROM `x1` UNION ALL SELECT `a`,`b` FROM `x3` UNION ALL (SELECT `x1`.`a`,`x3`.`b` FROM (SELECT * FROM `x3` UNION ALL SELECT * FROM `x2`) AS `x3` LEFT JOIN `x1` ON `x3`.`a`=`x1`.`b`))"}, - {"(SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)", true, "(SELECT 1 AS `a`,3 AS `b`) UNION (SELECT 2,1) ORDER BY (SELECT 2)"}, - {"((select * from t1)) union (select * from t1)", true, "(SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)"}, - {"(((select * from t1))) union (select * from t1)", true, "(SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)"}, - {"select * from (((select * from t1)) union (select * from t1) union (select * from t1)) a", true, "SELECT * FROM ((SELECT * FROM `t1`) UNION (SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)) AS `a`"}, - {"SELECT COUNT(*) FROM plan_executions WHERE (EXISTS((SELECT * FROM triggers WHERE plan_executions.trigger_id=triggers.id AND triggers.type='CRON')))", true, "SELECT COUNT(1) FROM `plan_executions` WHERE (EXISTS (SELECT * FROM `triggers` WHERE `plan_executions`.`trigger_id`=`triggers`.`id` AND `triggers`.`type`=_UTF8MB4'CRON'))"}, - {"select exists((select 1));", true, "SELECT EXISTS (SELECT 1)"}, - {"select * from ((SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)) t order by a,b", true, "SELECT * FROM ((SELECT 1 AS `a`,3 AS `b`) UNION (SELECT 2,1) ORDER BY (SELECT 2)) AS `t` ORDER BY `a`,`b`"}, - {"select (select * from t1 where a != t.a union all (select * from t2 where a != t.a) order by a limit 1) from t1 t", true, "SELECT (SELECT * FROM `t1` WHERE `a`!=`t`.`a` UNION ALL (SELECT * FROM `t2` WHERE `a`!=`t`.`a`) ORDER BY `a` LIMIT 1) FROM `t1` AS `t`"}, - {"(WITH v0 AS (SELECT TRUE) (SELECT 'abc' EXCEPT (SELECT TRUE)))", true, "WITH `v0` AS (SELECT TRUE) (SELECT _UTF8MB4'abc' EXCEPT (SELECT TRUE))"}, - } - RunTest(t, table, false, false) - tests := []struct { input string text string @@ -6621,127 +2738,6 @@ func TestSubquery(t *testing.T) { } } -func TestSetOperator(t *testing.T) { - table := []testCase{ - // union and union all - {"select c1 from t1 union select c2 from t2", true, "SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2`"}, - {"select c1 from t1 union (select c2 from t2)", true, "SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`)"}, - {"select c1 from t1 union (select c2 from t2) order by c1", true, "SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) ORDER BY `c1`"}, - {"select c1 from t1 union select c2 from t2 order by c2", true, "SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2` ORDER BY `c2`"}, - {"select c1 from t1 union (select c2 from t2) limit 1", true, "SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1"}, - {"select c1 from t1 union (select c2 from t2) limit 1, 1", true, "SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {"select c1 from t1 union (select c2 from t2) order by c1 limit 1", true, "SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) union distinct select c2 from t2", true, "(SELECT `c1` FROM `t1`) UNION SELECT `c2` FROM `t2`"}, - {"(select c1 from t1) union distinctrow select c2 from t2", true, "(SELECT `c1` FROM `t1`) UNION SELECT `c2` FROM `t2`"}, - {"(select c1 from t1) union all select c2 from t2", true, "(SELECT `c1` FROM `t1`) UNION ALL SELECT `c2` FROM `t2`"}, - {"(select c1 from t1) union distinct all select c2 from t2", false, ""}, - {"(select c1 from t1) union distinctrow all select c2 from t2", false, ""}, - {"(select c1 from t1) union (select c2 from t2) order by c1 union select c3 from t3", false, ""}, - {"(select c1 from t1) union (select c2 from t2) limit 1 union select c3 from t3", false, ""}, - {"(select c1 from t1) union select c2 from t2 union (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) UNION SELECT `c2` FROM `t2` UNION (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"select (select 1 union select 1) as a", true, "SELECT (SELECT 1 UNION SELECT 1) AS `a`"}, - {"select * from (select 1 union select 2) as a", true, "SELECT * FROM (SELECT 1 UNION SELECT 2) AS `a`"}, - {"insert into t select c1 from t1 union select c2 from t2", true, "INSERT INTO `t` SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2`"}, - {"insert into t (c) select c1 from t1 union select c2 from t2", true, "INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2`"}, - {"select 2 as a from dual union select 1 as b from dual order by a", true, "SELECT 2 AS `a` UNION SELECT 1 AS `b` ORDER BY `a`"}, - {"table t1 union table t2", true, "TABLE `t1` UNION TABLE `t2`"}, - {"table t1 union (table t2)", true, "TABLE `t1` UNION (TABLE `t2`)"}, - {"table t1 union select * from t2", true, "TABLE `t1` UNION SELECT * FROM `t2`"}, - {"select * from t1 union table t2", true, "SELECT * FROM `t1` UNION TABLE `t2`"}, - {"table t1 union (select c2 from t2) order by c1 limit 1", true, "TABLE `t1` UNION (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1"}, - {"select c1 from t1 union (table t2) order by c1 limit 1", true, "SELECT `c1` FROM `t1` UNION (TABLE `t2`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) union table t2 union (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) UNION TABLE `t2` UNION (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"(table t1) union select c2 from t2 union (table t3) order by c1 limit 1", true, "(TABLE `t1`) UNION SELECT `c2` FROM `t2` UNION (TABLE `t3`) ORDER BY `c1` LIMIT 1"}, - {"values row(1,-2,3), row(5,7,9) union values row(1,-2,3), row(5,7,9)", true, "VALUES ROW(1,-2,3), ROW(5,7,9) UNION VALUES ROW(1,-2,3), ROW(5,7,9)"}, - {"values row(1,-2,3), row(5,7,9) union (values row(1,-2,3), row(5,7,9))", true, "VALUES ROW(1,-2,3), ROW(5,7,9) UNION (VALUES ROW(1,-2,3), ROW(5,7,9))"}, - {"values row(1,-2,3), row(5,7,9) union select * from t", true, "VALUES ROW(1,-2,3), ROW(5,7,9) UNION SELECT * FROM `t`"}, - {"values row(1,-2,3), row(5,7,9) union table t", true, "VALUES ROW(1,-2,3), ROW(5,7,9) UNION TABLE `t`"}, - {"select * from t union values row(1,-2,3), row(5,7,9)", true, "SELECT * FROM `t` UNION VALUES ROW(1,-2,3), ROW(5,7,9)"}, - {"table t union values row(1,-2,3), row(5,7,9)", true, "TABLE `t` UNION VALUES ROW(1,-2,3), ROW(5,7,9)"}, - // except - {"select c1 from t1 except select c2 from t2", true, "SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2`"}, - {"select c1 from t1 except (select c2 from t2)", true, "SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`)"}, - {"select c1 from t1 except (select c2 from t2) order by c1", true, "SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) ORDER BY `c1`"}, - {"select c1 from t1 except select c2 from t2 order by c2", true, "SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2` ORDER BY `c2`"}, - {"select c1 from t1 except (select c2 from t2) limit 1", true, "SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) LIMIT 1"}, - {"select c1 from t1 except (select c2 from t2) limit 1, 1", true, "SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {"select c1 from t1 except (select c2 from t2) order by c1 limit 1", true, "SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) except (select c2 from t2) order by c1 except select c3 from t3", false, ""}, - {"(select c1 from t1) except (select c2 from t2) limit 1 except select c3 from t3", false, ""}, - {"(select c1 from t1) except select c2 from t2 except (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2` EXCEPT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"select (select 1 except select 1) as a", true, "SELECT (SELECT 1 EXCEPT SELECT 1) AS `a`"}, - {"select * from (select 1 except select 2) as a", true, "SELECT * FROM (SELECT 1 EXCEPT SELECT 2) AS `a`"}, - {"insert into t select c1 from t1 except select c2 from t2", true, "INSERT INTO `t` SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2`"}, - {"insert into t (c) select c1 from t1 except select c2 from t2", true, "INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2`"}, - {"select 2 as a from dual except select 1 as b from dual order by a", true, "SELECT 2 AS `a` EXCEPT SELECT 1 AS `b` ORDER BY `a`"}, - {"table t1 except table t2", true, "TABLE `t1` EXCEPT TABLE `t2`"}, - {"table t1 except (table t2)", true, "TABLE `t1` EXCEPT (TABLE `t2`)"}, - {"table t1 except select * from t2", true, "TABLE `t1` EXCEPT SELECT * FROM `t2`"}, - {"select * from t1 except table t2", true, "SELECT * FROM `t1` EXCEPT TABLE `t2`"}, - {"table t1 except (select c2 from t2) order by c1 limit 1", true, "TABLE `t1` EXCEPT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1"}, - {"select c1 from t1 except (table t2) order by c1 limit 1", true, "SELECT `c1` FROM `t1` EXCEPT (TABLE `t2`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) except table t2 except (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) EXCEPT TABLE `t2` EXCEPT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"(table t1) except select c2 from t2 except (table t3) order by c1 limit 1", true, "(TABLE `t1`) EXCEPT SELECT `c2` FROM `t2` EXCEPT (TABLE `t3`) ORDER BY `c1` LIMIT 1"}, - {"values row(1,-2,3), row(5,7,9) except values row(1,-2,3), row(5,7,9)", true, "VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT VALUES ROW(1,-2,3), ROW(5,7,9)"}, - {"values row(1,-2,3), row(5,7,9) except (values row(1,-2,3), row(5,7,9))", true, "VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT (VALUES ROW(1,-2,3), ROW(5,7,9))"}, - {"values row(1,-2,3), row(5,7,9) except select * from t", true, "VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT SELECT * FROM `t`"}, - {"values row(1,-2,3), row(5,7,9) except table t", true, "VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT TABLE `t`"}, - {"select * from t except values row(1,-2,3), row(5,7,9)", true, "SELECT * FROM `t` EXCEPT VALUES ROW(1,-2,3), ROW(5,7,9)"}, - {"table t except values row(1,-2,3), row(5,7,9)", true, "TABLE `t` EXCEPT VALUES ROW(1,-2,3), ROW(5,7,9)"}, - // intersect - {"select c1 from t1 intersect select c2 from t2", true, "SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2`"}, - {"select c1 from t1 intersect (select c2 from t2)", true, "SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`)"}, - {"select c1 from t1 intersect (select c2 from t2) order by c1", true, "SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) ORDER BY `c1`"}, - {"select c1 from t1 intersect select c2 from t2 order by c2", true, "SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2` ORDER BY `c2`"}, - {"select c1 from t1 intersect (select c2 from t2) limit 1", true, "SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) LIMIT 1"}, - {"select c1 from t1 intersect (select c2 from t2) limit 1, 1", true, "SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {"select c1 from t1 intersect (select c2 from t2) order by c1 limit 1", true, "SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) intersect (select c2 from t2) order by c1 intersect select c3 from t3", false, ""}, - {"(select c1 from t1) intersect (select c2 from t2) limit 1 intersect select c3 from t3", false, ""}, - {"(select c1 from t1) intersect select c2 from t2 intersect (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) INTERSECT SELECT `c2` FROM `t2` INTERSECT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"select (select 1 intersect select 1) as a", true, "SELECT (SELECT 1 INTERSECT SELECT 1) AS `a`"}, - {"select * from (select 1 intersect select 2) as a", true, "SELECT * FROM (SELECT 1 INTERSECT SELECT 2) AS `a`"}, - {"insert into t select c1 from t1 intersect select c2 from t2", true, "INSERT INTO `t` SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2`"}, - {"insert into t (c) select c1 from t1 intersect select c2 from t2", true, "INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2`"}, - {"select 2 as a from dual intersect select 1 as b from dual order by a", true, "SELECT 2 AS `a` INTERSECT SELECT 1 AS `b` ORDER BY `a`"}, - {"table t1 intersect table t2", true, "TABLE `t1` INTERSECT TABLE `t2`"}, - {"table t1 intersect (table t2)", true, "TABLE `t1` INTERSECT (TABLE `t2`)"}, - {"table t1 intersect select * from t2", true, "TABLE `t1` INTERSECT SELECT * FROM `t2`"}, - {"select * from t1 intersect table t2", true, "SELECT * FROM `t1` INTERSECT TABLE `t2`"}, - {"table t1 intersect (select c2 from t2) order by c1 limit 1", true, "TABLE `t1` INTERSECT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1"}, - {"select c1 from t1 intersect (table t2) order by c1 limit 1", true, "SELECT `c1` FROM `t1` INTERSECT (TABLE `t2`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) intersect table t2 intersect (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) INTERSECT TABLE `t2` INTERSECT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"(table t1) intersect select c2 from t2 intersect (table t3) order by c1 limit 1", true, "(TABLE `t1`) INTERSECT SELECT `c2` FROM `t2` INTERSECT (TABLE `t3`) ORDER BY `c1` LIMIT 1"}, - {"values row(1,-2,3), row(5,7,9) intersect values row(1,-2,3), row(5,7,9)", true, "VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT VALUES ROW(1,-2,3), ROW(5,7,9)"}, - {"values row(1,-2,3), row(5,7,9) intersect (values row(1,-2,3), row(5,7,9))", true, "VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT (VALUES ROW(1,-2,3), ROW(5,7,9))"}, - {"values row(1,-2,3), row(5,7,9) intersect select * from t", true, "VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT SELECT * FROM `t`"}, - {"values row(1,-2,3), row(5,7,9) intersect table t", true, "VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT TABLE `t`"}, - {"select * from t intersect values row(1,-2,3), row(5,7,9)", true, "SELECT * FROM `t` INTERSECT VALUES ROW(1,-2,3), ROW(5,7,9)"}, - {"table t intersect values row(1,-2,3), row(5,7,9)", true, "TABLE `t` INTERSECT VALUES ROW(1,-2,3), ROW(5,7,9)"}, - // mixture of union, except and intersect - {"(select c1 from t1) intersect select c2 from t2 union (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) INTERSECT SELECT `c2` FROM `t2` UNION (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) union all select c2 from t2 except (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) UNION ALL SELECT `c2` FROM `t2` EXCEPT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) except select c2 from t2 intersect (select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2` INTERSECT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"select 1 union distinct select 1 except select 1 intersect select 1", true, "SELECT 1 UNION SELECT 1 EXCEPT SELECT 1 INTERSECT SELECT 1"}, - // mixture of union, except and intersect with parentheses - {"(select c1 from t1) intersect all (select c2 from t2 union (select c3 from t3)) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) INTERSECT ALL (SELECT `c2` FROM `t2` UNION (SELECT `c3` FROM `t3`)) ORDER BY `c1` LIMIT 1"}, - {"(select c1 from t1) union all (select c2 from t2 except select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) UNION ALL (SELECT `c2` FROM `t2` EXCEPT SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"((select c1 from t1) except select c2 from t2) intersect all (select c3 from t3) order by c1 limit 1", true, "((SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2`) INTERSECT ALL (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, - {"select 1 union distinct (select 1 except all select 1 intersect select 1)", true, "SELECT 1 UNION (SELECT 1 EXCEPT ALL SELECT 1 INTERSECT SELECT 1)"}, - - // https://github.com/pingcap/tidb/issues/49874 - {"select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1)", true, - "SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1)"}, - {"select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1) order by pk limit 2", true, - "SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"}, - {"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk limit 2", true, - "(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"}, - {"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk", true, - "(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk`"}, - } - RunTest(t, table, false, false) -} - func checkOrderBy(t *testing.T, s ast.Node, hasOrderBy []bool, i int) int { switch x := s.(type) { case *ast.SelectStmt: @@ -6797,100 +2793,7 @@ func TestUnionOrderBy(t *testing.T) { } } -func TestLikeEscape(t *testing.T) { - table := []testCase{ - // for like escape - {`select "abc_" like "abc\\_" escape ''`, true, "SELECT _UTF8MB4'abc_' LIKE _UTF8MB4'abc\\_' ESCAPE ''"}, - {`select "abc_" like "abc\\_" escape '\\'`, true, "SELECT _UTF8MB4'abc_' LIKE _UTF8MB4'abc\\_'"}, - {`select "abc_" like "abc\\_" escape '||'`, false, ""}, - {`select "abc" like "escape" escape '+'`, true, "SELECT _UTF8MB4'abc' LIKE _UTF8MB4'escape' ESCAPE '+'"}, - {"select '''_' like '''_' escape ''''", true, "SELECT _UTF8MB4'''_' LIKE _UTF8MB4'''_' ESCAPE ''''"}, - } - - RunTest(t, table, false, false) -} - -func TestLockUnlockTables(t *testing.T) { - table := []testCase{ - {`UNLOCK TABLES;`, true, "UNLOCK TABLES"}, - {`LOCK TABLES t1 READ;`, true, "LOCK TABLES `t1` READ"}, - {`LOCK TABLES t1 READ LOCAL;`, true, "LOCK TABLES `t1` READ LOCAL"}, - {`show table status like 't'`, true, "SHOW TABLE STATUS LIKE _UTF8MB4't'"}, - {`LOCK TABLES t2 WRITE`, true, "LOCK TABLES `t2` WRITE"}, - {`LOCK TABLES t2 WRITE LOCAL;`, true, "LOCK TABLES `t2` WRITE LOCAL"}, - {`LOCK TABLES t1 WRITE, t2 READ;`, true, "LOCK TABLES `t1` WRITE, `t2` READ"}, - {`LOCK TABLES t1 WRITE LOCAL, t2 READ LOCAL;`, true, "LOCK TABLES `t1` WRITE LOCAL, `t2` READ LOCAL"}, - - // for unlock table and lock table - {`UNLOCK TABLE;`, true, "UNLOCK TABLES"}, - {`LOCK TABLE t1 READ;`, true, "LOCK TABLES `t1` READ"}, - {`LOCK TABLE t1 READ LOCAL;`, true, "LOCK TABLES `t1` READ LOCAL"}, - {`show table status like 't'`, true, "SHOW TABLE STATUS LIKE _UTF8MB4't'"}, - {`LOCK TABLE t2 WRITE`, true, "LOCK TABLES `t2` WRITE"}, - {`LOCK TABLE t2 WRITE LOCAL;`, true, "LOCK TABLES `t2` WRITE LOCAL"}, - {`LOCK TABLE t1 WRITE, t2 READ;`, true, "LOCK TABLES `t1` WRITE, `t2` READ"}, - - // for cleanup table lock. - {"ADMIN CLEANUP TABLE LOCK", false, ""}, - {"ADMIN CLEANUP TABLE LOCK t", true, "ADMIN CLEANUP TABLE LOCK `t`"}, - {"ADMIN CLEANUP TABLE LOCK t1,t2", true, "ADMIN CLEANUP TABLE LOCK `t1`, `t2`"}, - - // For alter table read only/write. - {"ALTER TABLE t READ ONLY", true, "ALTER TABLE `t` READ ONLY"}, - {"ALTER TABLE t READ WRITE", true, "ALTER TABLE `t` READ WRITE"}, - } - - RunTest(t, table, false, false) -} - -func TestWithRollup(t *testing.T) { - table := []testCase{ - {`select * from t group by a, b rollup`, false, ""}, - {`select * from t group by a, b with rollup`, true, "SELECT * FROM `t` GROUP BY `a`,`b` WITH ROLLUP"}, - // should be ERROR 1241 (21000): Operand should contain 1 column(s) in runtime. - {`select * from t group by (a, b) with rollup`, true, "SELECT * FROM `t` GROUP BY ROW(`a`,`b`) WITH ROLLUP"}, - {`select * from t group by (a+b) with rollup`, true, "SELECT * FROM `t` GROUP BY (`a`+`b`) WITH ROLLUP"}, - } - RunTest(t, table, false, false) -} - -func TestIndexHint(t *testing.T) { - table := []testCase{ - {`select * from t use index (primary)`, true, "SELECT * FROM `t` USE INDEX (`primary`)"}, - {"select * from t use index (`primary`)", true, "SELECT * FROM `t` USE INDEX (`primary`)"}, - {`select * from t use index ();`, true, "SELECT * FROM `t` USE INDEX ()"}, - {`select * from t use index (idx);`, true, "SELECT * FROM `t` USE INDEX (`idx`)"}, - {`select * from t use index (idx1, idx2);`, true, "SELECT * FROM `t` USE INDEX (`idx1`, `idx2`)"}, - {`select * from t ignore key (idx1)`, true, "SELECT * FROM `t` IGNORE INDEX (`idx1`)"}, - {`select * from t force index for join (idx1)`, true, "SELECT * FROM `t` FORCE INDEX FOR JOIN (`idx1`)"}, - {`select * from t use index for order by (idx1)`, true, "SELECT * FROM `t` USE INDEX FOR ORDER BY (`idx1`)"}, - {`select * from t force index for group by (idx1)`, true, "SELECT * FROM `t` FORCE INDEX FOR GROUP BY (`idx1`)"}, - {`select * from t use index for group by (idx1) use index for order by (idx2), t2`, true, "SELECT * FROM (`t` USE INDEX FOR GROUP BY (`idx1`) USE INDEX FOR ORDER BY (`idx2`)) JOIN `t2`"}, - } - - RunTest(t, table, false, false) -} - func TestPriority(t *testing.T) { - table := []testCase{ - {`select high_priority * from t`, true, "SELECT HIGH_PRIORITY * FROM `t`"}, - {`select low_priority * from t`, true, "SELECT LOW_PRIORITY * FROM `t`"}, - {`select delayed * from t`, true, "SELECT DELAYED * FROM `t`"}, - {`insert high_priority into t values (1)`, true, "INSERT HIGH_PRIORITY INTO `t` VALUES (1)"}, - {`insert LOW_PRIORITY into t values (1)`, true, "INSERT LOW_PRIORITY INTO `t` VALUES (1)"}, - {`insert delayed into t values (1)`, true, "INSERT DELAYED INTO `t` VALUES (1)"}, - {`update low_priority t set a = 2`, true, "UPDATE LOW_PRIORITY `t` SET `a`=2"}, - {`update high_priority t set a = 2`, true, "UPDATE HIGH_PRIORITY `t` SET `a`=2"}, - {`update delayed t set a = 2`, true, "UPDATE DELAYED `t` SET `a`=2"}, - {`delete low_priority from t where a = 2`, true, "DELETE LOW_PRIORITY FROM `t` WHERE `a`=2"}, - {`delete high_priority from t where a = 2`, true, "DELETE HIGH_PRIORITY FROM `t` WHERE `a`=2"}, - {`delete delayed from t where a = 2`, true, "DELETE DELAYED FROM `t` WHERE `a`=2"}, - {`replace high_priority into t values (1)`, true, "REPLACE HIGH_PRIORITY INTO `t` VALUES (1)"}, - {`replace LOW_PRIORITY into t values (1)`, true, "REPLACE LOW_PRIORITY INTO `t` VALUES (1)"}, - {`replace delayed into t values (1)`, true, "REPLACE DELAYED INTO `t` VALUES (1)"}, - } - RunTest(t, table, false, false) - p := parser.New() stmt, _, err := p.Parse("select HIGH_PRIORITY * from t", "", "") if err != nil { @@ -6902,19 +2805,6 @@ func TestPriority(t *testing.T) { } } -func TestSQLResult(t *testing.T) { - table := []testCase{ - {`select SQL_BIG_RESULT c1 from t group by c1`, true, "SELECT SQL_BIG_RESULT `c1` FROM `t` GROUP BY `c1`"}, - {`select SQL_SMALL_RESULT c1 from t group by c1`, true, "SELECT SQL_SMALL_RESULT `c1` FROM `t` GROUP BY `c1`"}, - {`select SQL_BUFFER_RESULT * from t`, true, "SELECT SQL_BUFFER_RESULT * FROM `t`"}, - {`select sql_small_result sql_big_result sql_buffer_result 1`, true, "SELECT SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT 1"}, - {`select STRAIGHT_JOIN SQL_SMALL_RESULT * from t`, true, "SELECT SQL_SMALL_RESULT STRAIGHT_JOIN * FROM `t`"}, - {`select SQL_CALC_FOUND_ROWS DISTINCT * from t`, true, "SELECT SQL_CALC_FOUND_ROWS DISTINCT * FROM `t`"}, - } - - RunTest(t, table, false, false) -} - func TestSQLNoCache(t *testing.T) { table := []testCase{ {`select SQL_NO_CACHE * from t`, false, ""}, @@ -6936,210 +2826,7 @@ func TestSQLNoCache(t *testing.T) { } } -func TestEscape(t *testing.T) { - table := []testCase{ - {`select """;`, false, ""}, - {`select """";`, true, "SELECT _UTF8MB4'\"'"}, - {`select "汉字";`, true, "SELECT _UTF8MB4'汉字'"}, - {`select 'abc"def';`, true, "SELECT _UTF8MB4'abc\"def'"}, - {`select 'a\r\n';`, true, "SELECT _UTF8MB4'a\r\n'"}, - {`select "\a\r\n"`, true, "SELECT _UTF8MB4'a\r\n'"}, - {`select "\xFF"`, true, "SELECT _UTF8MB4'xFF'"}, - } - RunTest(t, table, false, false) -} - -func TestExplain(t *testing.T) { - table := []testCase{ - {"explain select c1 from t1", true, "EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1`"}, - {"explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true, "EXPLAIN FORMAT = 'row' DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, - {"explain insert into t values (1), (2), (3)", true, "EXPLAIN FORMAT = 'row' INSERT INTO `t` VALUES (1),(2),(3)"}, - {"explain replace into foo values (1 || 2)", true, "EXPLAIN FORMAT = 'row' REPLACE INTO `foo` VALUES (1 OR 2)"}, - {"explain update t set id = id + 1 order by id desc;", true, "EXPLAIN FORMAT = 'row' UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, - {"explain select c1 from t1 union (select c2 from t2) limit 1, 1", true, "EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {`explain format = "row" select c1 from t1 union (select c2 from t2) limit 1, 1`, true, "EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {"explain format = 'brief' select * from t", true, "EXPLAIN FORMAT = 'brief' SELECT * FROM `t`"}, - {"DESC SCHE.TABL", true, "DESC `SCHE`.`TABL`"}, - {"DESC SCHE.TABL COLUM", true, "DESC `SCHE`.`TABL` `COLUM`"}, - {"DESCRIBE SCHE.TABL COLUM", true, "DESC `SCHE`.`TABL` `COLUM`"}, - {"EXPLAIN ANALYZE SELECT 1", true, "EXPLAIN ANALYZE SELECT 1"}, - {"EXPLAIN ANALYZE format=VERBOSE SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'VERBOSE' SELECT 1"}, - {"EXPLAIN ANALYZE format=TRUE_CARD_COST SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'TRUE_CARD_COST' SELECT 1"}, - {"EXPLAIN ANALYZE format='VERBOSE' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'VERBOSE' SELECT 1"}, - {"EXPLAIN ANALYZE format='TRUE_CARD_COST' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'TRUE_CARD_COST' SELECT 1"}, - {"EXPLAIN FORMAT = 'dot' SELECT 1", true, "EXPLAIN FORMAT = 'dot' SELECT 1"}, - {"EXPLAIN FORMAT = DOT SELECT 1", true, "EXPLAIN FORMAT = 'DOT' SELECT 1"}, - {"EXPLAIN FORMAT = 'row' SELECT 1", true, "EXPLAIN FORMAT = 'row' SELECT 1"}, - {"EXPLAIN FORMAT = 'ROW' SELECT 1", true, "EXPLAIN FORMAT = 'ROW' SELECT 1"}, - {"EXPLAIN FORMAT = 'BRIEF' SELECT 1", true, "EXPLAIN FORMAT = 'BRIEF' SELECT 1"}, - {"EXPLAIN FORMAT = BRIEF SELECT 1", true, "EXPLAIN FORMAT = 'BRIEF' SELECT 1"}, - {"EXPLAIN FORMAT = 'verbose' SELECT 1", true, "EXPLAIN FORMAT = 'verbose' SELECT 1"}, - {"EXPLAIN FORMAT = 'VERBOSE' SELECT 1", true, "EXPLAIN FORMAT = 'VERBOSE' SELECT 1"}, - {"EXPLAIN FORMAT = VERBOSE SELECT 1", true, "EXPLAIN FORMAT = 'VERBOSE' SELECT 1"}, - {"EXPLAIN SELECT 1", true, "EXPLAIN FORMAT = 'row' SELECT 1"}, - {"EXPLAIN FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'row' FOR CONNECTION 1"}, - {"EXPLAIN FOR connection 42", true, "EXPLAIN FORMAT = 'row' FOR CONNECTION 42"}, - {"EXPLAIN FORMAT = 'dot' FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'dot' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = DOT FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'DOT' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = 'row' FOR connection 1", true, "EXPLAIN FORMAT = 'row' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = ROW FOR connection 1", true, "EXPLAIN FORMAT = 'ROW' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = TRADITIONAL FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'TRADITIONAL' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = TRADITIONAL SELECT 1", true, "EXPLAIN FORMAT = 'TRADITIONAL' SELECT 1"}, - {"EXPLAIN FORMAT = BRIEF SELECT 1", true, "EXPLAIN FORMAT = 'BRIEF' SELECT 1"}, - {"EXPLAIN FORMAT = 'brief' SELECT 1", true, "EXPLAIN FORMAT = 'brief' SELECT 1"}, - {"EXPLAIN FORMAT = DOT SELECT 1", true, "EXPLAIN FORMAT = 'DOT' SELECT 1"}, - {"EXPLAIN FORMAT = 'dot' SELECT 1", true, "EXPLAIN FORMAT = 'dot' SELECT 1"}, - {"EXPLAIN FORMAT = VERBOSE SELECT 1", true, "EXPLAIN FORMAT = 'VERBOSE' SELECT 1"}, - {"EXPLAIN FORMAT = 'verbose' SELECT 1", true, "EXPLAIN FORMAT = 'verbose' SELECT 1"}, - {"EXPLAIN FORMAT = JSON FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'JSON' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = JSON SELECT 1", true, "EXPLAIN FORMAT = 'JSON' SELECT 1"}, - {"EXPLAIN FORMAT = 'hint' SELECT 1", true, "EXPLAIN FORMAT = 'hint' SELECT 1"}, - {"EXPLAIN ANALYZE FORMAT = 'verbose' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'verbose' SELECT 1"}, - {"EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1"}, - {"EXPLAIN ALTER TABLE t1 ADD INDEX (a)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD INDEX(`a`)"}, - {"EXPLAIN ALTER TABLE t1 ADD a varchar(255)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD COLUMN `a` VARCHAR(255)"}, - {"EXPLAIN FORMAT = TIDB_JSON FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'TIDB_JSON' FOR CONNECTION 1"}, - {"EXPLAIN FORMAT = tidb_json SELECT 1", true, "EXPLAIN FORMAT = 'tidb_json' SELECT 1"}, - {"EXPLAIN ANALYZE FORMAT = tidb_json SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'tidb_json' SELECT 1"}, - {"EXPLAIN 'sqldigest'", true, "EXPLAIN FORMAT = 'row' 'sqldigest'"}, - {"EXPLAIN ANALYZE 'sqldigest'", true, "EXPLAIN ANALYZE 'sqldigest'"}, - {"EXPLAIN format='json' 'sqldigest'", true, "EXPLAIN FORMAT = 'json' 'sqldigest'"}, - {"EXPLAIN ANALYZE format='json' 'sqldigest'", true, "EXPLAIN ANALYZE FORMAT = 'json' 'sqldigest'"}, - } - RunTest(t, table, false, false) -} - -func TestPrepare(t *testing.T) { - table := []testCase{ - {"PREPARE pname FROM 'SELECT ?'", true, "PREPARE `pname` FROM 'SELECT ?'"}, - {"PREPARE pname FROM @test", true, "PREPARE `pname` FROM @`test`"}, - {"PREPARE `` FROM @test", true, "PREPARE `` FROM @`test`"}, - } - RunTest(t, table, false, false) -} - -func TestDeallocate(t *testing.T) { - table := []testCase{ - {"DEALLOCATE PREPARE test", true, "DEALLOCATE PREPARE `test`"}, - {"DEALLOCATE PREPARE ``", true, "DEALLOCATE PREPARE ``"}, - } - RunTest(t, table, false, false) -} - -func TestExecute(t *testing.T) { - table := []testCase{ - {"EXECUTE test", true, "EXECUTE `test`"}, - {"EXECUTE test USING @var1,@var2", true, "EXECUTE `test` USING @`var1`,@`var2`"}, - {"EXECUTE `` USING @var1,@var2", true, "EXECUTE `` USING @`var1`,@`var2`"}, - } - RunTest(t, table, false, false) -} - -func TestTrace(t *testing.T) { - table := []testCase{ - {"trace begin", true, "TRACE START TRANSACTION"}, - {"trace commit", true, "TRACE COMMIT"}, - {"trace rollback", true, "TRACE ROLLBACK"}, - {"trace set a = 1", true, "TRACE SET @@SESSION.`a`=1"}, - {"trace select c1 from t1", true, "TRACE SELECT `c1` FROM `t1`"}, - {"trace delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true, "TRACE DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, - {"trace insert into t values (1), (2), (3)", true, "TRACE INSERT INTO `t` VALUES (1),(2),(3)"}, - {"trace replace into foo values (1 || 2)", true, "TRACE REPLACE INTO `foo` VALUES (1 OR 2)"}, - {"trace update t set id = id + 1 order by id desc;", true, "TRACE UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, - {"trace select c1 from t1 union (select c2 from t2) limit 1, 1", true, "TRACE SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {"trace format = 'row' select c1 from t1 union (select c2 from t2) limit 1, 1", true, "TRACE SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, - {"trace format = 'json' update t set id = id + 1 order by id desc;", true, "TRACE FORMAT = 'json' UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, - {"trace plan select c1 from t1", true, "TRACE PLAN SELECT `c1` FROM `t1`"}, - {"trace plan target = 'estimation' select c1 from t1", true, "TRACE PLAN TARGET = 'estimation' SELECT `c1` FROM `t1`"}, - {"trace plan target = 'arandomstring' select c1 from t1", true, "TRACE PLAN TARGET = 'arandomstring' SELECT `c1` FROM `t1`"}, - } - RunTest(t, table, false, false) -} - func TestBinding(t *testing.T) { - table := []testCase{ - {"create global binding for select * from t using select * from t use index(a)", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, - {"create session binding for select * from t using select * from t use index(a)", true, "CREATE SESSION BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, - {"drop global binding for select * from t", true, "DROP GLOBAL BINDING FOR SELECT * FROM `t`"}, - {"drop session binding for select * from t", true, "DROP SESSION BINDING FOR SELECT * FROM `t`"}, - {"drop global binding for select * from t using select * from t use index(a)", true, "DROP GLOBAL BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, - {"drop session binding for select * from t using select * from t use index(a)", true, "DROP SESSION BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, - {"show global bindings", true, "SHOW GLOBAL BINDINGS"}, - {"show session bindings", true, "SHOW SESSION BINDINGS"}, - {"set binding enabled for select * from t", true, "SET BINDING ENABLED FOR SELECT * FROM `t`"}, - {"set binding enabled for select * from t using select * from t use index(a)", true, "SET BINDING ENABLED FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, - {"set binding disabled for select * from t", true, "SET BINDING DISABLED FOR SELECT * FROM `t`"}, - {"set binding disabled for select * from t using select * from t use index(a)", true, "SET BINDING DISABLED FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, - {"create global binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a)", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`)"}, - {"create session binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a)", true, "CREATE SESSION BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`)"}, - {"drop global binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a)", true, "DROP GLOBAL BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`)"}, - {"drop session binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a)", true, "DROP SESSION BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`)"}, - {"drop global binding for select * from t union all select * from t", true, "DROP GLOBAL BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create session binding for select 1 union select 2 intersect select 3 using select 1 union select 2 intersect select 3", true, "CREATE SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 USING SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"}, - {"drop session binding for select 1 union select 2 intersect select 3 using select 1 union select 2 intersect select 3", true, "DROP SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 USING SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"}, - {"drop session binding for select 1 union select 2 intersect select 3", true, "DROP SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"}, - // Use wildcards when creating binding - {"create global binding using select * from *.t1", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1`"}, - {"create global binding using select * from *.t1 where t1.a > (select max(a) from t2)", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `*`.`t1` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`) USING SELECT * FROM `*`.`t1` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`)"}, - {"create session binding using select * from *.t1", true, "CREATE SESSION BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1`"}, - {"create binding using select * from *.t1", true, "CREATE SESSION BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1`"}, - // Update cases. - {"CREATE GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1", true, "CREATE GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1"}, - {"CREATE SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1", true, "CREATE SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1"}, - {"drop global binding for update t set a = 1 where b = 1", true, "DROP GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1"}, - {"drop session binding for update t set a = 1 where b = 1", true, "DROP SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1"}, - {"DROP GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1", true, "DROP GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1"}, - {"DROP SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1", true, "DROP SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1"}, - // Multi-table Update. - {"CREATE GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`", true, "CREATE GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`"}, - {"CREATE SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`", true, "CREATE SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`"}, - {"DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`", true, "DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`"}, - {"DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`", true, "DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`"}, - {"DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`", true, "DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`"}, - {"DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`", true, "DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b`"}, - // Delete cases. - {"CREATE GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1", true, "CREATE GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1"}, - {"CREATE SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1", true, "CREATE SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1"}, - {"drop global binding for delete from t where a = 1", true, "DROP GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1"}, - {"drop session binding for delete from t where a = 1", true, "DROP SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1"}, - {"DROP GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1", true, "DROP GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1"}, - {"DROP SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1", true, "DROP SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1"}, - // Multi-table Delete. - {"CREATE GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1", true, "CREATE GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1"}, - {"CREATE SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1", true, "CREATE SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1"}, - {"drop global binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.a = 1", true, "DROP GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1"}, - {"drop session binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.a = 1", true, "DROP SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1"}, - {"DROP GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1", true, "DROP GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1"}, - {"DROP SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1", true, "DROP SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1"}, - // Insert cases. - {"CREATE GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "CREATE GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - {"CREATE SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "CREATE SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - {"drop global binding for insert into t1 select * from t2 where t1.a=1", true, "DROP GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1"}, - {"drop session binding for insert into t1 select * from t2 where t1.a=1", true, "DROP SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1"}, - {"DROP GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - {"DROP SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - // Replace cases. - {"CREATE GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "CREATE GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - {"CREATE SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "CREATE SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - {"drop global binding for replace into t1 select * from t2 where t1.a=1", true, "DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1"}, - {"drop session binding for replace into t1 select * from t2 where t1.a=1", true, "DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1"}, - {"DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - {"DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, - // Specify digest cases. - {"DROP SESSION BINDING FOR SQL DIGEST 'a'", true, "DROP SESSION BINDING FOR SQL DIGEST 'a'"}, - {"drop global binding for sql digest 's'", true, "DROP GLOBAL BINDING FOR SQL DIGEST 's'"}, - {"drop global binding for sql digest @a, @b, 'test1,test2', @c, 'test333'", true, "DROP GLOBAL BINDING FOR SQL DIGEST @`a`, @`b`, 'test1,test2', @`c`, 'test333'"}, - {"create session binding from history using plan digest 'sss'", true, "CREATE SESSION BINDING FROM HISTORY USING PLAN DIGEST 'sss'"}, - {"create session binding from history using plan digest @a, @b, 'test1,test2', @c, 'test333'", true, "CREATE SESSION BINDING FROM HISTORY USING PLAN DIGEST @`a`, @`b`, 'test1,test2', @`c`, 'test333'"}, - {"CREATE GLOBAL BINDING FROM HISTORY USING PLAN DIGEST 'sss'", true, "CREATE GLOBAL BINDING FROM HISTORY USING PLAN DIGEST 'sss'"}, - {"set binding enabled for sql digest '1'", true, "SET BINDING ENABLED FOR SQL DIGEST '1'"}, - {"set binding disabled for sql digest '1'", true, "SET BINDING DISABLED FOR SQL DIGEST '1'"}, - // Explain explore for a specified SQL. - {"explain explore 'select a from t'", true, "EXPLAIN EXPLORE 'select a from t'"}, - {"explain explore '23adc8e6f62'", true, "EXPLAIN EXPLORE '23adc8e6f62'"}, - } - RunTest(t, table, false, false) - p := parser.New() sms, _, err := p.Parse("create global binding for select * from t using select * from t use index(a)", "", "") if err != nil { @@ -7161,78 +2848,6 @@ func TestBinding(t *testing.T) { } func TestView(t *testing.T) { - table := []testCase{ - {"create view v as select * from t", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = undefined view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = temptable view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with local check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` WITH LOCAL CHECK OPTION"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = current_user view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, - - // create view with `(` select statement `)` - {"create view v as (select * from t)", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = undefined view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = temptable view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security definer view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t) with local check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t`) WITH LOCAL CHECK OPTION"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t) with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = current_user view v as (select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`)"}, - - // create view with union statement - {"create view v as select * from t union select * from t", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = undefined view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = temptable view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union select * from t with local check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION SELECT * FROM `t` WITH LOCAL CHECK OPTION"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union select * from t with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = current_user view v as select * from t union select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t`"}, - - // create view with union all statement - {"create view v as select * from t union all select * from t", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = undefined view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = temptable view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union all select * from t with local check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` WITH LOCAL CHECK OPTION"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union all select * from t with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - {"create or replace algorithm = merge definer = current_user view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - - // create view with `(` union statement `)` - {"create view v as (select * from t union all select * from t)", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = undefined view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = temptable view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security definer view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t)", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t) with local check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) WITH LOCAL CHECK OPTION"}, - {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t) with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, - {"create or replace algorithm = merge definer = current_user view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, - } - RunTest(t, table, false, false) - // Test case for the text of the select statement in create view statement. p := parser.New() sms, _, err := p.Parse("create view v as select * from t", "", "") @@ -7350,22 +2965,6 @@ func TestTimestampDiffUnit(t *testing.T) { if !reflect.DeepEqual(ast.TimeUnitMonth, f.Args[0].(*ast.TimeUnitExpr).Unit) { t.Fatalf("got %v, want %v", f.Args[0].(*ast.TimeUnitExpr).Unit, ast.TimeUnitMonth) } - - // Test Illegal TimeUnit for TimestampDiff - table := []testCase{ - {"SELECT TIMESTAMPDIFF(SECOND_MICROSECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(MINUTE_MICROSECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(MINUTE_SECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(HOUR_MICROSECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(HOUR_SECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(HOUR_MINUTE,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(DAY_MICROSECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(DAY_SECOND,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(DAY_MINUTE,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(DAY_HOUR,'2003-02-01','2003-05-01')", false, ""}, - {"SELECT TIMESTAMPDIFF(YEAR_MONTH,'2003-02-01','2003-05-01')", false, ""}, - } - RunTest(t, table, false, false) } func TestFuncCallExprOffset(t *testing.T) { @@ -7406,34 +3005,6 @@ func TestFuncCallExprOffset(t *testing.T) { } } -func TestSessionManage(t *testing.T) { - table := []testCase{ - // Kill statement. - // See https://dev.mysql.com/doc/refman/5.7/en/kill.html - {"kill 23123", true, "KILL 23123"}, - {"kill CONNECTION_ID()", true, "KILL CONNECTION_ID()"}, - {"kill connection 23123", true, "KILL 23123"}, - {"kill query 23123", true, "KILL QUERY 23123"}, - {"kill tidb 23123", true, "KILL TIDB 23123"}, - {"kill tidb connection 23123", true, "KILL TIDB 23123"}, - {"kill tidb query 23123", true, "KILL TIDB QUERY 23123"}, - {"show processlist", true, "SHOW PROCESSLIST"}, - {"show full processlist", true, "SHOW FULL PROCESSLIST"}, - {"shutdown", true, "SHUTDOWN"}, - {"restart", true, "RESTART"}, - } - RunTest(t, table, false, false) -} - -func TestParseShowOpenTables(t *testing.T) { - table := []testCase{ - {"SHOW OPEN TABLES", true, "SHOW OPEN TABLES"}, - {"SHOW OPEN TABLES IN test", true, "SHOW OPEN TABLES IN `test`"}, - {"SHOW OPEN TABLES FROM test", true, "SHOW OPEN TABLES IN `test`"}, - } - RunTest(t, table, false, false) -} - func TestSQLModeANSIQuotes(t *testing.T) { p := parser.New() p.SetSQLMode(mysql.ModeANSIQuotes) @@ -7566,82 +3137,7 @@ func TestDDLStatements(t *testing.T) { } } -func TestAnalyze(t *testing.T) { - table := []testCase{ - {"analyze table t1", true, "ANALYZE TABLE `t1`"}, - {"analyze table t1.*", false, ""}, - {"analyze table t,t1", true, "ANALYZE TABLE `t`,`t1`"}, - {"analyze table t1 index", true, "ANALYZE TABLE `t1` INDEX"}, - {"analyze table t1 index a", true, "ANALYZE TABLE `t1` INDEX `a`"}, - {"analyze table t1 index a,b", true, "ANALYZE TABLE `t1` INDEX `a`,`b`"}, - {"analyze table t with 4 buckets", true, "ANALYZE TABLE `t` WITH 4 BUCKETS"}, - {"analyze table t with 4 topn", true, "ANALYZE TABLE `t` WITH 4 TOPN"}, - {"analyze table t with 4 cmsketch width", true, "ANALYZE TABLE `t` WITH 4 CMSKETCH WIDTH"}, - {"analyze table t with 4 cmsketch depth", true, "ANALYZE TABLE `t` WITH 4 CMSKETCH DEPTH"}, - {"analyze table t with 4 samples", true, "ANALYZE TABLE `t` WITH 4 SAMPLES"}, - {"analyze table t with 4 buckets, 4 topn, 4 cmsketch width, 4 cmsketch depth, 4 samples", true, "ANALYZE TABLE `t` WITH 4 BUCKETS, 4 TOPN, 4 CMSKETCH WIDTH, 4 CMSKETCH DEPTH, 4 SAMPLES"}, - {"analyze table t index a with 4 buckets", true, "ANALYZE TABLE `t` INDEX `a` WITH 4 BUCKETS"}, - {"analyze table t partition a", true, "ANALYZE TABLE `t` PARTITION `a`"}, - {"analyze table t partition a with 4 buckets", true, "ANALYZE TABLE `t` PARTITION `a` WITH 4 BUCKETS"}, - {"analyze table t partition a index b", true, "ANALYZE TABLE `t` PARTITION `a` INDEX `b`"}, - {"analyze table t partition a index b with 4 buckets", true, "ANALYZE TABLE `t` PARTITION `a` INDEX `b` WITH 4 BUCKETS"}, - {"analyze incremental table t index", true, "ANALYZE INCREMENTAL TABLE `t` INDEX"}, - {"analyze incremental table t index idx", true, "ANALYZE INCREMENTAL TABLE `t` INDEX `idx`"}, - {"analyze table t update histogram on b with 1024 buckets", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `b` WITH 1024 BUCKETS"}, - {"analyze table t drop histogram on b", true, "ANALYZE TABLE `t` DROP HISTOGRAM ON `b`"}, - {"analyze table t update histogram on c1, c2;", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c1`,`c2`"}, - {"analyze table t drop histogram on c1, c2;", true, "ANALYZE TABLE `t` DROP HISTOGRAM ON `c1`,`c2`"}, - {"analyze table t update histogram on t.c1, t.c2", false, ""}, - {"analyze table t drop histogram on t.c1, t.c2", false, ""}, - {"analyze table t1,t2 all columns", true, "ANALYZE TABLE `t1`,`t2` ALL COLUMNS"}, - {"analyze table t partition a all columns", true, "ANALYZE TABLE `t` PARTITION `a` ALL COLUMNS"}, - {"analyze table t1,t2 all columns with 4 topn", true, "ANALYZE TABLE `t1`,`t2` ALL COLUMNS WITH 4 TOPN"}, - {"analyze table t partition a all columns with 1024 buckets", true, "ANALYZE TABLE `t` PARTITION `a` ALL COLUMNS WITH 1024 BUCKETS"}, - {"analyze table t1,t2 predicate columns", true, "ANALYZE TABLE `t1`,`t2` PREDICATE COLUMNS"}, - {"analyze table t partition a predicate columns", true, "ANALYZE TABLE `t` PARTITION `a` PREDICATE COLUMNS"}, - {"analyze table t1,t2 predicate columns with 4 topn", true, "ANALYZE TABLE `t1`,`t2` PREDICATE COLUMNS WITH 4 TOPN"}, - {"analyze table t partition a predicate columns with 1024 buckets", true, "ANALYZE TABLE `t` PARTITION `a` PREDICATE COLUMNS WITH 1024 BUCKETS"}, - {"analyze table t columns c1,c2", true, "ANALYZE TABLE `t` COLUMNS `c1`,`c2`"}, - {"analyze table t partition a columns c1,c2", true, "ANALYZE TABLE `t` PARTITION `a` COLUMNS `c1`,`c2`"}, - {"analyze table t columns t.c1,t.c2", false, ""}, - {"analyze table t partition a columns t.c1,t.c2", false, ""}, - {"analyze table t columns c1,c2 with 4 topn", true, "ANALYZE TABLE `t` COLUMNS `c1`,`c2` WITH 4 TOPN"}, - {"analyze table t partition a columns c1,c2 with 1024 buckets", true, "ANALYZE TABLE `t` PARTITION `a` COLUMNS `c1`,`c2` WITH 1024 BUCKETS"}, - {"analyze table t index a columns c", false, ""}, - {"analyze table t index a all columns", false, ""}, - {"analyze table t index a predicate columns", false, ""}, - {"analyze table t with 10 samplerate", true, "ANALYZE TABLE `t` WITH 10 SAMPLERATE"}, - {"analyze table t with 0.1 samplerate", true, "ANALYZE TABLE `t` WITH 0.1 SAMPLERATE"}, - {"analyze table t with 0.05 ndvrate", true, "ANALYZE TABLE `t` WITH 0.05 NDVRATE"}, - {"analyze table t with 0.05 ndvrate 0.00001 samplerate", true, "ANALYZE TABLE `t` WITH 0.05 NDVRATE, 0.00001 SAMPLERATE"}, - {"analyze no_write_to_binlog table t1", true, "ANALYZE NO_WRITE_TO_BINLOG TABLE `t1`"}, - {"analyze local table t,t1", true, "ANALYZE NO_WRITE_TO_BINLOG TABLE `t`,`t1`"}, - } - RunTest(t, table, false, false) -} - func TestChangeReplicationSource(t *testing.T) { - table := []testCase{ - // MySQL 26.7 Change Stream Applier options - {"change replication source to applier_version = 2", true, "CHANGE REPLICATION SOURCE TO APPLIER_VERSION = 2"}, - {"CHANGE REPLICATION SOURCE TO APPLIER_VERSION = 1, APPLIER_WORKER_COUNT = 64, APPLIER_EVENT_MEMORY_LIMIT = 1073741824 FOR CHANNEL 'channel_1'", true, "CHANGE REPLICATION SOURCE TO APPLIER_VERSION = 1, APPLIER_WORKER_COUNT = 64, APPLIER_EVENT_MEMORY_LIMIT = 1073741824 FOR CHANNEL 'channel_1'"}, - - // generic connection options - {"change replication source to source_host = 'replica.example.com', source_port = 3306", true, "CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'replica.example.com', SOURCE_PORT = 3306"}, - {"change replication source to source_auto_position = 1 for channel 'group_replication_recovery'", true, "CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 FOR CHANNEL 'group_replication_recovery'"}, - {"change replication source to source_heartbeat_period = 60.5", true, "CHANGE REPLICATION SOURCE TO SOURCE_HEARTBEAT_PERIOD = 60.5"}, - - // negative test cases - {"change replication source to", false, ""}, - {"change replication source applier_version = 2", false, ""}, - {"change master to master_host = 'h'", false, ""}, - {"change replication source to applier_version", false, ""}, - {"change replication source to applier_version = 2,", false, ""}, - {"change replication source to applier_version = 2 for channel", false, ""}, - {"change replication source to for channel 'ch'", false, ""}, - } - RunTest(t, table, false, false) - // SOURCE_PASSWORD is masked in the sensitive-statement text. p := parser.New() stmt, err := p.ParseOneStmt("change replication source to source_user = 'repl', source_password = 'hunter2'", "", "") @@ -7662,72 +3158,7 @@ func TestChangeReplicationSource(t *testing.T) { } } -func TestMySQLReservedWordCompat(t *testing.T) { - // MySQL reserves CUBE, EXTERNAL, QUALIFY, and TABLESAMPLE (documented - // since 8.4; information_schema.KEYWORDS corrected in 26.7, MySQL Bug - // #114874), while MANUAL and PARALLEL are non-reserved keywords. - table := []testCase{ - // reserved: rejected as unquoted identifiers - {"create table cube (a int)", false, ""}, - {"create table external (a int)", false, ""}, - {"create table qualify (a int)", false, ""}, - {"select cube from t", false, ""}, - {"select external from t", false, ""}, - {"select qualify from t", false, ""}, - - // reserved: usable when quoted - {"create table `cube` (a int)", true, "CREATE TABLE `cube` (`a` INT)"}, - {"create table `external` (a int)", true, "CREATE TABLE `external` (`a` INT)"}, - {"create table `qualify` (a int)", true, "CREATE TABLE `qualify` (`a` INT)"}, - - // reserved: usable unquoted after a qualifying dot, like MySQL - {"select t.cube from t", true, "SELECT `t`.`cube` FROM `t`"}, - {"select t.external from t", true, "SELECT `t`.`external` FROM `t`"}, - {"select t.qualify from t", true, "SELECT `t`.`qualify` FROM `t`"}, - - // non-reserved: valid identifiers anywhere - {"create table manual (parallel int)", true, "CREATE TABLE `manual` (`parallel` INT)"}, - {"select manual, parallel from t", true, "SELECT `manual`,`parallel` FROM `t`"}, - } - RunTest(t, table, false, false) -} - func TestTableSample(t *testing.T) { - table := []testCase{ - // positive test cases - {"select * from tbl tablesample system (50);", true, "SELECT * FROM `tbl` TABLESAMPLE SYSTEM (50)"}, - {"select * from tbl tablesample system (50 percent);", true, "SELECT * FROM `tbl` TABLESAMPLE SYSTEM (50 PERCENT)"}, - {"select * from tbl tablesample system (49.9 percent);", true, "SELECT * FROM `tbl` TABLESAMPLE SYSTEM (49.9 PERCENT)"}, - {"select * from tbl tablesample system (120 rows);", true, "SELECT * FROM `tbl` TABLESAMPLE SYSTEM (120 ROWS)"}, - {"select * from tbl tablesample bernoulli (50);", true, "SELECT * FROM `tbl` TABLESAMPLE BERNOULLI (50)"}, - {"select * from tbl tablesample (50);", true, "SELECT * FROM `tbl` TABLESAMPLE (50)"}, - {"select * from tbl tablesample (50) repeatable (123456789);", true, "SELECT * FROM `tbl` TABLESAMPLE (50) REPEATABLE(123456789)"}, - {"select * from tbl as a tablesample (50);", true, "SELECT * FROM `tbl` AS `a` TABLESAMPLE (50)"}, - {"select * from tbl `tablesample` tablesample (50);", true, "SELECT * FROM `tbl` AS `tablesample` TABLESAMPLE (50)"}, - {"select * from tbl tablesample (50) where id > 20;", true, "SELECT * FROM `tbl` TABLESAMPLE (50) WHERE `id`>20"}, - {"select * from tbl partition (p0) tablesample (50);", true, "SELECT * FROM `tbl` PARTITION(`p0`) TABLESAMPLE (50)"}, - {"select * from tbl tablesample (0 percent);", true, "SELECT * FROM `tbl` TABLESAMPLE (0 PERCENT)"}, - {"select * from tbl tablesample (100 percent);", true, "SELECT * FROM `tbl` TABLESAMPLE (100 PERCENT)"}, - {"select * from tbl tablesample (0 rows);", true, "SELECT * FROM `tbl` TABLESAMPLE (0 ROWS)"}, - {"select * from tbl tablesample ('34');", true, "SELECT * FROM `tbl` TABLESAMPLE (_UTF8MB4'34')"}, - {"select * from tbl1 tablesample (10), tbl2 tablesample (20);", true, "SELECT * FROM (`tbl1` TABLESAMPLE (10)) JOIN `tbl2` TABLESAMPLE (20)"}, - {"select * from tbl1 a tablesample (10) join tbl2 b tablesample (20) on a.id <> b.id;", true, "SELECT * FROM `tbl1` AS `a` TABLESAMPLE (10) JOIN `tbl2` AS `b` TABLESAMPLE (20) ON `a`.`id`!=`b`.`id`"}, - {"select * from demo tablesample bernoulli(50) limit 1 into outfile '/tmp/sample.csv';", true, "SELECT * FROM `demo` TABLESAMPLE BERNOULLI (50) LIMIT 1 INTO OUTFILE '/tmp/sample.csv'"}, - {"select * from demo tablesample bernoulli(50) order by a, b into outfile '/tmp/sample.csv';", true, "SELECT * FROM `demo` TABLESAMPLE BERNOULLI (50) ORDER BY `a`,`b` INTO OUTFILE '/tmp/sample.csv'"}, - - // negative test cases - {"select * from tbl tablesample system(50) a;", false, ""}, - {"select * from tbl tablesample (50) partition (p0);", false, ""}, - {"select * from tbl where id > 20 tablesample system(50);", false, ""}, - {"select * from (select * from tbl) a tablesample system(50);", false, ""}, - {"select * from tbl tablesample system(50) tablesample system(50);", false, ""}, - {"select * from tbl tablesample system(50, 50);", false, ""}, - {"select * from tbl tablesample dhfksdlfljcoew(50);", false, ""}, - {"select * from tbl tablesample system;", false, ""}, - {"select * from tbl tablesample system (33) repeatable;", false, ""}, - {"select 1 from dual tablesample system (50);", false, ""}, - } - RunTest(t, table, false, false) p := parser.New() cases := []string{ "select * from tbl tablesample (33.3 + 44.4);", @@ -7857,201 +3288,6 @@ func TestSideEffect(t *testing.T) { } func TestTablePartition(t *testing.T) { - table := []testCase{ - {"ALTER TABLE t1 TRUNCATE PARTITION p0", true, "ALTER TABLE `t1` TRUNCATE PARTITION `p0`"}, - {"ALTER TABLE t1 TRUNCATE PARTITION p0, p1", true, "ALTER TABLE `t1` TRUNCATE PARTITION `p0`,`p1`"}, - {"ALTER TABLE t1 TRUNCATE PARTITION ALL", true, "ALTER TABLE `t1` TRUNCATE PARTITION ALL"}, - {"ALTER TABLE t1 TRUNCATE PARTITION ALL, p0", false, ""}, - {"ALTER TABLE t1 TRUNCATE PARTITION p0, ALL", false, ""}, - - {"ALTER TABLE t1 OPTIMIZE PARTITION p0", true, "ALTER TABLE `t1` OPTIMIZE PARTITION `p0`"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION NO_WRITE_TO_BINLOG p0", true, "ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0`"}, - // LOCAL is alias to NO_WRITE_TO_BINLOG - {"ALTER TABLE t1 OPTIMIZE PARTITION LOCAL p0", true, "ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0`"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION p0, p1", true, "ALTER TABLE `t1` OPTIMIZE PARTITION `p0`,`p1`"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION NO_WRITE_TO_BINLOG p0, p1", true, "ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0`,`p1`"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION LOCAL p0, p1", true, "ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0`,`p1`"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION ALL", true, "ALTER TABLE `t1` OPTIMIZE PARTITION ALL"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION NO_WRITE_TO_BINLOG ALL", true, "ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG ALL"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION LOCAL ALL", true, "ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG ALL"}, - {"ALTER TABLE t1 OPTIMIZE PARTITION ALL, p0", false, ""}, - {"ALTER TABLE t1 OPTIMIZE PARTITION p0, ALL", false, ""}, - // The first `LOCAL` should be recognized as unreserved keyword `LOCAL` (alias to `NO_WRITE_TO_BINLOG`), - // and the remains should re recognized as identifier, used as partition name here. - {"ALTER TABLE t_n OPTIMIZE PARTITION LOCAL", false, ""}, - {"ALTER TABLE t_n OPTIMIZE PARTITION LOCAL local", true, "ALTER TABLE `t_n` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `local`"}, - {"ALTER TABLE t_n OPTIMIZE PARTITION LOCAL local, local", true, "ALTER TABLE `t_n` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `local`,`local`"}, - - {"ALTER TABLE t1 REPAIR PARTITION p0", true, "ALTER TABLE `t1` REPAIR PARTITION `p0`"}, - {"ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG p0", true, "ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0`"}, - // LOCAL is alias to NO_WRITE_TO_BINLOG - {"ALTER TABLE t1 REPAIR PARTITION LOCAL p0", true, "ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0`"}, - {"ALTER TABLE t1 REPAIR PARTITION p0, p1", true, "ALTER TABLE `t1` REPAIR PARTITION `p0`,`p1`"}, - {"ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG p0, p1", true, "ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0`,`p1`"}, - {"ALTER TABLE t1 REPAIR PARTITION LOCAL p0, p1", true, "ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0`,`p1`"}, - {"ALTER TABLE t1 REPAIR PARTITION ALL", true, "ALTER TABLE `t1` REPAIR PARTITION ALL"}, - {"ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG ALL", true, "ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG ALL"}, - {"ALTER TABLE t1 REPAIR PARTITION LOCAL ALL", true, "ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG ALL"}, - {"ALTER TABLE t1 REPAIR PARTITION ALL, p0", false, ""}, - {"ALTER TABLE t1 REPAIR PARTITION p0, ALL", false, ""}, - // The first `LOCAL` should be recognized as unreserved keyword `LOCAL` (alias to `NO_WRITE_TO_BINLOG`), - // and the remains should re recognized as identifier, used as partition name here. - {"ALTER TABLE t_n REPAIR PARTITION LOCAL", false, ""}, - {"ALTER TABLE t_n REPAIR PARTITION LOCAL local", true, "ALTER TABLE `t_n` REPAIR PARTITION NO_WRITE_TO_BINLOG `local`"}, - {"ALTER TABLE t_n REPAIR PARTITION LOCAL local, local", true, "ALTER TABLE `t_n` REPAIR PARTITION NO_WRITE_TO_BINLOG `local`,`local`"}, - - {"ALTER TABLE t1 IMPORT PARTITION p0 TABLESPACE", true, "ALTER TABLE `t1` IMPORT PARTITION `p0` TABLESPACE"}, - {"ALTER TABLE t1 IMPORT PARTITION p0, p1 TABLESPACE", true, "ALTER TABLE `t1` IMPORT PARTITION `p0`,`p1` TABLESPACE"}, - {"ALTER TABLE t1 IMPORT PARTITION ALL TABLESPACE", true, "ALTER TABLE `t1` IMPORT PARTITION ALL TABLESPACE"}, - {"ALTER TABLE t1 IMPORT PARTITION ALL, p0 TABLESPACE", false, ""}, - {"ALTER TABLE t1 IMPORT PARTITION p0, ALL TABLESPACE", false, ""}, - - {"ALTER TABLE t1 DISCARD PARTITION p0 TABLESPACE", true, "ALTER TABLE `t1` DISCARD PARTITION `p0` TABLESPACE"}, - {"ALTER TABLE t1 DISCARD PARTITION p0, p1 TABLESPACE", true, "ALTER TABLE `t1` DISCARD PARTITION `p0`,`p1` TABLESPACE"}, - {"ALTER TABLE t1 DISCARD PARTITION ALL TABLESPACE", true, "ALTER TABLE `t1` DISCARD PARTITION ALL TABLESPACE"}, - {"ALTER TABLE t1 DISCARD PARTITION ALL, p0 TABLESPACE", false, ""}, - {"ALTER TABLE t1 DISCARD PARTITION p0, ALL TABLESPACE", false, ""}, - - {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT 'APSTART \\' APEND')", true, "ALTER TABLE `t1` ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'APSTART '' APEND')"}, - {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'xxx')", true, "ALTER TABLE `t1` ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'xxx')"}, - {`CREATE TABLE t1 (a int not null,b int not null,c int not null,primary key(a,b)) - partition by range (a) - partitions 3 - (partition x1 values less than (5), - partition x2 values less than (10), - partition x3 values less than maxvalue);`, true, "CREATE TABLE `t1` (`a` INT NOT NULL,`b` INT NOT NULL,`c` INT NOT NULL,PRIMARY KEY(`a`, `b`)) PARTITION BY RANGE (`a`) (PARTITION `x1` VALUES LESS THAN (5),PARTITION `x2` VALUES LESS THAN (10),PARTITION `x3` VALUES LESS THAN (MAXVALUE))"}, - {"CREATE TABLE t1 (a int not null) partition by range (a) (partition x1 values less than (5) tablespace ts1)", true, "CREATE TABLE `t1` (`a` INT NOT NULL) PARTITION BY RANGE (`a`) (PARTITION `x1` VALUES LESS THAN (5) TABLESPACE = `ts1`)"}, - {`create table t (a int) partition by range (a) - (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM, - PARTITION p1 VALUES LESS THAN (63342604800) ENGINE MyISAM)`, true, "CREATE TABLE `t` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (63340531200) ENGINE = MyISAM,PARTITION `p1` VALUES LESS THAN (63342604800) ENGINE = MyISAM)"}, - {`create table t (a int) partition by range (a) - (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM COMMENT 'xxx', - PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM)`, true, "CREATE TABLE `t` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (63340531200) ENGINE = MyISAM COMMENT = 'xxx',PARTITION `p1` VALUES LESS THAN (63342604800) ENGINE = MyISAM)"}, - {`create table t1 (a int) partition by range (a) - (PARTITION p0 VALUES LESS THAN (63340531200) COMMENT 'xxx' ENGINE = MyISAM , - PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM)`, true, "CREATE TABLE `t1` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (63340531200) COMMENT = 'xxx' ENGINE = MyISAM,PARTITION `p1` VALUES LESS THAN (63342604800) ENGINE = MyISAM)"}, - {`create table t (id int) - partition by range (id) - subpartition by key (id) subpartitions 2 - (partition p0 values less than (42))`, true, "CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) SUBPARTITION BY KEY (`id`) SUBPARTITIONS 2 (PARTITION `p0` VALUES LESS THAN (42))"}, - {`create table t (id int) - partition by range (id) - subpartition by hash (id) - (partition p0 values less than (42))`, true, "CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) SUBPARTITION BY HASH (`id`) (PARTITION `p0` VALUES LESS THAN (42))"}, - {`create table t1 (a varchar(5), b int signed, c varchar(10), d datetime) - partition by range columns(b,c) - subpartition by hash(to_seconds(d)) - ( partition p0 values less than (2, 'b'), - partition p1 values less than (4, 'd'), - partition p2 values less than (10, 'za'));`, true, - "CREATE TABLE `t1` (`a` VARCHAR(5),`b` INT,`c` VARCHAR(10),`d` DATETIME) PARTITION BY RANGE COLUMNS (`b`,`c`) SUBPARTITION BY HASH (TO_SECONDS(`d`)) (PARTITION `p0` VALUES LESS THAN (2, _UTF8MB4'b'),PARTITION `p1` VALUES LESS THAN (4, _UTF8MB4'd'),PARTITION `p2` VALUES LESS THAN (10, _UTF8MB4'za'))"}, - {`CREATE TABLE t1 (a INT, b TIMESTAMP DEFAULT '0000-00-00 00:00:00') -ENGINE=INNODB PARTITION BY LINEAR HASH (a) PARTITIONS 1;`, true, "CREATE TABLE `t1` (`a` INT,`b` TIMESTAMP DEFAULT _UTF8MB4'0000-00-00 00:00:00') ENGINE = INNODB PARTITION BY LINEAR HASH (`a`) PARTITIONS 1"}, - - // empty clause is valid only for HASH/KEY partitions - {"create table t1 (a int) partition by hash (a) (partition x, partition y)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) (PARTITION `x`,PARTITION `y`)"}, - {"create table t1 (a int) partition by key (a) (partition x, partition y)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY KEY (`a`) (PARTITION `x`,PARTITION `y`)"}, - {"create table t1 (a int) partition by range (a) (partition x, partition y)", false, ""}, - {"create table t1 (a int) partition by list (a) (partition x, partition y)", false, ""}, - {"create table t1 (a int) partition by system_time (partition x, partition y)", false, ""}, - // VALUES LESS THAN clause is valid only for RANGE partitions - {"create table t1 (a int) partition by hash (a) (partition x values less than (10))", false, ""}, - {"create table t1 (a int) partition by key (a) (partition x values less than (10))", false, ""}, - {"create table t1 (a int) partition by range (a) (partition x values less than (maxvalue))", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `x` VALUES LESS THAN (MAXVALUE))"}, - {"create table t1 (a int) partition by range (a) (partition x values less than (default))", false, ""}, - {"create table t (a varchar(100), b int) partition by list columns (a) (partition p1 values in ('a','b','DEFAULT'), partition pDef values in (default))", true, "CREATE TABLE `t` (`a` VARCHAR(100),`b` INT) PARTITION BY LIST COLUMNS (`a`) (PARTITION `p1` VALUES IN (_UTF8MB4'a', _UTF8MB4'b', _UTF8MB4'DEFAULT'),PARTITION `pDef` DEFAULT)"}, - {"create table t1 (a int) partition by range (a) (partition x values less than (10))", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `x` VALUES LESS THAN (10))"}, - {"create table t1 (a int) partition by list (a) (partition x values less than (10))", false, ""}, - {"create table t1 (a int) partition by system_time (partition x values less than (10))", false, ""}, - // VALUES IN clause is valid only for LIST partitions - {"create table t1 (a int) partition by hash (a) (partition x values in (10))", false, ""}, - {"create table t1 (a int) partition by key (a) (partition x values in (10))", false, ""}, - {"create table t1 (a int) partition by range (a) (partition x values in (10))", false, ""}, - {"create table t1 (a int) partition by list (a) (partition x values in (10))", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` VALUES IN (10))"}, - {"create table t1 (a int) partition by list (a) (partition x values in (default))", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` DEFAULT)"}, - {"create table t1 (a int) partition by list (a) (partition x values in (maxvalue))", false, ""}, - {"create table t1 (a int) partition by list (a) (partition x values in (default, 10))", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` VALUES IN (DEFAULT, 10))"}, - {"create table t1 (a int) partition by system_time (partition x values in (10))", false, ""}, - // HISTORY/CURRENT clauses are valid only for SYSTEM_TIME partitions - {"create table t1 (a int) partition by hash (a) (partition x history, partition y current)", false, ""}, - {"create table t1 (a int) partition by key (a) (partition x history, partition y current)", false, ""}, - {"create table t1 (a int) partition by range (a) (partition x history, partition y current)", false, ""}, - {"create table t1 (a int) partition by list (a) (partition x history, partition y current)", false, ""}, - {"create table t1 (a int) partition by system_time (partition x history, partition y current)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY SYSTEM_TIME (PARTITION `x` HISTORY,PARTITION `y` CURRENT)"}, - - // LIST, RANGE and SYSTEM_TIME partitions all required definitions - {"create table t1 (a int) partition by hash (a)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) PARTITIONS 1"}, - {"create table t1 (a int) partition by key (a)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY KEY (`a`) PARTITIONS 1"}, - {"create table t1 (a int) partition by range (a)", false, ""}, - {"create table t1 (a int) partition by list (a)", false, ""}, - {"create table t1 (a int) partition by system_time", false, ""}, - // SYSTEM_TIME required 2 or more partitions - {"create table t1 (a int) partition by system_time (partition x history)", false, ""}, - {"create table t1 (a int) partition by system_time (partition x current)", false, ""}, - - // number of columns and number of values in VALUES clauses must match - {"create table t1 (a int, b int) partition by range (a) (partition x values less than (10, 20))", false, ""}, - {"create table t (id int) partition by range columns (id) (partition p0 values less than (1, 2))", false, ""}, - {"create table t1 (a int, b int) partition by range columns (a, b) (partition x values less than (10, 20))", true, "CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE COLUMNS (`a`,`b`) (PARTITION `x` VALUES LESS THAN (10, 20))"}, - {"create table t1 (a int, b int) partition by range columns (a, b) (partition x values less than (10))", false, ""}, - {"create table t1 (a int, b int) partition by range columns (a, b) (partition x values less than maxvalue)", false, ""}, - {"create table t1 (a int, b int) partition by list (a) (partition x values in ((10, 20)))", false, ""}, - {"create table t1 (a int, b int) partition by list columns (a, b) (partition x values in ((10, 20)))", true, "CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY LIST COLUMNS (`a`,`b`) (PARTITION `x` VALUES IN ((10, 20)))"}, - {"create table t1 (a int, b int) partition by list columns (a, b) (partition x values in (10, 20))", false, ""}, - {"create table t1 (a int, b int) partition by list columns (a, b) (partition x values in (10, (20, 30)))", false, ""}, - {"create table t1 (a int, b int) partition by list columns (a, b) (partition x values in ((10, 20), 30))", false, ""}, - {"create table t1 (a int, b int) partition by list columns (a, b) (partition x values in ((10, 20), (30, 40, 50)))", false, ""}, - - // there must be at least one column/partition/value inside (...) - {"create table t1 (a int) partition by hash (a) ()", false, ""}, - {"create table t1 (a int primary key) partition by key ()", true, "CREATE TABLE `t1` (`a` INT PRIMARY KEY) PARTITION BY KEY () PARTITIONS 1"}, - {"create table t1 (a int) partition by range columns () (partition x values less than maxvalue)", false, ""}, - {"create table t1 (a int) partition by list columns () (partition x default)", false, ""}, - {"create table t1 (a int) partition by range (a) (partition x values less than ())", false, ""}, - {"create table t1 (a int) partition by list (a) (partition x values in ())", false, ""}, - {"create table t1 (a int) partition by list (a) (partition x default)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` DEFAULT)"}, - - // only hash and key subpartitions are allowed - {"create table t1 (a int, b int) partition by range (a) subpartition by range (b) (partition x values less than maxvalue)", false, ""}, - - // number of partitions/subpartitions must be matching - {"create table t1 (a int) partition by hash (a) partitions 2 (partition x)", false, ""}, - {"create table t1 (a int) partition by hash (a) partitions 2 (partition x, partition y)", true, "CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) (PARTITION `x`,PARTITION `y`)"}, - {"create table t1 (a int, b int) partition by range (a) subpartition by hash (b) subpartitions 2 (partition x values less than maxvalue (subpartition y))", false, ""}, - { - "create table t1 (a int, b int) partition by range (a) subpartition by hash (b) subpartitions 2 (partition x values less than maxvalue (subpartition y, subpartition z))", true, - "CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 2 (PARTITION `x` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `y`,SUBPARTITION `z`))", - }, - { - "create table t1 (a int, b int) partition by range (a) subpartition by hash (b) (partition x values less than (10) (subpartition y,subpartition z),partition a values less than (20) (subpartition b,subpartition c))", true, - "CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 2 (PARTITION `x` VALUES LESS THAN (10) (SUBPARTITION `y`,SUBPARTITION `z`),PARTITION `a` VALUES LESS THAN (20) (SUBPARTITION `b`,SUBPARTITION `c`))", - }, - {"create table t1 (a int, b int) partition by range (a) subpartition by hash (b) (partition x values less than (10) (subpartition y),partition a values less than (20) (subpartition b,subpartition c))", false, ""}, - {"create table t1 (a int, b int) partition by range (a) (partition x values less than (10) (subpartition y))", false, ""}, - {"create table t1 (a int) partition by hash (a) partitions 0", false, ""}, - {"create table t1 (a int, b int) partition by range (a) subpartition by hash (b) subpartitions 0 (partition x values less than (10))", false, ""}, - - // other partition tests - {"create table t1 (a int) partition by system_time interval 7 day limit 50000 (partition x history, partition y current)", false, ""}, - { - "create table t1 (a int) partition by system_time interval 7 day (partition x history, partition y current)", true, - "CREATE TABLE `t1` (`a` INT) PARTITION BY SYSTEM_TIME INTERVAL 7 DAY (PARTITION `x` HISTORY,PARTITION `y` CURRENT)", - }, - { - "create table t1 (a int) partition by system_time limit 50000 (partition x history, partition y current)", true, - "CREATE TABLE `t1` (`a` INT) PARTITION BY SYSTEM_TIME LIMIT 50000 (PARTITION `x` HISTORY,PARTITION `y` CURRENT)", - }, - { - "create table t1 (a int) partition by hash(a) (partition x engine InnoDB comment 'xxxx' data directory '/var/data' index directory '/var/index' max_rows 70000 min_rows 50 tablespace `innodb_file_per_table` nodegroup 255)", true, - "CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) (PARTITION `x` ENGINE = InnoDB COMMENT = 'xxxx' DATA DIRECTORY = '/var/data' INDEX DIRECTORY = '/var/index' MAX_ROWS = 70000 MIN_ROWS = 50 TABLESPACE = `innodb_file_per_table` NODEGROUP = 255)", - }, - { - "create table t1 (a int, b int) partition by range(a) subpartition by hash(b) (partition x values less than maxvalue (subpartition y engine InnoDB comment 'xxxx' data directory '/var/data' index directory '/var/index' max_rows 70000 min_rows 50 tablespace `innodb_file_per_table` nodegroup 255))", true, - "CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 1 (PARTITION `x` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `y` ENGINE = InnoDB COMMENT = 'xxxx' DATA DIRECTORY = '/var/data' INDEX DIRECTORY = '/var/index' MAX_ROWS = 70000 MIN_ROWS = 50 TABLESPACE = `innodb_file_per_table` NODEGROUP = 255))", - }, - } - RunTest(t, table, false, false) - // Check comment content. p := parser.New() stmt, err := p.ParseOneStmt("create table t (id int) partition by range (id) (partition p0 values less than (10) comment 'check')", "", "") @@ -8138,79 +3374,6 @@ func TestWindowFunctionIdentifier(t *testing.T) { RunTest(t, table, false, false) } -func TestWindowFunctions(t *testing.T) { - table := []testCase{ - // For window function descriptions. - // See https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html - {`SELECT CUME_DIST() OVER w FROM t;`, true, "SELECT CUME_DIST() OVER `w` FROM `t`"}, - {`SELECT DENSE_RANK() OVER (w) FROM t;`, true, "SELECT DENSE_RANK() OVER (`w`) FROM `t`"}, - {`SELECT FIRST_VALUE(val) OVER w FROM t;`, true, "SELECT FIRST_VALUE(`val`) OVER `w` FROM `t`"}, - {`SELECT FIRST_VALUE(val) RESPECT NULLS OVER w FROM t;`, true, "SELECT FIRST_VALUE(`val`) OVER `w` FROM `t`"}, - {`SELECT FIRST_VALUE(val) IGNORE NULLS OVER w FROM t;`, true, "SELECT FIRST_VALUE(`val`) IGNORE NULLS OVER `w` FROM `t`"}, - {`SELECT LAG(val) OVER (w) FROM t;`, true, "SELECT LAG(`val`) OVER (`w`) FROM `t`"}, - {`SELECT LAG(val, 1) OVER (w) FROM t;`, true, "SELECT LAG(`val`, 1) OVER (`w`) FROM `t`"}, - {`SELECT LAG(val, 1, def) OVER (w) FROM t;`, true, "SELECT LAG(`val`, 1, `def`) OVER (`w`) FROM `t`"}, - {`SELECT LAST_VALUE(val) OVER (w) FROM t;`, true, "SELECT LAST_VALUE(`val`) OVER (`w`) FROM `t`"}, - {`SELECT LEAD(val) OVER w FROM t;`, true, "SELECT LEAD(`val`) OVER `w` FROM `t`"}, - {`SELECT LEAD(val, 1) OVER w FROM t;`, true, "SELECT LEAD(`val`, 1) OVER `w` FROM `t`"}, - {`SELECT LEAD(val, 1, def) OVER w FROM t;`, true, "SELECT LEAD(`val`, 1, `def`) OVER `w` FROM `t`"}, - {`SELECT NTH_VALUE(val, 233) OVER w FROM t;`, true, "SELECT NTH_VALUE(`val`, 233) OVER `w` FROM `t`"}, - {`SELECT NTH_VALUE(val, 233) FROM FIRST OVER w FROM t;`, true, "SELECT NTH_VALUE(`val`, 233) OVER `w` FROM `t`"}, - {`SELECT NTH_VALUE(val, 233) FROM LAST OVER w FROM t;`, true, "SELECT NTH_VALUE(`val`, 233) FROM LAST OVER `w` FROM `t`"}, - {`SELECT NTH_VALUE(val, 233) FROM LAST IGNORE NULLS OVER w FROM t;`, true, "SELECT NTH_VALUE(`val`, 233) FROM LAST IGNORE NULLS OVER `w` FROM `t`"}, - {`SELECT NTH_VALUE(val) OVER w FROM t;`, false, ""}, - {`SELECT NTILE(233) OVER (w) FROM t;`, true, "SELECT NTILE(233) OVER (`w`) FROM `t`"}, - {`SELECT PERCENT_RANK() OVER (w) FROM t;`, true, "SELECT PERCENT_RANK() OVER (`w`) FROM `t`"}, - {`SELECT RANK() OVER (w) FROM t;`, true, "SELECT RANK() OVER (`w`) FROM `t`"}, - {`SELECT ROW_NUMBER() OVER (w) FROM t;`, true, "SELECT ROW_NUMBER() OVER (`w`) FROM `t`"}, - {`SELECT n, LAG(n, 1, 0) OVER (w), LEAD(n, 1, 0) OVER w, n + LAG(n, 1, 0) OVER (w) FROM fib;`, true, "SELECT `n`,LAG(`n`, 1, 0) OVER (`w`),LEAD(`n`, 1, 0) OVER `w`,`n`+LAG(`n`, 1, 0) OVER (`w`) FROM `fib`"}, - - // For window function concepts and syntax. - // See https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html - {`SELECT SUM(profit) OVER(PARTITION BY country) AS country_profit FROM sales;`, true, "SELECT SUM(`profit`) OVER (PARTITION BY `country`) AS `country_profit` FROM `sales`"}, - {`SELECT SUM(profit) OVER() AS country_profit FROM sales;`, true, "SELECT SUM(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT AVG(profit) OVER() AS country_profit FROM sales;`, true, "SELECT AVG(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT BIT_XOR(profit) OVER() AS country_profit FROM sales;`, true, "SELECT BIT_XOR(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT COUNT(profit) OVER() AS country_profit FROM sales;`, true, "SELECT COUNT(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT COUNT(ALL profit) OVER() AS country_profit FROM sales;`, true, "SELECT COUNT(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT COUNT(*) OVER() AS country_profit FROM sales;`, true, "SELECT COUNT(1) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT MAX(profit) OVER() AS country_profit FROM sales;`, true, "SELECT MAX(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT MIN(profit) OVER() AS country_profit FROM sales;`, true, "SELECT MIN(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT SUM(profit) OVER() AS country_profit FROM sales;`, true, "SELECT SUM(`profit`) OVER () AS `country_profit` FROM `sales`"}, - {`SELECT ROW_NUMBER() OVER(PARTITION BY country) AS row_num1 FROM sales;`, true, "SELECT ROW_NUMBER() OVER (PARTITION BY `country`) AS `row_num1` FROM `sales`"}, - {`SELECT ROW_NUMBER() OVER(PARTITION BY country, d ORDER BY year, product) AS row_num2 FROM sales;`, true, "SELECT ROW_NUMBER() OVER (PARTITION BY `country`, `d` ORDER BY `year`,`product`) AS `row_num2` FROM `sales`"}, - - // For window function frame specification. - // See https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html - {`SELECT SUM(val) OVER (PARTITION BY subject ORDER BY time ROWS UNBOUNDED PRECEDING) FROM t;`, true, "SELECT SUM(`val`) OVER (PARTITION BY `subject` ORDER BY `time` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM `t`"}, - {`SELECT AVG(val) OVER (PARTITION BY subject ORDER BY time ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t;`, true, "SELECT AVG(`val`) OVER (PARTITION BY `subject` ORDER BY `time` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM `t`"}, - {`SELECT AVG(val) OVER (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t;`, true, "SELECT AVG(`val`) OVER (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM `t`"}, - {`SELECT AVG(val) OVER (ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) FROM t;`, true, "SELECT AVG(`val`) OVER (ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) FROM `t`"}, - {`SELECT AVG(val) OVER (RANGE BETWEEN INTERVAL 5 DAY PRECEDING AND INTERVAL '2:30' MINUTE_SECOND FOLLOWING) FROM t;`, true, "SELECT AVG(`val`) OVER (RANGE BETWEEN INTERVAL 5 DAY PRECEDING AND INTERVAL _UTF8MB4'2:30' MINUTE_SECOND FOLLOWING) FROM `t`"}, - {`SELECT AVG(val) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t;`, true, "SELECT AVG(`val`) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM `t`"}, - {`SELECT AVG(val) OVER (RANGE CURRENT ROW) FROM t;`, true, "SELECT AVG(`val`) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM `t`"}, - - // For named windows. - // See https://dev.mysql.com/doc/refman/8.0/en/window-functions-named-windows.html - {`SELECT RANK() OVER (w) FROM t WINDOW w AS (ORDER BY val);`, true, "SELECT RANK() OVER (`w`) FROM `t` WINDOW `w` AS (ORDER BY `val`)"}, - {`SELECT RANK() OVER w FROM t WINDOW w AS ();`, true, "SELECT RANK() OVER `w` FROM `t` WINDOW `w` AS ()"}, - {`SELECT FIRST_VALUE(year) OVER (w ORDER BY year) AS first FROM sales WINDOW w AS (PARTITION BY country);`, true, "SELECT FIRST_VALUE(`year`) OVER (`w` ORDER BY `year`) AS `first` FROM `sales` WINDOW `w` AS (PARTITION BY `country`)"}, - {`SELECT RANK() OVER (w1) FROM t WINDOW w1 AS (w2), w2 AS (), w3 AS (w1);`, true, "SELECT RANK() OVER (`w1`) FROM `t` WINDOW `w1` AS (`w2`),`w2` AS (),`w3` AS (`w1`)"}, - {`SELECT RANK() OVER w1 FROM t WINDOW w1 AS (w2), w2 AS (w3), w3 AS (w1);`, true, "SELECT RANK() OVER `w1` FROM `t` WINDOW `w1` AS (`w2`),`w2` AS (`w3`),`w3` AS (`w1`)"}, - - // For TSO functions - {`select tidb_parse_tso(1)`, true, "SELECT TIDB_PARSE_TSO(1)"}, - {`select tidb_parse_tso_logical(1)`, true, "SELECT TIDB_PARSE_TSO_LOGICAL(1)"}, - {`select tidb_bounded_staleness('2015-09-21 00:07:01', NOW())`, true, "SELECT TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW())"}, - {`select tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())`, true, "SELECT TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, - {`select tidb_bounded_staleness('2015-09-21 00:07:01', '2021-04-27 11:26:13')`, true, "SELECT TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13')"}, - - {`select from_unixtime(404411537129996288)`, true, "SELECT FROM_UNIXTIME(404411537129996288)"}, - {`select from_unixtime(404411537129996288.22)`, true, "SELECT FROM_UNIXTIME(404411537129996288.22)"}, - } - RunTest(t, table, true, false) -} - type windowFrameBoundChecker struct { fb *ast.FrameBound exprRc int @@ -8568,23 +3731,6 @@ func TestFulltextSearch(t *testing.T) { } } -func TestStartTransaction(t *testing.T) { - cases := []testCase{ - {"START TRANSACTION READ WRITE", true, "START TRANSACTION"}, - {"START TRANSACTION WITH CONSISTENT SNAPSHOT", true, "START TRANSACTION"}, - {"START TRANSACTION WITH CAUSAL CONSISTENCY ONLY", true, "START TRANSACTION WITH CAUSAL CONSISTENCY ONLY"}, - {"START TRANSACTION READ ONLY", true, "START TRANSACTION READ ONLY"}, - {"START TRANSACTION READ ONLY AS OF", false, ""}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP", false, ""}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP '2015-09-21 00:07:01'", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP _UTF8MB4'2015-09-21 00:07:01'"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW())", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW())"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', '2021-04-27 11:26:13')", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13')"}, - } - - RunTest(t, cases, false, false) -} - func TestSignedInt64OutOfRange(t *testing.T) { p := parser.New() cases := []string{ @@ -8727,86 +3873,7 @@ func (checker *nodeTextCleaner) Leave(in ast.Node) (out ast.Node, ok bool) { return in, true } -// For BRIE -func TestBRIE(t *testing.T) { - table := []testCase{ - {"BACKUP DATABASE a TO 'local:///tmp/archive01/'", true, "BACKUP DATABASE `a` TO 'local:///tmp/archive01/'"}, - {"BACKUP SCHEMA a TO 'local:///tmp/archive01/'", true, "BACKUP DATABASE `a` TO 'local:///tmp/archive01/'"}, - {"BACKUP DATABASE a,b,c TO 'noop://'", true, "BACKUP DATABASE `a`, `b`, `c` TO 'noop://'"}, - {"BACKUP DATABASE a.b TO 'noop://'", false, ""}, - {"BACKUP DATABASE * TO 'noop://'", true, "BACKUP DATABASE * TO 'noop://'"}, - {"BACKUP DATABASE *, a TO 'noop://'", false, ""}, - {"BACKUP DATABASE a, * TO 'noop://'", false, ""}, - {"BACKUP DATABASE TO 'noop://'", false, ""}, - {"BACKUP TABLE a TO 'noop://' checksum_concurrency 4 compression_level 4 ignore_stats 1 compression_type 'lz4'", true, "BACKUP TABLE `a` TO 'noop://' CHECKSUM_CONCURRENCY = 4 COMPRESSION_LEVEL = 4 IGNORE_STATS = 1 COMPRESSION_TYPE = 'lz4'"}, - {"RESTORE TABLE a FROM 'noop://' checksum_concurrency 4 wait_tiflash_ready 1 with_sys_table 1", true, "RESTORE TABLE `a` FROM 'noop://' CHECKSUM_CONCURRENCY = 4 WAIT_TIFLASH_READY = 1 WITH_SYS_TABLE = 1"}, - {"BACKUP TABLE a.b TO 'noop://'", true, "BACKUP TABLE `a`.`b` TO 'noop://'"}, - {"BACKUP TABLE a.b,c.d,e TO 'noop://'", true, "BACKUP TABLE `a`.`b`, `c`.`d`, `e` TO 'noop://'"}, - {"BACKUP TABLE a.* TO 'noop://'", false, ""}, - {"BACKUP TABLE * TO 'noop://'", false, ""}, - {"BACKUP TABLE TO 'noop://'", false, ""}, - {"RESTORE DATABASE * FROM 's3://bucket/path/'", true, "RESTORE DATABASE * FROM 's3://bucket/path/'"}, - - {"BACKUP DATABASE * TO 'noop://' LAST_BACKUP = '2020-02-02 14:14:14'", true, "BACKUP DATABASE * TO 'noop://' LAST_BACKUP = '2020-02-02 14:14:14'"}, - {"BACKUP DATABASE * TO 'noop://' LAST_BACKUP = 1234567890", true, "BACKUP DATABASE * TO 'noop://' LAST_BACKUP = 1234567890"}, - - {"backup database * to 'noop://' rate_limit 500 MB/second snapshot 5 minute ago", true, "BACKUP DATABASE * TO 'noop://' RATE_LIMIT = 500 MB/SECOND SNAPSHOT = 300000000 MICROSECOND AGO"}, - {"backup database * to 'noop://' snapshot = '2020-03-18 18:13:54'", true, "BACKUP DATABASE * TO 'noop://' SNAPSHOT = '2020-03-18 18:13:54'"}, - {"backup database * to 'noop://' snapshot = 1234567890", true, "BACKUP DATABASE * TO 'noop://' SNAPSHOT = 1234567890"}, - {"restore table g from 'noop://' concurrency 40 checksum 0 online 1", true, "RESTORE TABLE `g` FROM 'noop://' CONCURRENCY = 40 CHECKSUM = OFF ONLINE = 1"}, - { - "backup table x to 's3://bucket/path/?endpoint=https://test-cluster-s3.local&access-key=aaaaaaaaa&secret-access-key=bbbbbbbb&force-path-style=1'", - true, - "BACKUP TABLE `x` TO 's3://bucket/path/?endpoint=https://test-cluster-s3.local&access-key=aaaaaaaaa&secret-access-key=bbbbbbbb&force-path-style=1'", - }, - { - "backup database * to 's3://bucket/path/?provider=alibaba®ion=us-west-9&storage-class=glacier&sse=AES256&acl=authenticated-read&use-accelerate-endpoint=1' send_credentials_to_tikv = 1", - true, - "BACKUP DATABASE * TO 's3://bucket/path/?provider=alibaba®ion=us-west-9&storage-class=glacier&sse=AES256&acl=authenticated-read&use-accelerate-endpoint=1' SEND_CREDENTIALS_TO_TIKV = 1", - }, - { - "restore database * from 'gcs://bucket/path/?endpoint=https://test-cluster.gcs.local&storage-class=coldline&predefined-acl=OWNER&credentials-file=/data/private/creds.json'", - true, - "RESTORE DATABASE * FROM 'gcs://bucket/path/?endpoint=https://test-cluster.gcs.local&storage-class=coldline&predefined-acl=OWNER&credentials-file=/data/private/creds.json'", - }, - {"restore table g from 'noop://' checksum off", true, "RESTORE TABLE `g` FROM 'noop://' CHECKSUM = OFF"}, - {"restore table g from 'noop://' checksum optional", true, "RESTORE TABLE `g` FROM 'noop://' CHECKSUM = OPTIONAL"}, - {"backup logs to 'noop://'", true, "BACKUP LOGS TO 'noop://'"}, - {"backup logs to 'noop://' start_ts='20220304'", true, "BACKUP LOGS TO 'noop://' START_TS = '20220304'"}, - {"pause backup logs", true, "PAUSE BACKUP LOGS"}, - {"pause backup logs gc_ttl='20220304'", true, "PAUSE BACKUP LOGS GC_TTL = '20220304'"}, - {"resume backup logs", true, "RESUME BACKUP LOGS"}, - {"show backup logs status", true, "SHOW BACKUP LOGS STATUS"}, - {"show backup logs metadata from 'noop://'", true, "SHOW BACKUP LOGS METADATA FROM 'noop://'"}, - {"show br job 1234", true, "SHOW BR JOB 1234"}, - {"show br job query 1234", true, "SHOW BR JOB QUERY 1234"}, - {"cancel br job 1234", true, "CANCEL BR JOB 1234"}, - {"purge backup logs from 'noop://'", true, "PURGE BACKUP LOGS FROM 'noop://'"}, - {"purge backup logs from 'noop://' until_ts='2012122304'", true, "PURGE BACKUP LOGS FROM 'noop://' UNTIL_TS = '2012122304'"}, - {"restore point from 'noop://log_backup'", true, "RESTORE POINT FROM 'noop://log_backup'"}, - {"restore point from 'noop://log_backup' full_backup_storage='noop://full_log'", true, "RESTORE POINT FROM 'noop://log_backup' FULL_BACKUP_STORAGE = 'noop://full_log'"}, - {"restore point from 'noop://log_backup' full_backup_storage='noop://full_log' restored_ts='20230123'", true, "RESTORE POINT FROM 'noop://log_backup' FULL_BACKUP_STORAGE = 'noop://full_log' RESTORED_TS = '20230123'"}, - {"restore point from 'noop://log_backup' full_backup_storage='noop://full_log' start_ts='20230101' restored_ts='20230123'", true, "RESTORE POINT FROM 'noop://log_backup' FULL_BACKUP_STORAGE = 'noop://full_log' START_TS = '20230101' RESTORED_TS = '20230123'"}, - } - - RunTest(t, table, false, false) -} - func TestStatisticsOps(t *testing.T) { - table := []testCase{ - {"create statistics stats1 (cardinality) on t(a,b,c)", true, "CREATE STATISTICS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`)"}, - {"create statistics stats2 (dependency) on t(a,b)", true, "CREATE STATISTICS `stats2` (DEPENDENCY) ON `t`(`a`, `b`)"}, - {"create statistics stats3 (correlation) on t(a,b)", true, "CREATE STATISTICS `stats3` (CORRELATION) ON `t`(`a`, `b`)"}, - {"create statistics stats3 on t(a,b)", false, ""}, - {"create statistics if not exists stats1 (cardinality) on t(a,b,c)", true, "CREATE STATISTICS IF NOT EXISTS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`)"}, - {"create statistics if not exists stats2 (dependency) on t(a,b)", true, "CREATE STATISTICS IF NOT EXISTS `stats2` (DEPENDENCY) ON `t`(`a`, `b`)"}, - {"create statistics if not exists stats3 (correlation) on t(a,b)", true, "CREATE STATISTICS IF NOT EXISTS `stats3` (CORRELATION) ON `t`(`a`, `b`)"}, - {"create statistics if not exists stats3 on t(a,b)", false, ""}, - {"create statistics stats1(cardinality) on t(a,b,c)", true, "CREATE STATISTICS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`)"}, - {"drop statistics stats1", true, "DROP STATISTICS `stats1`"}, - } - RunTest(t, table, false, false) - p := parser.New() sms, _, err := p.Parse("create statistics if not exists stats1 (cardinality) on t(a,b,c)", "", "") if err != nil { @@ -8917,92 +3984,6 @@ func TestHighNotPrecedenceMode(t *testing.T) { } } -// For CTE -func TestCTE(t *testing.T) { - table := []testCase{ - {"WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`"}, - {"WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, - {"WITH `cte` AS (SELECT 1,2), cte2 as (select 3) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2), `cte2` AS (SELECT 3) SELECT `col1`,`col2` FROM `cte`"}, - {"WITH RECURSIVE cte (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;", true, "WITH RECURSIVE `cte` (`n`) AS (SELECT 1 UNION ALL SELECT `n`+1 FROM `cte` WHERE `n`<5) SELECT * FROM `cte`"}, - {"with cte(a) as (select 1) update t, cte set t.a=1 where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) UPDATE (`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a`=`cte`.`a`"}, - {"with cte(a) as (select 1) delete t from t, cte where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) DELETE `t` FROM (`t`) JOIN `cte` WHERE `t`.`a`=`cte`.`a`"}, - {"WITH cte1 AS (SELECT 1) SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt;", true, "WITH `cte1` AS (SELECT 1) SELECT * FROM (WITH `cte2` AS (SELECT 2) SELECT * FROM `cte2` JOIN `cte1`) AS `dt`"}, - {"WITH cte AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte;", true, "WITH `cte` AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte`"}, - {"with cte as (table t) table cte;", true, "WITH `cte` AS (TABLE `t`) TABLE `cte`"}, - {"with cte as (select 1) select 1 union with cte as (select 1) select * from cte;", false, ""}, - {"with cte as (select 1) (select 1);", true, "WITH `cte` AS (SELECT 1) (SELECT 1)"}, - {"with cte as (select 1) (select 1 union select 1)", true, "WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT 1)"}, - {"select * from (with cte as (select 1) select 1 union select 2) qn", true, "SELECT * FROM (WITH `cte` AS (SELECT 1) SELECT 1 UNION SELECT 2) AS `qn`"}, - {"select * from t where 1 > (with cte as (select 2) select * from cte)", true, "SELECT * FROM `t` WHERE 1>(WITH `cte` AS (SELECT 2) SELECT * FROM `cte`)"}, - {"( with cte(n) as ( select 1 ) select n+1 from cte union select n+2 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte` UNION SELECT `n`+2 FROM `cte`) UNION SELECT 1"}, - {"( with cte(n) as ( select 1 ) select n+1 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte`) UNION SELECT 1"}, - {"( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1"}, - } - - RunTest(t, table, false, false) -} - -// For CTE Merge -func TestCTEMerge(t *testing.T) { - table := []testCase{ - {"WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`"}, - {"WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, - {"WITH `cte` AS (SELECT 1,2), cte2 as (select 3) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2), `cte2` AS (SELECT 3) SELECT `col1`,`col2` FROM `cte`"}, - {"with cte(a) as (select 1) update t, cte set t.a=1 where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) UPDATE (`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a`=`cte`.`a`"}, - {"with cte(a) as (select 1) delete t from t, cte where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) DELETE `t` FROM (`t`) JOIN `cte` WHERE `t`.`a`=`cte`.`a`"}, - {"WITH cte1 AS (SELECT 1) SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt;", true, "WITH `cte1` AS (SELECT 1) SELECT * FROM (WITH `cte2` AS (SELECT 2) SELECT * FROM `cte2` JOIN `cte1`) AS `dt`"}, - {"WITH cte AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte;", true, "WITH `cte` AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte`"}, - {"with cte as (table t) table cte;", true, "WITH `cte` AS (TABLE `t`) TABLE `cte`"}, - {"with cte as (select 1) select 1 union with cte as (select 1) select * from cte;", false, ""}, - {"with cte as (select 1) (select 1);", true, "WITH `cte` AS (SELECT 1) (SELECT 1)"}, - {"with cte as (select 1) (select 1 union select 1)", true, "WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT 1)"}, - {"select * from (with cte as (select 1) select 1 union select 2) qn", true, "SELECT * FROM (WITH `cte` AS (SELECT 1) SELECT 1 UNION SELECT 2) AS `qn`"}, - {"select * from t where 1 > (with cte as (select 2) select * from cte)", true, "SELECT * FROM `t` WHERE 1>(WITH `cte` AS (SELECT 2) SELECT * FROM `cte`)"}, - {"( with cte(n) as ( select 1 ) select n+1 from cte union select n+2 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte` UNION SELECT `n`+2 FROM `cte`) UNION SELECT 1"}, - {"( with cte(n) as ( select 1 ) select n+1 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte`) UNION SELECT 1"}, - {"( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1"}, - } - - RunTest(t, table, false, false) -} - -func TestAsOfClause(t *testing.T) { - table := []testCase{ - {"SELECT * FROM `t` AS /* comment */ a;", true, "SELECT * FROM `t` AS `a`"}, - {"SELECT * FROM `t` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW());", true, "SELECT * FROM `t` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, - {"select * from `t` as of timestamp '2021-04-15 00:00:00'", true, "SELECT * FROM `t` AS OF TIMESTAMP _UTF8MB4'2021-04-15 00:00:00'"}, - {"SELECT * FROM (`a` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())) JOIN `b` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW());", true, "SELECT * FROM (`a` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())) JOIN `b` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, - {"INSERT INTO `employees` (SELECT * FROM `employees` AS OF TIMESTAMP (DATE_SUB(NOW(), INTERVAL _UTF8MB4'60' MINUTE)) NOT IN (SELECT * FROM `employees`))", true, "INSERT INTO `employees` (SELECT * FROM `employees` AS OF TIMESTAMP (DATE_SUB(NOW(), INTERVAL _UTF8MB4'60' MINUTE)) NOT IN (SELECT * FROM `employees`))"}, - {"SET TRANSACTION READ ONLY as of timestamp '2021-04-21 00:42:12'", true, "SET @@SESSION.`tx_read_ts`=_UTF8MB4'2021-04-21 00:42:12'"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP '2015-09-21 00:07:01'", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP _UTF8MB4'2015-09-21 00:07:01'"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW())", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW())"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, - {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', '2021-04-27 11:26:13')", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13')"}, - } - RunTest(t, table, false, false) -} - -// For `PARTITION BY [LINEAR] KEY ALGORITHM` syntax -func TestPartitionKeyAlgorithm(t *testing.T) { - table := []testCase{ - {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 1 (c1,c2) PARTITIONS 4", true, "CREATE TABLE `t` (`c1` INT,`c2` INT) PARTITION BY LINEAR KEY ALGORITHM = 1 (`c1`,`c2`) PARTITIONS 4"}, - {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = -1 (c1,c2) PARTITIONS 4", false, ""}, - {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 0 (c1,c2) PARTITIONS 4", false, ""}, - {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 3 (c1,c2) PARTITIONS 4", false, ""}, - } - - RunTest(t, table, false, false) -} - -// server side help syntax -func TestHelp(t *testing.T) { - table := []testCase{ - {"HELP 'select'", true, "HELP 'select'"}, - } - - RunTest(t, table, false, false) -} - func TestWithoutCharsetFlags(t *testing.T) { type testCaseWithFlag struct { src string @@ -9182,29 +4163,6 @@ func TestCTEBindings(t *testing.T) { } func TestPlanReplayer(t *testing.T) { - table := []testCase{ - {"PLAN REPLAYER DUMP EXPLAIN SELECT a FROM t", true, "PLAN REPLAYER DUMP EXPLAIN SELECT `a` FROM `t`"}, - {"PLAN REPLAYER DUMP EXPLAIN SELECT * FROM t WHERE a > 10", true, "PLAN REPLAYER DUMP EXPLAIN SELECT * FROM `t` WHERE `a`>10"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE SELECT * FROM t WHERE a > 10", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE SELECT * FROM `t` WHERE `a`>10"}, - {"PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE a > 10 and t < 1 ORDER BY t LIMIT 10", true, "PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE `a`>10 AND `t`<1 ORDER BY `t` LIMIT 10"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE a > 10 and t < 1 ORDER BY t LIMIT 10", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE `a`>10 AND `t`<1 ORDER BY `t` LIMIT 10"}, - {"PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE a > 10 and t < 1 LIMIT 10", true, "PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE `a`>10 AND `t`<1 LIMIT 10"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE a > 10 and t < 1 LIMIT 10", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE `a`>10 AND `t`<1 LIMIT 10"}, - {"PLAN REPLAYER DUMP EXPLAIN SLOW QUERY LIMIT 10", true, "PLAN REPLAYER DUMP EXPLAIN SLOW QUERY LIMIT 10"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY LIMIT 10", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY LIMIT 10"}, - {"PLAN REPLAYER DUMP EXPLAIN SLOW QUERY", true, "PLAN REPLAYER DUMP EXPLAIN SLOW QUERY"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY"}, - {"PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip'", true, "PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip'"}, - {"PLAN REPLAYER DUMP EXPLAIN 'sql.txt'", true, "PLAN REPLAYER DUMP EXPLAIN 'sql.txt'"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE 'sql.txt'", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE 'sql.txt'"}, - {"PLAN REPLAYER DUMP EXPLAIN ('SELECT * FROM t1')", true, "PLAN REPLAYER DUMP EXPLAIN ('SELECT * FROM t1')"}, - {"PLAN REPLAYER DUMP EXPLAIN ( 'SELECT * FROM t1' , 'SELECT * FROM t2' )", true, "PLAN REPLAYER DUMP EXPLAIN ('SELECT * FROM t1', 'SELECT * FROM t2')"}, - {"PLAN REPLAYER DUMP EXPLAIN ANALYZE ('SELECT * FROM t1', 'SELECT * FROM t2 WHERE id = 1')", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE ('SELECT * FROM t1', 'SELECT * FROM t2 WHERE id = 1')"}, - {"PLAN REPLAYER CAPTURE '123' '123'", true, "PLAN REPLAYER CAPTURE '123' '123'"}, - {"PLAN REPLAYER CAPTURE REMOVE '123' '123'", true, "PLAN REPLAYER CAPTURE REMOVE '123' '123'"}, - } - RunTest(t, table, false, false) - p := parser.New() sms, _, err := p.Parse("PLAN REPLAYER DUMP EXPLAIN SELECT a FROM t", "", "") if err != nil { @@ -9541,123 +4499,6 @@ func TestCharsetIntroducer(t *testing.T) { } } -func TestNonTransactionalDML(t *testing.T) { - cases := []testCase{ - // deletes - {"batch on c limit 10 delete from t where c = 10", true, - "BATCH ON `c` LIMIT 10 DELETE FROM `t` WHERE `c`=10"}, - {"batch on c limit 10 dry run delete from t where c = 10", true, - "BATCH ON `c` LIMIT 10 DRY RUN DELETE FROM `t` WHERE `c`=10"}, - {"batch on c limit 10 dry run query delete from t where c = 10", true, - "BATCH ON `c` LIMIT 10 DRY RUN QUERY DELETE FROM `t` WHERE `c`=10"}, - {"batch limit 10 delete from t where c = 10", true, - "BATCH LIMIT 10 DELETE FROM `t` WHERE `c`=10"}, - {"batch limit 10 dry run delete from t where c = 10", true, - "BATCH LIMIT 10 DRY RUN DELETE FROM `t` WHERE `c`=10"}, - {"batch limit 10 dry run query delete from t where c = 10", true, - "BATCH LIMIT 10 DRY RUN QUERY DELETE FROM `t` WHERE `c`=10"}, - // updates - {"batch on c limit 10 update t set c = 10", true, - "BATCH ON `c` LIMIT 10 UPDATE `t` SET `c`=10"}, - {"batch on c limit 10 dry run update t set c = 10", true, - "BATCH ON `c` LIMIT 10 DRY RUN UPDATE `t` SET `c`=10"}, - {"batch on c limit 10 dry run query update t set c = 10", true, - "BATCH ON `c` LIMIT 10 DRY RUN QUERY UPDATE `t` SET `c`=10"}, - {"batch limit 10 update t set c = 10", true, - "BATCH LIMIT 10 UPDATE `t` SET `c`=10"}, - {"batch limit 10 dry run update t set c = 10", true, - "BATCH LIMIT 10 DRY RUN UPDATE `t` SET `c`=10"}, - {"batch limit 10 dry run query update t set c = 10", true, - "BATCH LIMIT 10 DRY RUN QUERY UPDATE `t` SET `c`=10"}, - // inserts - {"batch on c limit 10 insert into t1 select * from t2 where c = 10", true, - "BATCH ON `c` LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10"}, - {"batch on c limit 10 dry run insert into t1 select * from t2 where c = 10", true, - "BATCH ON `c` LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10"}, - {"batch on c limit 10 dry run query insert into t1 select * from t2 where c = 10", true, - "BATCH ON `c` LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10"}, - {"batch limit 10 insert into t1 select * from t2 where c = 10", true, - "BATCH LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10"}, - {"batch limit 10 dry run insert into t1 select * from t2 where c = 10", true, - "BATCH LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10"}, - {"batch limit 10 dry run query insert into t1 select * from t2 where c = 10", true, - "BATCH LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10"}, - // inserts on duplicate key update - {"batch on c limit 10 insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val", true, - "BATCH ON `c` LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val`"}, - {"batch on c limit 10 dry run insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val", true, - "BATCH ON `c` LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val`"}, - {"batch on c limit 10 dry run query insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val", true, - "BATCH ON `c` LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val`"}, - {"batch limit 10 insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val", true, - "BATCH LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val`"}, - {"batch limit 10 dry run insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val", true, - "BATCH LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val`"}, - {"batch limit 10 dry run query insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val", true, - "BATCH LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val`"}, - } - - RunTest(t, cases, false, false) -} - -func TestIntervalPartition(t *testing.T) { - table := []testCase{ - {"CREATE TABLE t (c1 integer,c2 integer) PARTITION BY RANGE (c1) INTERVAL (1000)", true, "CREATE TABLE `t` (`c1` INT,`c2` INT) PARTITION BY RANGE (`c1`) INTERVAL (1000)"}, - {"CREATE TABLE t (c1 int, c2 date) PARTITION BY RANGE (c2) INTERVAL (1 Month)", true, "CREATE TABLE `t` (`c1` INT,`c2` DATE) PARTITION BY RANGE (`c2`) INTERVAL (1 MONTH)"}, - {"CREATE TABLE t (c1 int, c2 date) PARTITION BY RANGE (c1) (partition p1 values less than (22))", true, "CREATE TABLE `t` (`c1` INT,`c2` DATE) PARTITION BY RANGE (`c1`) (PARTITION `p1` VALUES LESS THAN (22))"}, - {`CREATE TABLE t (c1 int, c2 date) PARTITION BY RANGE COLUMNS (c2) INTERVAL (1 year) first partition less than ("2022-02-01")`, false, ""}, - {`CREATE TABLE t (c1 int, c2 datetime) PARTITION BY RANGE COLUMNS (c2) INTERVAL (1 day) first partition less than ("2022-01-02") last partition less than ("2022-06-01") NULL PARTITION MAXVALUE PARTITION`, true, "CREATE TABLE `t` (`c1` INT,`c2` DATETIME) PARTITION BY RANGE COLUMNS (`c2`) INTERVAL (1 DAY) FIRST PARTITION LESS THAN (_UTF8MB4'2022-01-02') LAST PARTITION LESS THAN (_UTF8MB4'2022-06-01') NULL PARTITION MAXVALUE PARTITION"}, - {`ALTER TABLE t LAST PARTITION LESS THAN (1000)`, true, "ALTER TABLE `t` LAST PARTITION LESS THAN (1000)"}, - {`ALTER TABLE t REORGANIZE MAX PARTITION INTO NEW LAST PARTITION LESS THAN (1000)`, false, ""}, - {`ALTER TABLE t REORGANIZE MAX PARTITION INTO LAST PARTITION LESS THAN (1000)`, false, ""}, - {`ALTER TABLE t REORGANIZE MAXVALUE PARTITION INTO NEW LAST PARTITION LESS THAN (1000)`, false, ""}, - {`ALTER TABLE t REORGANIZE MAXVALUE PARTITION INTO LAST PARTITION LESS THAN (1000)`, false, ""}, - {`ALTER TABLE t split MAXVALUE PARTITION LESS THAN (1000)`, true, "ALTER TABLE `t` SPLIT MAXVALUE PARTITION LESS THAN (1000)"}, - {`ALTER TABLE t merge first PARTITION LESS THAN (1000)`, true, "ALTER TABLE `t` MERGE FIRST PARTITION LESS THAN (1000)"}, - {`ALTER TABLE t first PARTITION LESS THAN (1000)`, true, "ALTER TABLE `t` FIRST PARTITION LESS THAN (1000)"}, - } - - RunTest(t, table, false, false) -} - -func TestTTLTableOption(t *testing.T) { - table := []testCase{ - // create table with various temporal interval - {"create table t (created_at datetime) TTL = created_at + INTERVAL 3.1415 YEAR", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 3.1415 YEAR"}, - {"create table t (created_at datetime) TTL = created_at + INTERVAL '1 1:1:1' DAY_SECOND", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL _UTF8MB4'1 1:1:1' DAY_SECOND"}, - {"create table t (created_at datetime) TTL = created_at + INTERVAL 1 YEAR", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR"}, - {"create table t (created_at datetime) TTL = created_at + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'"}, - {"create table t (created_at datetime) TTL created_at + INTERVAL 1 YEAR TTL_ENABLE 'OFF'", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF'"}, - {"create table t (created_at datetime) TTL created_at + INTERVAL 1 YEAR TTL_ENABLE 'OFF' TTL_JOB_INTERVAL='8h'", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '8h'"}, - {"create table t (created_at datetime) /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON'*/", true, "CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON'"}, - - // alter table with various temporal interval - {"alter table t TTL = created_at + INTERVAL 1 MONTH", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH"}, - {"alter table t TTL_ENABLE = 'ON'", true, "ALTER TABLE `t` TTL_ENABLE = 'ON'"}, - {"alter table t TTL_ENABLE = 'OFF'", true, "ALTER TABLE `t` TTL_ENABLE = 'OFF'"}, - {"alter table t TTL = created_at + INTERVAL 1 MONTH TTL_ENABLE 'OFF'", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH TTL_ENABLE = 'OFF'"}, - {"alter table t TTL = created_at + INTERVAL 1 MONTH TTL_ENABLE 'OFF' TTL_JOB_INTERVAL '1h'", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '1h'"}, - {"alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON'*/", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON'"}, - {"alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON' TTL_JOB_INTERVAL='8h'*/", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' TTL_JOB_INTERVAL = '8h'"}, - {"alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON' TTL_JOB_INTERVAL='8.645124531235h'*/", true, "ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' TTL_JOB_INTERVAL = '8.645124531235h'"}, - - // alter table to remove ttl settings - {"alter table t remove ttl", true, "ALTER TABLE `t` REMOVE TTL"}, - - // validate invalid TTL_ENABLE settings - {"create table t (created_at datetime) TTL_ENABLE = 'test_case'", false, ""}, - {"create table t (created_at datetime) /*T![ttl] TTL_ENABLE = 'test_case' */", false, ""}, - {"alter table t /*T![ttl] TTL_ENABLE = 'test_case' */", false, ""}, - - // validate invalid TTL_JOB_INTERVAL settings - {"create table t (created_at datetime) TTL_JOB_INTERVAL = '@monthly'", false, ""}, - {"create table t (created_at datetime) TTL_JOB_INTERVAL = '10hourxx'", false, ""}, - {"create table t (created_at datetime) TTL_JOB_INTERVAL = '10.10.255h'", false, ""}, - } - - RunTest(t, table, false, false) -} - func TestIssue45898(t *testing.T) { p := parser.New() p.ParseSQL("a.") @@ -9709,257 +4550,3 @@ func TestMultiStmt(t *testing.T) { t.Fatalf("got %v, want %v", stmt4.Fields.Fields[0].Text(), "1") } } - -// https://dev.mysql.com/doc/refman/8.1/en/other-vendor-data-types.html -func TestCompatTypes(t *testing.T) { - table := []testCase{ - {`CREATE TABLE t(id INT PRIMARY KEY, c1 BOOL)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` TINYINT(1))"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 BOOLEAN)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` TINYINT(1))"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 CHARACTER VARYING(0))`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` VARCHAR(0))"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 FIXED)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` DECIMAL)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 FLOAT4)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` FLOAT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 FLOAT8)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` DOUBLE)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 INT1)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` TINYINT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 INT2)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` SMALLINT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 INT3)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMINT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 INT4)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` INT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 INT8)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` BIGINT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 LONG VARBINARY)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMBLOB)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 LONG VARCHAR)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMTEXT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 LONG)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMTEXT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 MIDDLEINT)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMINT)"}, - {`CREATE TABLE t(id INT PRIMARY KEY, c1 NUMERIC)`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` DECIMAL)"}, - } - - RunTest(t, table, false, false) -} - -func TestVector(t *testing.T) { - table := []testCase{ - {"CREATE TABLE t (a VECTOR)", true, "CREATE TABLE `t` (`a` VECTOR)"}, - {"CREATE TABLE t (a VECTOR)", true, "CREATE TABLE `t` (`a` VECTOR)"}, - {"CREATE TABLE t (a VECTOR)", false, ""}, - {"CREATE TABLE t (a VECTOR)", false, ""}, - {"CREATE TABLE t (a VECTOR)", false, ""}, - {"CREATE TABLE t (a VECTOR(5))", false, ""}, - } - - RunTest(t, table, false, false) -} - -func TestExplainExplore(t *testing.T) { - cases := []testCase{ - {`explain explore 'digestxxx'`, true, `EXPLAIN EXPLORE 'digestxxx'`}, - {`explain explore select 1 from t`, true, "EXPLAIN EXPLORE SELECT 1 FROM `t`"}, - {`explain explore select 1 from t1, t2`, true, "EXPLAIN EXPLORE SELECT 1 FROM (`t1`) JOIN `t2`"}, - {`explain explore select 1 from t where t1.a > (select max(a) from t2)`, true, "EXPLAIN EXPLORE SELECT 1 FROM `t` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`)"}, - } - RunTest(t, cases, false, false) -} - -// TestCompatMariaDB is to test for MariaDB specific table options -func TestCompatMariaDB(t *testing.T) { - cases := []testCase{ - {`CREATE TABLE t (id int PRIMARY KEY) PAGE_CHECKSUM=1`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY) PAGE_CHECKSUM = 1"}, - {`CREATE TABLE t (id int PRIMARY KEY) PAGE_COMPRESSED=1`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY) PAGE_COMPRESSED = 1"}, - {`CREATE TABLE t (id int PRIMARY KEY) PAGE_COMPRESSION_LEVEL=1`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY) PAGE_COMPRESSION_LEVEL = 1"}, - {`CREATE TABLE t (id int PRIMARY KEY) TRANSACTIONAL=0`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY) TRANSACTIONAL = 0"}, - {`CREATE TABLE t (id int PRIMARY KEY) IETF_QUOTES=YES`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY) IETF_QUOTES = YES"}, - {`CREATE TABLE t (id int PRIMARY KEY) SEQUENCE=1`, true, "CREATE TABLE `t` (`id` INT PRIMARY KEY) SEQUENCE = 1"}, - } - RunTest(t, cases, false, false) -} - -func TestSecondaryEngineAttribute(t *testing.T) { - table := []testCase{ - // Valid Partition-level SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE TABLE t (id INT) PARTITION BY RANGE (id) (" + - "PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"value\"}'," + - "PARTITION p1 VALUES LESS THAN (20) SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"value2\"}')", - true, - "CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) (" + - "PARTITION `p0` VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"value\"}'," + - "PARTITION `p1` VALUES LESS THAN (20) SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"value2\"}')", - }, - - // Valid Table-level SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"value\"}'", - true, - "CREATE TABLE `t` (`id` INT) SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"value\"}'", - }, - - // Valid Table-level and Partition-level SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"value\"}' PARTITION BY RANGE (id) (" + - "PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"partition_value\"}')", - true, - "CREATE TABLE `t` (`id` INT) SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"value\"}' PARTITION BY RANGE (`id`) (" + - "PARTITION `p0` VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"partition_value\"}')", - }, - - // Valid Column-level SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE TABLE t (id INT SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"value\"}')", - true, - "CREATE TABLE `t` (`id` INT SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"value\"}')", - }, - - // Valid: Table-level with tablespace option SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE TABLE t (id INT) TABLESPACE ts1 SECONDARY_ENGINE_ATTRIBUTE='{\"key\":\"value\"}'", - true, - "CREATE TABLE `t` (`id` INT) TABLESPACE = `ts1` SECONDARY_ENGINE_ATTRIBUTE = '{\"key\":\"value\"}'", - }, - - // Valid: Index SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE TABLE t (id INT,INDEX idx (id) INVISIBLE SECONDARY_ENGINE_ATTRIBUTE='{\"key1\":\"value1\"}')", - true, - "CREATE TABLE `t` (`id` INT,INDEX `idx`(`id`) INVISIBLE SECONDARY_ENGINE_ATTRIBUTE = '{\"key1\":\"value1\"}')", - }, - - // Missing value for SECONDARY_ENGINE_ATTRIBUTE at Partition-level - { - "CREATE TABLE t (id INT) PARTITION BY RANGE (id) (" + - "PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE=)", - false, - "", - }, - - // Missing value for SECONDARY_ENGINE_ATTRIBUTE at Table-level - { - "CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE=", - false, - "", - }, - - // Missing value for SECONDARY_ENGINE_ATTRIBUTE at Column-level - { - "CREATE TABLE t (id INT SECONDARY_ENGINE_ATTRIBUTE=)", - false, - "", - }, - - // Missing value for SECONDARY_ENGINE_ATTRIBUTE in Table-level with tablespace option - { - "CREATE TABLE t (id INT) TABLESPACE ts1 SECONDARY_ENGINE_ATTRIBUTE=", - false, - "", - }, - - // Missing value for SECONDARY_ENGINE_ATTRIBUTE at Index-level - { - "CREATE TABLE t (id INT, INDEX idx (id) SECONDARY_ENGINE_ATTRIBUTE=)", - false, - "", - }, - - // Invalid syntax for SECONDARY_ENGINE_ATTRIBUTE at Partition-level - { - "CREATE TABLE t (id INT) PARTITION BY RANGE (id) (" + - "PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE)", - false, - "", - }, - - // Invalid syntax for SECONDARY_ENGINE_ATTRIBUTE at Table-level - { - "CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE", - false, - "", - }, - - // Invalid syntax for SECONDARY_ENGINE_ATTRIBUTE at Column-level - { - "CREATE TABLE t (id INT SECONDARY_ENGINE_ATTRIBUTE)", - false, - "", - }, - - // Invalid syntax for SECONDARY_ENGINE_ATTRIBUTE in Table-level with tablespace option - { - "CREATE TABLE t (id INT) TABLESPACE ts1 SECONDARY_ENGINE_ATTRIBUTE", - false, - "", - }, - - // Invalid syntax for SECONDARY_ENGINE_ATTRIBUTE in Index-level - { - "CREATE TABLE t (id INT, INDEX idx (id) SECONDARY_ENGINE_ATTRIBUTE)", - false, - "", - }, - - // CREATE INDEX syntax for SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE INDEX i ON t (a) SECONDARY_ENGINE_ATTRIBUTE = '{}'", - true, - "CREATE INDEX `i` ON `t` (`a`) SECONDARY_ENGINE_ATTRIBUTE = '{}'", - }, - - // CREATE INDEX syntax for SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE INDEX i ON t (a) SECONDARY_ENGINE_ATTRIBUTE '{}'", - true, - "CREATE INDEX `i` ON `t` (`a`) SECONDARY_ENGINE_ATTRIBUTE = '{}'", - }, - - // Invalid CREATE INDEX syntax for SECONDARY_ENGINE_ATTRIBUTE - { - "CREATE INDEX i ON t (a) SECONDARY_ENGINE_ATTRIBUTE", - false, - "", - }, - } - - RunTest(t, table, false, false) -} - -func TestPartialIndex(t *testing.T) { - cases := []testCase{ - {"create table `t` (`id` int primary key,`col` int,index(`col`) where `col`>100)", true, "CREATE TABLE `t` (`id` INT PRIMARY KEY,`col` INT,INDEX(`col`) WHERE `col`>100)"}, - {"create index `idx` on `t` (`col`) where `col`>100", true, "CREATE INDEX `idx` ON `t` (`col`) WHERE `col`>100"}, - {"alter table `t` add index `idx`(`col`) where `col`>100", true, "ALTER TABLE `t` ADD INDEX `idx`(`col`) WHERE `col`>100"}, - } - RunTest(t, cases, false, false) -} - -func TestTableAffinityOption(t *testing.T) { - table := []testCase{ - // create table with affinity option - {"create table t (a int) AFFINITY = 'table'", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'table'"}, - {"create table t (a int) affinity 'TABLE'", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'TABLE'"}, - {"create table t (a int) affinity 'partition'", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'partition'"}, - {"create table t (a int) AFFINITY = ''", true, "CREATE TABLE `t` (`a` INT) AFFINITY = ''"}, - {"create table t (a int) AFFINITY 'none'", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'none'"}, - {"create table t (a int) AFFINITY 'PARTITION' partition by hash ( a ) PARTITIONS 1", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'PARTITION' PARTITION BY HASH (`a`) PARTITIONS 1"}, - {"create table t (a int) /*T![affinity] AFFINITY = 'table'*/", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'table'"}, - {"create table t (a int) AFFINITY 'abcd'", true, "CREATE TABLE `t` (`a` INT) AFFINITY = 'abcd'"}, - - // alter table with affinity option - {"alter table t AFFINITY = 'table'", true, "ALTER TABLE `t` AFFINITY = 'table'"}, - {"alter table t affinity 'TABLE'", true, "ALTER TABLE `t` AFFINITY = 'TABLE'"}, - {"alter table t /*T![affinity] affinity 'table'*/", true, "ALTER TABLE `t` AFFINITY = 'table'"}, - - // invalid option - {"create table t (a int) AFFINITY 1", false, ""}, - {"create table t (a int) AFFINITY = 1", false, ""}, - {"create table t (a int) AFFINITY", false, ""}, - } - - RunTest(t, table, false, false) -} - -func TestSplitPartition(t *testing.T) { - cases := []testCase{ - {`create table t (id BIGINT, user_id BIGINT, action_type VARCHAR(20), PRIMARY KEY (id), INDEX idx_user_id (user_id)) SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX idx_user_id BETWEEN (1000) AND (100000) REGIONS 3`, true, "CREATE TABLE `t` (`id` BIGINT,`user_id` BIGINT,`action_type` VARCHAR(20),PRIMARY KEY(`id`),INDEX `idx_user_id`(`user_id`)) SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX `idx_user_id` BETWEEN (1000) AND (100000) REGIONS 3"}, - {`alter table t SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4`, true, "ALTER TABLE `t` SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4"}, - {`alter table t SPLIT INDEX ss BETWEEN (0) AND (1000000) REGIONS 3`, true, "ALTER TABLE `t` SPLIT INDEX `ss` BETWEEN (0) AND (1000000) REGIONS 3"}, - {`create table t (id BIGINT) SPLIT BETWEEN (0) AND (1000000) REGIONS 4`, true, "CREATE TABLE `t` (`id` BIGINT) SPLIT BETWEEN (0) AND (1000000) REGIONS 4"}, - {`create table t (id BIGINT, INDEX idx(id)) SPLIT BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX idx BETWEEN (0) AND (1000000) REGIONS 2`, true, "CREATE TABLE `t` (`id` BIGINT,INDEX `idx`(`id`)) SPLIT BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX `idx` BETWEEN (0) AND (1000000) REGIONS 2"}, - {`alter table t SPLIT BETWEEN (0) AND (1000000) REGIONS 3`, true, "ALTER TABLE `t` SPLIT BETWEEN (0) AND (1000000) REGIONS 3"}, - } - RunTest(t, cases, false, false) -} diff --git a/parser/testdata/parser/README.md b/parser/testdata/parser/README.md new file mode 100644 index 0000000..e33a905 --- /dev/null +++ b/parser/testdata/parser/README.md @@ -0,0 +1,25 @@ +# File-driven parser tests + +Each subdirectory is one test group, run as `TestParserData/` (see +`parser/datadriven_test.go`). A group holds two files whose cases are +separated by lines reading exactly `-- case`: + +- `input.sql` — the source SQL for each case. An optional first line + `-- flags: a, b` configures the parser for the whole group; recognized + flags are `window_func`, `mariadb`, and `real_as_float`. +- `output.sql` — one segment per input case. A segment is either the + expected `Restore()` output of the parsed statements (joined by `; ` + for multi-statement sources), or `-- error: ` with the exact + error the parse must fail with. Error messages are part of the parser's + compatibility contract (see CLAUDE.md), so they are matched verbatim. + +Every passing case is also round-tripped: the restored SQL is re-parsed +and the two ASTs must be deep-equal. + +To regenerate all `output.sql` goldens from current parser behavior: + +```sh +go test ./parser -run TestParserData -update +``` + +Review the diff before committing — the goldens are the contract. diff --git a/parser/testdata/parser/admin_stmt/input.sql b/parser/testdata/parser/admin_stmt/input.sql new file mode 100644 index 0000000..515726f --- /dev/null +++ b/parser/testdata/parser/admin_stmt/input.sql @@ -0,0 +1,119 @@ +admin show ddl; +-- case +admin show ddl jobs; +-- case +admin show ddl jobs where id > 0; +-- case +admin show ddl jobs 20 where id=0; +-- case +admin show ddl jobs -1; +-- case +admin show ddl job queries 1 +-- case +admin show ddl job queries 1, 2, 3, 4 +-- case +admin show ddl job queries limit 5 +-- case +admin show ddl job queries limit 5, 10 +-- case +admin show ddl job queries limit 3 offset 2 +-- case +admin show ddl job queries limit 22 offset 0 +-- case +admin show t1 next_row_id +-- case +admin create workload snapshot; +-- case +admin check table t1, t2; +-- case +admin check index tableName idxName; +-- case +admin check index tableName idxName (1, 2), (4, 5); +-- case +admin checksum table t1, t2; +-- case +admin cancel ddl jobs 1 +-- case +admin cancel ddl jobs 1, 2 +-- case +admin pause ddl jobs 1, 3 +-- case +admin pause ddl jobs 5 +-- case +admin pause ddl jobs +-- case +admin pause ddl jobs str_not_num +-- case +admin resume ddl jobs 1, 2 +-- case +admin resume ddl jobs 3 +-- case +admin resume ddl jobs +-- case +admin resume ddl jobs str_not_num +-- case +admin recover index t1 idx_a +-- case +admin cleanup index t1 idx_a +-- case +admin show slow top 3 +-- case +admin show slow top internal 7 +-- case +admin show slow top all 9 +-- case +admin show slow recent 11 +-- case +admin reload expr_pushdown_blacklist +-- case +admin plugins disable audit, whitelist +-- case +admin plugins enable audit, whitelist +-- case +admin flush bindings +-- case +admin capture bindings +-- case +admin evolve bindings +-- case +admin reload bindings +-- case +admin reload cluster bindings +-- case +admin reload statistics +-- case +admin reload stats_extended +-- case +admin flush instance plan_cache +-- case +admin flush session plan_cache +-- case +admin flush global plan_cache +-- case +admin set bdr role primary +-- case +admin set bdr role secondary +-- case +admin unset bdr role +-- case +admin show bdr role +-- case +admin alter ddl jobs 1 thread = 2 +-- case +admin alter ddl jobs 1 thread = +-- case +admin alter ddl jobs 1 thread +-- case +admin alter ddl jobs 1 batch_size = 3 +-- case +admin alter ddl jobs 1 batch_size = +-- case +admin alter ddl jobs 1 batch_size +-- case +admin alter ddl jobs 1 max_write_speed = 4 +-- case +admin alter ddl jobs 1 max_write_speed = _UTF8MB4'4MiB' +-- case +admin alter ddl jobs 1 max_write_speed = +-- case +admin alter ddl jobs 1 max_write_speed diff --git a/parser/testdata/parser/admin_stmt/output.sql b/parser/testdata/parser/admin_stmt/output.sql new file mode 100644 index 0000000..3f016ae --- /dev/null +++ b/parser/testdata/parser/admin_stmt/output.sql @@ -0,0 +1,119 @@ +ADMIN SHOW DDL +-- case +ADMIN SHOW DDL JOBS +-- case +ADMIN SHOW DDL JOBS WHERE `id`>0 +-- case +ADMIN SHOW DDL JOBS 20 WHERE `id`=0 +-- case +-- error: line 1 column 21 near "-1;" +-- case +ADMIN SHOW DDL JOB QUERIES 1 +-- case +ADMIN SHOW DDL JOB QUERIES 1, 2, 3, 4 +-- case +ADMIN SHOW DDL JOB QUERIES LIMIT 0, 5 +-- case +ADMIN SHOW DDL JOB QUERIES LIMIT 5, 10 +-- case +ADMIN SHOW DDL JOB QUERIES LIMIT 2, 3 +-- case +ADMIN SHOW DDL JOB QUERIES LIMIT 0, 22 +-- case +ADMIN SHOW `t1` NEXT_ROW_ID +-- case +ADMIN CREATE WORKLOAD SNAPSHOT +-- case +ADMIN CHECK TABLE `t1`, `t2` +-- case +ADMIN CHECK INDEX `tableName` idxName +-- case +ADMIN CHECK INDEX `tableName` idxName (1,2), (4,5) +-- case +ADMIN CHECKSUM TABLE `t1`, `t2` +-- case +ADMIN CANCEL DDL JOBS 1 +-- case +ADMIN CANCEL DDL JOBS 1, 2 +-- case +ADMIN PAUSE DDL JOBS 1, 3 +-- case +ADMIN PAUSE DDL JOBS 5 +-- case +-- error: line 1 column 20 near "" +-- case +-- error: line 1 column 32 near "str_not_num" +-- case +ADMIN RESUME DDL JOBS 1, 2 +-- case +ADMIN RESUME DDL JOBS 3 +-- case +-- error: line 1 column 21 near "" +-- case +-- error: line 1 column 33 near "str_not_num" +-- case +ADMIN RECOVER INDEX `t1` idx_a +-- case +ADMIN CLEANUP INDEX `t1` idx_a +-- case +ADMIN SHOW SLOW TOP 3 +-- case +ADMIN SHOW SLOW TOP INTERNAL 7 +-- case +ADMIN SHOW SLOW TOP ALL 9 +-- case +ADMIN SHOW SLOW RECENT 11 +-- case +ADMIN RELOAD EXPR_PUSHDOWN_BLACKLIST +-- case +ADMIN PLUGINS DISABLE audit, whitelist +-- case +ADMIN PLUGINS ENABLE audit, whitelist +-- case +ADMIN FLUSH BINDINGS +-- case +ADMIN CAPTURE BINDINGS +-- case +ADMIN EVOLVE BINDINGS +-- case +ADMIN RELOAD BINDINGS +-- case +ADMIN RELOAD CLUSTER BINDINGS +-- case +ADMIN RELOAD STATS_EXTENDED +-- case +ADMIN RELOAD STATS_EXTENDED +-- case +ADMIN FLUSH INSTANCE PLAN_CACHE +-- case +ADMIN FLUSH SESSION PLAN_CACHE +-- case +ADMIN FLUSH GLOBAL PLAN_CACHE +-- case +ADMIN SET BDR ROLE PRIMARY +-- case +ADMIN SET BDR ROLE SECONDARY +-- case +ADMIN UNSET BDR ROLE +-- case +ADMIN SHOW BDR ROLE +-- case +ADMIN ALTER DDL JOBS 1 thread = 2 +-- case +-- error: line 1 column 32 near "" +-- case +-- error: line 1 column 29 near "" +-- case +ADMIN ALTER DDL JOBS 1 batch_size = 3 +-- case +-- error: line 1 column 36 near "" +-- case +-- error: line 1 column 33 near "" +-- case +ADMIN ALTER DDL JOBS 1 max_write_speed = 4 +-- case +ADMIN ALTER DDL JOBS 1 max_write_speed = _UTF8MB4'4MiB' +-- case +-- error: line 1 column 41 near "" +-- case +-- error: line 1 column 38 near "" diff --git a/parser/testdata/parser/analyze/input.sql b/parser/testdata/parser/analyze/input.sql new file mode 100644 index 0000000..b3b2521 --- /dev/null +++ b/parser/testdata/parser/analyze/input.sql @@ -0,0 +1,95 @@ +analyze table t1 +-- case +analyze table t1.* +-- case +analyze table t,t1 +-- case +analyze table t1 index +-- case +analyze table t1 index a +-- case +analyze table t1 index a,b +-- case +analyze table t with 4 buckets +-- case +analyze table t with 4 topn +-- case +analyze table t with 4 cmsketch width +-- case +analyze table t with 4 cmsketch depth +-- case +analyze table t with 4 samples +-- case +analyze table t with 4 buckets, 4 topn, 4 cmsketch width, 4 cmsketch depth, 4 samples +-- case +analyze table t index a with 4 buckets +-- case +analyze table t partition a +-- case +analyze table t partition a with 4 buckets +-- case +analyze table t partition a index b +-- case +analyze table t partition a index b with 4 buckets +-- case +analyze incremental table t index +-- case +analyze incremental table t index idx +-- case +analyze table t update histogram on b with 1024 buckets +-- case +analyze table t drop histogram on b +-- case +analyze table t update histogram on c1, c2; +-- case +analyze table t drop histogram on c1, c2; +-- case +analyze table t update histogram on t.c1, t.c2 +-- case +analyze table t drop histogram on t.c1, t.c2 +-- case +analyze table t1,t2 all columns +-- case +analyze table t partition a all columns +-- case +analyze table t1,t2 all columns with 4 topn +-- case +analyze table t partition a all columns with 1024 buckets +-- case +analyze table t1,t2 predicate columns +-- case +analyze table t partition a predicate columns +-- case +analyze table t1,t2 predicate columns with 4 topn +-- case +analyze table t partition a predicate columns with 1024 buckets +-- case +analyze table t columns c1,c2 +-- case +analyze table t partition a columns c1,c2 +-- case +analyze table t columns t.c1,t.c2 +-- case +analyze table t partition a columns t.c1,t.c2 +-- case +analyze table t columns c1,c2 with 4 topn +-- case +analyze table t partition a columns c1,c2 with 1024 buckets +-- case +analyze table t index a columns c +-- case +analyze table t index a all columns +-- case +analyze table t index a predicate columns +-- case +analyze table t with 10 samplerate +-- case +analyze table t with 0.1 samplerate +-- case +analyze table t with 0.05 ndvrate +-- case +analyze table t with 0.05 ndvrate 0.00001 samplerate +-- case +analyze no_write_to_binlog table t1 +-- case +analyze local table t,t1 diff --git a/parser/testdata/parser/analyze/output.sql b/parser/testdata/parser/analyze/output.sql new file mode 100644 index 0000000..1bc8c39 --- /dev/null +++ b/parser/testdata/parser/analyze/output.sql @@ -0,0 +1,95 @@ +ANALYZE TABLE `t1` +-- case +-- error: line 1 column 18 near "*" +-- case +ANALYZE TABLE `t`,`t1` +-- case +ANALYZE TABLE `t1` INDEX +-- case +ANALYZE TABLE `t1` INDEX `a` +-- case +ANALYZE TABLE `t1` INDEX `a`,`b` +-- case +ANALYZE TABLE `t` WITH 4 BUCKETS +-- case +ANALYZE TABLE `t` WITH 4 TOPN +-- case +ANALYZE TABLE `t` WITH 4 CMSKETCH WIDTH +-- case +ANALYZE TABLE `t` WITH 4 CMSKETCH DEPTH +-- case +ANALYZE TABLE `t` WITH 4 SAMPLES +-- case +ANALYZE TABLE `t` WITH 4 BUCKETS, 4 TOPN, 4 CMSKETCH WIDTH, 4 CMSKETCH DEPTH, 4 SAMPLES +-- case +ANALYZE TABLE `t` INDEX `a` WITH 4 BUCKETS +-- case +ANALYZE TABLE `t` PARTITION `a` +-- case +ANALYZE TABLE `t` PARTITION `a` WITH 4 BUCKETS +-- case +ANALYZE TABLE `t` PARTITION `a` INDEX `b` +-- case +ANALYZE TABLE `t` PARTITION `a` INDEX `b` WITH 4 BUCKETS +-- case +ANALYZE INCREMENTAL TABLE `t` INDEX +-- case +ANALYZE INCREMENTAL TABLE `t` INDEX `idx` +-- case +ANALYZE TABLE `t` UPDATE HISTOGRAM ON `b` WITH 1024 BUCKETS +-- case +ANALYZE TABLE `t` DROP HISTOGRAM ON `b` +-- case +ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c1`,`c2` +-- case +ANALYZE TABLE `t` DROP HISTOGRAM ON `c1`,`c2` +-- case +-- error: line 1 column 38 near ".c1, t.c2" +-- case +-- error: line 1 column 36 near ".c1, t.c2" +-- case +ANALYZE TABLE `t1`,`t2` ALL COLUMNS +-- case +ANALYZE TABLE `t` PARTITION `a` ALL COLUMNS +-- case +ANALYZE TABLE `t1`,`t2` ALL COLUMNS WITH 4 TOPN +-- case +ANALYZE TABLE `t` PARTITION `a` ALL COLUMNS WITH 1024 BUCKETS +-- case +ANALYZE TABLE `t1`,`t2` PREDICATE COLUMNS +-- case +ANALYZE TABLE `t` PARTITION `a` PREDICATE COLUMNS +-- case +ANALYZE TABLE `t1`,`t2` PREDICATE COLUMNS WITH 4 TOPN +-- case +ANALYZE TABLE `t` PARTITION `a` PREDICATE COLUMNS WITH 1024 BUCKETS +-- case +ANALYZE TABLE `t` COLUMNS `c1`,`c2` +-- case +ANALYZE TABLE `t` PARTITION `a` COLUMNS `c1`,`c2` +-- case +-- error: line 1 column 26 near ".c1,t.c2" +-- case +-- error: line 1 column 38 near ".c1,t.c2" +-- case +ANALYZE TABLE `t` COLUMNS `c1`,`c2` WITH 4 TOPN +-- case +ANALYZE TABLE `t` PARTITION `a` COLUMNS `c1`,`c2` WITH 1024 BUCKETS +-- case +-- error: line 1 column 31 near "columns c" +-- case +-- error: line 1 column 27 near "all columns" +-- case +-- error: line 1 column 33 near "predicate columns" +-- case +ANALYZE TABLE `t` WITH 10 SAMPLERATE +-- case +ANALYZE TABLE `t` WITH 0.1 SAMPLERATE +-- case +ANALYZE TABLE `t` WITH 0.05 NDVRATE +-- case +ANALYZE TABLE `t` WITH 0.05 NDVRATE, 0.00001 SAMPLERATE +-- case +ANALYZE NO_WRITE_TO_BINLOG TABLE `t1` +-- case +ANALYZE NO_WRITE_TO_BINLOG TABLE `t`,`t1` diff --git a/parser/testdata/parser/as_of_clause/input.sql b/parser/testdata/parser/as_of_clause/input.sql new file mode 100644 index 0000000..0556b70 --- /dev/null +++ b/parser/testdata/parser/as_of_clause/input.sql @@ -0,0 +1,19 @@ +SELECT * FROM `t` AS /* comment */ a; +-- case +SELECT * FROM `t` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()); +-- case +select * from `t` as of timestamp '2021-04-15 00:00:00' +-- case +SELECT * FROM (`a` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())) JOIN `b` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()); +-- case +INSERT INTO `employees` (SELECT * FROM `employees` AS OF TIMESTAMP (DATE_SUB(NOW(), INTERVAL _UTF8MB4'60' MINUTE)) NOT IN (SELECT * FROM `employees`)) +-- case +SET TRANSACTION READ ONLY as of timestamp '2021-04-21 00:42:12' +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP '2015-09-21 00:07:01' +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', '2021-04-27 11:26:13') diff --git a/parser/testdata/parser/as_of_clause/output.sql b/parser/testdata/parser/as_of_clause/output.sql new file mode 100644 index 0000000..c79cdf7 --- /dev/null +++ b/parser/testdata/parser/as_of_clause/output.sql @@ -0,0 +1,19 @@ +SELECT * FROM `t` AS `a` +-- case +SELECT * FROM `t` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +SELECT * FROM `t` AS OF TIMESTAMP _UTF8MB4'2021-04-15 00:00:00' +-- case +SELECT * FROM (`a` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())) JOIN `b` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +INSERT INTO `employees` (SELECT * FROM `employees` AS OF TIMESTAMP (DATE_SUB(NOW(), INTERVAL _UTF8MB4'60' MINUTE)) NOT IN (SELECT * FROM `employees`)) +-- case +SET @@SESSION.`tx_read_ts`=_UTF8MB4'2021-04-21 00:42:12' +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP _UTF8MB4'2015-09-21 00:07:01' +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13') diff --git a/parser/testdata/parser/binding/input.sql b/parser/testdata/parser/binding/input.sql new file mode 100644 index 0000000..859b2ce --- /dev/null +++ b/parser/testdata/parser/binding/input.sql @@ -0,0 +1,139 @@ +create global binding for select * from t using select * from t use index(a) +-- case +create session binding for select * from t using select * from t use index(a) +-- case +drop global binding for select * from t +-- case +drop session binding for select * from t +-- case +drop global binding for select * from t using select * from t use index(a) +-- case +drop session binding for select * from t using select * from t use index(a) +-- case +show global bindings +-- case +show session bindings +-- case +set binding enabled for select * from t +-- case +set binding enabled for select * from t using select * from t use index(a) +-- case +set binding disabled for select * from t +-- case +set binding disabled for select * from t using select * from t use index(a) +-- case +create global binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a) +-- case +create session binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a) +-- case +drop global binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a) +-- case +drop session binding for select * from t union all select * from t using select * from t use index(a) union all select * from t use index(a) +-- case +drop global binding for select * from t union all select * from t +-- case +create session binding for select 1 union select 2 intersect select 3 using select 1 union select 2 intersect select 3 +-- case +drop session binding for select 1 union select 2 intersect select 3 using select 1 union select 2 intersect select 3 +-- case +drop session binding for select 1 union select 2 intersect select 3 +-- case +create global binding using select * from *.t1 +-- case +create global binding using select * from *.t1 where t1.a > (select max(a) from t2) +-- case +create session binding using select * from *.t1 +-- case +create binding using select * from *.t1 +-- case +CREATE GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +CREATE SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +drop global binding for update t set a = 1 where b = 1 +-- case +drop session binding for update t set a = 1 where b = 1 +-- case +DROP GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +DROP SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +CREATE GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +CREATE SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +CREATE GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +CREATE SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +drop global binding for delete from t where a = 1 +-- case +drop session binding for delete from t where a = 1 +-- case +DROP GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +DROP SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +CREATE GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +CREATE SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +drop global binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.a = 1 +-- case +drop session binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.a = 1 +-- case +DROP GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +DROP SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +CREATE GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +CREATE SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +drop global binding for insert into t1 select * from t2 where t1.a=1 +-- case +drop session binding for insert into t1 select * from t2 where t1.a=1 +-- case +DROP GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +CREATE GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +CREATE SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +drop global binding for replace into t1 select * from t2 where t1.a=1 +-- case +drop session binding for replace into t1 select * from t2 where t1.a=1 +-- case +DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP SESSION BINDING FOR SQL DIGEST 'a' +-- case +drop global binding for sql digest 's' +-- case +drop global binding for sql digest @a, @b, 'test1,test2', @c, 'test333' +-- case +create session binding from history using plan digest 'sss' +-- case +create session binding from history using plan digest @a, @b, 'test1,test2', @c, 'test333' +-- case +CREATE GLOBAL BINDING FROM HISTORY USING PLAN DIGEST 'sss' +-- case +set binding enabled for sql digest '1' +-- case +set binding disabled for sql digest '1' +-- case +explain explore 'select a from t' +-- case +explain explore '23adc8e6f62' diff --git a/parser/testdata/parser/binding/output.sql b/parser/testdata/parser/binding/output.sql new file mode 100644 index 0000000..28ad019 --- /dev/null +++ b/parser/testdata/parser/binding/output.sql @@ -0,0 +1,139 @@ +CREATE GLOBAL BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) +-- case +CREATE SESSION BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) +-- case +DROP GLOBAL BINDING FOR SELECT * FROM `t` +-- case +DROP SESSION BINDING FOR SELECT * FROM `t` +-- case +DROP GLOBAL BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) +-- case +DROP SESSION BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) +-- case +SHOW GLOBAL BINDINGS +-- case +SHOW SESSION BINDINGS +-- case +SET BINDING ENABLED FOR SELECT * FROM `t` +-- case +SET BINDING ENABLED FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) +-- case +SET BINDING DISABLED FOR SELECT * FROM `t` +-- case +SET BINDING DISABLED FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) +-- case +CREATE GLOBAL BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`) +-- case +CREATE SESSION BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`) +-- case +DROP GLOBAL BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`) +-- case +DROP SESSION BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`) UNION ALL SELECT * FROM `t` USE INDEX (`a`) +-- case +DROP GLOBAL BINDING FOR SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 USING SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 +-- case +DROP SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 USING SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 +-- case +DROP SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 +-- case +CREATE GLOBAL BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1` +-- case +CREATE GLOBAL BINDING FOR SELECT * FROM `*`.`t1` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`) USING SELECT * FROM `*`.`t1` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`) +-- case +CREATE SESSION BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1` +-- case +CREATE SESSION BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1` +-- case +CREATE GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +CREATE SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +DROP GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 +-- case +DROP SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 +-- case +DROP GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +DROP SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1 +-- case +CREATE GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +CREATE SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP GLOBAL BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +DROP SESSION BINDING FOR UPDATE `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` USING UPDATE /*+ INL_JOIN(`t1`)*/ `t1` JOIN `t2` SET `t1`.`a`=1 WHERE `t1`.`b`=`t2`.`b` +-- case +CREATE GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +CREATE SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +DROP GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 +-- case +DROP SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 +-- case +DROP GLOBAL BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +DROP SESSION BINDING FOR DELETE FROM `t` WHERE `a`=1 USING DELETE /*+ USE_INDEX(`t` `a`)*/ FROM `t` WHERE `a`=1 +-- case +CREATE GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +CREATE SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +DROP GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +DROP SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +DROP GLOBAL BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +DROP SESSION BINDING FOR DELETE `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 USING DELETE /*+ HASH_JOIN(`t1`, `t2`)*/ `t1`,`t2` FROM `t1` JOIN `t2` ON `t1`.`b`=`t2`.`b` WHERE `t1`.`a`=1 +-- case +CREATE GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +CREATE SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1 +-- case +DROP SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1 +-- case +DROP GLOBAL BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP SESSION BINDING FOR INSERT INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING INSERT INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +CREATE GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +CREATE SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1 +-- case +DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t1`.`a`=1 +-- case +DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1 +-- case +DROP SESSION BINDING FOR SQL DIGEST 'a' +-- case +DROP GLOBAL BINDING FOR SQL DIGEST 's' +-- case +DROP GLOBAL BINDING FOR SQL DIGEST @`a`, @`b`, 'test1,test2', @`c`, 'test333' +-- case +CREATE SESSION BINDING FROM HISTORY USING PLAN DIGEST 'sss' +-- case +CREATE SESSION BINDING FROM HISTORY USING PLAN DIGEST @`a`, @`b`, 'test1,test2', @`c`, 'test333' +-- case +CREATE GLOBAL BINDING FROM HISTORY USING PLAN DIGEST 'sss' +-- case +SET BINDING ENABLED FOR SQL DIGEST '1' +-- case +SET BINDING DISABLED FOR SQL DIGEST '1' +-- case +EXPLAIN EXPLORE 'select a from t' +-- case +EXPLAIN EXPLORE '23adc8e6f62' diff --git a/parser/testdata/parser/brie/input.sql b/parser/testdata/parser/brie/input.sql new file mode 100644 index 0000000..733fe5e --- /dev/null +++ b/parser/testdata/parser/brie/input.sql @@ -0,0 +1,85 @@ +BACKUP DATABASE a TO 'local:///tmp/archive01/' +-- case +BACKUP SCHEMA a TO 'local:///tmp/archive01/' +-- case +BACKUP DATABASE a,b,c TO 'noop://' +-- case +BACKUP DATABASE a.b TO 'noop://' +-- case +BACKUP DATABASE * TO 'noop://' +-- case +BACKUP DATABASE *, a TO 'noop://' +-- case +BACKUP DATABASE a, * TO 'noop://' +-- case +BACKUP DATABASE TO 'noop://' +-- case +BACKUP TABLE a TO 'noop://' checksum_concurrency 4 compression_level 4 ignore_stats 1 compression_type 'lz4' +-- case +RESTORE TABLE a FROM 'noop://' checksum_concurrency 4 wait_tiflash_ready 1 with_sys_table 1 +-- case +BACKUP TABLE a.b TO 'noop://' +-- case +BACKUP TABLE a.b,c.d,e TO 'noop://' +-- case +BACKUP TABLE a.* TO 'noop://' +-- case +BACKUP TABLE * TO 'noop://' +-- case +BACKUP TABLE TO 'noop://' +-- case +RESTORE DATABASE * FROM 's3://bucket/path/' +-- case +BACKUP DATABASE * TO 'noop://' LAST_BACKUP = '2020-02-02 14:14:14' +-- case +BACKUP DATABASE * TO 'noop://' LAST_BACKUP = 1234567890 +-- case +backup database * to 'noop://' rate_limit 500 MB/second snapshot 5 minute ago +-- case +backup database * to 'noop://' snapshot = '2020-03-18 18:13:54' +-- case +backup database * to 'noop://' snapshot = 1234567890 +-- case +restore table g from 'noop://' concurrency 40 checksum 0 online 1 +-- case +backup table x to 's3://bucket/path/?endpoint=https://test-cluster-s3.local&access-key=aaaaaaaaa&secret-access-key=bbbbbbbb&force-path-style=1' +-- case +backup database * to 's3://bucket/path/?provider=alibaba®ion=us-west-9&storage-class=glacier&sse=AES256&acl=authenticated-read&use-accelerate-endpoint=1' send_credentials_to_tikv = 1 +-- case +restore database * from 'gcs://bucket/path/?endpoint=https://test-cluster.gcs.local&storage-class=coldline&predefined-acl=OWNER&credentials-file=/data/private/creds.json' +-- case +restore table g from 'noop://' checksum off +-- case +restore table g from 'noop://' checksum optional +-- case +backup logs to 'noop://' +-- case +backup logs to 'noop://' start_ts='20220304' +-- case +pause backup logs +-- case +pause backup logs gc_ttl='20220304' +-- case +resume backup logs +-- case +show backup logs status +-- case +show backup logs metadata from 'noop://' +-- case +show br job 1234 +-- case +show br job query 1234 +-- case +cancel br job 1234 +-- case +purge backup logs from 'noop://' +-- case +purge backup logs from 'noop://' until_ts='2012122304' +-- case +restore point from 'noop://log_backup' +-- case +restore point from 'noop://log_backup' full_backup_storage='noop://full_log' +-- case +restore point from 'noop://log_backup' full_backup_storage='noop://full_log' restored_ts='20230123' +-- case +restore point from 'noop://log_backup' full_backup_storage='noop://full_log' start_ts='20230101' restored_ts='20230123' diff --git a/parser/testdata/parser/brie/output.sql b/parser/testdata/parser/brie/output.sql new file mode 100644 index 0000000..8a5385d --- /dev/null +++ b/parser/testdata/parser/brie/output.sql @@ -0,0 +1,85 @@ +BACKUP DATABASE `a` TO 'local:///tmp/archive01/' +-- case +BACKUP DATABASE `a` TO 'local:///tmp/archive01/' +-- case +BACKUP DATABASE `a`, `b`, `c` TO 'noop://' +-- case +-- error: line 1 column 18 near ".b TO 'noop://'" +-- case +BACKUP DATABASE * TO 'noop://' +-- case +-- error: line 1 column 18 near ", a TO 'noop://'" +-- case +-- error: line 1 column 20 near "* TO 'noop://'" +-- case +-- error: line 1 column 18 near "TO 'noop://'" +-- case +BACKUP TABLE `a` TO 'noop://' CHECKSUM_CONCURRENCY = 4 COMPRESSION_LEVEL = 4 IGNORE_STATS = 1 COMPRESSION_TYPE = 'lz4' +-- case +RESTORE TABLE `a` FROM 'noop://' CHECKSUM_CONCURRENCY = 4 WAIT_TIFLASH_READY = 1 WITH_SYS_TABLE = 1 +-- case +BACKUP TABLE `a`.`b` TO 'noop://' +-- case +BACKUP TABLE `a`.`b`, `c`.`d`, `e` TO 'noop://' +-- case +-- error: line 1 column 16 near "* TO 'noop://'" +-- case +-- error: line 1 column 17 near "TO 'noop://'" +-- case +-- error: line 1 column 15 near "TO 'noop://'" +-- case +RESTORE DATABASE * FROM 's3://bucket/path/' +-- case +BACKUP DATABASE * TO 'noop://' LAST_BACKUP = '2020-02-02 14:14:14' +-- case +BACKUP DATABASE * TO 'noop://' LAST_BACKUP = 1234567890 +-- case +BACKUP DATABASE * TO 'noop://' RATE_LIMIT = 500 MB/SECOND SNAPSHOT = 300000000 MICROSECOND AGO +-- case +BACKUP DATABASE * TO 'noop://' SNAPSHOT = '2020-03-18 18:13:54' +-- case +BACKUP DATABASE * TO 'noop://' SNAPSHOT = 1234567890 +-- case +RESTORE TABLE `g` FROM 'noop://' CONCURRENCY = 40 CHECKSUM = OFF ONLINE = 1 +-- case +BACKUP TABLE `x` TO 's3://bucket/path/?endpoint=https://test-cluster-s3.local&access-key=aaaaaaaaa&secret-access-key=bbbbbbbb&force-path-style=1' +-- case +BACKUP DATABASE * TO 's3://bucket/path/?provider=alibaba®ion=us-west-9&storage-class=glacier&sse=AES256&acl=authenticated-read&use-accelerate-endpoint=1' SEND_CREDENTIALS_TO_TIKV = 1 +-- case +RESTORE DATABASE * FROM 'gcs://bucket/path/?endpoint=https://test-cluster.gcs.local&storage-class=coldline&predefined-acl=OWNER&credentials-file=/data/private/creds.json' +-- case +RESTORE TABLE `g` FROM 'noop://' CHECKSUM = OFF +-- case +RESTORE TABLE `g` FROM 'noop://' CHECKSUM = OPTIONAL +-- case +BACKUP LOGS TO 'noop://' +-- case +BACKUP LOGS TO 'noop://' START_TS = '20220304' +-- case +PAUSE BACKUP LOGS +-- case +PAUSE BACKUP LOGS GC_TTL = '20220304' +-- case +RESUME BACKUP LOGS +-- case +SHOW BACKUP LOGS STATUS +-- case +SHOW BACKUP LOGS METADATA FROM 'noop://' +-- case +SHOW BR JOB 1234 +-- case +SHOW BR JOB QUERY 1234 +-- case +CANCEL BR JOB 1234 +-- case +PURGE BACKUP LOGS FROM 'noop://' +-- case +PURGE BACKUP LOGS FROM 'noop://' UNTIL_TS = '2012122304' +-- case +RESTORE POINT FROM 'noop://log_backup' +-- case +RESTORE POINT FROM 'noop://log_backup' FULL_BACKUP_STORAGE = 'noop://full_log' +-- case +RESTORE POINT FROM 'noop://log_backup' FULL_BACKUP_STORAGE = 'noop://full_log' RESTORED_TS = '20230123' +-- case +RESTORE POINT FROM 'noop://log_backup' FULL_BACKUP_STORAGE = 'noop://full_log' START_TS = '20230101' RESTORED_TS = '20230123' diff --git a/parser/testdata/parser/builtin/input.sql b/parser/testdata/parser/builtin/input.sql new file mode 100644 index 0000000..c4e56d9 --- /dev/null +++ b/parser/testdata/parser/builtin/input.sql @@ -0,0 +1,1221 @@ +SELECT POW(1, 2) +-- case +SELECT POW(1, 2, 1) +-- case +SELECT POW(1, 0.5) +-- case +SELECT POW(1, -1) +-- case +SELECT POW(-1, 1) +-- case +SELECT RAND(); +-- case +SELECT RAND(1); +-- case +SELECT MOD(10, 2); +-- case +SELECT ROUND(-1.23); +-- case +SELECT ROUND(1.23, 1); +-- case +SELECT ROUND(1.23, 1, 1); +-- case +SELECT CEIL(-1.23); +-- case +SELECT CEILING(1.23); +-- case +SELECT FLOOR(-1.23); +-- case +SELECT LN(1); +-- case +SELECT LN(1, 2); +-- case +SELECT LOG(-2); +-- case +SELECT LOG(2, 65536); +-- case +SELECT LOG(2, 65536, 1); +-- case +SELECT LOG2(2); +-- case +SELECT LOG2(2, 2); +-- case +SELECT LOG10(10); +-- case +SELECT LOG10(10, 1); +-- case +SELECT ABS(10, 1); +-- case +SELECT ABS(10); +-- case +SELECT ABS(); +-- case +SELECT CONV(10+'10'+'10'+X'0a',10,10); +-- case +SELECT CONV(); +-- case +SELECT CRC32('MySQL'); +-- case +SELECT CRC32(); +-- case +SELECT SIGN(); +-- case +SELECT SIGN(0); +-- case +SELECT SQRT(0); +-- case +SELECT SQRT(); +-- case +SELECT ACOS(); +-- case +SELECT ACOS(1); +-- case +SELECT ACOS(1, 2); +-- case +SELECT ASIN(); +-- case +SELECT ASIN(1); +-- case +SELECT ASIN(1, 2); +-- case +SELECT ATAN(0), ATAN(1), ATAN(1, 2); +-- case +SELECT ATAN2(), ATAN2(1,2); +-- case +SELECT COS(0); +-- case +SELECT COS(1); +-- case +SELECT COS(1, 2); +-- case +SELECT COT(); +-- case +SELECT COT(1); +-- case +SELECT COT(1, 2); +-- case +SELECT DEGREES(); +-- case +SELECT DEGREES(0); +-- case +SELECT EXP(); +-- case +SELECT EXP(1); +-- case +SELECT PI(); +-- case +SELECT PI(1); +-- case +SELECT RADIANS(); +-- case +SELECT RADIANS(1); +-- case +SELECT SIN(); +-- case +SELECT SIN(1); +-- case +SELECT TAN(1); +-- case +SELECT TAN(); +-- case +SELECT TRUNCATE(1.223,1); +-- case +SELECT TRUNCATE(); +-- case +SELECT SUBSTR('Quadratically',5); +-- case +SELECT SUBSTR('Quadratically',5, 3); +-- case +SELECT SUBSTR('Quadratically' FROM 5); +-- case +SELECT SUBSTR('Quadratically' FROM 5 FOR 3); +-- case +SELECT SUBSTRING('Quadratically',5); +-- case +SELECT SUBSTRING('Quadratically',5, 3); +-- case +SELECT SUBSTRING('Quadratically' FROM 5); +-- case +SELECT SUBSTRING('Quadratically' FROM 5 FOR 3); +-- case +SELECT CONVERT('111', SIGNED); +-- case +SELECT LEAST(), LEAST(1, 2, 3); +-- case +SELECT INTERVAL(1, 0, 1, 2) +-- case +SELECT (INTERVAL(1, 0, 1, 2)+5)*7+INTERVAL(1, 0, 1, 2)/2 +-- case +SELECT INTERVAL(0, (1*5)/2)+INTERVAL(5, 4, 3) +-- case +SELECT DATE_ADD('2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY); +-- case +SELECT DATABASE(); +-- case +SELECT SCHEMA(); +-- case +SELECT USER(); +-- case +SELECT USER(1); +-- case +SELECT CURRENT_USER(); +-- case +SELECT CURRENT_ROLE(); +-- case +SELECT CURRENT_USER; +-- case +SELECT CONNECTION_ID(); +-- case +SELECT VERSION(); +-- case +SELECT CURRENT_RESOURCE_GROUP(); +-- case +SELECT BENCHMARK(1000000, AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3'))); +-- case +SELECT BENCHMARK(AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3'))); +-- case +SELECT CHARSET('abc'); +-- case +SELECT COERCIBILITY('abc'); +-- case +SELECT COERCIBILITY('abc', 'a'); +-- case +SELECT COLLATION('abc'); +-- case +SELECT ROW_COUNT(); +-- case +SELECT SESSION_USER(); +-- case +SELECT SYSTEM_USER(); +-- case +SELECT FORMAT_BYTES(512); +-- case +SELECT FORMAT_NANO_TIME(3501); +-- case +SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); +-- case +SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); +-- case +SELECT ASCII(), ASCII(""), ASCII("A"), ASCII(1); +-- case +SELECT LOWER("A"), UPPER("a") +-- case +SELECT LCASE("A"), UCASE("a") +-- case +SELECT REPLACE('www.mysql.com', 'w', 'Ww') +-- case +SELECT LOCATE('bar', 'foobarbar'); +-- case +SELECT LOCATE('bar', 'foobarbar', 5); +-- case +SELECT tidb_version(); +-- case +SELECT tidb_is_ddl_owner(); +-- case +SELECT tidb_decode_plan(); +-- case +SELECT tidb_decode_key('abc'); +-- case +SELECT tidb_decode_base64_key('abc'); +-- case +SELECT tidb_decode_sql_digests('[]'); +-- case +CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) ); +-- case +select row(1) +-- case +select row(1, 1,) +-- case +select (1, 1,) +-- case +select row(1, 1) > row(1, 1), row(1, 1, 1) > row(1, 1, 1) +-- case +Select (1, 1) > (1, 1) +-- case +create table t (`row` int) +-- case +create table t (row int) +-- case +SELECT *, CAST(data AS CHAR CHARACTER SET utf8) FROM t; +-- case +SELECT CAST(data AS CHARACTER); +-- case +SELECT CAST(data AS CHARACTER(10) CHARACTER SET utf8); +-- case +SELECT CAST(data AS BINARY) +-- case +SELECT *, CAST(data AS JSON) FROM t; +-- case +SELECT *, JSON_SUM_CRC32(data AS UNSIGNED ARRAY) FROM t; +-- case +SELECT *, JSON_SUM_CRC32(data AS DOUBLE ARRAY) FROM t; +-- case +SELECT *, JSON_SUM_CRC32(data AS DOUBLE) FROM t; +-- case +SELECT *, JSON_SUM_CRC32(data) FROM t; +-- case +select cast(1 as signed int); +-- case +select cast(1 as double); +-- case +select cast(1 as float); +-- case +select cast(1 as float(0)); +-- case +select cast(1 as float(24)); +-- case +select cast(1 as float(25)); +-- case +select cast(1 as float(53)); +-- case +select cast(1 as float(54)); +-- case +select cast(1 as real); +-- case +select cast('2000' as year); +-- case +select cast(time '2000' as year); +-- case +select cast(b as signed array); +-- case +select cast(b as char(10) array); +-- case +SELECT last_insert_id(); +-- case +SELECT last_insert_id(1); +-- case +SELECT binary 'a'; +-- case +SELECT BIT_COUNT(1); +-- case +select current_timestamp +-- case +select current_timestamp() +-- case +select current_timestamp(6) +-- case +select current_timestamp(null) +-- case +select current_timestamp(-1) +-- case +select current_timestamp(1.0) +-- case +select current_timestamp('2') +-- case +select now() +-- case +select now(6) +-- case +select sysdate(), sysdate(6) +-- case +SELECT time('01:02:03'); +-- case +SELECT time('01:02:03.1') +-- case +SELECT time('20.1') +-- case +SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001'); +-- case +SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); +-- case +SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); +-- case +SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55'); +-- case +select current_time +-- case +select current_time() +-- case +select current_time(6) +-- case +select current_time(-1) +-- case +select current_time(1.0) +-- case +select current_time('1') +-- case +select current_time(null) +-- case +select curtime() +-- case +select curtime(6) +-- case +select curtime(-1) +-- case +select curtime(1.0) +-- case +select curtime('1') +-- case +select curtime(null) +-- case +select utc_timestamp +-- case +select utc_timestamp() +-- case +select utc_timestamp(6) +-- case +select utc_timestamp(-1) +-- case +select utc_timestamp(1.0) +-- case +select utc_timestamp('1') +-- case +select utc_timestamp(null) +-- case +select utc_time +-- case +select utc_time() +-- case +select utc_time(6) +-- case +select utc_time(-1) +-- case +select utc_time(1.0) +-- case +select utc_time('1') +-- case +select utc_time(null) +-- case +SELECT MICROSECOND('2009-12-31 23:59:59.000010'); +-- case +SELECT SECOND('10:05:03'); +-- case +SELECT MINUTE('2008-02-03 10:05:03'); +-- case +SELECT HOUR(), HOUR('10:05:03'); +-- case +SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE() +-- case +SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE(1) +-- case +SELECT DATEDIFF('2003-12-31', '2003-12-30'); +-- case +SELECT DATE('2003-12-31 01:02:03'); +-- case +SELECT DATE(); +-- case +SELECT DATE('2003-12-31 01:02:03', ''); +-- case +SELECT DATE_FORMAT('2003-12-31 01:02:03', '%W %M %Y'); +-- case +SELECT DAY('2007-02-03'); +-- case +SELECT DAYOFMONTH('2007-02-03'); +-- case +SELECT DAYOFWEEK('2007-02-03'); +-- case +SELECT DAYOFYEAR('2007-02-03'); +-- case +SELECT DAYNAME('2007-02-03'); +-- case +SELECT FROM_DAYS(1423); +-- case +SELECT WEEKDAY('2007-02-03'); +-- case +SELECT UTC_DATE, UTC_DATE(); +-- case +SELECT UTC_DATE(), UTC_DATE()+0 +-- case +SELECT WEEK(); +-- case +SELECT WEEK('2007-02-03'); +-- case +SELECT WEEK('2007-02-03', 0); +-- case +SELECT WEEKOFYEAR('2007-02-03'); +-- case +SELECT MONTH('2007-02-03'); +-- case +SELECT MONTHNAME('2007-02-03'); +-- case +SELECT YEAR('2007-02-03'); +-- case +SELECT YEARWEEK('2007-02-03'); +-- case +SELECT YEARWEEK('2007-02-03', 0); +-- case +SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); +-- case +SELECT ADDTIME('02:00:00.999998'); +-- case +SELECT ADDTIME(); +-- case +SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); +-- case +SELECT CONVERT_TZ(); +-- case +SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); +-- case +SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00', '+10:00'); +-- case +SELECT GET_FORMAT(DATE, 'USA'); +-- case +SELECT GET_FORMAT(DATETIME, 'USA'); +-- case +SELECT GET_FORMAT(TIME, 'USA'); +-- case +SELECT GET_FORMAT(TIMESTAMP, 'USA'); +-- case +SELECT LOCALTIME(), LOCALTIME(1) +-- case +SELECT LOCALTIMESTAMP(), LOCALTIMESTAMP(2) +-- case +SELECT MAKEDATE(2011,31); +-- case +SELECT MAKETIME(12,15,30); +-- case +SELECT MAKEDATE(); +-- case +SELECT MAKETIME(); +-- case +SELECT PERIOD_ADD(200801,2) +-- case +SELECT PERIOD_DIFF(200802,200703) +-- case +SELECT QUARTER('2008-04-01'); +-- case +SELECT SEC_TO_TIME(2378) +-- case +SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l') +-- case +SELECT TIME_TO_SEC('22:23:00') +-- case +SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_SECOND,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_MINUTE,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_HOUR,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_DAY,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_WEEK,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_MONTH,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_QUARTER,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_YEAR,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(SQL_TSI_MICROSECOND,1,'2003-01-02'); +-- case +SELECT TIMESTAMPADD(MICROSECOND,1,'2003-01-02'); +-- case +SELECT TO_DAYS('2007-10-07') +-- case +SELECT TO_SECONDS('2009-11-29') +-- case +SELECT LAST_DAY('2003-02-05'); +-- case +SELECT UTC_TIME(), UTC_TIME(1) +-- case +select extract(microsecond from "2011-11-11 10:10:10.123456") +-- case +select extract(second from "2011-11-11 10:10:10.123456") +-- case +select extract(minute from "2011-11-11 10:10:10.123456") +-- case +select extract(hour from "2011-11-11 10:10:10.123456") +-- case +select extract(day from "2011-11-11 10:10:10.123456") +-- case +select extract(week from "2011-11-11 10:10:10.123456") +-- case +select extract(month from "2011-11-11 10:10:10.123456") +-- case +select extract(quarter from "2011-11-11 10:10:10.123456") +-- case +select extract(year from "2011-11-11 10:10:10.123456") +-- case +select extract(second_microsecond from "2011-11-11 10:10:10.123456") +-- case +select extract(minute_microsecond from "2011-11-11 10:10:10.123456") +-- case +select extract(minute_second from "2011-11-11 10:10:10.123456") +-- case +select extract(hour_microsecond from "2011-11-11 10:10:10.123456") +-- case +select extract(hour_second from "2011-11-11 10:10:10.123456") +-- case +select extract(hour_minute from "2011-11-11 10:10:10.123456") +-- case +select extract(day_microsecond from "2011-11-11 10:10:10.123456") +-- case +select extract(day_second from "2011-11-11 10:10:10.123456") +-- case +select extract(day_minute from "2011-11-11 10:10:10.123456") +-- case +select extract(day_hour from "2011-11-11 10:10:10.123456") +-- case +select extract(year_month from "2011-11-11 10:10:10.123456") +-- case +select from_unixtime(1447430881) +-- case +select from_unixtime(1447430881.123456) +-- case +select from_unixtime(1447430881.1234567) +-- case +select from_unixtime(1447430881.9999999) +-- case +select from_unixtime(1447430881, "%Y %D %M %h:%i:%s %x") +-- case +select from_unixtime(1447430881.123456, "%Y %D %M %h:%i:%s %x") +-- case +select from_unixtime(1447430881.1234567, "%Y %D %M %h:%i:%s %x") +-- case +SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin; +-- case +SELECT TRIM(' bar '); +-- case +SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); +-- case +SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); +-- case +SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); +-- case +SELECT LTRIM(' foo '); +-- case +SELECT RTRIM(' bar '); +-- case +SELECT RPAD('hi', 6, 'c'); +-- case +SELECT BIT_LENGTH('hi'); +-- case +SELECT CHAR(65); +-- case +SELECT CHAR_LENGTH('abc'); +-- case +SELECT CHARACTER_LENGTH('abc'); +-- case +SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); +-- case +SELECT FIND_IN_SET('foo', 'foo,bar') +-- case +SELECT FIND_IN_SET('foo') +-- case +SELECT MAKE_SET(1,'a'), MAKE_SET(1,'a','b','c') +-- case +SELECT MID('Sakila', -5, 3) +-- case +SELECT OCT(12) +-- case +SELECT OCTET_LENGTH('text') +-- case +SELECT ORD('2') +-- case +SELECT POSITION('bar' IN 'foobarbar') +-- case +SELECT QUOTE('Don\'t!') +-- case +SELECT BIN(12) +-- case +SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo') +-- case +SELECT EXPORT_SET(5,'Y','N'), EXPORT_SET(5,'Y','N',','), EXPORT_SET(5,'Y','N',',',4) +-- case +SELECT FORMAT(), FORMAT(12332.2,2,'de_DE'), FORMAT(12332.123456, 4) +-- case +SELECT FROM_BASE64('abc') +-- case +SELECT TO_BASE64('abc') +-- case +SELECT INSERT(), INSERT('Quadratic', 3, 4, 'What'), INSTR('foobarbar', 'bar') +-- case +SELECT LOAD_FILE('/tmp/picture') +-- case +SELECT LPAD('hi',4,'??') +-- case +SELECT LEFT("foobar", 3) +-- case +SELECT RIGHT("foobar", 3) +-- case +SELECT REPEAT("a", 10); +-- case +SELECT SLEEP(10); +-- case +SELECT ANY_VALUE(@arg); +-- case +SELECT INET_ATON('10.0.5.9'); +-- case +SELECT INET_NTOA(167773449); +-- case +SELECT INET6_ATON('fdfe::5a55:caff:fefa:9089'); +-- case +SELECT INET6_NTOA(INET_NTOA(167773449)); +-- case +SELECT IS_FREE_LOCK(@str); +-- case +SELECT IS_IPV4('10.0.5.9'); +-- case +SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9')); +-- case +SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9')); +-- case +SELECT IS_IPV6('10.0.5.9'); +-- case +SELECT IS_USED_LOCK(@str); +-- case +SELECT NAME_CONST('myname', 14); +-- case +SELECT RELEASE_ALL_LOCKS(); +-- case +SELECT UUID(); +-- case +SELECT UUID_SHORT() +-- case +SELECT UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db') +-- case +SELECT UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db', 1) +-- case +SELECT BIN_TO_UUID(0x6ccd780cbaba102695645b8c656024db) +-- case +SELECT BIN_TO_UUID(0x6ccd780cbaba102695645b8c656024db, 1) +-- case +SELECT SLEEP(); +-- case +SELECT ANY_VALUE(); +-- case +SELECT INET_ATON(); +-- case +SELECT INET_NTOA(); +-- case +SELECT INET6_ATON(); +-- case +SELECT INET6_NTOA(INET_NTOA()); +-- case +SELECT IS_FREE_LOCK(); +-- case +SELECT IS_IPV4(); +-- case +SELECT IS_IPV4_COMPAT(INET6_ATON()); +-- case +SELECT IS_IPV4_MAPPED(INET6_ATON()); +-- case +SELECT IS_IPV6() +-- case +SELECT IS_USED_LOCK(); +-- case +SELECT NAME_CONST(); +-- case +SELECT RELEASE_ALL_LOCKS(1); +-- case +SELECT UUID(1); +-- case +SELECT UUID_SHORT(1) +-- case +select "2011-11-11 10:10:10.123456" + interval 10 second +-- case +select "2011-11-11 10:10:10.123456" - interval 10 second +-- case +select interval 10 second + "2011-11-11 10:10:10.123456" +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 microsecond) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 second) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 minute) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 hour) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 day) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 week) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 month) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 quarter) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 year) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "10:10" minute_second) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "10:10" hour_minute) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10.10 hour_minute) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "11 10" day_hour) +-- case +select date_add("2011-11-11 10:10:10.123456", interval "11-11" year_month) +-- case +select date_add("2011-11-11 10:10:10.123456", 10) +-- case +select date_add("2011-11-11 10:10:10.123456", 0.10) +-- case +select date_add("2011-11-11 10:10:10.123456", "11,11") +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_microsecond) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_second) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_minute) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_hour) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 10 sql_tsi_day) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_week) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_month) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_quarter) +-- case +select date_add("2011-11-11 10:10:10.123456", interval 1 sql_tsi_year) +-- case +select strcmp('abc', 'def') +-- case +select adddate("2011-11-11 10:10:10.123456", interval 10 microsecond) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 10 second) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 10 minute) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 10 hour) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 10 day) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 1 week) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 1 month) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 1 quarter) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 1 year) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "10:10" minute_second) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute) +-- case +select adddate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "11 10" day_hour) +-- case +select adddate("2011-11-11 10:10:10.123456", interval "11-11" year_month) +-- case +select adddate("2011-11-11 10:10:10.123456", 10) +-- case +select adddate("2011-11-11 10:10:10.123456", 0.10) +-- case +select adddate("2011-11-11 10:10:10.123456", "11,11") +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 10 microsecond) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 10 second) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 10 minute) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 10 hour) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 10 day) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 1 week) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 1 month) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 1 quarter) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 1 year) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "10:10" minute_second) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "10:10" hour_minute) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval 10.10 hour_minute) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "11 10" day_hour) +-- case +select date_sub("2011-11-11 10:10:10.123456", interval "11-11" year_month) +-- case +select date_sub("2011-11-11 10:10:10.123456", 10) +-- case +select date_sub("2011-11-11 10:10:10.123456", 0.10) +-- case +select date_sub("2011-11-11 10:10:10.123456", "11,11") +-- case +select subdate("2011-11-11 10:10:10.123456", interval 10 microsecond) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 10 second) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 10 minute) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 10 hour) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 10 day) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 1 week) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 1 month) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 1 quarter) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 1 year) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "10:10" minute_second) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute) +-- case +select subdate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "11 10" day_hour) +-- case +select subdate("2011-11-11 10:10:10.123456", interval "11-11" year_month) +-- case +select subdate("2011-11-11 10:10:10.123456", 10) +-- case +select subdate("2011-11-11 10:10:10.123456", 0.10) +-- case +select subdate("2011-11-11 10:10:10.123456", "11,11") +-- case +select unix_timestamp() +-- case +select unix_timestamp('2015-11-13 10:20:19.012') +-- case +SELECT GET_LOCK('lock1',10); +-- case +SELECT RELEASE_LOCK('lock1'); +-- case +select avg(), avg(c1,c2) from t; +-- case +select avg(distinct c1) from t; +-- case +select avg(distinctrow c1) from t; +-- case +select avg(distinct all c1) from t; +-- case +select avg(distinctrow all c1) from t; +-- case +select avg(c2) from t; +-- case +select bit_and(c1) from t; +-- case +select bit_and(all c1) from t; +-- case +select bit_and(distinct c1) from t; +-- case +select bit_and(distinctrow c1) from t; +-- case +select bit_and(distinctrow all c1) from t; +-- case +select bit_and(distinct all c1) from t; +-- case +select bit_and(), bit_and(distinct c1) from t; +-- case +select bit_and(), bit_and(distinctrow c1) from t; +-- case +select bit_and(), bit_and(all c1) from t; +-- case +select bit_or(c1) from t; +-- case +select bit_or(all c1) from t; +-- case +select bit_or(distinct c1) from t; +-- case +select bit_or(distinctrow c1) from t; +-- case +select bit_or(distinctrow all c1) from t; +-- case +select bit_or(distinct all c1) from t; +-- case +select bit_or(), bit_or(distinct c1) from t; +-- case +select bit_or(), bit_or(distinctrow c1) from t; +-- case +select bit_or(), bit_or(all c1) from t; +-- case +select bit_xor(c1) from t; +-- case +select bit_xor(all c1) from t; +-- case +select bit_xor(distinct c1) from t; +-- case +select bit_xor(distinctrow c1) from t; +-- case +select bit_xor(distinctrow all c1) from t; +-- case +select bit_xor(), bit_xor(distinct c1) from t; +-- case +select bit_xor(), bit_xor(distinctrow c1) from t; +-- case +select bit_xor(), bit_xor(all c1) from t; +-- case +select max(c1,c2) from t; +-- case +select max(distinct c1) from t; +-- case +select max(distinctrow c1) from t; +-- case +select max(distinct all c1) from t; +-- case +select max(distinctrow all c1) from t; +-- case +select max(c2) from t; +-- case +select min(c1,c2) from t; +-- case +select min(distinct c1) from t; +-- case +select min(distinctrow c1) from t; +-- case +select min(distinct all c1) from t; +-- case +select min(distinctrow all c1) from t; +-- case +select min(c2) from t; +-- case +select sum(c1,c2) from t; +-- case +select sum(distinct c1) from t; +-- case +select sum(distinctrow c1) from t; +-- case +select sum(distinct all c1) from t; +-- case +select sum(distinctrow all c1) from t; +-- case +select sum(c2) from t; +-- case +select count(c1) from t; +-- case +select count(distinct *) from t; +-- case +select count(distinctrow *) from t; +-- case +select count(*) from t; +-- case +select count(distinct c1, c2) from t; +-- case +select count(distinctrow c1, c2) from t; +-- case +select count(c1, c2) from t; +-- case +select count(all c1) from t; +-- case +select count(distinct all c1) from t; +-- case +select count(distinctrow all c1) from t; +-- case +select approx_count_distinct(c1) from t; +-- case +select approx_count_distinct(c1, c2) from t; +-- case +select approx_count_distinct(c1, 123) from t; +-- case +select approx_percentile(c1) from t; +-- case +select approx_percentile(c1, c2) from t; +-- case +select approx_percentile(c1, 123) from t; +-- case +select group_concat(c2,c1) from t group by c1; +-- case +select group_concat(c2,c1 SEPARATOR ';') from t group by c1; +-- case +select group_concat(distinct c2,c1) from t group by c1; +-- case +select group_concat(distinctrow c2,c1) from t group by c1; +-- case +SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name; +-- case +select std(c1), std(all c1), std(distinct c1) from t +-- case +select std(c1, c2) from t +-- case +select stddev(c1), stddev(all c1), stddev(distinct c1) from t +-- case +select stddev(c1, c2) from t +-- case +select stddev_pop(c1), stddev_pop(all c1), stddev_pop(distinct c1) from t +-- case +select stddev_pop(c1, c2) from t +-- case +select stddev_samp(c1), stddev_samp(all c1), stddev_samp(distinct c1) from t +-- case +select stddev_samp(c1, c2) from t +-- case +select variance(c1), variance(all c1), variance(distinct c1) from t +-- case +select variance(c1, c2) from t +-- case +select var_pop(c1), var_pop(all c1), var_pop(distinct c1) from t +-- case +select var_pop(c1, c2) from t +-- case +select var_samp(c1), var_samp(all c1), var_samp(distinct c1) from t +-- case +select var_samp(c1, c2) from t +-- case +select json_arrayagg(c2) from t group by c1 +-- case +select json_arrayagg(c1, c2) from t group by c1 +-- case +select json_arrayagg(distinct c2) from t group by c1 +-- case +select json_arrayagg(all c2) from t group by c1 +-- case +select json_objectagg(c1, c2) from t group by c1 +-- case +select json_objectagg(c1, c2, c3) from t group by c1 +-- case +select json_objectagg(distinct c1, c2) from t group by c1 +-- case +select json_objectagg(c1, distinct c2) from t group by c1 +-- case +select json_objectagg(distinct c1, distinct c2) from t group by c1 +-- case +select json_objectagg(all c1, c2) from t group by c1 +-- case +select json_objectagg(c1, all c2) from t group by c1 +-- case +select json_objectagg(all c1, all c2) from t group by c1 +-- case +select AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')) +-- case +select AES_DECRYPT(@crypt_str,@key_str) +-- case +select AES_DECRYPT(@crypt_str,@key_str,@init_vector); +-- case +SELECT COMPRESS(''); +-- case +SELECT DECODE(@crypt_str, @pass_str); +-- case +SELECT DES_DECRYPT(@crypt_str), DES_DECRYPT(@crypt_str, @key_str); +-- case +SELECT DES_ENCRYPT(@str), DES_ENCRYPT(@key_num); +-- case +SELECT ENCODE('cleartext', CONCAT('my_random_salt','my_secret_password')); +-- case +SELECT ENCRYPT('hello'), ENCRYPT('hello', @salt); +-- case +SELECT MD5('testing'); +-- case +SELECT OLD_PASSWORD(@str); +-- case +SELECT PASSWORD(@str); +-- case +SELECT RANDOM_BYTES(@len); +-- case +SELECT SHA1('abc'); +-- case +SELECT SHA('abc'); +-- case +SELECT SHA2('abc', 224); +-- case +SELECT SM3('abc'); +-- case +SELECT UNCOMPRESS('any string'); +-- case +SELECT UNCOMPRESSED_LENGTH(@compressed_string); +-- case +SELECT VALIDATE_PASSWORD_STRENGTH(@str); +-- case +SELECT JSON_EXTRACT(); +-- case +SELECT JSON_UNQUOTE(); +-- case +SELECT JSON_TYPE('[123]'); +-- case +SELECT JSON_TYPE(); +-- case +SELECT a->'$.a' FROM t +-- case +SELECT a->>'$.a' FROM t +-- case +SELECT '{}'->'$.a' FROM t +-- case +SELECT '{}'->>'$.a' FROM t +-- case +SELECT a->3 FROM t +-- case +SELECT a->>3 FROM t +-- case +SELECT 1 member of (a) +-- case +SELECT 1 member of a +-- case +SELECT 1 member a +-- case +SELECT 1 not member of a +-- case +SELECT 1 member of (1+1) +-- case +SELECT concat('a') member of (cast(1 as char(1))) +-- case +SELECT `uuid`() +-- case +select nextval(seq) +-- case +select lastval(seq) +-- case +select setval(seq, 100) +-- case +select next value for seq +-- case +select next value for sequence +-- case +select NeXt vAluE for seQuEncE2 +-- case +select regexp_like('aBc', 'abc', 'im'); +-- case +select regexp_substr('aBc', 'abc', 1, 1, 'im'); +-- case +select regexp_instr('aBc', 'abc', 1, 1, 0, 'im'); +-- case +select regexp_replace('aBc', 'abc', 'def', 1, 1, 'i'); +-- case +select 'aBc' ilike 'abc'; diff --git a/parser/testdata/parser/builtin/output.sql b/parser/testdata/parser/builtin/output.sql new file mode 100644 index 0000000..1bdf48b --- /dev/null +++ b/parser/testdata/parser/builtin/output.sql @@ -0,0 +1,1221 @@ +SELECT POW(1, 2) +-- case +SELECT POW(1, 2, 1) +-- case +SELECT POW(1, 0.5) +-- case +SELECT POW(1, -1) +-- case +SELECT POW(-1, 1) +-- case +SELECT RAND() +-- case +SELECT RAND(1) +-- case +SELECT 10%2 +-- case +SELECT ROUND(-1.23) +-- case +SELECT ROUND(1.23, 1) +-- case +SELECT ROUND(1.23, 1, 1) +-- case +SELECT CEIL(-1.23) +-- case +SELECT CEILING(1.23) +-- case +SELECT FLOOR(-1.23) +-- case +SELECT LN(1) +-- case +SELECT LN(1, 2) +-- case +SELECT LOG(-2) +-- case +SELECT LOG(2, 65536) +-- case +SELECT LOG(2, 65536, 1) +-- case +SELECT LOG2(2) +-- case +SELECT LOG2(2, 2) +-- case +SELECT LOG10(10) +-- case +SELECT LOG10(10, 1) +-- case +SELECT ABS(10, 1) +-- case +SELECT ABS(10) +-- case +SELECT ABS() +-- case +SELECT CONV(10+_UTF8MB4'10'+_UTF8MB4'10'+x'0a', 10, 10) +-- case +SELECT CONV() +-- case +SELECT CRC32(_UTF8MB4'MySQL') +-- case +SELECT CRC32() +-- case +SELECT SIGN() +-- case +SELECT SIGN(0) +-- case +SELECT SQRT(0) +-- case +SELECT SQRT() +-- case +SELECT ACOS() +-- case +SELECT ACOS(1) +-- case +SELECT ACOS(1, 2) +-- case +SELECT ASIN() +-- case +SELECT ASIN(1) +-- case +SELECT ASIN(1, 2) +-- case +SELECT ATAN(0),ATAN(1),ATAN(1, 2) +-- case +SELECT ATAN2(),ATAN2(1, 2) +-- case +SELECT COS(0) +-- case +SELECT COS(1) +-- case +SELECT COS(1, 2) +-- case +SELECT COT() +-- case +SELECT COT(1) +-- case +SELECT COT(1, 2) +-- case +SELECT DEGREES() +-- case +SELECT DEGREES(0) +-- case +SELECT EXP() +-- case +SELECT EXP(1) +-- case +SELECT PI() +-- case +SELECT PI(1) +-- case +SELECT RADIANS() +-- case +SELECT RADIANS(1) +-- case +SELECT SIN() +-- case +SELECT SIN(1) +-- case +SELECT TAN(1) +-- case +SELECT TAN() +-- case +SELECT TRUNCATE(1.223, 1) +-- case +SELECT TRUNCATE() +-- case +SELECT SUBSTR(_UTF8MB4'Quadratically', 5) +-- case +SELECT SUBSTR(_UTF8MB4'Quadratically', 5, 3) +-- case +SELECT SUBSTR(_UTF8MB4'Quadratically', 5) +-- case +SELECT SUBSTR(_UTF8MB4'Quadratically', 5, 3) +-- case +SELECT SUBSTRING(_UTF8MB4'Quadratically', 5) +-- case +SELECT SUBSTRING(_UTF8MB4'Quadratically', 5, 3) +-- case +SELECT SUBSTRING(_UTF8MB4'Quadratically', 5) +-- case +SELECT SUBSTRING(_UTF8MB4'Quadratically', 5, 3) +-- case +SELECT CONVERT(_UTF8MB4'111', SIGNED) +-- case +SELECT LEAST(),LEAST(1, 2, 3) +-- case +SELECT INTERVAL(1, 0, 1, 2) +-- case +SELECT (INTERVAL(1, 0, 1, 2)+5)*7+INTERVAL(1, 0, 1, 2)/2 +-- case +SELECT INTERVAL(0, (1*5)/2)+INTERVAL(5, 4, 3) +-- case +SELECT DATE_ADD(_UTF8MB4'2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY) +-- case +SELECT DATABASE() +-- case +SELECT SCHEMA() +-- case +SELECT USER() +-- case +SELECT USER(1) +-- case +SELECT CURRENT_USER() +-- case +SELECT CURRENT_ROLE() +-- case +SELECT CURRENT_USER() +-- case +SELECT CONNECTION_ID() +-- case +SELECT VERSION() +-- case +SELECT CURRENT_RESOURCE_GROUP() +-- case +SELECT BENCHMARK(1000000, AES_ENCRYPT(_UTF8MB4'text', UNHEX(_UTF8MB4'F3229A0B371ED2D9441B830D21A390C3'))) +-- case +SELECT BENCHMARK(AES_ENCRYPT(_UTF8MB4'text', UNHEX(_UTF8MB4'F3229A0B371ED2D9441B830D21A390C3'))) +-- case +SELECT CHARSET(_UTF8MB4'abc') +-- case +SELECT COERCIBILITY(_UTF8MB4'abc') +-- case +SELECT COERCIBILITY(_UTF8MB4'abc', _UTF8MB4'a') +-- case +SELECT COLLATION(_UTF8MB4'abc') +-- case +SELECT ROW_COUNT() +-- case +SELECT SESSION_USER() +-- case +SELECT SYSTEM_USER() +-- case +SELECT FORMAT_BYTES(512) +-- case +SELECT FORMAT_NANO_TIME(3501) +-- case +SELECT SUBSTRING_INDEX(_UTF8MB4'www.mysql.com', _UTF8MB4'.', 2) +-- case +SELECT SUBSTRING_INDEX(_UTF8MB4'www.mysql.com', _UTF8MB4'.', -2) +-- case +SELECT ASCII(),ASCII(_UTF8MB4''),ASCII(_UTF8MB4'A'),ASCII(1) +-- case +SELECT LOWER(_UTF8MB4'A'),UPPER(_UTF8MB4'a') +-- case +SELECT LCASE(_UTF8MB4'A'),UCASE(_UTF8MB4'a') +-- case +SELECT REPLACE(_UTF8MB4'www.mysql.com', _UTF8MB4'w', _UTF8MB4'Ww') +-- case +SELECT LOCATE(_UTF8MB4'bar', _UTF8MB4'foobarbar') +-- case +SELECT LOCATE(_UTF8MB4'bar', _UTF8MB4'foobarbar', 5) +-- case +SELECT TIDB_VERSION() +-- case +SELECT TIDB_IS_DDL_OWNER() +-- case +SELECT TIDB_DECODE_PLAN() +-- case +SELECT TIDB_DECODE_KEY(_UTF8MB4'abc') +-- case +SELECT TIDB_DECODE_BASE64_KEY(_UTF8MB4'abc') +-- case +SELECT TIDB_DECODE_SQL_DIGESTS(_UTF8MB4'[]') +-- case +CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2)) +-- case +-- error: line 1 column 13 near ")" +-- case +-- error: line 1 column 17 near ")" +-- case +-- error: line 1 column 14 near ")" +-- case +SELECT ROW(1,1)>ROW(1,1),ROW(1,1,1)>ROW(1,1,1) +-- case +SELECT ROW(1,1)>ROW(1,1) +-- case +CREATE TABLE `t` (`row` INT) +-- case +-- error: line 1 column 19 near "row int)" +-- case +SELECT *,CAST(`data` AS CHAR CHARSET UTF8) FROM `t` +-- case +SELECT CAST(`data` AS CHAR) +-- case +SELECT CAST(`data` AS CHAR(10) CHARSET UTF8) +-- case +SELECT CAST(`data` AS BINARY) +-- case +SELECT *,CAST(`data` AS JSON) FROM `t` +-- case +SELECT *,JSON_SUM_CRC32(`data` AS UNSIGNED ARRAY) FROM `t` +-- case +SELECT *,JSON_SUM_CRC32(`data` AS DOUBLE ARRAY) FROM `t` +-- case +-- error: line 1 column 40 near ") FROM t;" +-- case +-- error: line 1 column 30 near ") FROM t;" +-- case +SELECT CAST(1 AS SIGNED) +-- case +SELECT CAST(1 AS DOUBLE) +-- case +SELECT CAST(1 AS FLOAT) +-- case +SELECT CAST(1 AS FLOAT) +-- case +SELECT CAST(1 AS FLOAT) +-- case +SELECT CAST(1 AS DOUBLE) +-- case +SELECT CAST(1 AS DOUBLE) +-- case +-- error: [parser:1426]Too-big precision 54 specified for 'CAST'. Maximum is 53. +-- case +SELECT CAST(1 AS DOUBLE) +-- case +SELECT CAST(_UTF8MB4'2000' AS YEAR) +-- case +SELECT CAST(TIME '2000' AS YEAR) +-- case +SELECT CAST(`b` AS SIGNED ARRAY) +-- case +SELECT CAST(`b` AS CHAR(10) ARRAY) +-- case +SELECT LAST_INSERT_ID() +-- case +SELECT LAST_INSERT_ID(1) +-- case +SELECT BINARY _UTF8MB4'a' +-- case +SELECT BIT_COUNT(1) +-- case +SELECT CURRENT_TIMESTAMP() +-- case +SELECT CURRENT_TIMESTAMP() +-- case +SELECT CURRENT_TIMESTAMP(6) +-- case +-- error: line 1 column 29 near "null)" +-- case +-- error: line 1 column 26 near "-1)" +-- case +-- error: line 1 column 28 near "1.0)" +-- case +-- error: line 1 column 28 near "'2')" +-- case +SELECT NOW() +-- case +SELECT NOW(6) +-- case +SELECT SYSDATE(),SYSDATE(6) +-- case +SELECT TIME(_UTF8MB4'01:02:03') +-- case +SELECT TIME(_UTF8MB4'01:02:03.1') +-- case +SELECT TIME(_UTF8MB4'20.1') +-- case +SELECT TIMEDIFF(_UTF8MB4'2000:01:01 00:00:00', _UTF8MB4'2000:01:01 00:00:00.000001') +-- case +SELECT TIMESTAMPDIFF(MONTH, _UTF8MB4'2003-02-01', _UTF8MB4'2003-05-01') +-- case +SELECT TIMESTAMPDIFF(YEAR, _UTF8MB4'2002-05-01', _UTF8MB4'2001-01-01') +-- case +SELECT TIMESTAMPDIFF(MINUTE, _UTF8MB4'2003-02-01', _UTF8MB4'2003-05-01 12:05:55') +-- case +SELECT CURRENT_TIME() +-- case +SELECT CURRENT_TIME() +-- case +SELECT CURRENT_TIME(6) +-- case +-- error: line 1 column 21 near "-1)" +-- case +-- error: line 1 column 23 near "1.0)" +-- case +-- error: line 1 column 23 near "'1')" +-- case +-- error: line 1 column 24 near "null)" +-- case +SELECT CURTIME() +-- case +SELECT CURTIME(6) +-- case +-- error: line 1 column 16 near "-1)" +-- case +-- error: line 1 column 18 near "1.0)" +-- case +-- error: line 1 column 18 near "'1')" +-- case +-- error: line 1 column 19 near "null)" +-- case +SELECT UTC_TIMESTAMP() +-- case +SELECT UTC_TIMESTAMP() +-- case +SELECT UTC_TIMESTAMP(6) +-- case +-- error: line 1 column 22 near "-1)" +-- case +-- error: line 1 column 24 near "1.0)" +-- case +-- error: line 1 column 24 near "'1')" +-- case +-- error: line 1 column 25 near "null)" +-- case +SELECT UTC_TIME() +-- case +SELECT UTC_TIME() +-- case +SELECT UTC_TIME(6) +-- case +-- error: line 1 column 17 near "-1)" +-- case +-- error: line 1 column 19 near "1.0)" +-- case +-- error: line 1 column 19 near "'1')" +-- case +-- error: line 1 column 20 near "null)" +-- case +SELECT MICROSECOND(_UTF8MB4'2009-12-31 23:59:59.000010') +-- case +SELECT SECOND(_UTF8MB4'10:05:03') +-- case +SELECT MINUTE(_UTF8MB4'2008-02-03 10:05:03') +-- case +SELECT HOUR(),HOUR(_UTF8MB4'10:05:03') +-- case +SELECT CURRENT_DATE(),CURRENT_DATE(),CURDATE() +-- case +-- error: line 1 column 46 near "1)" +-- case +SELECT DATEDIFF(_UTF8MB4'2003-12-31', _UTF8MB4'2003-12-30') +-- case +SELECT DATE(_UTF8MB4'2003-12-31 01:02:03') +-- case +SELECT DATE() +-- case +SELECT DATE(_UTF8MB4'2003-12-31 01:02:03', _UTF8MB4'') +-- case +SELECT DATE_FORMAT(_UTF8MB4'2003-12-31 01:02:03', _UTF8MB4'%W %M %Y') +-- case +SELECT DAY(_UTF8MB4'2007-02-03') +-- case +SELECT DAYOFMONTH(_UTF8MB4'2007-02-03') +-- case +SELECT DAYOFWEEK(_UTF8MB4'2007-02-03') +-- case +SELECT DAYOFYEAR(_UTF8MB4'2007-02-03') +-- case +SELECT DAYNAME(_UTF8MB4'2007-02-03') +-- case +SELECT FROM_DAYS(1423) +-- case +SELECT WEEKDAY(_UTF8MB4'2007-02-03') +-- case +SELECT UTC_DATE(),UTC_DATE() +-- case +SELECT UTC_DATE(),UTC_DATE()+0 +-- case +SELECT WEEK() +-- case +SELECT WEEK(_UTF8MB4'2007-02-03') +-- case +SELECT WEEK(_UTF8MB4'2007-02-03', 0) +-- case +SELECT WEEKOFYEAR(_UTF8MB4'2007-02-03') +-- case +SELECT MONTH(_UTF8MB4'2007-02-03') +-- case +SELECT MONTHNAME(_UTF8MB4'2007-02-03') +-- case +SELECT YEAR(_UTF8MB4'2007-02-03') +-- case +SELECT YEARWEEK(_UTF8MB4'2007-02-03') +-- case +SELECT YEARWEEK(_UTF8MB4'2007-02-03', 0) +-- case +SELECT ADDTIME(_UTF8MB4'01:00:00.999999', _UTF8MB4'02:00:00.999998') +-- case +SELECT ADDTIME(_UTF8MB4'02:00:00.999998') +-- case +SELECT ADDTIME() +-- case +SELECT SUBTIME(_UTF8MB4'01:00:00.999999', _UTF8MB4'02:00:00.999998') +-- case +SELECT CONVERT_TZ() +-- case +SELECT CONVERT_TZ(_UTF8MB4'2004-01-01 12:00:00', _UTF8MB4'+00:00', _UTF8MB4'+10:00') +-- case +SELECT CONVERT_TZ(_UTF8MB4'2004-01-01 12:00:00', _UTF8MB4'+00:00', _UTF8MB4'+10:00', _UTF8MB4'+10:00') +-- case +SELECT GET_FORMAT(DATE, _UTF8MB4'USA') +-- case +SELECT GET_FORMAT(DATETIME, _UTF8MB4'USA') +-- case +SELECT GET_FORMAT(TIME, _UTF8MB4'USA') +-- case +SELECT GET_FORMAT(DATETIME, _UTF8MB4'USA') +-- case +SELECT LOCALTIME(),LOCALTIME(1) +-- case +SELECT LOCALTIMESTAMP(),LOCALTIMESTAMP(2) +-- case +SELECT MAKEDATE(2011, 31) +-- case +SELECT MAKETIME(12, 15, 30) +-- case +SELECT MAKEDATE() +-- case +SELECT MAKETIME() +-- case +SELECT PERIOD_ADD(200801, 2) +-- case +SELECT PERIOD_DIFF(200802, 200703) +-- case +SELECT QUARTER(_UTF8MB4'2008-04-01') +-- case +SELECT SEC_TO_TIME(2378) +-- case +SELECT TIME_FORMAT(_UTF8MB4'100:00:00', _UTF8MB4'%H %k %h %I %l') +-- case +SELECT TIME_TO_SEC(_UTF8MB4'22:23:00') +-- case +SELECT TIMESTAMPADD(WEEK, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(SECOND, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(MINUTE, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(HOUR, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(DAY, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(WEEK, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(MONTH, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(QUARTER, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TIMESTAMPADD(YEAR, 1, _UTF8MB4'2003-01-02') +-- case +-- error: line 1 column 39 near "SQL_TSI_MICROSECOND,1,'2003-01-02');" +-- case +SELECT TIMESTAMPADD(MICROSECOND, 1, _UTF8MB4'2003-01-02') +-- case +SELECT TO_DAYS(_UTF8MB4'2007-10-07') +-- case +SELECT TO_SECONDS(_UTF8MB4'2009-11-29') +-- case +SELECT LAST_DAY(_UTF8MB4'2003-02-05') +-- case +SELECT UTC_TIME(),UTC_TIME(1) +-- case +SELECT EXTRACT(MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(MINUTE FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(HOUR FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(DAY FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(WEEK FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(MONTH FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(QUARTER FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(YEAR FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(SECOND_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(MINUTE_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(MINUTE_SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(HOUR_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(HOUR_SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(HOUR_MINUTE FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(DAY_MICROSECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(DAY_SECOND FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(DAY_MINUTE FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(DAY_HOUR FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT EXTRACT(YEAR_MONTH FROM _UTF8MB4'2011-11-11 10:10:10.123456') +-- case +SELECT FROM_UNIXTIME(1447430881) +-- case +SELECT FROM_UNIXTIME(1447430881.123456) +-- case +SELECT FROM_UNIXTIME(1447430881.1234567) +-- case +SELECT FROM_UNIXTIME(1447430881.9999999) +-- case +SELECT FROM_UNIXTIME(1447430881, _UTF8MB4'%Y %D %M %h:%i:%s %x') +-- case +SELECT FROM_UNIXTIME(1447430881.123456, _UTF8MB4'%Y %D %M %h:%i:%s %x') +-- case +SELECT FROM_UNIXTIME(1447430881.1234567, _UTF8MB4'%Y %D %M %h:%i:%s %x') +-- case +SELECT CAST(_UTF8MB4'test collated returns' AS CHAR CHARSET UTF8) COLLATE utf8_bin +-- case +SELECT TRIM(_UTF8MB4' bar ') +-- case +SELECT TRIM(LEADING _UTF8MB4'x' FROM _UTF8MB4'xxxbarxxx') +-- case +SELECT TRIM(BOTH _UTF8MB4'x' FROM _UTF8MB4'xxxbarxxx') +-- case +SELECT TRIM(TRAILING _UTF8MB4'xyz' FROM _UTF8MB4'barxxyz') +-- case +SELECT LTRIM(_UTF8MB4' foo ') +-- case +SELECT RTRIM(_UTF8MB4' bar ') +-- case +SELECT RPAD(_UTF8MB4'hi', 6, _UTF8MB4'c') +-- case +SELECT BIT_LENGTH(_UTF8MB4'hi') +-- case +SELECT CHAR_FUNC(65, NULL) +-- case +SELECT CHAR_LENGTH(_UTF8MB4'abc') +-- case +SELECT CHARACTER_LENGTH(_UTF8MB4'abc') +-- case +SELECT FIELD(_UTF8MB4'ej', _UTF8MB4'Hej', _UTF8MB4'ej', _UTF8MB4'Heja', _UTF8MB4'hej', _UTF8MB4'foo') +-- case +SELECT FIND_IN_SET(_UTF8MB4'foo', _UTF8MB4'foo,bar') +-- case +SELECT FIND_IN_SET(_UTF8MB4'foo') +-- case +SELECT MAKE_SET(1, _UTF8MB4'a'),MAKE_SET(1, _UTF8MB4'a', _UTF8MB4'b', _UTF8MB4'c') +-- case +SELECT MID(_UTF8MB4'Sakila', -5, 3) +-- case +SELECT OCT(12) +-- case +SELECT OCTET_LENGTH(_UTF8MB4'text') +-- case +SELECT ORD(_UTF8MB4'2') +-- case +SELECT POSITION(_UTF8MB4'bar' IN _UTF8MB4'foobarbar') +-- case +SELECT QUOTE(_UTF8MB4'Don''t!') +-- case +SELECT BIN(12) +-- case +SELECT ELT(1, _UTF8MB4'ej', _UTF8MB4'Heja', _UTF8MB4'hej', _UTF8MB4'foo') +-- case +SELECT EXPORT_SET(5, _UTF8MB4'Y', _UTF8MB4'N'),EXPORT_SET(5, _UTF8MB4'Y', _UTF8MB4'N', _UTF8MB4','),EXPORT_SET(5, _UTF8MB4'Y', _UTF8MB4'N', _UTF8MB4',', 4) +-- case +SELECT FORMAT(),FORMAT(12332.2, 2, _UTF8MB4'de_DE'),FORMAT(12332.123456, 4) +-- case +SELECT FROM_BASE64(_UTF8MB4'abc') +-- case +SELECT TO_BASE64(_UTF8MB4'abc') +-- case +SELECT INSERT_FUNC(),INSERT_FUNC(_UTF8MB4'Quadratic', 3, 4, _UTF8MB4'What'),INSTR(_UTF8MB4'foobarbar', _UTF8MB4'bar') +-- case +SELECT LOAD_FILE(_UTF8MB4'/tmp/picture') +-- case +SELECT LPAD(_UTF8MB4'hi', 4, _UTF8MB4'??') +-- case +SELECT LEFT(_UTF8MB4'foobar', 3) +-- case +SELECT RIGHT(_UTF8MB4'foobar', 3) +-- case +SELECT REPEAT(_UTF8MB4'a', 10) +-- case +SELECT SLEEP(10) +-- case +SELECT ANY_VALUE(@`arg`) +-- case +SELECT INET_ATON(_UTF8MB4'10.0.5.9') +-- case +SELECT INET_NTOA(167773449) +-- case +SELECT INET6_ATON(_UTF8MB4'fdfe::5a55:caff:fefa:9089') +-- case +SELECT INET6_NTOA(INET_NTOA(167773449)) +-- case +SELECT IS_FREE_LOCK(@`str`) +-- case +SELECT IS_IPV4(_UTF8MB4'10.0.5.9') +-- case +SELECT IS_IPV4_COMPAT(INET6_ATON(_UTF8MB4'::10.0.5.9')) +-- case +SELECT IS_IPV4_MAPPED(INET6_ATON(_UTF8MB4'::10.0.5.9')) +-- case +SELECT IS_IPV6(_UTF8MB4'10.0.5.9') +-- case +SELECT IS_USED_LOCK(@`str`) +-- case +SELECT NAME_CONST(_UTF8MB4'myname', 14) +-- case +SELECT RELEASE_ALL_LOCKS() +-- case +SELECT UUID() +-- case +SELECT UUID_SHORT() +-- case +SELECT UUID_TO_BIN(_UTF8MB4'6ccd780c-baba-1026-9564-5b8c656024db') +-- case +SELECT UUID_TO_BIN(_UTF8MB4'6ccd780c-baba-1026-9564-5b8c656024db', 1) +-- case +SELECT BIN_TO_UUID(x'6ccd780cbaba102695645b8c656024db') +-- case +SELECT BIN_TO_UUID(x'6ccd780cbaba102695645b8c656024db', 1) +-- case +SELECT SLEEP() +-- case +SELECT ANY_VALUE() +-- case +SELECT INET_ATON() +-- case +SELECT INET_NTOA() +-- case +SELECT INET6_ATON() +-- case +SELECT INET6_NTOA(INET_NTOA()) +-- case +SELECT IS_FREE_LOCK() +-- case +SELECT IS_IPV4() +-- case +SELECT IS_IPV4_COMPAT(INET6_ATON()) +-- case +SELECT IS_IPV4_MAPPED(INET6_ATON()) +-- case +SELECT IS_IPV6() +-- case +SELECT IS_USED_LOCK() +-- case +SELECT NAME_CONST() +-- case +SELECT RELEASE_ALL_LOCKS(1) +-- case +SELECT UUID(1) +-- case +SELECT UUID_SHORT(1) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH) +-- case +-- error: line 1 column 48 near "10)" +-- case +-- error: line 1 column 50 near "0.10)" +-- case +-- error: line 1 column 53 near ""11,11")" +-- case +-- error: line 1 column 77 near "sql_tsi_microsecond)" +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER) +-- case +SELECT DATE_ADD(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR) +-- case +SELECT STRCMP(_UTF8MB4'abc', _UTF8MB4'def') +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 0.10 DAY) +-- case +SELECT ADDDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11,11' DAY) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR) +-- case +SELECT DATE_SUB(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH) +-- case +-- error: line 1 column 48 near "10)" +-- case +-- error: line 1 column 50 near "0.10)" +-- case +-- error: line 1 column 53 near ""11,11")" +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MICROSECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 SECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 MINUTE) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 HOUR) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 WEEK) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 MONTH) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 QUARTER) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 1 YEAR) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10.10' SECOND_MICROSECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10.10' MINUTE_MICROSECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' MINUTE_SECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10.10' HOUR_MICROSECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10:10' HOUR_SECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'10:10' HOUR_MINUTE) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10.10 HOUR_MINUTE) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10.10' DAY_MICROSECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10:10' DAY_SECOND) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10:10' DAY_MINUTE) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11 10' DAY_HOUR) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11-11' YEAR_MONTH) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 10 DAY) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL 0.10 DAY) +-- case +SELECT SUBDATE(_UTF8MB4'2011-11-11 10:10:10.123456', INTERVAL _UTF8MB4'11,11' DAY) +-- case +SELECT UNIX_TIMESTAMP() +-- case +SELECT UNIX_TIMESTAMP(_UTF8MB4'2015-11-13 10:20:19.012') +-- case +SELECT GET_LOCK(_UTF8MB4'lock1', 10) +-- case +SELECT RELEASE_LOCK(_UTF8MB4'lock1') +-- case +-- error: line 1 column 12 near "), avg(c1,c2) from t;" +-- case +SELECT AVG(DISTINCT `c1`) FROM `t` +-- case +SELECT AVG(DISTINCT `c1`) FROM `t` +-- case +SELECT AVG(DISTINCT `c1`) FROM `t` +-- case +SELECT AVG(DISTINCT `c1`) FROM `t` +-- case +SELECT AVG(`c2`) FROM `t` +-- case +SELECT BIT_AND(`c1`) FROM `t` +-- case +SELECT BIT_AND(`c1`) FROM `t` +-- case +-- error: line 1 column 23 near "distinct c1) from t;" +-- case +-- error: line 1 column 26 near "distinctrow c1) from t;" +-- case +-- error: line 1 column 26 near "distinctrow all c1) from t;" +-- case +-- error: line 1 column 23 near "distinct all c1) from t;" +-- case +-- error: line 1 column 16 near "), bit_and(distinct c1) from t;" +-- case +-- error: line 1 column 16 near "), bit_and(distinctrow c1) from t;" +-- case +-- error: line 1 column 16 near "), bit_and(all c1) from t;" +-- case +SELECT BIT_OR(`c1`) FROM `t` +-- case +SELECT BIT_OR(`c1`) FROM `t` +-- case +-- error: line 1 column 22 near "distinct c1) from t;" +-- case +-- error: line 1 column 25 near "distinctrow c1) from t;" +-- case +-- error: line 1 column 25 near "distinctrow all c1) from t;" +-- case +-- error: line 1 column 22 near "distinct all c1) from t;" +-- case +-- error: line 1 column 15 near "), bit_or(distinct c1) from t;" +-- case +-- error: line 1 column 15 near "), bit_or(distinctrow c1) from t;" +-- case +-- error: line 1 column 15 near "), bit_or(all c1) from t;" +-- case +SELECT BIT_XOR(`c1`) FROM `t` +-- case +SELECT BIT_XOR(`c1`) FROM `t` +-- case +-- error: line 1 column 23 near "distinct c1) from t;" +-- case +-- error: line 1 column 26 near "distinctrow c1) from t;" +-- case +-- error: line 1 column 26 near "distinctrow all c1) from t;" +-- case +-- error: line 1 column 16 near "), bit_xor(distinct c1) from t;" +-- case +-- error: line 1 column 16 near "), bit_xor(distinctrow c1) from t;" +-- case +-- error: line 1 column 16 near "), bit_xor(all c1) from t;" +-- case +-- error: line 1 column 14 near ",c2) from t;" +-- case +SELECT MAX(DISTINCT `c1`) FROM `t` +-- case +SELECT MAX(DISTINCT `c1`) FROM `t` +-- case +SELECT MAX(DISTINCT `c1`) FROM `t` +-- case +SELECT MAX(DISTINCT `c1`) FROM `t` +-- case +SELECT MAX(`c2`) FROM `t` +-- case +-- error: line 1 column 14 near ",c2) from t;" +-- case +SELECT MIN(DISTINCT `c1`) FROM `t` +-- case +SELECT MIN(DISTINCT `c1`) FROM `t` +-- case +SELECT MIN(DISTINCT `c1`) FROM `t` +-- case +SELECT MIN(DISTINCT `c1`) FROM `t` +-- case +SELECT MIN(`c2`) FROM `t` +-- case +-- error: line 1 column 14 near ",c2) from t;" +-- case +SELECT SUM(DISTINCT `c1`) FROM `t` +-- case +SELECT SUM(DISTINCT `c1`) FROM `t` +-- case +SELECT SUM(DISTINCT `c1`) FROM `t` +-- case +SELECT SUM(DISTINCT `c1`) FROM `t` +-- case +SELECT SUM(`c2`) FROM `t` +-- case +SELECT COUNT(`c1`) FROM `t` +-- case +-- error: line 1 column 23 near "*) from t;" +-- case +-- error: line 1 column 26 near "*) from t;" +-- case +SELECT COUNT(1) FROM `t` +-- case +SELECT COUNT(DISTINCT `c1`, `c2`) FROM `t` +-- case +SELECT COUNT(DISTINCT `c1`, `c2`) FROM `t` +-- case +-- error: line 1 column 16 near ", c2) from t;" +-- case +SELECT COUNT(`c1`) FROM `t` +-- case +-- error: line 1 column 25 near "all c1) from t;" +-- case +-- error: line 1 column 28 near "all c1) from t;" +-- case +SELECT APPROX_COUNT_DISTINCT(`c1`) FROM `t` +-- case +SELECT APPROX_COUNT_DISTINCT(`c1`, `c2`) FROM `t` +-- case +SELECT APPROX_COUNT_DISTINCT(`c1`, 123) FROM `t` +-- case +SELECT APPROX_PERCENTILE(`c1`) FROM `t` +-- case +SELECT APPROX_PERCENTILE(`c1`, `c2`) FROM `t` +-- case +SELECT APPROX_PERCENTILE(`c1`, 123) FROM `t` +-- case +SELECT GROUP_CONCAT(`c2`, `c1` SEPARATOR ',') FROM `t` GROUP BY `c1` +-- case +SELECT GROUP_CONCAT(`c2`, `c1` SEPARATOR ';') FROM `t` GROUP BY `c1` +-- case +SELECT GROUP_CONCAT(DISTINCT `c2`, `c1` SEPARATOR ',') FROM `t` GROUP BY `c1` +-- case +SELECT GROUP_CONCAT(DISTINCT `c2`, `c1` SEPARATOR ',') FROM `t` GROUP BY `c1` +-- case +SELECT `student_name`,GROUP_CONCAT(DISTINCT `test_score` ORDER BY `test_score` DESC SEPARATOR ' ') FROM `student` GROUP BY `student_name` +-- case +SELECT STDDEV_POP(`c1`),STDDEV_POP(`c1`),STDDEV_POP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 14 near ", c2) from t" +-- case +SELECT STDDEV_POP(`c1`),STDDEV_POP(`c1`),STDDEV_POP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 17 near ", c2) from t" +-- case +SELECT STDDEV_POP(`c1`),STDDEV_POP(`c1`),STDDEV_POP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 21 near ", c2) from t" +-- case +SELECT STDDEV_SAMP(`c1`),STDDEV_SAMP(`c1`),STDDEV_SAMP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 22 near ", c2) from t" +-- case +SELECT VAR_POP(`c1`),VAR_POP(`c1`),VAR_POP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 19 near ", c2) from t" +-- case +SELECT VAR_POP(`c1`),VAR_POP(`c1`),VAR_POP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 18 near ", c2) from t" +-- case +SELECT VAR_SAMP(`c1`),VAR_SAMP(`c1`),VAR_SAMP(DISTINCT `c1`) FROM `t` +-- case +-- error: line 1 column 19 near ", c2) from t" +-- case +SELECT JSON_ARRAYAGG(`c2`) FROM `t` GROUP BY `c1` +-- case +-- error: line 1 column 24 near ", c2) from t group by c1" +-- case +-- error: line 1 column 29 near "distinct c2) from t group by c1" +-- case +SELECT JSON_ARRAYAGG(`c2`) FROM `t` GROUP BY `c1` +-- case +SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1` +-- case +-- error: line 1 column 29 near ", c3) from t group by c1" +-- case +-- error: line 1 column 30 near "distinct c1, c2) from t group by c1" +-- case +-- error: line 1 column 34 near "distinct c2) from t group by c1" +-- case +-- error: line 1 column 30 near "distinct c1, distinct c2) from t group by c1" +-- case +SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1` +-- case +SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1` +-- case +SELECT JSON_OBJECTAGG(`c1`, `c2`) FROM `t` GROUP BY `c1` +-- case +SELECT AES_ENCRYPT(_UTF8MB4'text', UNHEX(_UTF8MB4'F3229A0B371ED2D9441B830D21A390C3')) +-- case +SELECT AES_DECRYPT(@`crypt_str`, @`key_str`) +-- case +SELECT AES_DECRYPT(@`crypt_str`, @`key_str`, @`init_vector`) +-- case +SELECT COMPRESS(_UTF8MB4'') +-- case +SELECT DECODE(@`crypt_str`, @`pass_str`) +-- case +SELECT DES_DECRYPT(@`crypt_str`),DES_DECRYPT(@`crypt_str`, @`key_str`) +-- case +SELECT DES_ENCRYPT(@`str`),DES_ENCRYPT(@`key_num`) +-- case +SELECT ENCODE(_UTF8MB4'cleartext', CONCAT(_UTF8MB4'my_random_salt', _UTF8MB4'my_secret_password')) +-- case +SELECT ENCRYPT(_UTF8MB4'hello'),ENCRYPT(_UTF8MB4'hello', @`salt`) +-- case +SELECT MD5(_UTF8MB4'testing') +-- case +SELECT OLD_PASSWORD(@`str`) +-- case +SELECT PASSWORD(@`str`) +-- case +SELECT RANDOM_BYTES(@`len`) +-- case +SELECT SHA1(_UTF8MB4'abc') +-- case +SELECT SHA(_UTF8MB4'abc') +-- case +SELECT SHA2(_UTF8MB4'abc', 224) +-- case +SELECT SM3(_UTF8MB4'abc') +-- case +SELECT UNCOMPRESS(_UTF8MB4'any string') +-- case +SELECT UNCOMPRESSED_LENGTH(@`compressed_string`) +-- case +SELECT VALIDATE_PASSWORD_STRENGTH(@`str`) +-- case +SELECT JSON_EXTRACT() +-- case +SELECT JSON_UNQUOTE() +-- case +SELECT JSON_TYPE(_UTF8MB4'[123]') +-- case +SELECT JSON_TYPE() +-- case +SELECT JSON_EXTRACT(`a`, _UTF8MB4'$.a') FROM `t` +-- case +SELECT JSON_UNQUOTE(JSON_EXTRACT(`a`, _UTF8MB4'$.a')) FROM `t` +-- case +-- error: line 1 column 13 near "->'$.a' FROM t" +-- case +-- error: line 1 column 14 near "->>'$.a' FROM t" +-- case +-- error: line 1 column 11 near "3 FROM t" +-- case +-- error: line 1 column 12 near "3 FROM t" +-- case +SELECT 1 MEMBER OF (`a`) +-- case +-- error: line 1 column 20 near "a" +-- case +-- error: line 1 column 17 near "a" +-- case +-- error: line 1 column 22 near "of a" +-- case +-- error: line 1 column 22 near "+1)" +-- case +SELECT CONCAT(_UTF8MB4'a') MEMBER OF (CAST(1 AS CHAR(1))) +-- case +SELECT UUID() +-- case +SELECT NEXTVAL(`seq`) +-- case +SELECT LASTVAL(`seq`) +-- case +SELECT SETVAL(`seq`, 100) +-- case +SELECT NEXTVAL(`seq`) +-- case +SELECT NEXTVAL(`sequence`) +-- case +SELECT NEXTVAL(`seQuEncE2`) +-- case +SELECT REGEXP_LIKE(_UTF8MB4'aBc', _UTF8MB4'abc', _UTF8MB4'im') +-- case +SELECT REGEXP_SUBSTR(_UTF8MB4'aBc', _UTF8MB4'abc', 1, 1, _UTF8MB4'im') +-- case +SELECT REGEXP_INSTR(_UTF8MB4'aBc', _UTF8MB4'abc', 1, 1, 0, _UTF8MB4'im') +-- case +SELECT REGEXP_REPLACE(_UTF8MB4'aBc', _UTF8MB4'abc', _UTF8MB4'def', 1, 1, _UTF8MB4'i') +-- case +SELECT _UTF8MB4'aBc' ILIKE _UTF8MB4'abc' diff --git a/parser/testdata/parser/builtin_2/input.sql b/parser/testdata/parser/builtin_2/input.sql new file mode 100644 index 0000000..b388b43 --- /dev/null +++ b/parser/testdata/parser/builtin_2/input.sql @@ -0,0 +1,14 @@ +-- flags: real_as_float +select cast(1 as float); +-- case +select cast(1 as float(0)); +-- case +select cast(1 as float(24)); +-- case +select cast(1 as float(25)); +-- case +select cast(1 as float(53)); +-- case +select cast(1 as float(54)); +-- case +select cast(1 as real); diff --git a/parser/testdata/parser/builtin_2/output.sql b/parser/testdata/parser/builtin_2/output.sql new file mode 100644 index 0000000..dc34c89 --- /dev/null +++ b/parser/testdata/parser/builtin_2/output.sql @@ -0,0 +1,13 @@ +SELECT CAST(1 AS FLOAT) +-- case +SELECT CAST(1 AS FLOAT) +-- case +SELECT CAST(1 AS FLOAT) +-- case +SELECT CAST(1 AS DOUBLE) +-- case +SELECT CAST(1 AS DOUBLE) +-- case +-- error: [parser:1426]Too-big precision 54 specified for 'CAST'. Maximum is 53. +-- case +SELECT CAST(1 AS FLOAT) diff --git a/parser/testdata/parser/change_replication_source/input.sql b/parser/testdata/parser/change_replication_source/input.sql new file mode 100644 index 0000000..f7762a3 --- /dev/null +++ b/parser/testdata/parser/change_replication_source/input.sql @@ -0,0 +1,23 @@ +change replication source to applier_version = 2 +-- case +CHANGE REPLICATION SOURCE TO APPLIER_VERSION = 1, APPLIER_WORKER_COUNT = 64, APPLIER_EVENT_MEMORY_LIMIT = 1073741824 FOR CHANNEL 'channel_1' +-- case +change replication source to source_host = 'replica.example.com', source_port = 3306 +-- case +change replication source to source_auto_position = 1 for channel 'group_replication_recovery' +-- case +change replication source to source_heartbeat_period = 60.5 +-- case +change replication source to +-- case +change replication source applier_version = 2 +-- case +change master to master_host = 'h' +-- case +change replication source to applier_version +-- case +change replication source to applier_version = 2, +-- case +change replication source to applier_version = 2 for channel +-- case +change replication source to for channel 'ch' diff --git a/parser/testdata/parser/change_replication_source/output.sql b/parser/testdata/parser/change_replication_source/output.sql new file mode 100644 index 0000000..d9ad8cb --- /dev/null +++ b/parser/testdata/parser/change_replication_source/output.sql @@ -0,0 +1,23 @@ +CHANGE REPLICATION SOURCE TO APPLIER_VERSION = 2 +-- case +CHANGE REPLICATION SOURCE TO APPLIER_VERSION = 1, APPLIER_WORKER_COUNT = 64, APPLIER_EVENT_MEMORY_LIMIT = 1073741824 FOR CHANNEL 'channel_1' +-- case +CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'replica.example.com', SOURCE_PORT = 3306 +-- case +CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 FOR CHANNEL 'group_replication_recovery' +-- case +CHANGE REPLICATION SOURCE TO SOURCE_HEARTBEAT_PERIOD = 60.5 +-- case +-- error: line 1 column 28 near "" +-- case +-- error: line 1 column 41 near "applier_version = 2" +-- case +-- error: line 1 column 13 near "master to master_host = 'h'" +-- case +-- error: line 1 column 44 near "" +-- case +-- error: line 1 column 49 near "" +-- case +-- error: line 1 column 60 near "" +-- case +-- error: line 1 column 32 near "for channel 'ch'" diff --git a/parser/testdata/parser/comment/input.sql b/parser/testdata/parser/comment/input.sql new file mode 100644 index 0000000..604ef98 --- /dev/null +++ b/parser/testdata/parser/comment/input.sql @@ -0,0 +1,45 @@ +create table t (c int comment 'comment') +-- case +create table t (c int) comment = 'comment' +-- case +create table t (c int) comment 'comment' +-- case +create table t (c int) comment comment +-- case +create table t (comment text) +-- case +START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */ +-- case +/*comment*/ /*comment*/ select c /* this is a comment */ from t; +-- case +delete from t where a = 7 or 1=1/*' and b = 'p' +-- case +create table t (ssl int) +-- case +create table t (require int) +-- case +create table t (account int) +-- case +create table t (expire int) +-- case +create table t (cipher int) +-- case +create table t (issuer int) +-- case +create table t (never int) +-- case +create table t (subject int) +-- case +create table t (x509 int) +-- case +create user commentUser COMMENT '123456' '{"name": "Tom", "age", 19} +-- case +alter user commentUser COMMENT '123456' '{"name": "Tom", "age", 19} +-- case +create user commentUser COMMENT '123456' +-- case +alter user commentUser COMMENT '123456' +-- case +create user commentUser ATTRIBUTE '{"name": "Tom", "age", 19}' +-- case +alter user commentUser ATTRIBUTE '{"name": "Tom", "age", 19}' diff --git a/parser/testdata/parser/comment/output.sql b/parser/testdata/parser/comment/output.sql new file mode 100644 index 0000000..0665912 --- /dev/null +++ b/parser/testdata/parser/comment/output.sql @@ -0,0 +1,45 @@ +CREATE TABLE `t` (`c` INT COMMENT 'comment') +-- case +CREATE TABLE `t` (`c` INT) COMMENT = 'comment' +-- case +CREATE TABLE `t` (`c` INT) COMMENT = 'comment' +-- case +-- error: line 1 column 38 near "comment" +-- case +CREATE TABLE `t` (`comment` TEXT) +-- case +START TRANSACTION +-- case +SELECT `c` FROM `t` +-- case +-- error: near '/*' and b = 'p'' at line 1 +-- case +-- error: line 1 column 19 near "ssl int)" +-- case +-- error: line 1 column 23 near "require int)" +-- case +CREATE TABLE `t` (`account` INT) +-- case +CREATE TABLE `t` (`expire` INT) +-- case +CREATE TABLE `t` (`cipher` INT) +-- case +CREATE TABLE `t` (`issuer` INT) +-- case +CREATE TABLE `t` (`never` INT) +-- case +CREATE TABLE `t` (`subject` INT) +-- case +CREATE TABLE `t` (`x509` INT) +-- case +-- error: line 1 column 68 near "'{"name": "Tom", "age", 19}" +-- case +-- error: line 1 column 67 near "'{"name": "Tom", "age", 19}" +-- case +CREATE USER `commentUser`@`%` COMMENT '123456' +-- case +ALTER USER `commentUser`@`%` COMMENT '123456' +-- case +CREATE USER `commentUser`@`%` ATTRIBUTE '{"name": "Tom", "age", 19}' +-- case +ALTER USER `commentUser`@`%` ATTRIBUTE '{"name": "Tom", "age", 19}' diff --git a/parser/testdata/parser/compat_maria_db/input.sql b/parser/testdata/parser/compat_maria_db/input.sql new file mode 100644 index 0000000..a040043 --- /dev/null +++ b/parser/testdata/parser/compat_maria_db/input.sql @@ -0,0 +1,11 @@ +CREATE TABLE t (id int PRIMARY KEY) PAGE_CHECKSUM=1 +-- case +CREATE TABLE t (id int PRIMARY KEY) PAGE_COMPRESSED=1 +-- case +CREATE TABLE t (id int PRIMARY KEY) PAGE_COMPRESSION_LEVEL=1 +-- case +CREATE TABLE t (id int PRIMARY KEY) TRANSACTIONAL=0 +-- case +CREATE TABLE t (id int PRIMARY KEY) IETF_QUOTES=YES +-- case +CREATE TABLE t (id int PRIMARY KEY) SEQUENCE=1 diff --git a/parser/testdata/parser/compat_maria_db/output.sql b/parser/testdata/parser/compat_maria_db/output.sql new file mode 100644 index 0000000..655b896 --- /dev/null +++ b/parser/testdata/parser/compat_maria_db/output.sql @@ -0,0 +1,11 @@ +CREATE TABLE `t` (`id` INT PRIMARY KEY) PAGE_CHECKSUM = 1 +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY) PAGE_COMPRESSED = 1 +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY) PAGE_COMPRESSION_LEVEL = 1 +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY) TRANSACTIONAL = 0 +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY) IETF_QUOTES = YES +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY) SEQUENCE = 1 diff --git a/parser/testdata/parser/compat_types/input.sql b/parser/testdata/parser/compat_types/input.sql new file mode 100644 index 0000000..1810b90 --- /dev/null +++ b/parser/testdata/parser/compat_types/input.sql @@ -0,0 +1,31 @@ +CREATE TABLE t(id INT PRIMARY KEY, c1 BOOL) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 BOOLEAN) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 CHARACTER VARYING(0)) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 FIXED) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 FLOAT4) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 FLOAT8) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 INT1) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 INT2) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 INT3) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 INT4) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 INT8) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 LONG VARBINARY) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 LONG VARCHAR) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 LONG) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 MIDDLEINT) +-- case +CREATE TABLE t(id INT PRIMARY KEY, c1 NUMERIC) diff --git a/parser/testdata/parser/compat_types/output.sql b/parser/testdata/parser/compat_types/output.sql new file mode 100644 index 0000000..959aeb1 --- /dev/null +++ b/parser/testdata/parser/compat_types/output.sql @@ -0,0 +1,31 @@ +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` TINYINT(1)) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` TINYINT(1)) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` VARCHAR(0)) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` DECIMAL) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` FLOAT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` DOUBLE) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` TINYINT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` SMALLINT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMINT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` INT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` BIGINT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMBLOB) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` MEDIUMINT) +-- case +CREATE TABLE `t` (`id` INT PRIMARY KEY,`c1` DECIMAL) diff --git a/parser/testdata/parser/cte/input.sql b/parser/testdata/parser/cte/input.sql new file mode 100644 index 0000000..73143d7 --- /dev/null +++ b/parser/testdata/parser/cte/input.sql @@ -0,0 +1,33 @@ +WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte; +-- case +WITH `cte` AS (SELECT 1,2), cte2 as (select 3) SELECT `col1`,`col2` FROM `cte` +-- case +WITH RECURSIVE cte (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte; +-- case +with cte(a) as (select 1) update t, cte set t.a=1 where t.a=cte.a; +-- case +with cte(a) as (select 1) delete t from t, cte where t.a=cte.a; +-- case +WITH cte1 AS (SELECT 1) SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt; +-- case +WITH cte AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte; +-- case +with cte as (table t) table cte; +-- case +with cte as (select 1) select 1 union with cte as (select 1) select * from cte; +-- case +with cte as (select 1) (select 1); +-- case +with cte as (select 1) (select 1 union select 1) +-- case +select * from (with cte as (select 1) select 1 union select 2) qn +-- case +select * from t where 1 > (with cte as (select 2) select * from cte) +-- case +( with cte(n) as ( select 1 ) select n+1 from cte union select n+2 from cte) union select 1 +-- case +( with cte(n) as ( select 1 ) select n+1 from cte) union select 1 +-- case +( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1 diff --git a/parser/testdata/parser/cte/output.sql b/parser/testdata/parser/cte/output.sql new file mode 100644 index 0000000..7508393 --- /dev/null +++ b/parser/testdata/parser/cte/output.sql @@ -0,0 +1,33 @@ +WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` AS (SELECT 1,2), `cte2` AS (SELECT 3) SELECT `col1`,`col2` FROM `cte` +-- case +WITH RECURSIVE `cte` (`n`) AS (SELECT 1 UNION ALL SELECT `n`+1 FROM `cte` WHERE `n`<5) SELECT * FROM `cte` +-- case +WITH `cte` (`a`) AS (SELECT 1) UPDATE (`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a`=`cte`.`a` +-- case +WITH `cte` (`a`) AS (SELECT 1) DELETE `t` FROM (`t`) JOIN `cte` WHERE `t`.`a`=`cte`.`a` +-- case +WITH `cte1` AS (SELECT 1) SELECT * FROM (WITH `cte2` AS (SELECT 2) SELECT * FROM `cte2` JOIN `cte1`) AS `dt` +-- case +WITH `cte` AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte` +-- case +WITH `cte` AS (TABLE `t`) TABLE `cte` +-- case +-- error: line 1 column 42 near "with cte as (select 1) select * from cte;" +-- case +WITH `cte` AS (SELECT 1) (SELECT 1) +-- case +WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT 1) +-- case +SELECT * FROM (WITH `cte` AS (SELECT 1) SELECT 1 UNION SELECT 2) AS `qn` +-- case +SELECT * FROM `t` WHERE 1>(WITH `cte` AS (SELECT 2) SELECT * FROM `cte`) +-- case +(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte` UNION SELECT `n`+2 FROM `cte`) UNION SELECT 1 +-- case +(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte`) UNION SELECT 1 +-- case +(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1 diff --git a/parser/testdata/parser/cte_merge/input.sql b/parser/testdata/parser/cte_merge/input.sql new file mode 100644 index 0000000..bcb3e25 --- /dev/null +++ b/parser/testdata/parser/cte_merge/input.sql @@ -0,0 +1,31 @@ +WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte; +-- case +WITH `cte` AS (SELECT 1,2), cte2 as (select 3) SELECT `col1`,`col2` FROM `cte` +-- case +with cte(a) as (select 1) update t, cte set t.a=1 where t.a=cte.a; +-- case +with cte(a) as (select 1) delete t from t, cte where t.a=cte.a; +-- case +WITH cte1 AS (SELECT 1) SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt; +-- case +WITH cte AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte; +-- case +with cte as (table t) table cte; +-- case +with cte as (select 1) select 1 union with cte as (select 1) select * from cte; +-- case +with cte as (select 1) (select 1); +-- case +with cte as (select 1) (select 1 union select 1) +-- case +select * from (with cte as (select 1) select 1 union select 2) qn +-- case +select * from t where 1 > (with cte as (select 2) select * from cte) +-- case +( with cte(n) as ( select 1 ) select n+1 from cte union select n+2 from cte) union select 1 +-- case +( with cte(n) as ( select 1 ) select n+1 from cte) union select 1 +-- case +( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1 diff --git a/parser/testdata/parser/cte_merge/output.sql b/parser/testdata/parser/cte_merge/output.sql new file mode 100644 index 0000000..ecb0505 --- /dev/null +++ b/parser/testdata/parser/cte_merge/output.sql @@ -0,0 +1,31 @@ +WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` AS (SELECT 1,2), `cte2` AS (SELECT 3) SELECT `col1`,`col2` FROM `cte` +-- case +WITH `cte` (`a`) AS (SELECT 1) UPDATE (`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a`=`cte`.`a` +-- case +WITH `cte` (`a`) AS (SELECT 1) DELETE `t` FROM (`t`) JOIN `cte` WHERE `t`.`a`=`cte`.`a` +-- case +WITH `cte1` AS (SELECT 1) SELECT * FROM (WITH `cte2` AS (SELECT 2) SELECT * FROM `cte2` JOIN `cte1`) AS `dt` +-- case +WITH `cte` AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte` +-- case +WITH `cte` AS (TABLE `t`) TABLE `cte` +-- case +-- error: line 1 column 42 near "with cte as (select 1) select * from cte;" +-- case +WITH `cte` AS (SELECT 1) (SELECT 1) +-- case +WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT 1) +-- case +SELECT * FROM (WITH `cte` AS (SELECT 1) SELECT 1 UNION SELECT 2) AS `qn` +-- case +SELECT * FROM `t` WHERE 1>(WITH `cte` AS (SELECT 2) SELECT * FROM `cte`) +-- case +(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte` UNION SELECT `n`+2 FROM `cte`) UNION SELECT 1 +-- case +(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte`) UNION SELECT 1 +-- case +(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1 diff --git a/parser/testdata/parser/dba_stmt/input.sql b/parser/testdata/parser/dba_stmt/input.sql new file mode 100644 index 0000000..4613c94 --- /dev/null +++ b/parser/testdata/parser/dba_stmt/input.sql @@ -0,0 +1,433 @@ +SHOW VARIABLES LIKE 'character_set_results' +-- case +SHOW GLOBAL VARIABLES LIKE 'character_set_results' +-- case +SHOW SESSION VARIABLES LIKE 'character_set_results' +-- case +SHOW VARIABLES +-- case +SHOW GLOBAL VARIABLES +-- case +SHOW GLOBAL VARIABLES WHERE Variable_name = 'autocommit' +-- case +SHOW STATUS +-- case +SHOW GLOBAL STATUS +-- case +SHOW SESSION STATUS +-- case +SHOW STATUS LIKE 'Up%' +-- case +SHOW STATUS WHERE Variable_name +-- case +SHOW STATUS WHERE Variable_name LIKE 'Up%' +-- case +SHOW FULL TABLES FROM icar_qa LIKE play_evolutions +-- case +SHOW FULL TABLES WHERE Table_Type != 'VIEW' +-- case +SHOW GRANTS +-- case +SHOW GRANTS FOR 'test'@'localhost' +-- case +SHOW GRANTS FOR 'test'@'LOCALHOST' +-- case +SHOW GRANTS FOR current_user() +-- case +SHOW GRANTS FOR current_user +-- case +SHOW GRANTS FOR 'u1'@'localhost' USING 'r1' +-- case +SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2' +-- case +SHOW COLUMNS FROM City; +-- case +SHOW COLUMNS FROM tv189.1_t_1_x; +-- case +SHOW FIELDS FROM City; +-- case +SHOW TRIGGERS LIKE 't' +-- case +SHOW DATABASES LIKE 'test2' +-- case +SHOW PROCEDURE STATUS WHERE Db='test' +-- case +SHOW FUNCTION STATUS WHERE Db='test' +-- case +SHOW INDEX FROM t; +-- case +SHOW KEYS FROM t; +-- case +SHOW INDEX IN t; +-- case +SHOW KEYS IN t; +-- case +SHOW INDEXES IN t where true; +-- case +SHOW KEYS FROM t FROM test where true; +-- case +SHOW EVENTS FROM test_db WHERE definer = 'current_user' +-- case +SHOW PLUGINS +-- case +SHOW PROFILES +-- case +SHOW PROFILE +-- case +SHOW PROFILE FOR QUERY 1 +-- case +SHOW PROFILE CPU FOR QUERY 2 +-- case +SHOW PROFILE CPU FOR QUERY 2 LIMIT 1,1 +-- case +SHOW PROFILE CPU, MEMORY, BLOCK IO, CONTEXT SWITCHES, PAGE FAULTS, IPC, SWAPS, SOURCE FOR QUERY 1 limit 100 +-- case +SHOW MASTER STATUS +-- case +SHOW BINARY LOG STATUS +-- case +SHOW PRIVILEGES +-- case +show character set; +-- case +show charset +-- case +show collation +-- case +show collation like 'utf8%' +-- case +show collation where Charset = 'utf8' and Collation = 'utf8_bin' +-- case +show columns in t; +-- case +show full columns in t; +-- case +SHOW COLUMNS FROM City; +-- case +SHOW EXTENDED COLUMNS FROM City; +-- case +SHOW EXTENDED FIELDS FROM City; +-- case +SHOW EXTENDED FULL COLUMNS FROM City; +-- case +SHOW EXTENDED FULL FIELDS FROM City; +-- case +show create table test.t +-- case +show create table t +-- case +show create view test.t +-- case +show create view t +-- case +show create database d1 +-- case +show create database if not exists d1 +-- case +show create sequence seq +-- case +show create sequence test.seq +-- case +show stats_extended +-- case +show stats_extended where table_name = 't' +-- case +show stats_meta +-- case +show stats_meta where table_name = 't' +-- case +show stats_locked +-- case +show stats_locked where table_name = 't' +-- case +show stats_histograms +-- case +show stats_histograms where col_name = 'a' +-- case +show stats_buckets +-- case +show stats_buckets where col_name = 'a' +-- case +show stats_healthy +-- case +show stats_healthy where table_name = 't' +-- case +show stats_topn +-- case +show stats_topn where table_name = 't' +-- case +show histograms_in_flight +-- case +show column_stats_usage +-- case +show column_stats_usage where table_name = 't' +-- case +show binding_cache status +-- case +show analyze status +-- case +show analyze status where table_name = 't' +-- case +show analyze status where table_name like '%' +-- case +show builtins +-- case +show backups +-- case +show restores like 'r0001' +-- case +show backups where start_time > now() - interval 10 hour +-- case +show backup +-- case +show restore +-- case +show replica status +-- case +show slave status +-- case +load stats '/tmp/stats.json' +-- case +lock stats test.t +-- case +lock stats t, t2 +-- case +lock stats t partition (p0, p1) +-- case +unlock stats test.t +-- case +unlock stats t, t2 +-- case +unlock stats t partition (p0, p1) +-- case +SET @ = 1 +-- case +SET @' ' = 1 +-- case +SET @! = 1 +-- case +SET @1 = 1 +-- case +SET @a = 1 +-- case +SET @b := 1 +-- case +SET @.c = 1 +-- case +SET @_d = 1 +-- case +SET @_e._$. = 1 +-- case +SET @~f = 1 +-- case +SET @`g,` = 1 +-- case +SET +-- case +SET @a = 1, @b := 2 +-- case +SET SESSION autocommit = 1 +-- case +SET @@session.autocommit = 1 +-- case +SET @@SESSION.autocommit = 1 +-- case +SET @@GLOBAL.GTID_PURGED = '123' +-- case +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN +-- case +SET LOCAL autocommit = 1 +-- case +SET @@local.autocommit = 1 +-- case +SET @@autocommit = 1 +-- case +SET autocommit = 1 +-- case +SET GLOBAL autocommit = 1 +-- case +SET @@global.autocommit = 1 +-- case +SET autocommit := 1 +-- case +SET @@session.autocommit := 1 +-- case +SET @MYSQLDUMP_TEMP_LOG_BIN := @@SESSION.SQL_LOG_BIN +-- case +SET LOCAL autocommit := 1 +-- case +SET @@global.autocommit := default +-- case +SET @@global.autocommit = default +-- case +SET @@session.autocommit = default +-- case +SET @@character_set_results = binary +-- case +SET CHARACTER SET utf8mb4; +-- case +SET CHARACTER SET 'utf8mb4'; +-- case +SET PASSWORD = 'password'; +-- case +SET PASSWORD FOR 'root'@'localhost' = 'password'; +-- case +SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ +-- case +SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ +-- case +SET SESSION TRANSACTION READ WRITE +-- case +SET SESSION TRANSACTION READ ONLY +-- case +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED +-- case +SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED +-- case +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE +-- case +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ +-- case +SET TRANSACTION READ WRITE +-- case +SET TRANSACTION READ ONLY +-- case +SET TRANSACTION ISOLATION LEVEL READ COMMITTED +-- case +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED +-- case +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE +-- case +set names utf8 +-- case +set names utf8 collate utf8_unicode_ci +-- case +set names binary +-- case +set names default +-- case +set character set default +-- case +set charset default +-- case +set char set default +-- case +set role `role1` +-- case +SET ROLE DEFAULT +-- case +SET ROLE ALL +-- case +SET ROLE ALL EXCEPT `role1`, `role2` +-- case +SET DEFAULT ROLE administrator, developer TO `joe`@`10.0.0.1` +-- case +set names utf8, @@session.sql_mode=1; +-- case +set @@session.sql_mode=1, names utf8, charset utf8; +-- case +set config TIKV LOG.LEVEL='info' +-- case +set config PD LOG.LEVEL='info' +-- case +set config TIDB LOG.LEVEL='info' +-- case +set config '127.0.0.1:3306' LOG.LEVEL='info' +-- case +set config '127.0.0.1:3306' AUTO-COMPACTION-MODE=TRUE +-- case +set config '127.0.0.1:3306' LABEL-PROPERTY.REJECT-LEADER.KEY='zone' +-- case +show config +-- case +show config where type='tidb' +-- case +show config where instance='127.0.0.1:3306' +-- case +create table CONFIG (a int) +-- case +flush no_write_to_binlog tables tbl1 with read lock +-- case +flush table +-- case +flush tables +-- case +flush tables tbl1 +-- case +flush no_write_to_binlog tables tbl1 +-- case +flush local tables tbl1 +-- case +flush table with read lock +-- case +flush tables tbl1, tbl2, tbl3 +-- case +flush tables tbl1, tbl2, tbl3 with read lock +-- case +flush privileges +-- case +flush status +-- case +flush tidb plugins plugin1 +-- case +flush tidb plugins plugin1, plugin2 +-- case +flush hosts +-- case +flush logs +-- case +flush binary logs +-- case +flush engine logs +-- case +flush error logs +-- case +flush general logs +-- case +flush slow logs +-- case +flush client_errors_summary +-- case +flush stats_delta +-- case +flush stats_delta cluster +-- case +flush stats_delta cluster cluster +-- case +flush stats_delta *.* +-- case +flush stats_delta *.* cluster +-- case +flush stats_delta db1.* +-- case +flush stats_delta db1.* cluster +-- case +flush stats_delta t1 +-- case +flush stats_delta db1.t1 +-- case +flush stats_delta db1.t1 cluster +-- case +flush stats_delta db1.t1, db2.* +-- case +flush stats_delta db1.t1, db2.* cluster +-- case +call +-- case +call test +-- case +call test() +-- case +call test(1, 'test', true) +-- case +call x.y; +-- case +call x.y(); +-- case +call x.y('p', 'q', 'r'); +-- case +call `x`.`y`; +-- case +call `x`.`y`(); +-- case +call `x`.`y`('p', 'q', 'r'); diff --git a/parser/testdata/parser/dba_stmt/output.sql b/parser/testdata/parser/dba_stmt/output.sql new file mode 100644 index 0000000..7d48d68 --- /dev/null +++ b/parser/testdata/parser/dba_stmt/output.sql @@ -0,0 +1,433 @@ +SHOW SESSION VARIABLES LIKE _UTF8MB4'character_set_results' +-- case +SHOW GLOBAL VARIABLES LIKE _UTF8MB4'character_set_results' +-- case +SHOW SESSION VARIABLES LIKE _UTF8MB4'character_set_results' +-- case +SHOW SESSION VARIABLES +-- case +SHOW GLOBAL VARIABLES +-- case +SHOW GLOBAL VARIABLES WHERE `Variable_name`=_UTF8MB4'autocommit' +-- case +SHOW SESSION STATUS +-- case +SHOW GLOBAL STATUS +-- case +SHOW SESSION STATUS +-- case +SHOW SESSION STATUS LIKE _UTF8MB4'Up%' +-- case +SHOW SESSION STATUS WHERE `Variable_name` +-- case +SHOW SESSION STATUS WHERE `Variable_name` LIKE _UTF8MB4'Up%' +-- case +SHOW FULL TABLES IN `icar_qa` LIKE `play_evolutions` +-- case +SHOW FULL TABLES WHERE `Table_Type`!=_UTF8MB4'VIEW' +-- case +SHOW GRANTS +-- case +SHOW GRANTS FOR `test`@`localhost` +-- case +SHOW GRANTS FOR `test`@`localhost` +-- case +SHOW GRANTS FOR CURRENT_USER +-- case +SHOW GRANTS FOR CURRENT_USER +-- case +SHOW GRANTS FOR `u1`@`localhost` USING `r1`@`%` +-- case +SHOW GRANTS FOR `u1`@`localhost` USING `r1`@`%`, `r2`@`%` +-- case +SHOW COLUMNS IN `City` +-- case +SHOW COLUMNS IN `tv189`.`1_t_1_x` +-- case +SHOW COLUMNS IN `City` +-- case +SHOW TRIGGERS LIKE _UTF8MB4't' +-- case +SHOW DATABASES LIKE _UTF8MB4'test2' +-- case +SHOW PROCEDURE STATUS WHERE `Db`=_UTF8MB4'test' +-- case +SHOW FUNCTION STATUS WHERE `Db`=_UTF8MB4'test' +-- case +SHOW INDEX IN `t` +-- case +SHOW INDEX IN `t` +-- case +SHOW INDEX IN `t` +-- case +SHOW INDEX IN `t` +-- case +SHOW INDEX IN `t` WHERE TRUE +-- case +SHOW INDEX IN `test`.`t` WHERE TRUE +-- case +SHOW EVENTS IN `test_db` WHERE `definer`=_UTF8MB4'current_user' +-- case +SHOW PLUGINS +-- case +SHOW PROFILES +-- case +SHOW PROFILE +-- case +SHOW PROFILE FOR QUERY 1 +-- case +SHOW PROFILE CPU FOR QUERY 2 +-- case +SHOW PROFILE CPU FOR QUERY 2 LIMIT 1,1 +-- case +SHOW PROFILE CPU, MEMORY, BLOCK IO, CONTEXT SWITCHES, PAGE FAULTS, IPC, SWAPS, SOURCE FOR QUERY 1 LIMIT 100 +-- case +SHOW MASTER STATUS +-- case +SHOW BINARY LOG STATUS +-- case +SHOW PRIVILEGES +-- case +SHOW CHARSET +-- case +SHOW CHARSET +-- case +SHOW COLLATION +-- case +SHOW COLLATION LIKE _UTF8MB4'utf8%' +-- case +SHOW COLLATION WHERE `Charset`=_UTF8MB4'utf8' AND `Collation`=_UTF8MB4'utf8_bin' +-- case +SHOW COLUMNS IN `t` +-- case +SHOW FULL COLUMNS IN `t` +-- case +SHOW COLUMNS IN `City` +-- case +SHOW EXTENDED COLUMNS IN `City` +-- case +SHOW EXTENDED COLUMNS IN `City` +-- case +SHOW EXTENDED FULL COLUMNS IN `City` +-- case +SHOW EXTENDED FULL COLUMNS IN `City` +-- case +SHOW CREATE TABLE `test`.`t` +-- case +SHOW CREATE TABLE `t` +-- case +SHOW CREATE VIEW `test`.`t` +-- case +SHOW CREATE VIEW `t` +-- case +SHOW CREATE DATABASE `d1` +-- case +SHOW CREATE DATABASE IF NOT EXISTS `d1` +-- case +SHOW CREATE SEQUENCE `seq` +-- case +SHOW CREATE SEQUENCE `test`.`seq` +-- case +SHOW STATS_EXTENDED +-- case +SHOW STATS_EXTENDED WHERE `table_name`=_UTF8MB4't' +-- case +SHOW STATS_META +-- case +SHOW STATS_META WHERE `table_name`=_UTF8MB4't' +-- case +SHOW STATS_LOCKED +-- case +SHOW STATS_LOCKED WHERE `table_name`=_UTF8MB4't' +-- case +SHOW STATS_HISTOGRAMS +-- case +SHOW STATS_HISTOGRAMS WHERE `col_name`=_UTF8MB4'a' +-- case +SHOW STATS_BUCKETS +-- case +SHOW STATS_BUCKETS WHERE `col_name`=_UTF8MB4'a' +-- case +SHOW STATS_HEALTHY +-- case +SHOW STATS_HEALTHY WHERE `table_name`=_UTF8MB4't' +-- case +SHOW STATS_TOPN +-- case +SHOW STATS_TOPN WHERE `table_name`=_UTF8MB4't' +-- case +SHOW HISTOGRAMS_IN_FLIGHT +-- case +SHOW COLUMN_STATS_USAGE +-- case +SHOW COLUMN_STATS_USAGE WHERE `table_name`=_UTF8MB4't' +-- case +SHOW BINDING_CACHE STATUS +-- case +SHOW ANALYZE STATUS +-- case +SHOW ANALYZE STATUS WHERE `table_name`=_UTF8MB4't' +-- case +SHOW ANALYZE STATUS WHERE `table_name` LIKE _UTF8MB4'%' +-- case +SHOW BUILTINS +-- case +SHOW BACKUPS +-- case +SHOW RESTORES LIKE _UTF8MB4'r0001' +-- case +SHOW BACKUPS WHERE `start_time`>DATE_SUB(NOW(), INTERVAL 10 HOUR) +-- case +-- error: line 1 column 11 near "" +-- case +-- error: line 1 column 12 near "restore" +-- case +SHOW REPLICA STATUS +-- case +SHOW REPLICA STATUS +-- case +LOAD STATS '/tmp/stats.json' +-- case +LOCK STATS `test`.`t` +-- case +LOCK STATS `t`, `t2` +-- case +LOCK STATS `t` PARTITION(`p0`, `p1`) +-- case +UNLOCK STATS `test`.`t` +-- case +UNLOCK STATS `t`, `t2` +-- case +UNLOCK STATS `t` PARTITION(`p0`, `p1`) +-- case +SET @``=1 +-- case +SET @` `=1 +-- case +-- error: line 1 column 6 near "! = 1" +-- case +SET @`1`=1 +-- case +SET @`a`=1 +-- case +SET @`b`=1 +-- case +SET @`.c`=1 +-- case +SET @`_d`=1 +-- case +SET @`_e._$.`=1 +-- case +-- error: line 1 column 6 near "~f = 1" +-- case +SET @`g,`=1 +-- case +-- error: line 1 column 3 near "" +-- case +SET @`a`=1, @`b`=2 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@GLOBAL.`gtid_purged`=_UTF8MB4'123' +-- case +SET @`MYSQLDUMP_TEMP_LOG_BIN`=@@SESSION.`sql_log_bin` +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@GLOBAL.`autocommit`=1 +-- case +SET @@GLOBAL.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @`MYSQLDUMP_TEMP_LOG_BIN`=@@SESSION.`sql_log_bin` +-- case +SET @@SESSION.`autocommit`=1 +-- case +SET @@GLOBAL.`autocommit`=DEFAULT +-- case +SET @@GLOBAL.`autocommit`=DEFAULT +-- case +SET @@SESSION.`autocommit`=DEFAULT +-- case +SET @@SESSION.`character_set_results`=_UTF8MB4'BINARY' +-- case +SET CHARSET 'utf8mb4' +-- case +SET CHARSET 'utf8mb4' +-- case +SET PASSWORD='password' +-- case +SET PASSWORD FOR `root`@`localhost`='password' +-- case +SET @@SESSION.`tx_isolation`=_UTF8MB4'REPEATABLE-READ' +-- case +SET @@GLOBAL.`tx_isolation`=_UTF8MB4'REPEATABLE-READ' +-- case +SET @@SESSION.`tx_read_only`=_UTF8MB4'0' +-- case +SET @@SESSION.`tx_read_only`=_UTF8MB4'1' +-- case +SET @@SESSION.`tx_isolation`=_UTF8MB4'READ-COMMITTED' +-- case +SET @@SESSION.`tx_isolation`=_UTF8MB4'READ-UNCOMMITTED' +-- case +SET @@SESSION.`tx_isolation`=_UTF8MB4'SERIALIZABLE' +-- case +SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'REPEATABLE-READ' +-- case +SET @@SESSION.`tx_read_only`=_UTF8MB4'0' +-- case +SET @@SESSION.`tx_read_only`=_UTF8MB4'1' +-- case +SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'READ-COMMITTED' +-- case +SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'READ-UNCOMMITTED' +-- case +SET @@SESSION.`tx_isolation_one_shot`=_UTF8MB4'SERIALIZABLE' +-- case +SET NAMES 'utf8' +-- case +SET NAMES 'utf8' COLLATE 'utf8_unicode_ci' +-- case +SET NAMES 'binary' +-- case +SET NAMES DEFAULT +-- case +SET CHARSET DEFAULT +-- case +SET CHARSET DEFAULT +-- case +SET CHARSET DEFAULT +-- case +SET ROLE `role1`@`%` +-- case +SET ROLE DEFAULT +-- case +SET ROLE ALL +-- case +SET ROLE ALL EXCEPT `role1`@`%`, `role2`@`%` +-- case +SET DEFAULT ROLE `administrator`@`%`, `developer`@`%` TO `joe`@`10.0.0.1` +-- case +SET NAMES 'utf8', @@SESSION.`sql_mode`=1 +-- case +SET @@SESSION.`sql_mode`=1, NAMES 'utf8', CHARSET 'utf8' +-- case +SET CONFIG TIKV LOG.LEVEL = _UTF8MB4'info' +-- case +SET CONFIG PD LOG.LEVEL = _UTF8MB4'info' +-- case +SET CONFIG TIDB LOG.LEVEL = _UTF8MB4'info' +-- case +SET CONFIG '127.0.0.1:3306' LOG.LEVEL = _UTF8MB4'info' +-- case +SET CONFIG '127.0.0.1:3306' AUTO-COMPACTION-MODE = TRUE +-- case +SET CONFIG '127.0.0.1:3306' LABEL-PROPERTY.REJECT-LEADER.KEY = _UTF8MB4'zone' +-- case +SHOW CONFIG +-- case +SHOW CONFIG WHERE `type`=_UTF8MB4'tidb' +-- case +SHOW CONFIG WHERE `instance`=_UTF8MB4'127.0.0.1:3306' +-- case +CREATE TABLE `CONFIG` (`a` INT) +-- case +FLUSH NO_WRITE_TO_BINLOG TABLES `tbl1` WITH READ LOCK +-- case +FLUSH TABLES +-- case +FLUSH TABLES +-- case +FLUSH TABLES `tbl1` +-- case +FLUSH NO_WRITE_TO_BINLOG TABLES `tbl1` +-- case +FLUSH NO_WRITE_TO_BINLOG TABLES `tbl1` +-- case +FLUSH TABLES WITH READ LOCK +-- case +FLUSH TABLES `tbl1`, `tbl2`, `tbl3` +-- case +FLUSH TABLES `tbl1`, `tbl2`, `tbl3` WITH READ LOCK +-- case +FLUSH PRIVILEGES +-- case +FLUSH STATUS +-- case +FLUSH TIDB PLUGINS plugin1 +-- case +FLUSH TIDB PLUGINS plugin1, plugin2 +-- case +FLUSH HOSTS +-- case +FLUSH LOGS +-- case +FLUSH BINARY LOGS +-- case +FLUSH ENGINE LOGS +-- case +FLUSH ERROR LOGS +-- case +FLUSH GENERAL LOGS +-- case +FLUSH SLOW LOGS +-- case +FLUSH CLIENT_ERRORS_SUMMARY +-- case +-- error: line 1 column 17 near "" +-- case +FLUSH STATS_DELTA `cluster` +-- case +FLUSH STATS_DELTA `cluster` CLUSTER +-- case +FLUSH STATS_DELTA *.* +-- case +FLUSH STATS_DELTA *.* CLUSTER +-- case +FLUSH STATS_DELTA `db1`.* +-- case +FLUSH STATS_DELTA `db1`.* CLUSTER +-- case +FLUSH STATS_DELTA `t1` +-- case +FLUSH STATS_DELTA `db1`.`t1` +-- case +FLUSH STATS_DELTA `db1`.`t1` CLUSTER +-- case +FLUSH STATS_DELTA `db1`.`t1`, `db2`.* +-- case +FLUSH STATS_DELTA `db1`.`t1`, `db2`.* CLUSTER +-- case +-- error: line 1 column 5 near "" +-- case +CALL `test`() +-- case +CALL `test`() +-- case +CALL `test`(1, _UTF8MB4'test', TRUE) +-- case +CALL `x`.`y`() +-- case +CALL `x`.`y`() +-- case +CALL `x`.`y`(_UTF8MB4'p', _UTF8MB4'q', _UTF8MB4'r') +-- case +CALL `x`.`y`() +-- case +CALL `x`.`y`() +-- case +CALL `x`.`y`(_UTF8MB4'p', _UTF8MB4'q', _UTF8MB4'r') diff --git a/parser/testdata/parser/ddl/input.sql b/parser/testdata/parser/ddl/input.sql new file mode 100644 index 0000000..1a48e6b --- /dev/null +++ b/parser/testdata/parser/ddl/input.sql @@ -0,0 +1,2867 @@ +CREATE +-- case +CREATE TABLE +-- case +CREATE TABLE foo ( +-- case +CREATE TABLE foo () +-- case +CREATE TABLE foo (); +-- case +CREATE TABLE foo.* (a varchar(50), b int); +-- case +CREATE TABLE foo (a varchar(50), b int); +-- case +CREATE TABLE foo (a TINYINT UNSIGNED); +-- case +CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) +-- case +CREATE TABLE foo (a bigint unsigned, b bool); +-- case +CREATE TABLE foo (a TINYINT, b SMALLINT) CREATE TABLE bar (x INT, y int64) +-- case +CREATE TABLE foo (a int, b float); CREATE TABLE bar (x double, y float) +-- case +CREATE TABLE foo (a bytes) +-- case +CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) +-- case +CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) -- foo +-- case +CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) // foo +-- case +CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */ +-- case +CREATE TABLE foo /* foo */ (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */ +-- case +CREATE TABLE foo (name CHAR(50) BINARY); +-- case +CREATE TABLE foo (name CHAR(50) COLLATE utf8_bin) +-- case +CREATE TABLE foo (id varchar(50) collate utf8_bin); +-- case +CREATE TABLE foo (name CHAR(50) CHARACTER SET UTF8) +-- case +CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY) +-- case +CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY CHARACTER set utf8) +-- case +CREATE TABLE foo (name CHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin) +-- case +CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 COLLATE utf8_bin COLLATE ascii_bin) +-- case +CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin COLLATE latin1_bin) +-- case +CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin PRIMARY KEY COLLATE latin1_bin) +-- case +CREATE TABLE foo (a.b, b); +-- case +CREATE TABLE foo (a, b.c); +-- case +CREATE TABLE (name CHAR(50) BINARY) +-- case +CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin PRIMARY KEY COLLATE latin1_bin, INDEX (name ASC)) +-- case +CREATE TABLE foo (name CHAR(50) COLLATE ascii_bin PRIMARY KEY COLLATE latin1_bin, INDEX (name DESC)) +-- case +ALTER TABLE tmp CACHE +-- case +ALTER TABLE tmp NOCACHE +-- case +CREATE TEMPORARY TABLE t (a varchar(50), b int); +-- case +CREATE TEMPORARY TABLE t LIKE t1 +-- case +DROP TEMPORARY TABLE t +-- case +create global temporary table t (a int, b varchar(255)) on commit delete rows +-- case +create temporary table t (a int, b varchar(255)) +-- case +create global temporary table t (a int, b varchar(255)) +-- case +create temporary table t (a int, b varchar(255)) on commit delete rows +-- case +create table t (a int, b varchar(255)) on commit delete rows +-- case +create global temporary table t (a int, b varchar(255)) partition by hash(a) partitions 10 on commit delete rows +-- case +create global temporary table t (a int, b varchar(255)) on commit preserve rows +-- case +drop global temporary table t +-- case +drop temporary table t +-- case +CREATE TABLE foo (node_id varchar(50), b int); +-- case +CREATE TABLE foo (node_state varchar(50), b int); +-- case +create table t (c int) avg_row_length = 3 +-- case +create table t (c int) avg_row_length 3 +-- case +create table t (c int) checksum = 0 +-- case +create table t (c int) checksum 1 +-- case +create table t (c int) table_checksum = 0 +-- case +create table t (c int) table_checksum 1 +-- case +create table t (c int) compression = 'NONE' +-- case +create table t (c int) compression 'lz4' +-- case +create table t (c int) connection = 'abc' +-- case +create table t (c int) connection 'abc' +-- case +create table t (c int) key_block_size = 1024 +-- case +create table t (c int) key_block_size 1024 +-- case +create table t (c int) max_rows = 1000 +-- case +create table t (c int) max_rows 1000 +-- case +create table t (c int) min_rows = 1000 +-- case +create table t (c int) min_rows 1000 +-- case +create table t (c int) password = 'abc' +-- case +create table t (c int) password 'abc' +-- case +create table t (c int) DELAY_KEY_WRITE=1 +-- case +create table t (c int) DELAY_KEY_WRITE 1 +-- case +create table t (c int) ROW_FORMAT = default +-- case +create table t (c int) ROW_FORMAT default +-- case +create table t (c int) ROW_FORMAT = fixed +-- case +create table t (c int) ROW_FORMAT = compressed +-- case +create table t (c int) ROW_FORMAT = compact +-- case +create table t (c int) ROW_FORMAT = redundant +-- case +create table t (c int) ROW_FORMAT = dynamic +-- case +create table t (c int) STATS_PERSISTENT = default +-- case +create table t (c int) STATS_PERSISTENT = 0 +-- case +create table t (c int) STATS_PERSISTENT = 1 +-- case +create table t (c int) STATS_SAMPLE_PAGES 0 +-- case +create table t (c int) STATS_SAMPLE_PAGES 10 +-- case +create table t (c int) STATS_SAMPLE_PAGES = 10 +-- case +create table t (c int) STATS_SAMPLE_PAGES = default +-- case +create table t (c int) PACK_KEYS = 1 +-- case +create table t (c int) PACK_KEYS = 0 +-- case +create table t (c int) PACK_KEYS = DEFAULT +-- case +create table t (c int) STORAGE DISK +-- case +create table t (c int) STORAGE MEMORY +-- case +create table t (c int) SECONDARY_ENGINE null +-- case +create table t (c int) SECONDARY_ENGINE = innodb +-- case +create table t (c int) SECONDARY_ENGINE 'null' +-- case +create table testTableCompression (c VARCHAR(15000)) compression="ZLIB"; +-- case +create table t1 (c1 int) compression="zlib"; +-- case +create table t1 (c1 int) collate=binary; +-- case +create table t1 (c1 int) collate=utf8mb4_0900_as_cs; +-- case +create table t1 (c1 int) default charset=binary collate=binary; +-- case +create table t1 (c1 int) autoextend_size=4M +-- case +ALTER TABLE t_n UNION ( ), KEY_BLOCK_SIZE = 1 +-- case +ALTER TABLE d_n.t_n UNION ( t_n ) REMOVE PARTITIONING +-- case +ALTER TABLE d_n.t_n LOCK DEFAULT , UNION = ( t_n , d_n.t_n ) REMOVE PARTITIONING +-- case +ALTER TABLE d_n.t_n ALGORITHM = DEFAULT , MAX_ROWS 10, UNION ( d_n.t_n ) , ROW_FORMAT REDUNDANT, STATS_PERSISTENT = DEFAULT +-- case +create table t (b int) partition by range columns (b) (partition p0 values less than (not 3), partition p2 values less than (20)); +-- case +create table t (b int) partition by range columns (b) (partition p0 values less than (1 or 3), partition p2 values less than (20)); +-- case +create table t (b int) partition by range columns (b) (partition p0 values less than (3 is null), partition p2 values less than (20)); +-- case +create table t (b int) partition by range (b is null) (partition p0 values less than (10)); +-- case +create table t (b int) partition by list (not b) (partition p0 values in (10, 20)); +-- case +create table t (b int) partition by hash ( not b ); +-- case +create table t (b int) partition by range columns (b) (partition p0 values less than (3 in (3, 4, 5)), partition p2 values less than (20)); +-- case +CREATE TABLE t (id int) ENGINE = INNDB PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20)); +-- case +create table t (c int) PARTITION BY HASH (c) PARTITIONS 32; +-- case +create table t (c int) PARTITION BY HASH (Year(VDate)) (PARTITION p1980 VALUES LESS THAN (1980) ENGINE = MyISAM, PARTITION p1990 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION pothers VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +-- case +create table t (c int) PARTITION BY RANGE (Year(VDate)) (PARTITION p1980 VALUES LESS THAN (1980) ENGINE = MyISAM, PARTITION p1990 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION pothers VALUES LESS THAN MAXVALUE ENGINE = MyISAM) +-- case +create table t (c int, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '') PARTITION BY RANGE (UNIX_TIMESTAMP(create_time)) (PARTITION p201610 VALUES LESS THAN(1477929600), PARTITION p201611 VALUES LESS THAN(1480521600),PARTITION p201612 VALUES LESS THAN(1483200000),PARTITION p201701 VALUES LESS THAN(1485878400),PARTITION p201702 VALUES LESS THAN(1488297600),PARTITION p201703 VALUES LESS THAN(1490976000)) +-- case +CREATE TABLE `md_product_shop` (`shopCode` varchar(4) DEFAULT NULL COMMENT '地点') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*!50100 PARTITION BY KEY (shopCode) PARTITIONS 19 */; +-- case +CREATE TABLE `payinfo1` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `oderTime` datetime NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=641533032 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 /*!50500 PARTITION BY RANGE COLUMNS(oderTime) (PARTITION P2011 VALUES LESS THAN ('2012-01-01 00:00:00') ENGINE = InnoDB, PARTITION P1201 VALUES LESS THAN ('2012-02-01 00:00:00') ENGINE = InnoDB, PARTITION PMAX VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)*/; +-- case +CREATE TABLE app_channel_daily_report (id bigint(20) NOT NULL AUTO_INCREMENT, app_version varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'default', gmt_create datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=33703438 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci +/*!50100 PARTITION BY RANGE (month(gmt_create)-1) +(PARTITION part0 VALUES LESS THAN (1) COMMENT = '1月份' ENGINE = InnoDB, + PARTITION part1 VALUES LESS THAN (2) COMMENT = '2月份' ENGINE = InnoDB, + PARTITION part2 VALUES LESS THAN (3) COMMENT = '3月份' ENGINE = InnoDB, + PARTITION part3 VALUES LESS THAN (4) COMMENT = '4月份' ENGINE = InnoDB, + PARTITION part4 VALUES LESS THAN (5) COMMENT = '5月份' ENGINE = InnoDB, + PARTITION part5 VALUES LESS THAN (6) COMMENT = '6月份' ENGINE = InnoDB, + PARTITION part6 VALUES LESS THAN (7) COMMENT = '7月份' ENGINE = InnoDB, + PARTITION part7 VALUES LESS THAN (8) COMMENT = '8月份' ENGINE = InnoDB, + PARTITION part8 VALUES LESS THAN (9) COMMENT = '9月份' ENGINE = InnoDB, + PARTITION part9 VALUES LESS THAN (10) COMMENT = '10月份' ENGINE = InnoDB, + PARTITION part10 VALUES LESS THAN (11) COMMENT = '11月份' ENGINE = InnoDB, + PARTITION part11 VALUES LESS THAN (12) COMMENT = '12月份' ENGINE = InnoDB) */ ; +-- case +create table t (c int) primary_region="us"; +-- case +create table t (c int) regions="us,3"; +-- case +create table t (c int) followers="us,3"; +-- case +create table t (c int) followers=3; +-- case +create table t (c int) followers=0; +-- case +create table t (c int) voters=3; +-- case +create table t (c int) learners="us,3"; +-- case +create table t (c int) learners=3; +-- case +create table t (c int) schedule="even"; +-- case +create table t (c int) constraints="ww"; +-- case +create table t (c int) leader_constraints="ww"; +-- case +create table t (c int) follower_constraints="ww"; +-- case +create table t (c int) voter_constraints="ww"; +-- case +create table t (c int) learner_constraints="ww"; +-- case +create table t (c int) survival_preference="ww"; +-- case +create table t (c int) /*T![placement] primary_region="us" */; +-- case +create table t (c int) /*T![placement] regions="us,3" */; +-- case +create table t (c int) /*T![placement] followers="us,3 */"; +-- case +create table t (c int) /*T![placement] followers=3 */; +-- case +create table t (c int) /*T![placement] followers=0 */; +-- case +create table t (c int) /*T![placement] voters="us,3" */; +-- case +create table t (c int) /*T![placement] primary_region="us" regions="us,3" */; +-- case +create table t (c int) placement policy="ww"; +-- case +create table t (c int) /*T![placement] placement policy=`x` */; +-- case +create table t (c int) /*T![placement] placement policy="y" */; +-- case +alter table t primary_region="us"; +-- case +alter table t regions="us,3"; +-- case +alter table t followers=3; +-- case +alter table t followers=0; +-- case +alter table t voters=3; +-- case +alter table t learners=3; +-- case +alter table t schedule="even"; +-- case +alter table t constraints="ww"; +-- case +alter table t leader_constraints="ww"; +-- case +alter table t follower_constraints="ww"; +-- case +alter table t voter_constraints="ww"; +-- case +alter table t learner_constraints="ww"; +-- case +alter table t /*T![placement] primary_region="us" */; +-- case +alter table t placement policy="ww"; +-- case +alter table t /*T![placement] placement policy="ww" */; +-- case +alter table t compact; +-- case +alter table t compact tiflash replica; +-- case +alter table t compact partition p1,p2; +-- case +alter table t compact partition p1,p2 tiflash replica; +-- case +create database t primary_region="us"; +-- case +create database t regions="us,3"; +-- case +create database t followers=3; +-- case +create database t followers=0; +-- case +create database t voters=3; +-- case +create database t learners=3; +-- case +create database t schedule="even"; +-- case +create database t constraints="ww"; +-- case +create database t leader_constraints="ww"; +-- case +create database t follower_constraints="ww"; +-- case +create database t voter_constraints="ww"; +-- case +create database t learner_constraints="ww"; +-- case +create database t /*T![placement] primary_region="us" */; +-- case +create database t placement policy="ww"; +-- case +create database t default placement policy="ww"; +-- case +create database t /*T![placement] placement policy="ww" */; +-- case +alter database t primary_region="us"; +-- case +alter database t regions="us,3"; +-- case +alter database t followers=3; +-- case +alter database t followers=0; +-- case +alter database t voters=3; +-- case +alter database t learners=3; +-- case +alter database t schedule="even"; +-- case +alter database t constraints="ww"; +-- case +alter database t leader_constraints="ww"; +-- case +alter database t follower_constraints="ww"; +-- case +alter database t voter_constraints="ww"; +-- case +alter database t learner_constraints="ww"; +-- case +alter database t /*T![placement] primary_region="us" */; +-- case +alter database t placement policy="ww"; +-- case +alter database t default placement policy="ww"; +-- case +alter database t PLACEMENT POLICY='DEFAULT'; +-- case +alter database t PLACEMENT POLICY=DEFAULT; +-- case +alter database t PLACEMENT POLICY = DEFAULT; +-- case +alter database t PLACEMENT POLICY SET DEFAULT +-- case +alter database t PLACEMENT POLICY=`DEFAULT`; +-- case +alter database t /*T![placement] PLACEMENT POLICY='DEFAULT' */; +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) primary_region="us"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) regions="us,3"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) followers=3); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) voters=3); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) learners=3); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) schedule="even"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) constraints="ww"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) leader_constraints="ww"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) follower_constraints="ww"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) voter_constraints="ww"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) learner_constraints="ww"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) placement policy="ww"); +-- case +create table m (c int) partition by range (c) (partition p1 values less than (200) /*T![placement] placement policy="ww" */); +-- case +alter table m partition t primary_region="us"; +-- case +alter table m partition t regions="us,3"; +-- case +alter table m partition t followers=3; +-- case +alter table m partition t primary_region="us" followers=3; +-- case +alter table m partition t voters=3; +-- case +alter table m partition t learners=3; +-- case +alter table m partition t schedule="even"; +-- case +alter table m partition t constraints="ww"; +-- case +alter table m partition t leader_constraints="ww"; +-- case +alter table m partition t follower_constraints="ww"; +-- case +alter table m partition t voter_constraints="ww"; +-- case +alter table m partition t learner_constraints="ww"; +-- case +alter table m partition t placement policy="ww"; +-- case +alter table m partition t /*T![placement] placement policy="ww" */; +-- case +alter table m add partition (partition p1 values less than (200) primary_region="us"); +-- case +alter table m add partition (partition p1 values less than (200) regions="us,3"); +-- case +alter table m add partition (partition p1 values less than (200) followers=3); +-- case +alter table m add partition (partition p1 values less than (200) voters=3); +-- case +alter table m add partition (partition p1 values less than (200) learners=3); +-- case +alter table m add partition (partition p1 values less than (200) schedule="even"); +-- case +alter table m add partition (partition p1 values less than (200) constraints="ww"); +-- case +alter table m add partition (partition p1 values less than (200) leader_constraints="ww"); +-- case +alter table m add partition (partition p1 values less than (200) follower_constraints="ww"); +-- case +alter table m add partition (partition p1 values less than (200) voter_constraints="ww"); +-- case +alter table m add partition (partition p1 values less than (200) learner_constraints="ww"); +-- case +alter table m add partition (partition p1 values less than (200) placement policy="ww"); +-- case +alter table m add partition (partition p1 values less than (200) /*T![placement] placement policy="ww" */); +-- case +alter table m add column a int, add partition (partition p1 values less than (200)) +-- case +alter table m add partition (partition p1 values less than (200)), add column a int +-- case +create table t (c1 bool, c2 bool, check (c1 in (0, 1)) not enforced, check (c2 in (0, 1))) +-- case +CREATE TABLE Customer (SD integer CHECK (SD > 0), First_Name varchar(30)); +-- case +CREATE TABLE Customer (SD integer CHECK (SD > 0) not enforced, SS varchar(30) check(ss='test') enforced); +-- case +CREATE TABLE Customer (SD integer CHECK (SD > 0) not null, First_Name varchar(30) comment 'string' not null); +-- case +CREATE TABLE Customer (SD integer comment 'string' CHECK (SD > 0) not null); +-- case +CREATE TABLE Customer (SD integer comment 'string' not enforced, First_Name varchar(30)); +-- case +CREATE TABLE Customer (SD integer not enforced, First_Name varchar(30)); +-- case +create database xxx +-- case +create database if exists xxx +-- case +create database if not exists xxx +-- case +create database xxx encryption = 'N' +-- case +create database xxx encryption 'N' +-- case +create database xxx default encryption = 'N' +-- case +create database xxx default encryption 'N' +-- case +create database xxx encryption = 'Y' +-- case +create database xxx encryption 'Y' +-- case +create database xxx default encryption = 'Y' +-- case +create database xxx default encryption 'Y' +-- case +create database xxx encryption = N +-- case +create schema xxx +-- case +create schema if exists xxx +-- case +create schema if not exists xxx +-- case +drop database xxx +-- case +drop database if exists xxx +-- case +drop database if not exists xxx +-- case +drop schema xxx +-- case +drop schema if exists xxx +-- case +drop schema if not exists xxx +-- case +drop table +-- case +drop table if exists t'xyz +-- case +drop table if exists t' +-- case +drop table if exists t` +-- case +drop table if exists t' +-- case +drop table if exists t" +-- case +drop table xxx +-- case +drop table xxx, yyy +-- case +drop tables xxx +-- case +drop tables xxx, yyy +-- case +drop table if exists xxx +-- case +drop table if exists xxx, yyy +-- case +drop table if not exists xxx +-- case +drop table xxx restrict +-- case +drop table xxx, yyy cascade +-- case +drop table if exists xxx restrict +-- case +drop view +-- case +drop view xxx +-- case +drop view xxx, yyy +-- case +drop view if exists xxx +-- case +drop view if exists xxx, yyy +-- case +drop stats t +-- case +drop stats t1, t2, t3 +-- case +drop stats t global +-- case +drop stats t partition p0 +-- case +drop stats t partition p0, p1, p2 +-- case +CREATE TABLE address ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(128) NOT NULL, + address_detail varchar(128) NOT NULL, + cellphone varchar(16) NOT NULL, + latitude double NOT NULL, + longitude double NOT NULL, + name varchar(16) NOT NULL, + sex tinyint(1) NOT NULL, + user_id bigint(20) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), + INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0; +-- case +CREATE TABLE test_data ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(255) NOT NULL, + amount decimal(19,2) DEFAULT NULL, + charge_id varchar(32) DEFAULT NULL, + paid_amount decimal(19,2) DEFAULT NULL, + transaction_no varchar(64) DEFAULT NULL, + wx_mp_app_id varchar(32) DEFAULT NULL, + contacts varchar(50) DEFAULT NULL, + deliver_fee decimal(19,2) DEFAULT NULL, + deliver_info varchar(255) DEFAULT NULL, + deliver_time varchar(255) DEFAULT NULL, + description varchar(255) DEFAULT NULL, + invoice varchar(255) DEFAULT NULL, + order_from int(11) DEFAULT NULL, + order_state int(11) NOT NULL, + packing_fee decimal(19,2) DEFAULT NULL, + payment_time datetime DEFAULT NULL, + payment_type int(11) DEFAULT NULL, + phone varchar(50) NOT NULL, + store_employee_id bigint(20) DEFAULT NULL, + store_id bigint(20) NOT NULL, + user_id bigint(20) NOT NULL, + payment_mode int(11) NOT NULL, + current_latitude double NOT NULL, + current_longitude double NOT NULL, + address_latitude double NOT NULL, + address_longitude double NOT NULL, + PRIMARY KEY (id), + CONSTRAINT food_order_ibfk_1 FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), + CONSTRAINT food_order_ibfk_2 FOREIGN KEY (store_id) REFERENCES waimaiqa.store (id), + CONSTRAINT food_order_ibfk_3 FOREIGN KEY (store_employee_id) REFERENCES waimaiqa.store_employee (id), + UNIQUE FK_UNIQUE_charge_id USING BTREE (charge_id) comment '', + INDEX FK_eqst2x1xisn3o0wbrlahnnqq8 USING BTREE (store_employee_id) comment '', + INDEX FK_8jcmec4kb03f4dod0uqwm54o9 USING BTREE (store_id) comment '', + INDEX FK_a3t0m9apja9jmrn60uab30pqd USING BTREE (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARACTER SET utf8 COLLATE UTF8_GENERAL_CI ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0; +-- case +create table t (c int KEY); +-- case +CREATE TABLE address ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(128) NOT NULL, + address_detail varchar(128) NOT NULL, + cellphone varchar(16) NOT NULL, + latitude double NOT NULL, + longitude double NOT NULL, + name varchar(16) NOT NULL, + sex tinyint(1) NOT NULL, + user_id bigint(20) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION, + INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE UTF8_GENERAL_CI ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0; +-- case +CREATE TABLE address ( +id bigint(20) NOT NULL AUTO_INCREMENT, +create_at datetime NOT NULL, +deleted tinyint(1) NOT NULL, +update_at datetime NOT NULL, +version bigint(20) DEFAULT NULL, +address varchar(128) NOT NULL, +address_detail varchar(128) NOT NULL, +cellphone varchar(16) NOT NULL, +latitude double NOT NULL, +longitude double NOT NULL, +name varchar(16) NOT NULL, +sex tinyint(1) NOT NULL, +user_id bigint(20) NOT NULL, +PRIMARY KEY (id), +CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION, +INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0; +-- case +CREATE TABLE t1 ( + accout_id int(11) DEFAULT '0', + summoner_id int(11) DEFAULT '0', + union_name varbinary(52) NOT NULL, + union_id int(11) DEFAULT '0', + PRIMARY KEY (union_name)) ENGINE=MyISAM DEFAULT CHARSET=binary; +-- case +CREATE TABLE t (a DECIMAL(20,0), b DECIMAL(30), c FLOAT(25,0)) +-- case +create table t (c int, index ci (c) USING BTREE COMMENT "123"); +-- case +CREATE TABLE sbtest (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, k integer UNSIGNED DEFAULT '0' NOT NULL, c char(120) DEFAULT '' NOT NULL, pad char(60) DEFAULT '' NOT NULL, PRIMARY KEY (id) ) +-- case +create table test (create_date TIMESTAMP NOT NULL COMMENT '创建日期 create date' DEFAULT now()); +-- case +create table ts (t int, v timestamp(3) default CURRENT_TIMESTAMP(3)); +-- case +create table if not exists `t` (`id` int not null auto_increment comment '消息ID', primary key `pk_id` (`id`) ); +-- case +create table a like b +-- case +create table a (id int REFERENCES a (id) ON delete NO ACTION ) +-- case +create table a (id int REFERENCES a (id) ON update set default ) +-- case +create table a (id int REFERENCES a (id) ON delete set null on update CASCADE) +-- case +create table a (id int REFERENCES a (id) ON update set default on delete RESTRICT) +-- case +create table a (id int REFERENCES a (id) MATCH FULL ON delete NO ACTION ) +-- case +create table a (id int REFERENCES a (id) MATCH PARTIAL ON update NO ACTION ) +-- case +create table a (id int REFERENCES a (id) MATCH SIMPLE ON update NO ACTION ) +-- case +create table a (id int REFERENCES a (id) ON update set default ) +-- case +create table a (id int REFERENCES a (id) ON update set default on update CURRENT_TIMESTAMP) +-- case +create table a (id int REFERENCES a (id) ON delete set default on update CURRENT_TIMESTAMP) +-- case +create table a (like b) +-- case +create table if not exists a like b +-- case +create table if not exists a (like b) +-- case +create table if not exists a like (b) +-- case +create table a (t int) like b +-- case +create table a (t int) like (b) +-- case +create table a select * from b +-- case +create table a as select * from b +-- case +create table a (m int, n datetime) as select * from b +-- case +create table a (unique(n)) as select n from b +-- case +create table a ignore as select n from b +-- case +create table a replace as select n from b +-- case +create table a (m int) replace as (select n as m from b union select n+1 as m from c group by 1 limit 2) +-- case +create table a +-- case +create table t (a timestamp default now) +-- case +create table t (a timestamp default now()) +-- case +create table t (a timestamp default (((now())))) +-- case +create table t (a timestamp default now() on update now) +-- case +create table t (a timestamp default now() on update now()) +-- case +create table t (a timestamp default now() on update (now())) +-- case +CREATE TABLE t (c TEXT) default CHARACTER SET utf8, default COLLATE utf8_general_ci; +-- case +CREATE TABLE t (c TEXT) shard_row_id_bits = 1; +-- case +CREATE TABLE t (c TEXT) shard_row_id_bits = 1, PRE_SPLIT_REGIONS = 1; +-- case +CREATE TABLE IF NOT EXISTS `general_log` (`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` mediumtext NOT NULL,`thread_id` bigint(20) unsigned NOT NULL,`server_id` int(10) unsigned NOT NULL,`command_type` varchar(64) NOT NULL,`argument` mediumblob NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log' +-- case +CREATE TABLE followers ( f1 int NOT NULL REFERENCES user_profiles (uid) ); +-- case +create table t (a int default rand()) +-- case +create table t (a int default rand(1)) +-- case +create table t (a int default (rand())) +-- case +create table t (a int default (rand(1))) +-- case +create table t (a int default (((rand())))) +-- case +create table t (a int default (((rand(1))))) +-- case +create table t (d date default current_date()) +-- case +create table t (d date default current_date) +-- case +create table t (d date default (current_date())) +-- case +create table t (d date default (curdate())) +-- case +create table t (d date default curdate()) +-- case +create table t (d date default current_date()) +-- case +create table t (d date default date_format(now(),'%Y-%m')) +-- case +create table t (d date default (date_format(now(),'%Y-%m'))) +-- case +create table t (d date default date_format(now(),'%Y-%m-%d')) +-- case +create table t (d date default date_format(now(),'%Y-%m-%d %H.%i.%s')) +-- case +create table t (d date default date_format(now(),'%Y-%m-%d %H:%i:%s')) +-- case +create table t (d date default date_format(now(),'%b %d %Y %h:%i %p')) +-- case +create table t (a varchar(32) default (replace(upper(uuid()), '-', ''))) +-- case +create table t (a varchar(32) default replace(upper(uuid()), '-', '')) +-- case +create table t (a varchar(32) default (replace(convert(upper(uuid()) using utf8mb4), '-', ''))) +-- case +create table t (a varchar(32) default replace(convert(upper(uuid()) using utf8mb4), '-', '')) +-- case +create table t (a int default upper(substring_index(user(),'@',1))) +-- case +create table t (a int default (upper(substring_index(user(),'@',1)))) +-- case +create table t (a varchar(32) default (str_to_date('1980-01-01','%Y-%m-%d'))) +-- case +create table t (a varchar(32) default str_to_date('1980-01-01','%Y-%m-%d')) +-- case +create table t (j json default (json_object())) +-- case +create table t (j json default (json_array())) +-- case +create table t (j json default (json_quote())) +-- case +create table t (j json default (json_object('foo', 5, 'bar', 'barfoo'))) +-- case +create table t (j json default (json_array(1,2,3))) +-- case +create table t (j json default (json_quote('foobar'))) +-- case +create table t (c char(33) default (nonexistingfunc('foobar'))) +-- case +create table t (c char(33) default 'foobar') +-- case +create table t (c char(33) default ('foobar')) +-- case +create table t (i int default (0)) +-- case +create table t (i int default (-1)) +-- case +create table t (i int default (+1)) +-- case +create table t (a int, b int, c char(33) default (b)) +-- case +create table t (a int, b int, c char(33) default `b`) +-- case +create table t (a int) encryption = 'n'; +-- case +create table t (a int) encryption 'n'; +-- case +alter table t encryption = 'y'; +-- case +alter table t encryption 'y'; +-- case +create table t (a int key global) +-- case +create table t (a int key local) +-- case +create table t (a int primary key local) +-- case +create table t (a int primary key global) +-- case +create table t (a int UNIQUE local) +-- case +create table t (a int UNIQUE global) +-- case +create table t (a int UNIQUE key local) +-- case +create table t (a int UNIQUE key global) +-- case +alter table t add index (a) +-- case +alter table t add index (a) local +-- case +alter table t add index (a) global +-- case +alter table t add unique (a) +-- case +alter table t add unique (a) local +-- case +alter table t add unique (a) global +-- case +alter table t add unique key (a) global +-- case +alter table t add unique key (a) +-- case +alter table t add unique key (a) local +-- case +alter table t add primary key (a) global +-- case +alter table t add primary key (a) +-- case +alter table t add primary key (a) local +-- case +create index i on t (a) +-- case +create index i on t (a) local +-- case +create index i on t (a) global +-- case +ALTER DATABASE t CHARACTER SET = 'utf8' +-- case +ALTER DATABASE CHARACTER SET = 'utf8' +-- case +ALTER DATABASE t DEFAULT CHARACTER SET = 'utf8' +-- case +ALTER SCHEMA t DEFAULT CHARACTER SET = 'utf8' +-- case +ALTER SCHEMA DEFAULT CHARACTER SET = 'utf8' +-- case +ALTER SCHEMA t DEFAULT CHARSET = 'UTF8' +-- case +ALTER DATABASE t COLLATE = binary +-- case +ALTER DATABASE t CHARSET=binary COLLATE = binary +-- case +ALTER DATABASE t COLLATE = 'utf8_bin' +-- case +ALTER DATABASE COLLATE = 'utf8_bin' +-- case +ALTER DATABASE t DEFAULT COLLATE = 'utf8_bin' +-- case +ALTER SCHEMA t DEFAULT COLLATE = 'UTF8_BiN' +-- case +ALTER SCHEMA DEFAULT COLLATE = 'UTF8_BiN' +-- case +ALTER SCHEMA `` DEFAULT COLLATE = 'UTF8_BiN' +-- case +ALTER DATABASE t CHARSET = 'utf8mb4' COLLATE = 'utf8_bin' +-- case +ALTER DATABASE t DEFAULT CHARSET = 'utf8mb4' DEFAULT COLLATE = 'utf8mb4_general_ci' CHARACTER SET = 'utf8' COLLATE = 'utf8mb4_bin' +-- case +ALTER DATABASE DEFAULT CHARSET = 'utf8mb4' COLLATE = 'utf8_bin' +-- case +ALTER DATABASE DEFAULT CHARSET = 'utf8mb4' DEFAULT COLLATE = 'utf8mb4_general_ci' CHARACTER SET = 'utf8' COLLATE = 'utf8mb4_bin' +-- case +ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED) +-- case +ALTER TABLE t.* ADD COLUMN (a SMALLINT UNSIGNED) +-- case +ALTER TABLE t ADD COLUMN IF NOT EXISTS (a SMALLINT UNSIGNED) +-- case +ALTER TABLE ADD COLUMN (a SMALLINT UNSIGNED) +-- case +ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED, b varchar(255)) +-- case +ALTER TABLE t ADD COLUMN IF NOT EXISTS (a SMALLINT UNSIGNED, b varchar(255)) +-- case +ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED FIRST) +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED FIRST +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED AFTER b +-- case +ALTER TABLE t ADD COLUMN IF NOT EXISTS a SMALLINT UNSIGNED AFTER b +-- case +ALTER TABLE employees ADD PARTITION +-- case +ALTER TABLE employees ADD PARTITION ( PARTITION P1 VALUES LESS THAN (2010)) +-- case +ALTER TABLE employees ADD PARTITION ( PARTITION P2 VALUES LESS THAN MAXVALUE) +-- case +ALTER TABLE employees ADD PARTITION IF NOT EXISTS ( PARTITION P2 VALUES LESS THAN MAXVALUE) +-- case +ALTER TABLE employees ADD PARTITION IF NOT EXISTS PARTITIONS 5 +-- case +ALTER TABLE employees ADD PARTITION ( + PARTITION P1 VALUES LESS THAN (2010), + PARTITION P2 VALUES LESS THAN (2015), + PARTITION P3 VALUES LESS THAN MAXVALUE) +-- case +alter table t add partition (partition x values in ((3, 4), (5, 6))) +-- case +ALTER TABLE employees ADD PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE employees ADD PARTITION NO_WRITE_TO_BINLOG PARTITIONS 10 +-- case +ALTER TABLE employees ADD PARTITION LOCAL +-- case +ALTER TABLE employees ADD PARTITION LOCAL PARTITIONS 10 +-- case +ALTER TABLE t_n REBUILD PARTITION ALL +-- case +ALTER TABLE d_n.t_n REBUILD PARTITION LOCAL ALL +-- case +ALTER TABLE t_n REBUILD PARTITION LOCAL ident +-- case +ALTER TABLE t_n REBUILD PARTITION NO_WRITE_TO_BINLOG ident , ident +-- case +ALTER TABLE t_n REBUILD PARTITION LOCAL +-- case +ALTER TABLE t_n REBUILD PARTITION LOCAL local +-- case +ALTER TABLE t_n REBUILD PARTITION LOCAL local, local +-- case +alter table t drop partition p1; +-- case +alter table t drop partition p2; +-- case +alter table t drop partition if exists p2; +-- case +alter table t drop partition p1, p2; +-- case +alter table t drop partition if exists p1, p2; +-- case +alter table t check partition all; +-- case +alter table t check partition p; +-- case +alter table t check partition p1, p2; +-- case +alter table employees add partition partitions 1; +-- case +alter table employees add partition partitions 2; +-- case +alter table clients coalesce partition 3; +-- case +alter table clients coalesce partition 4; +-- case +alter table clients coalesce partition no_write_to_binlog 4; +-- case +alter table clients coalesce partition local 4; +-- case +ALTER TABLE t DISABLE KEYS +-- case +ALTER TABLE t ENABLE KEYS +-- case +ALTER TABLE t MODIFY COLUMN a varchar(255) +-- case +ALTER TABLE t MODIFY COLUMN IF EXISTS a varchar(255) +-- case +ALTER TABLE t CHANGE COLUMN a b varchar(255) +-- case +ALTER TABLE t CHANGE COLUMN IF EXISTS a b varchar(255) +-- case +ALTER TABLE t CHANGE COLUMN a b varchar(255) CHARACTER SET UTF8 BINARY +-- case +ALTER TABLE t CHANGE COLUMN a b varchar(255) FIRST +-- case +ALTER TABLE db.t RENAME to db1.t1 +-- case +ALTER TABLE db.t RENAME db1.t1 +-- case +ALTER TABLE db.t RENAME = db1.t1 +-- case +ALTER TABLE db.t RENAME as db1.t1 +-- case +ALTER TABLE t RENAME to t1 +-- case +ALTER TABLE t RENAME t1 +-- case +ALTER TABLE t RENAME = t1 +-- case +ALTER TABLE t RENAME as t1 +-- case +ALTER TABLE t_n ORDER BY ident +-- case +ALTER TABLE t_n ORDER BY ident ASC +-- case +ALTER TABLE t_n ORDER BY ident DESC +-- case +ALTER TABLE t_n ORDER BY ident1, ident2 +-- case +ALTER TABLE t_n ORDER BY ident1 ASC, ident2 +-- case +ALTER TABLE t_n ORDER BY ident1 ASC, ident2 ASC +-- case +ALTER TABLE t_n ORDER BY ident1 ASC, ident2 DESC +-- case +ALTER TABLE t_n ORDER BY ident1 DESC, ident2 +-- case +ALTER TABLE t_n ORDER BY ident1 DESC, ident2 ASC +-- case +ALTER TABLE t_n ORDER BY ident1 DESC, ident2 DESC +-- case +ALTER TABLE t_n ORDER BY ident1, ident2, ident3 +-- case +ALTER TABLE t_n ORDER BY ident1, ident2, ident3 ASC +-- case +ALTER TABLE t_n ORDER BY ident1, ident2, ident3 DESC +-- case +ALTER TABLE t_n ORDER BY ident1 ASC, ident2 ASC, ident3 ASC +-- case +ALTER TABLE t_n ORDER BY ident1 DESC, ident2 DESC, ident3 DESC +-- case +ALTER TABLE t RENAME COLUMN a TO b +-- case +ALTER TABLE t RENAME COLUMN t.a TO t.b +-- case +ALTER TABLE t RENAME COLUMN a TO t.b +-- case +ALTER TABLE t RENAME COLUMN t.a TO b +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT 1 +-- case +ALTER TABLE t ALTER a SET DEFAULT 1 +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT CURRENT_TIMESTAMP +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT NOW() +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT 1+1 +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT (CURRENT_TIMESTAMP()) +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT (NOW()) +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT (1+1) +-- case +ALTER TABLE t ALTER COLUMN a SET DEFAULT (1) +-- case +ALTER TABLE t ALTER COLUMN a DROP DEFAULT +-- case +ALTER TABLE t ALTER a DROP DEFAULT +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=none +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=default +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=shared +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=exclusive +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock none +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock default +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock shared +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock exclusive +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=NONE +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=DEFAULT +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=SHARED +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=EXCLUSIVE +-- case +ALTER TABLE t ADD FULLTEXT KEY `FullText` (`name` ASC) +-- case +ALTER TABLE t ADD FULLTEXT `FullText` (`name` ASC) +-- case +ALTER TABLE t ADD FULLTEXT INDEX `FullText` (`name` ASC) +-- case +ALTER TABLE t ADD INDEX (a) USING BTREE COMMENT 'a' +-- case +ALTER TABLE t ADD INDEX IF NOT EXISTS (a) USING BTREE COMMENT 'a' +-- case +ALTER TABLE t ADD INDEX (a) USING RTREE COMMENT 'a' +-- case +ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = 4 +-- case +ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS 4 +-- case +ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = 'a' +-- case +ALTER TABLE t ADD PRIMARY KEY (a) CLUSTERED PRE_SPLIT_REGIONS = 4 +-- case +ALTER TABLE t ADD PRIMARY KEY (a) PRE_SPLIT_REGIONS = 4 NONCLUSTERED +-- case +ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = (between (1, 'a') and (2, 'b') regions 4); +-- case +ALTER TABLE t ADD INDEX (a) PRE_SPLIT_REGIONS = (by (1, 'a'), (2, 'b'), (3, 'c')); +-- case +ALTER TABLE t ADD INDEX (a) comment 'a' PRE_SPLIT_REGIONS = (between (1, 'a') and (2, 'b') regions 4); +-- case +CREATE INDEX idx ON t (a, b) pre_split_regions = 100 +-- case +CREATE INDEX idx ON t (a, b) PRE_SPLIT_REGIONS = (between (1, 'a') and (2, 'b') regions 4); +-- case +ALTER TABLE t ADD INDEX idx(a) pre_split_regions = 100, ADD INDEX idx2(b) pre_split_regions = (by(1),(2),(3)) +-- case +ALTER TABLE t ADD KEY (a) USING HASH COMMENT 'a' +-- case +ALTER TABLE t ADD INDEX (a) USING BTREE /*T![global_index] GLOBAL */ COMMENT 'a' +-- case +ALTER TABLE t ADD UNIQUE INDEX (a) /*T![global_index] GLOBAL */ +-- case +ALTER TABLE t ADD UNIQUE INDEX (a) LOCAL +-- case +ALTER TABLE t ADD KEY IF NOT EXISTS (a) USING HASH COMMENT 'a' +-- case +ALTER TABLE t ADD PRIMARY KEY ident USING RTREE ( a DESC , b ) +-- case +ALTER TABLE t ADD KEY USING RTREE ( a ) +-- case +ALTER TABLE t ADD KEY USING RTREE ( ident ASC , ident ( 123 ) ) +-- case +ALTER TABLE t ADD PRIMARY KEY (a) COMMENT 'a' +-- case +ALTER TABLE t ADD UNIQUE (a) COMMENT 'a' +-- case +ALTER TABLE t ADD UNIQUE KEY (a) COMMENT 'a' +-- case +ALTER TABLE t ADD UNIQUE INDEX (a) COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR (a) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR (VEC_COSINE_DISTANCE(a)) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR ((VEC_COSINE_DISTANCE(a))) USING HASH COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR KEY ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX ((lower(a))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a), a)) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX (a, (VEC_COSINE_DISTANCE(a))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a))) USING HYPO COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a))) COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX ((VEC_COSINE_DISTANCE(a))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX IF NOT EXISTS ((VEC_COSINE_DISTANCE(a))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD VECTOR INDEX IF NOT EXISTS ((VEC_COSINE_DISTANCE(a))) ADD_COLUMNAR_REPLICA_ON_DEMAND USING HNSW COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR (a) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR ((a - 1)) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR (a) USING HASH COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR (a, b) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR KEY (a, b) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR INDEX (a, b) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR INDEX (a) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR INDEX (a) USING HYPO COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR INDEX ((a - 1)) USING HYPO COMMENT 'a' +-- case +ALTER TABLE t ADD COLUMNAR INDEX IF NOT EXISTS (a) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE t ADD CONSTRAINT fk_t2_id FOREIGN KEY (t2_id) REFERENCES t(id) +-- case +ALTER TABLE t ADD CONSTRAINT fk_t2_id FOREIGN KEY IF NOT EXISTS (t2_id) REFERENCES t(id) +-- case +ALTER TABLE t ADD CONSTRAINT c_1 CHECK (1+1) NOT ENFORCED, ADD UNIQUE (a) +-- case +ALTER TABLE t ADD CONSTRAINT c_1 CHECK (1+1) ENFORCED, ADD UNIQUE (a) +-- case +ALTER TABLE t ADD CONSTRAINT c_1 CHECK (1+1), ADD UNIQUE (a) +-- case +ALTER TABLE t ENGINE '' +-- case +ALTER TABLE t ENGINE = '' +-- case +ALTER TABLE t ENGINE = 'innodb' +-- case +ALTER TABLE t ENGINE = innodb +-- case +ALTER TABLE `db`.`t` ENGINE = `` +-- case +ALTER TABLE t INSERT_METHOD = FIRST +-- case +ALTER TABLE t INSERT_METHOD LAST +-- case +ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, ADD COLUMN a SMALLINT +-- case +ALTER TABLE t ADD COLUMN a SMALLINT, ENGINE = '', default COLLATE = UTF8_GENERAL_CI +-- case +ALTER TABLE t ENGINE = '', COMMENT='', default COLLATE = UTF8_GENERAL_CI +-- case +ALTER TABLE t ENGINE = '', ADD COLUMN a SMALLINT +-- case +ALTER TABLE t default COLLATE = UTF8_GENERAL_CI, ENGINE = '', ADD COLUMN a SMALLINT +-- case +ALTER TABLE t shard_row_id_bits = 1 +-- case +ALTER TABLE t AUTO_INCREMENT 3 +-- case +ALTER TABLE t AUTO_INCREMENT = 3 +-- case +ALTER TABLE t FORCE AUTO_INCREMENT 3 +-- case +ALTER TABLE t FORCE AUTO_INCREMENT = 3 +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL , ALGORITHM = DEFAULT; +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL , ALGORITHM = INPLACE; +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL , ALGORITHM = COPY; +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI NOT NULL, ALGORITHM = INSTANT; +-- case +ALTER TABLE t CONVERT TO CHARACTER SET UTF8; +-- case +ALTER TABLE t CONVERT TO CHARSET UTF8; +-- case +ALTER TABLE t CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_BIN; +-- case +ALTER TABLE t CONVERT TO CHARSET UTF8 COLLATE UTF8_BIN; +-- case +alter table d_n.t_n convert to character set default +-- case +alter table d_n.t_n convert to charset default +-- case +alter table d_n.t_n convert to char set default +-- case +alter table d_n.t_n convert to character set default collate utf8mb4_0900_ai_ci +-- case +ALTER TABLE t FORCE +-- case +ALTER TABLE t DROP INDEX; +-- case +ALTER TABLE t DROP INDEX a +-- case +ALTER TABLE t DROP INDEX IF EXISTS a +-- case +ALTER TABLE t ALTER INDEX a INVISIBLE +-- case +ALTER TABLE t ALTER INDEX a VISIBLE +-- case +ALTER TABLE t DROP FOREIGN KEY a +-- case +ALTER TABLE t DROP COLUMN a CASCADE +-- case +ALTER TABLE t DROP COLUMN IF EXISTS a CASCADE +-- case +ALTER TABLE testTableCompression COMPRESSION="LZ4"; +-- case +ALTER TABLE t1 COMPRESSION="zlib"; +-- case +ALTER TABLE t1 +-- case +ALTER TABLE t1 , +-- case +ALTER TABLE t RENAME KEY a TO b; +-- case +ALTER TABLE t RENAME INDEX a TO b; +-- case +ALTER TABLE d_n.t_n DROP CHECK ident; +-- case +ALTER TABLE t_n LOCK = DEFAULT , DROP CHECK ident; +-- case +ALTER TABLE t_n ALTER CHECK ident ENFORCED; +-- case +ALTER TABLE t_n ALTER CHECK ident NOT ENFORCED; +-- case +ALTER TABLE t_n DROP CONSTRAINT ident +-- case +ALTER TABLE t_n DROP CHECK ident +-- case +ALTER TABLE t_n ALTER CONSTRAINT ident +-- case +ALTER TABLE t_n ALTER CONSTRAINT ident enforced +-- case +ALTER TABLE t_n ALTER CHECK ident not enforced +-- case +alter table t analyze partition a +-- case +alter table t analyze partition a with 4 buckets +-- case +alter table t analyze partition a index b +-- case +alter table t analyze partition a index b with 4 buckets +-- case +alter table t partition by hash(a) +-- case +alter table t add column a int partition by hash(a) +-- case +alter table t add column a int partition by hash(a) update indexes (idx_a global) +-- case +alter table t add column a int partition by hash(a) update indexes (idx_a global, idx_b local) +-- case +alter table t add column a int partition by hash(a) update indexes (idx_a normal) +-- case +alter table t add column a int partition by hash(a) update indexes (global) +-- case +alter table t partition by range(a) +-- case +alter table t partition by range(a) update indexes (a local) +-- case +alter table t partition by range(a) (partition x values less than (75)) +-- case +alter table t add column a int, partition by range(a) (partition x values less than (75)) +-- case +alter table t comment 'cmt' partition by hash(a) +-- case +alter table t enable keys, comment = 'cmt' partition by hash(a) +-- case +alter table t enable keys, comment = 'cmt', partition by hash(a) +-- case +alter table t partition by hash(a) enable keys +-- case +alter table t partition by hash(a), enable keys +-- case +alter table t partition by range FIELDS(a) (partition x values less than maxvalue) +-- case +alter table t partition by list FIELDS(a) (PARTITION p0 VALUES IN (5, 10, 15)) +-- case +alter table t partition by range FIELDS(a,b,c) (partition p1 values less than (1,1,1)); +-- case +alter table t partition by list FIELDS(a,b,c) (PARTITION p0 VALUES IN ((5, 10, 15))) +-- case +alter table t with validation, add column b int as (a + 1) +-- case +alter table t without validation, add column b int as (a + 1) +-- case +alter table t without validation, with validation, add column b int as (a + 1) +-- case +alter table t with validation, modify column b int as (a + 2) +-- case +alter table t with validation, change column b c int as (a + 2) +-- case +ALTER TABLE d_n.t_n ADD PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE d_n.t_n ADD PARTITION LOCAL +-- case +alter table t with validation, exchange partition p with table nt without validation; +-- case +alter table t exchange partition p with table nt with validation; +-- case +alter table t reorganize partition; +-- case +alter table t reorganize partition local; +-- case +alter table t reorganize partition no_write_to_binlog; +-- case +ALTER TABLE members REORGANIZE PARTITION n0 INTO (PARTITION s0 VALUES LESS THAN (1960), PARTITION s1 VALUES LESS THAN (1970)); +-- case +ALTER TABLE members REORGANIZE PARTITION LOCAL n0 INTO (PARTITION s0 VALUES LESS THAN (1960), PARTITION s1 VALUES LESS THAN (1970)); +-- case +ALTER TABLE members REORGANIZE PARTITION p1,p2,p3 INTO ( PARTITION s0 VALUES LESS THAN (1960), PARTITION s1 VALUES LESS THAN (1970)); +-- case +alter table t reorganize partition remove partition; +-- case +alter table t reorganize partition no_write_to_binlog remove into (partition p0 VALUES LESS THAN (1991)); +-- case +ALTER TABLE t ATTRIBUTES='str' +-- case +ALTER TABLE t ATTRIBUTES='str1,str2' +-- case +ALTER TABLE t ATTRIBUTES="str1,str2" +-- case +ALTER TABLE t ATTRIBUTES 'str1,str2' +-- case +ALTER TABLE t ATTRIBUTES "str1,str2" +-- case +ALTER TABLE t ATTRIBUTES=DEFAULT +-- case +ALTER TABLE t ATTRIBUTES=default +-- case +ALTER TABLE t ATTRIBUTES=DeFaUlT +-- case +ALTER TABLE t ATTRIBUTES +-- case +ALTER TABLE t PARTITION p ATTRIBUTES='str' +-- case +ALTER TABLE t PARTITION p ATTRIBUTES='str1,str2' +-- case +ALTER TABLE t PARTITION p ATTRIBUTES="str1,str2" +-- case +ALTER TABLE t PARTITION p ATTRIBUTES 'str1,str2' +-- case +ALTER TABLE t PARTITION p ATTRIBUTES "str1,str2" +-- case +ALTER TABLE t PARTITION p ATTRIBUTES=DEFAULT +-- case +ALTER TABLE t PARTITION p ATTRIBUTES=default +-- case +ALTER TABLE t PARTITION p ATTRIBUTES=DeFaUlT +-- case +ALTER TABLE t PARTITION p ATTRIBUTES +-- case +CREATE TABLE t1 (attributes int); +-- case +CREATE INDEX idx ON t (a) +-- case +CREATE INDEX IF NOT EXISTS idx ON t (a) +-- case +CREATE UNIQUE INDEX idx ON t (a) +-- case +CREATE UNIQUE INDEX IF NOT EXISTS idx ON t (a) +-- case +CREATE UNIQUE INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE BTREE +-- case +CREATE UNIQUE INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE HASH +-- case +CREATE UNIQUE INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE RTREE +-- case +CREATE UNIQUE INDEX ident TYPE BTREE ON d_n.t_n ( ident , ident ASC ) +-- case +CREATE UNIQUE INDEX ident USING BTREE ON d_n.t_n ( ident , ident ASC ) +-- case +CREATE SPATIAL INDEX idx ON t (a) +-- case +CREATE SPATIAL INDEX IF NOT EXISTS idx ON t (a) +-- case +CREATE FULLTEXT INDEX idx ON t (a) +-- case +CREATE FULLTEXT INDEX IF NOT EXISTS idx ON t (a) +-- case +CREATE FULLTEXT INDEX idx ON t (a) WITH PARSER ident +-- case +CREATE FULLTEXT INDEX idx ON t (a) WITH PARSER ident comment 'string' +-- case +CREATE FULLTEXT INDEX idx ON t (a) comment 'string' with parser ident +-- case +CREATE FULLTEXT INDEX idx ON t (a) WITH PARSER ident comment 'string' lock default +-- case +CREATE INDEX idx ON t (a) USING HASH +-- case +CREATE INDEX idx ON t (a) COMMENT 'foo' +-- case +CREATE INDEX idx ON t (a) USING HASH COMMENT 'foo' +-- case +CREATE INDEX idx ON t (a) LOCK=NONE +-- case +CREATE INDEX idx USING BTREE ON t (a) USING HASH COMMENT 'foo' +-- case +CREATE INDEX idx USING BTREE ON t (a) +-- case +CREATE INDEX idx ON t ( a ) VISIBLE +-- case +CREATE INDEX idx ON t ( a ) INVISIBLE +-- case +CREATE INDEX idx ON t ( a ) INVISIBLE VISIBLE +-- case +CREATE INDEX idx ON t ( a ) VISIBLE INVISIBLE +-- case +CREATE INDEX idx ON t ( a ) USING HASH VISIBLE +-- case +CREATE INDEX idx ON t ( a ) USING HASH INVISIBLE +-- case +CREATE VECTOR INDEX idx ON t (a) USING HNSW +-- case +CREATE VECTOR INDEX idx ON t (a, b) USING HNSW +-- case +CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a))) +-- case +CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a))) TYPE BTREE +-- case +CREATE VECTOR INDEX idx ON t USING HNSW ((VEC_COSINE_DISTANCE(a))) +-- case +CREATE VECTOR idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW +-- case +CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a)), a) USING HNSW +-- case +CREATE VECTOR INDEX idx ON t (a, (VEC_COSINE_DISTANCE(a))) USING HNSW +-- case +CREATE VECTOR KEY idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW +-- case +CREATE VECTOR INDEX idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW +-- case +CREATE VECTOR INDEX IF NOT EXISTS idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW +-- case +CREATE VECTOR INDEX IF NOT EXISTS idx ON t ((VEC_COSINE_DISTANCE(a))) TYPE HNSW +-- case +CREATE VECTOR INDEX ident TYPE HNSW ON d_n.t_n ((VEC_COSINE_DISTANCE(a))) +-- case +CREATE VECTOR INDEX idx USING HNSW ON t ((VEC_COSINE_DISTANCE(a))) +-- case +CREATE VECTOR INDEX ident ON d_n.t_n ( ident , ident ASC ) TYPE HNSW +-- case +CREATE UNIQUE INDEX ident USING HNSW ON d_n.t_n ( ident , ident ASC ) +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM = DEFAULT +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM DEFAULT +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM = INPLACE +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM INPLACE +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM = COPY +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM COPY +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM = DEFAULT LOCK = DEFAULT +-- case +CREATE INDEX idx ON t ( a ) LOCK = DEFAULT ALGORITHM = DEFAULT +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM = INPLACE LOCK = EXCLUSIVE +-- case +CREATE INDEX idx ON t ( a ) LOCK = EXCLUSIVE ALGORITHM = INPLACE +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM = ident +-- case +CREATE INDEX idx ON t ( a ) ALGORITHM ident +-- case +drop index a on t +-- case +drop index a on db.t +-- case +drop index a on db.`tb-ttb` +-- case +drop index if exists a on t +-- case +drop index if exists a on db.t +-- case +drop index if exists a on db.`tb-ttb` +-- case +drop index idx on t algorithm = default +-- case +drop index idx on t algorithm default +-- case +drop index idx on t algorithm = inplace +-- case +drop index idx on t algorithm inplace +-- case +drop index idx on t lock = default +-- case +drop index idx on t lock default +-- case +drop index idx on t lock = shared +-- case +drop index idx on t lock shared +-- case +drop index idx on t algorithm = default lock = default +-- case +drop index idx on t lock = default algorithm = default +-- case +drop index idx on t algorithm = inplace lock = exclusive +-- case +drop index idx on t lock = exclusive algorithm = inplace +-- case +drop index idx on t algorithm = algorithm_type +-- case +drop index idx on t algorithm algorithm_type +-- case +drop index idx on t lock = lock_type +-- case +drop index idx on t lock lock_type +-- case +RENAME TABLE t TO t1 +-- case +RENAME TABLE t t1 +-- case +RENAME TABLE d.t TO d1.t1 +-- case +RENAME TABLE t1 TO t2, t3 TO t4 +-- case +TRUNCATE TABLE t1 +-- case +TRUNCATE t1 +-- case +ALTER TABLE t ADD INDEX () +-- case +ALTER TABLE t ADD UNIQUE () +-- case +ALTER TABLE t ADD UNIQUE INDEX () +-- case +ALTER TABLE t ADD UNIQUE KEY () +-- case +ALTER TABLE d_n.t_n SECONDARY_LOAD +-- case +ALTER TABLE d_n.t_n SECONDARY_UNLOAD +-- case +ALTER TABLE t_n LOCK = DEFAULT , SECONDARY_LOAD +-- case +ALTER TABLE d_n.t_n ALGORITHM = DEFAULT , SECONDARY_LOAD +-- case +ALTER TABLE d_n.t_n ALGORITHM = DEFAULT , SECONDARY_UNLOAD +-- case +create table a (process double) +-- case +create table t (a int1, b int2, c int3, d int4, e int8) +-- case +create table t (lv long varchar null) +-- case +CREATE TABLE cdp_test.`test2-1` (id int(11) DEFAULT NULL,key(id)); +-- case +CREATE TABLE miantiao (`扁豆焖面` INT(11)); +-- case +CREATE TABLE bar (m INT) SELECT n FROM foo; +-- case +CREATE TABLE bar (m INT) IGNORE SELECT n FROM foo; +-- case +CREATE TABLE bar (m INT) REPLACE SELECT n FROM foo; +-- case +create table t (a timestamp, b timestamp as (a) not null on update current_timestamp); +-- case +create table t (a bigint, b bigint as (a) primary key auto_increment); +-- case +create table t (a bigint, b bigint as (a) not null default 10); +-- case +create table t (a bigint, b bigint as (a+1) not null); +-- case +create table t (a bigint, b bigint as (a+1) not null); +-- case +create table t (a bigint, b bigint as (a+1) not null comment 'ttt'); +-- case +create table t(a int, index idx((cast(a as binary(1))))); +-- case +alter table t add column (f timestamp as (a+1) default '2019-01-01 11:11:11'); +-- case +alter table t modify column f int as (a+1) default 55; +-- case +create table t (a int column_format fixed) +-- case +create table t (a int column_format default) +-- case +create table t (a int column_format dynamic) +-- case +alter table t modify column a bigint column_format default +-- case +recover table by job 11 +-- case +recover table by job 11,12,13 +-- case +recover table by job +-- case +recover table by job 0 +-- case +recover table t1 +-- case +recover table t1,t2 +-- case +recover table +-- case +recover table t1 100 +-- case +recover table t1 abc +-- case +flashback table t +-- case +flashback table t TO t1 +-- case +flashback table t TO timestamp +-- case +flashback database db1 +-- case +flashback schema db1 +-- case +flashback database db1 to db2 +-- case +flashback schema db1 to db2 +-- case +flashback cluster to timestamp '2021-05-26 16:45:26' +-- case +flashback table t to timestamp '2021-05-26 16:45:26' +-- case +flashback table t,t1 to timestamp '2021-05-26 16:45:26' +-- case +flashback database test to timestamp '2021-05-26 16:45:26' +-- case +flashback schema test to timestamp '2021-05-26 16:45:26' +-- case +flashback cluster to timestamp TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +flashback cluster to timestamp DATE_SUB(NOW(), INTERVAL 3 SECOND) +-- case +flashback table to timestamp '2021-05-26 16:45:26' +-- case +flashback database to timestamp '2021-05-26 16:45:26' +-- case +flashback cluster to tso 445494955052105721 +-- case +flashback table t to tso 445494955052105722 +-- case +flashback table t,t1 to tso 445494955052105723 +-- case +flashback database test to tso 445494955052105724 +-- case +flashback schema test to tso 445494955052105725 +-- case +flashback table to tso 445494955052105726 +-- case +flashback database to tso 445494955052105727 +-- case +flashback schema test to tso 0 +-- case +flashback schema test to tso -100 +-- case +alter table t remove partitioning +-- case +alter table db.ident remove partitioning +-- case +alter table t lock = default remove partitioning +-- case +alter table t add column a int remove partitioning +-- case +alter table t add column a int, add index (c) remove partitioning +-- case +alter table t add column a int, remove partitioning +-- case +alter table t add column a int, add index (c), remove partitioning +-- case +alter table t remove partitioning add column a int +-- case +alter table t remove partitioning, add column a int +-- case +alter table t add column a double (4,2) zerofill references b match full on update set null first +-- case +alter table d_n.t_n add constraint foreign key ident (ident(1)) references d_n.t_n match full on delete set null +-- case +alter table t_n add constraint ident foreign key (ident,ident(1)) references t_n match full on update set null on delete restrict +-- case +alter table d_n.t_n add foreign key ident (ident, ident(1) asc) references t_n match partial on delete cascade remove partitioning +-- case +alter table d_n.t_n add constraint foreign key (ident asc) references d_n.t_n match simple on update cascade on delete cascade +-- case +create table t (a character varying(1)); +-- case +create table t (a character varying(255)); +-- case +create table t (a char varying(50)); +-- case +create table t (a varcharacter(1)); +-- case +create table t (a varcharacter(50)); +-- case +create table t (a varcharacter(1), b varcharacter(255)); +-- case +create table t (a char); +-- case +create table t (a character); +-- case +create table t (a character varying(50), b int); +-- case +create table t (a character, b int); +-- case +create table t (a national character varying(50)); +-- case +create table t (a national char varying(50)); +-- case +create table t (a national char); +-- case +create table t (a national character); +-- case +create table t (a nchar); +-- case +create table t (a nchar varchar(50)); +-- case +create table t (a nchar varcharacter(50)); +-- case +create table t (a national varchar); +-- case +create table t (a national varchar(50)); +-- case +create table t (a national varcharacter(50)); +-- case +create table t (a nchar varying(50)); +-- case +create table t (a nvarchar(50)); +-- case +create table nchar (a int); +-- case +create table nchar (a int, b nchar); +-- case +create table nchar (a int, b nchar(50)); +-- case +alter table t_n storage disk , modify ident national varcharacter(12) column_format fixed first; +-- case +create table t (a serial); +-- case +create table t (a serial null); +-- case +create table t (b int, a serial); +-- case +create table t (a int serial default value); +-- case +create table t (a int serial default value null); +-- case +create table t (a bigint serial default value); +-- case +create table t (a smallint serial default value); +-- case +create table t (a long); +-- case +create table t (a long varchar); +-- case +create table t (a long varcharacter); +-- case +create table t (a long char varying); +-- case +create table t (a long character varying); +-- case +create table t (a mediumtext, b long varchar, c long, d long varcharacter, e long char varying, f long character varying, g long); +-- case +create table t (a long varbinary); +-- case +create table t (a long char varying, b long varbinary); +-- case +create table t (a long char set utf8); +-- case +create table t (a long char varying char set utf8); +-- case +create table t (a long character set utf8); +-- case +create table t (a long character varying character set utf8); +-- case +alter table d_n.t_n modify column ident long after ident remove partitioning +-- case +alter table d_n.t_n modify column ident long char varying after ident remove partitioning +-- case +alter table d_n.t_n modify column ident long character varying after ident remove partitioning +-- case +alter table d_n.t_n modify column ident long varchar after ident remove partitioning +-- case +alter table d_n.t_n modify column ident long varcharacter after ident remove partitioning +-- case +alter table t_n change column ident ident long char varying binary charset utf8 first , tablespace ident +-- case +alter table t_n change column ident ident long character varying binary charset utf8 first , tablespace ident +-- case +create table t (a int) stats_auto_recalc 2; +-- case +create table t (a int) stats_auto_recalc = 10; +-- case +create table t (a int) stats_auto_recalc 0; +-- case +create table t (a int) stats_auto_recalc default; +-- case +create table t (a int) stats_auto_recalc = 0; +-- case +create table t (a int) stats_auto_recalc = 1; +-- case +create table t (a int) stats_auto_recalc=default; +-- case +create table t (a int) stats_persistent = 1, stats_auto_recalc = 1; +-- case +create table t (a int) stats_auto_recalc = 1, stats_sample_pages = 25; +-- case +alter table t modify a bigint, ENGINE=InnoDB, stats_auto_recalc = 0 +-- case +create table stats_auto_recalc (a int); +-- case +create table stats_auto_recalc (a int) stats_auto_recalc=1; +-- case +create table t (a int, primary key type type btree (a)); +-- case +create table t (a int, primary key type btree (a)); +-- case +create table t (a int, primary key using btree (a)); +-- case +create table t (a int, primary key (a) type btree); +-- case +create table t (a int, primary key (a) using btree); +-- case +create table t (a int, unique index type type btree (a)); +-- case +create table t (a int, unique index type using btree (a)); +-- case +create table t (a int, unique index type btree (a)); +-- case +create table t (a int, unique index using btree (a)); +-- case +create table t (a int, unique index (a) using btree); +-- case +create table t (a int, unique key (a) using btree); +-- case +create table t (a int, index type type btree (a)); +-- case +create table t (a int, index type btree (a)); +-- case +create table t (a int, index type using btree (a)); +-- case +create table t (a int, index using btree (a)); +-- case +ALTER TABLE d_n.t_n WITHOUT VALIDATION , ADD PARTITION ( PARTITION ident VALUES LESS THAN ( MAXVALUE ) STORAGE ENGINE text_string MAX_ROWS 12 ) +-- case +ALTER TABLE d_n.t_n WITH VALIDATION , ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION ident VALUES LESS THAN MAXVALUE STORAGE ENGINE = text_string, PARTITION ident VALUES LESS THAN ( MAXVALUE ) (SUBPARTITION text_string MIN_ROWS 11)) +-- case +ALTER TABLE d_n.t_n WITHOUT VALIDATION , ADD PARTITION ( PARTITION ident VALUES IN ( DEFAULT ) STORAGE ENGINE text_string MAX_ROWS 12 ) +-- case +ALTER TABLE d_n.t_n WITH VALIDATION , ADD PARTITION NO_WRITE_TO_BINLOG ( PARTITION ident VALUES IN ( DEFAULT ) STORAGE ENGINE text_string MAX_ROWS 12 ) +-- case +ALTER TABLE d_n.t_n ADD PARTITION ( PARTITION ident VALUES IN ( DEFAULT ), partition ptext values in ('default') ) +-- case +ALTER TABLE d_n.t_n WITH VALIDATION , ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION ident VALUES LESS THAN MAXVALUE STORAGE ENGINE = text_string, PARTITION ident VALUES IN ( DEFAULT ) (SUBPARTITION text_string MIN_ROWS 11)) +-- case +ALTER TABLE d_n.t_n ADD PARTITION (PARTITION ident VALUES IN ( DEFAULT )) +-- case +ALTER TABLE d_n.t_n ADD PARTITION (PARTITION ident VALUES IN (1, default )) +-- case +ALTER TABLE t IMPORT TABLESPACE; +-- case +ALTER TABLE t DISCARD TABLESPACE; +-- case +ALTER TABLE db.t IMPORT TABLESPACE; +-- case +ALTER TABLE db.t DISCARD TABLESPACE; +-- case +ALTER TABLE t ADD ( CHECK ( true ) ) +-- case +ALTER TABLE t ADD ( CONSTRAINT CHECK ( true ) ) +-- case +ALTER TABLE t ADD COLUMN ( CONSTRAINT ident CHECK ( 1>2 ) NOT ENFORCED ) +-- case +alter table t add column (b int, constraint c unique key (b)) +-- case +ALTER TABLE t ADD COLUMN ( CONSTRAINT CHECK ( true ) ) +-- case +ALTER TABLE t ADD COLUMN ( CONSTRAINT CHECK ( true ) ENFORCED , CHECK ( true ) ) +-- case +ALTER TABLE t ADD COLUMN (a1 int, CONSTRAINT b1 CHECK (a1>0)) +-- case +ALTER TABLE t ADD COLUMN (a1 int, a2 int, CONSTRAINT b1 CHECK (a1>0), CONSTRAINT b2 CHECK (a2<10)) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, PRIMARY KEY (`a1`)) +-- case +ALTER TABLE t ADD (a1 int, CONSTRAINT PRIMARY KEY (a1)) +-- case +ALTER TABLE t ADD (a1 int, a2 int, PRIMARY KEY (a1), UNIQUE (a2)) +-- case +ALTER TABLE t ADD (a1 int, a2 int, PRIMARY KEY (a1), CONSTRAINT b2 UNIQUE (a2)) +-- case +ALTER TABLE ident ADD ( CONSTRAINT FOREIGN KEY ident ( EXECUTE ( 123 ) ) REFERENCES t ( a ) MATCH SIMPLE ON DELETE CASCADE ON UPDATE SET NULL ) +-- case +ALTER TABLE t ADD COLUMN a DATE CHECK ( a > 0 ) FIRST +-- case +ALTER TABLE t ADD a1 int CONSTRAINT ident CHECK ( a1 > 1 ) REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE; +-- case +ALTER TABLE t ADD COLUMN a DATE CONSTRAINT CHECK ( a > 0 ) FIRST +-- case +ALTER TABLE t ADD a TINYBLOB CONSTRAINT ident CHECK ( 1>2 ) REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE +-- case +ALTER TABLE t ADD a2 int CONSTRAINT ident CHECK (a2 > 1) ENFORCED +-- case +ALTER TABLE t ADD a2 int CONSTRAINT ident CHECK (a2 > 1) NOT ENFORCED +-- case +ALTER TABLE t ADD a2 int CONSTRAINT ident primary key REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE; +-- case +ALTER TABLE t ADD a2 int CONSTRAINT ident primary key (a2)) +-- case +ALTER TABLE t ADD a2 int CONSTRAINT ident unique key (a2)) +-- case +ALTER TABLE t SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b' +-- case +ALTER TABLE t SET TIFLASH REPLICA 0 +-- case +ALTER DATABASE t SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b' +-- case +ALTER DATABASE t SET TIFLASH REPLICA 0 +-- case +ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b' +-- case +ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 +-- case +ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2 +-- case +ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b' +-- case +CREATE TABLE IF NOT EXISTS table_ident (a SQL_TSI_YEAR(4), b SQL_TSI_YEAR); +-- case +CREATE TABLE IF NOT EXISTS table_ident (ident1 BOOL COMMENT "text_string" unique, ident2 SQL_TSI_YEAR(4) ZEROFILL); +-- case +create table t (y sql_tsi_year(4), y1 sql_tsi_year) +-- case +create table t (y sql_tsi_year(4) unsigned zerofill zerofill, y1 sql_tsi_year signed unsigned zerofill) +-- case +insert into t set a = default +-- case +insert into t set a := default +-- case +replace t set a = default +-- case +update t set a = default +-- case +insert into t set a = default on duplicate key update a = default +-- case +create table t (a text byte ascii) +-- case +create table t (a text byte charset latin1) +-- case +create table t (a longtext ascii) +-- case +create table t (a mediumtext ascii) +-- case +create table t (a tinytext ascii) +-- case +create table t (a text byte) +-- case +create table t (a long byte, b text ascii) +-- case +create table t (a text ascii, b mediumtext ascii, c int) +-- case +create table t (a int, b text ascii, c mediumtext ascii) +-- case +create table t (a long ascii, b long ascii) +-- case +create table t (a long character set utf8mb4, b long charset utf8mb4, c long char set utf8mb4) +-- case +create table t (a int STORAGE MEMORY, b varchar(255) STORAGE MEMORY) +-- case +create table t (a int storage DISK, b varchar(255) STORAGE DEFAULT) +-- case +create table t (a int STORAGE DEFAULT, b varchar(255) STORAGE DISK) +-- case +create table t (a fixed(6, 3), b fixed key) +-- case +create table t (a numeric, b fixed(6)) +-- case +create table t (a fixed(65, 30) zerofill, b numeric, c fixed(65) unsigned zerofill) +-- case +create table a(a int, key(lower(a))); +-- case +create table a(a int, key(a+1)); +-- case +create table a(a int, key(a, a+1)); +-- case +create table a(a int, b int, key((a+1), (b+1))); +-- case +create table a(a int, b int, key(a, (b+1))); +-- case +create table a(a int, b int, key((a+1), b)); +-- case +create table a(a int, b int, key((a + 1) desc)); +-- case +create sequence sequence +-- case +create sequence seq +-- case +create sequence if not exists seq +-- case +create sequence seq +-- case +create sequence seq +-- case +create sequence if not exists seq +-- case +create sequence if not exists seq +-- case +create sequence if not exists seq increment +-- case +create sequence if not exists seq increment 1 +-- case +create sequence if not exists seq increment = 1 +-- case +create sequence if not exists seq increment by 1 +-- case +create sequence if not exists seq minvalue +-- case +create sequence if not exists seq minvalue 1 +-- case +create sequence if not exists seq minvalue = 1 +-- case +create sequence if not exists seq no +-- case +create sequence if not exists seq nominvalue +-- case +create sequence if not exists seq no minvalue +-- case +create sequence if not exists seq maxvalue +-- case +create sequence if not exists seq maxvalue 1 +-- case +create sequence if not exists seq maxvalue = 1 +-- case +create sequence if not exists seq no +-- case +create sequence if not exists seq nomaxvalue +-- case +create sequence if not exists seq no maxvalue +-- case +create sequence if not exists seq start +-- case +create sequence if not exists seq start with +-- case +create sequence if not exists seq start = +-- case +create sequence if not exists seq start with +-- case +create sequence if not exists seq start 1 +-- case +create sequence if not exists seq start = 1 +-- case +create sequence if not exists seq start with 1 +-- case +create sequence if not exists seq cache +-- case +create sequence if not exists seq cache 1 +-- case +create sequence if not exists seq cache = 1 +-- case +create sequence if not exists seq nocache +-- case +create sequence if not exists seq no cache +-- case +create sequence if not exists seq cycle +-- case +create sequence if not exists seq nocycle +-- case +create sequence if not exists seq no cycle +-- case +create sequence seq increment 1 start with 0 minvalue 0 maxvalue 1000 +-- case +create sequence seq increment 1 start with 0 minvalue 0 maxvalue 1000 +-- case +create sequence seq increment 10 start with 0 minvalue 0 maxvalue 1000 +-- case +create sequence if not exists seq cache 1 increment 1 start with -1 minvalue 0 maxvalue 1000 +-- case +create sequence sEq start with 0 minvalue 0 maxvalue 1000 +-- case +create sequence if not exists seq increment 1 start with 0 minvalue -2 maxvalue 1000 +-- case +create sequence seq increment -1 start with -1 minvalue -1 maxvalue -1000 cache = 10 nocycle +-- case +create table sequence (a int) +-- case +create table t (sequence int) +-- case +drop sequence +-- case +drop sequence seq +-- case +drop sequence if exists seq +-- case +drop sequence seq +-- case +drop sequence if exists seq +-- case +drop sequence if exists seq, seq2, seq3 +-- case +drop sequence seq seq2 +-- case +drop sequence seq, seq2 +-- case +create table t (a bigint auto_random(3) primary key, b varchar(255)) +-- case +create table t (a bigint auto_random primary key, b varchar(255)) +-- case +create table t (a bigint primary key auto_random(4), b varchar(255)) +-- case +create table t (a bigint primary key auto_random(3) primary key unique, b varchar(255)) +-- case +create table t (a bigint auto_random(5, 53) primary key, b varchar(255)) +-- case +create table t (a bigint auto_random(15, 32) primary key, b varchar(255)) +-- case +create table t (a int) auto_id_cache=1 +-- case +create table t (a int auto_increment key) auto_id_cache 10 +-- case +create table t (a bigint, b varchar(255)) auto_id_cache 50 +-- case +create table t (a bigint auto_random(3) primary key) auto_random_base = 10 +-- case +create table t (a bigint primary key auto_random(4), b varchar(100)) auto_random_base 200 +-- case +alter table t auto_random_base = 50 +-- case +alter table t auto_increment 30, auto_random_base 40 +-- case +alter table t force auto_random_base = 50 +-- case +alter table t auto_increment 30, force auto_random_base 40 +-- case +alter sequence seq +-- case +alter sequence seq comment="haha" +-- case +alter sequence seq start = 1 +-- case +alter sequence seq start with 1 increment by 1 +-- case +alter sequence seq start with 1 increment by 2 minvalue 0 maxvalue 100 +-- case +alter sequence seq increment -1 start with -1 minvalue -1 maxvalue -1000 cache = 10 nocycle +-- case +alter sequence if exists seq2 increment = 2 +-- case +alter sequence seq restart +-- case +alter sequence seq start with 3 restart with 5 +-- case +alter sequence seq restart = 5 +-- case +create sequence seq restart = 5 +-- case +create table t (a int, index ``(a)) +-- case +create table t (a int, b varchar(255), primary key(b, a) clustered) +-- case +create table t (a int, b varchar(255), primary key(b, a) nonclustered) +-- case +create table t (a int primary key nonclustered, b varchar(255)) +-- case +create table t (a int, b varchar(255) primary key clustered) +-- case +create table t (a int, b varchar(255) default 'a' primary key clustered) +-- case +create table t (a int, b varchar(255) primary key nonclustered, primary key(b, a) nonclustered) +-- case +create table t (a int, b varchar(255), primary key(b, a) using RTREE nonclustered) +-- case +create table t (a int, b varchar(255), primary key(b, a) using RTREE clustered nonclustered) +-- case +create table t (a int, b varchar(255), primary key(b, a) using RTREE nonclustered clustered) +-- case +create table t (a int, b varchar(255) clustered primary key) +-- case +create table t (a int, b varchar(255) primary key nonclustered clustered) +-- case +alter table t add primary key (`a`, `b`) clustered +-- case +alter table t add primary key (`a`, `b`) nonclustered +-- case +create table t(a int, b vector(3), vector index(b) USING HNSW); +-- case +create table t(a int, b vector(3), vector index(a, b) USING HNSW); +-- case +create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b)))); +-- case +create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b))) USING HASH); +-- case +create table t(a int, b vector(3), vector index(a, (VEC_COSINE_DISTANCE(b))) USING HNSW); +-- case +create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b)), a) USING HNSW); +-- case +create table t(a int, b vector(3), vector index(VEC_COSINE_DISTANCE(b)) USING HNSW); +-- case +create table t(a int, b vector(3), vector key((VEC_COSINE_DISTANCE(b))) TYPE HNSW); +-- case +create table t(a int, b vector(3), vector index((b+1)) USING HNSW); +-- case +create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(a, b))) USING HNSW); +-- case +create table t(a int, b vector(3), vector index((VEC_COSINE_DISTANCE(b))) USING HNSW); +-- case +drop placement policy x +-- case +drop placement policy x, y +-- case +drop placement policy if exists x +-- case +drop placement policy if exists x, y +-- case +show create placement policy x +-- case +show create placement policy if exists x +-- case +show create placement policy x, y +-- case +show create placement policy `placement` +-- case +create placement policy x primary_region='us' +-- case +create placement policy x region='us, 3' +-- case +create placement policy x followers=3 +-- case +create placement policy x followers=0 +-- case +create placement policy x voters=3 +-- case +create placement policy x learners=3 +-- case +create placement policy x schedule='even' +-- case +create placement policy x constraints='ww' +-- case +create placement policy x leader_constraints='ww' +-- case +create placement policy x follower_constraints='ww' +-- case +create placement policy x voter_constraints='ww' +-- case +create placement policy x learner_constraints='ww' +-- case +create placement policy x primary_region='cn' regions='us' schedule='even' +-- case +create placement policy x primary_region='cn', leader_constraints='ww', leader_constraints='yy' +-- case +create placement policy if not exists x regions = 'us', follower_constraints='yy' +-- case +create or replace placement policy x regions='us' +-- case +create placement policy x placement policy y +-- case +create table masking (id int) +-- case +select masking from t +-- case +alter table t add masking int +-- case +alter table t drop masking +-- case +alter table t modify masking int +-- case +create masking policy p on t(c) as c +-- case +create masking policy p on t(c) as c enable +-- case +create masking policy if not exists p on t(c) as c disable +-- case +create or replace masking policy p on t(c) as c +-- case +create masking policy p on t(c) as c restrict on none +-- case +create or replace masking policy if not exists p on t(c) as c +-- case +create masking policy p on t(c) as case when current_user() = 'root' then c else 'xxx' end enable +-- case +create masking policy p on t(c) as c restrict on (insert_into_select, delete_select) enable +-- case +create masking policy p on t(c) as case when current_user() not in ('root@%', 'u@%') then 'x' else c end +-- case +alter table t add masking policy p on (c) as c +-- case +alter table t add masking policy p on (c) as c restrict on none +-- case +alter table t add masking policy p on (c) as c disable +-- case +alter table t add masking policy p on (c) as c restrict on (update_select, ctas) disable +-- case +alter table t modify masking policy p set expression = case when current_role() in ('r1', 'r2') then c else 'x' end +-- case +alter table t modify masking policy p set expression case when current_role() in ('r1', 'r2') then c else 'x' end +-- case +alter table t modify masking policy p set restrict on (insert_into_select, update_select, delete_select, ctas) +-- case +alter table t modify masking policy p set restrict on none +-- case +alter table t enable masking policy p +-- case +alter table t disable masking policy p +-- case +alter table t drop masking policy p +-- case +show masking policies for t +-- case +show masking policies for t where column_name = 'c' +-- case +alter placement policy x primary_region='us' +-- case +alter placement policy x region='us, 3' +-- case +alter placement policy x followers=3 +-- case +alter placement policy x voters=3 +-- case +alter placement policy x learners=3 +-- case +alter placement policy x schedule='even' +-- case +alter placement policy x constraints='ww' +-- case +alter placement policy x leader_constraints='ww' +-- case +alter placement policy x follower_constraints='ww' +-- case +alter placement policy x voter_constraints='ww' +-- case +alter placement policy x learner_constraints='ww' +-- case +alter placement policy x primary_region='cn' regions='us' schedule='even' +-- case +alter placement policy x primary_region='cn', leader_constraints='ww', leader_constraints='yy' +-- case +alter placement policy if exists x regions = 'us', follower_constraints='yy' +-- case +alter placement policy x placement policy y +-- case +create resource group x cpu ='8c' +-- case +create resource group x region ='us, 3' +-- case +create resource group x cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s' +-- case +create resource group x ru_per_sec=2000 +-- case +create resource group x ru_per_sec=200000 +-- case +create resource group x ru_per_sec=UNLIMITED +-- case +create resource group x ru_per_sec=unlimited +-- case +create resource group x ru_per_sec='check' +-- case +create resource group x followers=0 +-- case +create resource group x burstable=true +-- case +create resource group x burstable=false +-- case +create resource group x burstable=disable +-- case +create resource group x ru_per_sec=1000, burstable +-- case +create resource group x burstable, ru_per_sec=2000 +-- case +create resource group x ru_per_sec=3000 burstable +-- case +create resource group x burstable ru_per_sec=4000 +-- case +create resource group x BURSTABLE = UNLIMITED ru_per_sec=4000 +-- case +create resource group x BURSTABLE = MODERATED ru_per_sec=4000 +-- case +create resource group x BURSTABLE = OFF ru_per_sec=4000 +-- case +create resource group x ru_per_sec=20, priority=LOW, burstable +-- case +create resource group default ru_per_sec=20, priority=LOW, burstable +-- case +create resource group default ru_per_sec=UNLIMITED, priority=LOW, burstable +-- case +create resource group x ru_per_sec=1000 +-- case +create resource group x ru_per_sec=1000 burstable=unlimited +-- case +create resource group x ru_per_sec=1000 burstable=off +-- case +create resource group x ru_per_sec=1000 burstable=moderated +-- case +create resource group x burstable=unlimited, ru_per_sec=2000 +-- case +create resource group x burstable=off, ru_per_sec=2000 +-- case +create resource group x burstable=moderated, ru_per_sec=2000 +-- case +create resource group x ru_per_sec=1000 ,burstable=unlimited +-- case +create resource group x ru_per_sec=1000 ,burstable=off +-- case +create resource group x ru_per_sec=1000 ,burstable=moderated +-- case +create resource group x ru_per_sec=1000 , priority=LOW,burstable=unlimited +-- case +create resource group x ru_per_sec=1000 , priority=LOW,burstable=off +-- case +create resource group x ru_per_sec=1000 , priority=LOW,burstable=moderated +-- case +create resource group x ru_per_sec=UNLIMITED , priority=LOW,burstable=unlimited +-- case +create resource group x ru_per_sec=UNLIMITED , priority=LOW,burstable=off +-- case +create resource group x ru_per_sec=UNLIMITED , priority=LOW,burstable=moderated +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION DRYRUN) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10m' ACTION COOLDOWN) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=(ACTION KILL EXEC_ELAPSED='10m') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' WATCH=SIMILAR DURATION '10m' ACTION COOLDOWN) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH EXACT DURATION='10m') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '9s' ACTION COOLDOWN WATCH EXACT) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '8s' ACTION COOLDOWN WATCH EXACT DURATION = UNLIMITED) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '7s' ACTION COOLDOWN WATCH EXACT DURATION UNLIMITED) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED '7s' ACTION COOLDOWN WATCH EXACT DURATION 'UNLIMITED') +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' RU 100 ACTION DRYRUN) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' PROCESSED_KEYS 100 ACTION DRYRUN) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' WATCH SIMILAR DURATION '10m' ACTION COOLDOWN) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION COOLDOWN WATCH EXACT DURATION '10m') +-- case +create resource group x ru_per_sec=1000 background = (task_types='') +-- case +create resource group x ru_per_sec=1000 background = (UTILIZATION_LIMIT=50) +-- case +create resource group x ru_per_sec=1000 background = (UTILIZATION_LIMIT="NAN") +-- case +create resource group x ru_per_sec=1000 background (task_types='br,lightning') +-- case +create resource group x ru_per_sec=1000 background (task_types='br,lightning',utilization_limit=50) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH EXACT DURATION='10m') background (task_types 'br,lightning') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH PLAN DURATION='10m') background (task_types 'br,lightning') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH PLAN DURATION='10m') background (task_types 'br,lightning', utilization_limit 10) +-- case +create resource group x ru_per_sec=UNLIMITED QUERY_LIMIT (EXEC_ELAPSED "10s" ACTION COOLDOWN WATCH PLAN DURATION='10m') background (task_types 'br,lightning') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s') +-- case +create resource group x ru_per_sec=1000 QUERY=(EXEC_ELAPSED '10s') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=EXEC_ELAPSED '10s' +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' +-- case +create resource group x ru_per_sec=1000 LIMIT=(EXEC_ELAPSED '10s') +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' ACTION DRYRUN ACTION KILL) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (PROCESSED_KEYS=100) +-- case +create resource group x ru_per_sec=1000 QUERY=(PROCESSED_KEYS 100) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=PROCESSED_KEYS 100 +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (PROCESSED_KEYS 100 +-- case +create resource group x ru_per_sec=1000 LIMIT=(PROCESSED_KEYS 100) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (PROCESSED_KEYS 100 ACTION DRYRUN ACTION KILL) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (RU=100) +-- case +create resource group x ru_per_sec=1000 QUERY=(RU 100) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT=RU 100 +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (RU 100 +-- case +create resource group x ru_per_sec=1000 LIMIT=(RU 100) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (RU 100 ACTION DRYRUN ACTION KILL) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED='10s' PROCESSED_KEYS=100) +-- case +create resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED='10s', PROCESSED_KEYS=100, RU=100) +-- case +alter resource group x cpu ='8c' +-- case +alter resource group x region ='us, 3' +-- case +alter resource group x burstable=true +-- case +alter resource group x burstable=false +-- case +alter resource group x burstable=disable +-- case +alter resource group default priority = high +-- case +alter resource group x cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s' +-- case +alter resource group x ru_per_sec=1000 +-- case +alter resource group x ru_per_sec=2000, BURSTABLE +-- case +alter resource group x ru_per_sec=UNLIMITED +-- case +alter resource group x ru_per_sec=UNLIMITED, BURSTABLE +-- case +alter resource group x ru_per_sec=unlimited, BURSTABLE +-- case +alter resource group x ru_per_sec='check', BURSTABLE +-- case +alter resource group x BURSTABLE, ru_per_sec=3000 +-- case +alter resource group x BURSTABLE ru_per_sec=4000 +-- case +alter resource group x ru_per_sec=2000, BURSTABLE=unlimited +-- case +alter resource group x ru_per_sec=2000, BURSTABLE=moderated +-- case +alter resource group x ru_per_sec=2000, BURSTABLE=off +-- case +alter resource group x ru_per_sec=UNLIMITED +-- case +alter resource group x ru_per_sec=UNLIMITED, BURSTABLE=unlimited +-- case +alter resource group x ru_per_sec=UNLIMITED, BURSTABLE=moderated +-- case +alter resource group x ru_per_sec=unlimited, BURSTABLE=off +-- case +alter resource group x ru_per_sec='check', BURSTABLE +-- case +alter resource group x ru_per_sec=2000, BURSTABLE=yes +-- case +alter resource group x BURSTABLE=unlimited, ru_per_sec=3000 +-- case +alter resource group x BURSTABLE=moderated, ru_per_sec=3000 +-- case +alter resource group x BURSTABLE=off, ru_per_sec=3000 +-- case +alter resource group x BURSTABLE=unlimited ru_per_sec=4000 +-- case +alter resource group x BURSTABLE=moderated ru_per_sec=4000 +-- case +alter resource group x BURSTABLE=off ru_per_sec=4000 +-- case +alter resource group x BURSTABLE +-- case +alter resource group x ru_per_sec=200000 BURSTABLE +-- case +alter resource group x followers=0 +-- case +alter resource group x ru_per_sec=20 priority=MID BURSTABLE +-- case +alter resource group x BURSTABLE=unlimited +-- case +alter resource group x BURSTABLE=moderated +-- case +alter resource group x BURSTABLE=off +-- case +alter resource group x ru_per_sec=200000 BURSTABLE=unlimited +-- case +alter resource group x ru_per_sec=200000 BURSTABLE=moderated +-- case +alter resource group x ru_per_sec=200000 BURSTABLE=off +-- case +alter resource group x followers=0 +-- case +alter resource group x ru_per_sec=20 priority=MID +-- case +alter resource group x ru_per_sec=20 priority=HIGH BURSTABLE=unlimited +-- case +alter resource group x ru_per_sec=20 priority=HIGH BURSTABLE=moderated +-- case +alter resource group x ru_per_sec=20 priority=HIGH BURSTABLE=off +-- case +alter resource group x QUERY_LIMIT=NULL +-- case +alter resource group x QUERY_LIMIT=() +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION DRYRUN) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=() +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10m' ACTION COOLDOWN) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=( ACTION KILL EXEC_ELAPSED '10m') +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' WATCH SIMILAR DURATION '10m' ACTION COOLDOWN) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION COOLDOWN WATCH EXACT DURATION '10m') +-- case +alter resource group x ru_per_sec=UNLIMITED QUERY_LIMIT=(EXEC_ELAPSED '10s' ACTION COOLDOWN WATCH EXACT DURATION '10m') +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s') +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT EXEC_ELAPSED '10s' +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' ACTION DRYRUN ACTION KILL) +-- case +alter resource group x ru_per_sec=1000 QUERY_LIMIT = (EXEC_ELAPSED '10s' ACTION DRYRUN WATCH SIMILAR DURATION '10m' ACTION COOLDOWN) +-- case +alter resource group x background=() +-- case +alter resource group x background NULL +-- case +alter resource group default priority=low background = ( task_types "ttl" ) +-- case +alter resource group default burstable=unlimited background ( task_types = 'a,b,c' ) +-- case +alter resource group default burstable=moderated background ( task_types = 'a,b,c' ) +-- case +alter resource group default burstable=off background ( task_types = 'a,b,c' ) +-- case +alter resource group default burstable=unlimited background ( utilization_limit = 20 ) +-- case +alter resource group default burstable=moderated background ( utilization_limit = 20 ) +-- case +alter resource group default burstable=off background ( utilization_limit = 20 ) +-- case +alter resource group default burstable=unlimited background ( task_types = 'a,b,c', utilization_limit = 20 ) +-- case +alter resource group default burstable=moderated background ( task_types = 'a,b,c', utilization_limit = 20 ) +-- case +alter resource group default burstable=off background ( task_types = 'a,b,c', utilization_limit = 20 ) +-- case +alter resource group default burstable=unlimited background ( utilization_limit = 'abc' ) +-- case +alter resource group default burstable=moderated background ( utilization_limit = 'abc' ) +-- case +alter resource group default burstable=off background ( utilization_limit = 'abc' ) +-- case +drop resource group x; +-- case +drop resource group DEFAULT; +-- case +drop resource group if exists x; +-- case +drop resource group x,y +-- case +drop resource group if exists x,y +-- case +set resource group x; +-- case +set resource group ``; +-- case +set resource group `default`; +-- case +set resource group default; +-- case +set resource group x y +-- case +CREATE ROLE `RESOURCE` +-- case +CREATE ROLE RESOURCE +-- case +CREATE TABLE t (a int) STATS_BUCKETS=1 +-- case +CREATE TABLE t (a int) STATS_BUCKETS='abc' +-- case +CREATE TABLE t (a int) STATS_BUCKETS= +-- case +CREATE TABLE t (a int) STATS_TOPN=1 +-- case +CREATE TABLE t (a int) STATS_TOPN='abc' +-- case +CREATE TABLE t (a int) STATS_AUTO_RECALC=1 +-- case +CREATE TABLE t (a int) STATS_AUTO_RECALC='abc' +-- case +CREATE TABLE t(a int) STATS_SAMPLE_RATE=0.1 +-- case +CREATE TABLE t (a int) STATS_SAMPLE_RATE='abc' +-- case +CREATE TABLE t (a int) STATS_COL_CHOICE='all' +-- case +CREATE TABLE t (a int) STATS_COL_CHOICE='list' +-- case +CREATE TABLE t (a int) STATS_COL_CHOICE=1 +-- case +CREATE TABLE t (a int, b int) STATS_COL_LIST='a,b' +-- case +CREATE TABLE t (a int, b int) STATS_COL_LIST=1 +-- case +CREATE TABLE t (a int) STATS_BUCKETS=1,STATS_TOPN=1 +-- case +CREATE TABLE t (a int) STATS_BUCKETS=1,STATS_TOPN=1 PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (200)) +-- case +ALTER TABLE t STATS_OPTIONS='str' +-- case +ALTER TABLE t STATS_OPTIONS='str1,str2' +-- case +ALTER TABLE t STATS_OPTIONS="str1,str2" +-- case +ALTER TABLE t STATS_OPTIONS 'str1,str2' +-- case +ALTER TABLE t STATS_OPTIONS "str1,str2" +-- case +ALTER TABLE t STATS_OPTIONS=DEFAULT +-- case +ALTER TABLE t STATS_OPTIONS=default +-- case +ALTER TABLE t STATS_OPTIONS=DeFaUlT +-- case +ALTER TABLE t STATS_OPTIONS +-- case +CREATE TABLE t (a int) INSERT_METHOD=FIRST diff --git a/parser/testdata/parser/ddl/output.sql b/parser/testdata/parser/ddl/output.sql new file mode 100644 index 0000000..58b7707 --- /dev/null +++ b/parser/testdata/parser/ddl/output.sql @@ -0,0 +1,2755 @@ +-- error: line 1 column 6 near "" +-- case +-- error: line 1 column 12 near "" +-- case +-- error: line 1 column 18 near "" +-- case +-- error: line 1 column 19 near ")" +-- case +-- error: line 1 column 19 near ");" +-- case +-- error: line 1 column 18 near "* (a varchar(50), b int);" +-- case +CREATE TABLE `foo` (`a` VARCHAR(50),`b` INT) +-- case +CREATE TABLE `foo` (`a` TINYINT UNSIGNED) +-- case +CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED) +-- case +CREATE TABLE `foo` (`a` BIGINT UNSIGNED,`b` TINYINT(1)) +-- case +-- error: line 1 column 47 near "CREATE TABLE bar (x INT, y int64)" +-- case +CREATE TABLE `foo` (`a` INT,`b` FLOAT); CREATE TABLE `bar` (`x` DOUBLE,`y` FLOAT) +-- case +-- error: line 1 column 25 near "bytes)" +-- case +CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED) +-- case +CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED) +-- case +-- error: line 1 column 56 near "// foo" +-- case +CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED) +-- case +CREATE TABLE `foo` (`a` SMALLINT UNSIGNED,`b` INT UNSIGNED) +-- case +CREATE TABLE `foo` (`name` CHAR(50) BINARY) +-- case +CREATE TABLE `foo` (`name` CHAR(50) COLLATE utf8_bin) +-- case +CREATE TABLE `foo` (`id` VARCHAR(50) COLLATE utf8_bin) +-- case +CREATE TABLE `foo` (`name` CHAR(50) CHARACTER SET UTF8) +-- case +CREATE TABLE `foo` (`name` CHAR(50) BINARY CHARACTER SET UTF8) +-- case +-- error: line 1 column 67 near "CHARACTER set utf8)" +-- case +CREATE TABLE `foo` (`name` CHAR(50) BINARY CHARACTER SET UTF8 COLLATE utf8_bin) +-- case +-- error: [parser:1064]Multiple COLLATE clauses line 1 column 86 near ")" +-- case +-- error: [parser:1064]Multiple COLLATE clauses line 1 column 69 near ")" +-- case +-- error: [parser:1064]Multiple COLLATE clauses line 1 column 81 near ")" +-- case +-- error: line 1 column 22 near ", b);" +-- case +-- error: line 1 column 20 near ", b.c);" +-- case +-- error: line 1 column 14 near "(name CHAR(50) BINARY)" +-- case +-- error: [parser:1064]Multiple COLLATE clauses line 1 column 81 near ", INDEX (name ASC))" +-- case +-- error: [parser:1064]Multiple COLLATE clauses line 1 column 81 near ", INDEX (name DESC))" +-- case +ALTER TABLE `tmp` CACHE +-- case +ALTER TABLE `tmp` NOCACHE +-- case +CREATE TEMPORARY TABLE `t` (`a` VARCHAR(50),`b` INT) +-- case +CREATE TEMPORARY TABLE `t` LIKE `t1` +-- case +DROP TEMPORARY TABLE `t` +-- case +CREATE GLOBAL TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) ON COMMIT DELETE ROWS +-- case +CREATE TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) +-- case +-- error: line 1 column 55 near ""GLOBAL TEMPORARY and ON COMMIT DELETE ROWS must appear together +-- case +-- error: line 1 column 70 near ""GLOBAL TEMPORARY and ON COMMIT DELETE ROWS must appear together +-- case +-- error: line 1 column 60 near ""GLOBAL TEMPORARY and ON COMMIT DELETE ROWS must appear together +-- case +CREATE GLOBAL TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) PARTITION BY HASH (`a`) PARTITIONS 10 ON COMMIT DELETE ROWS +-- case +CREATE GLOBAL TEMPORARY TABLE `t` (`a` INT,`b` VARCHAR(255)) ON COMMIT PRESERVE ROWS +-- case +DROP GLOBAL TEMPORARY TABLE `t` +-- case +DROP TEMPORARY TABLE `t` +-- case +CREATE TABLE `foo` (`node_id` VARCHAR(50),`b` INT) +-- case +CREATE TABLE `foo` (`node_state` VARCHAR(50),`b` INT) +-- case +CREATE TABLE `t` (`c` INT) AVG_ROW_LENGTH = 3 +-- case +CREATE TABLE `t` (`c` INT) AVG_ROW_LENGTH = 3 +-- case +CREATE TABLE `t` (`c` INT) CHECKSUM = 0 +-- case +CREATE TABLE `t` (`c` INT) CHECKSUM = 1 +-- case +CREATE TABLE `t` (`c` INT) TABLE_CHECKSUM = 0 +-- case +CREATE TABLE `t` (`c` INT) TABLE_CHECKSUM = 1 +-- case +CREATE TABLE `t` (`c` INT) COMPRESSION = 'NONE' +-- case +CREATE TABLE `t` (`c` INT) COMPRESSION = 'lz4' +-- case +CREATE TABLE `t` (`c` INT) CONNECTION = 'abc' +-- case +CREATE TABLE `t` (`c` INT) CONNECTION = 'abc' +-- case +CREATE TABLE `t` (`c` INT) KEY_BLOCK_SIZE = 1024 +-- case +CREATE TABLE `t` (`c` INT) KEY_BLOCK_SIZE = 1024 +-- case +CREATE TABLE `t` (`c` INT) MAX_ROWS = 1000 +-- case +CREATE TABLE `t` (`c` INT) MAX_ROWS = 1000 +-- case +CREATE TABLE `t` (`c` INT) MIN_ROWS = 1000 +-- case +CREATE TABLE `t` (`c` INT) MIN_ROWS = 1000 +-- case +CREATE TABLE `t` (`c` INT) PASSWORD = 'abc' +-- case +CREATE TABLE `t` (`c` INT) PASSWORD = 'abc' +-- case +CREATE TABLE `t` (`c` INT) DELAY_KEY_WRITE = 1 +-- case +CREATE TABLE `t` (`c` INT) DELAY_KEY_WRITE = 1 +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = DEFAULT +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = DEFAULT +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = FIXED +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = COMPRESSED +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = COMPACT +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = REDUNDANT +-- case +CREATE TABLE `t` (`c` INT) ROW_FORMAT = DYNAMIC +-- case +CREATE TABLE `t` (`c` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ +-- case +CREATE TABLE `t` (`c` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ +-- case +CREATE TABLE `t` (`c` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ +-- case +CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = 0 +-- case +CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = 10 +-- case +CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = 10 +-- case +CREATE TABLE `t` (`c` INT) STATS_SAMPLE_PAGES = DEFAULT +-- case +CREATE TABLE `t` (`c` INT) PACK_KEYS = DEFAULT /* TableOptionPackKeys is not supported */ +-- case +CREATE TABLE `t` (`c` INT) PACK_KEYS = DEFAULT /* TableOptionPackKeys is not supported */ +-- case +CREATE TABLE `t` (`c` INT) PACK_KEYS = DEFAULT /* TableOptionPackKeys is not supported */ +-- case +CREATE TABLE `t` (`c` INT) STORAGE DISK +-- case +CREATE TABLE `t` (`c` INT) STORAGE MEMORY +-- case +CREATE TABLE `t` (`c` INT) SECONDARY_ENGINE = NULL +-- case +CREATE TABLE `t` (`c` INT) SECONDARY_ENGINE = 'innodb' +-- case +CREATE TABLE `t` (`c` INT) SECONDARY_ENGINE = 'null' +-- case +CREATE TABLE `testTableCompression` (`c` VARCHAR(15000)) COMPRESSION = 'ZLIB' +-- case +CREATE TABLE `t1` (`c1` INT) COMPRESSION = 'zlib' +-- case +CREATE TABLE `t1` (`c1` INT) DEFAULT COLLATE = BINARY +-- case +CREATE TABLE `t1` (`c1` INT) DEFAULT COLLATE = UTF8MB4_0900_AS_CS +-- case +CREATE TABLE `t1` (`c1` INT) DEFAULT CHARACTER SET = BINARY DEFAULT COLLATE = BINARY +-- case +CREATE TABLE `t1` (`c1` INT) AUTOEXTEND_SIZE = 4M +-- case +ALTER TABLE `t_n` UNION = (), KEY_BLOCK_SIZE = 1 +-- case +ALTER TABLE `d_n`.`t_n` UNION = (`t_n`) REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` LOCK = DEFAULT, UNION = (`t_n`,`d_n`.`t_n`) REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` ALGORITHM = DEFAULT, MAX_ROWS = 10, UNION = (`d_n`.`t_n`), ROW_FORMAT = REDUNDANT, STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ +-- case +-- error: line 1 column 89 near "not 3), partition p2 values less than (20));" +-- case +-- error: line 1 column 90 near "or 3), partition p2 values less than (20));" +-- case +-- error: line 1 column 90 near "is null), partition p2 values less than (20));" +-- case +-- error: line 1 column 47 near "is null) (partition p0 values less than (10));" +-- case +-- error: line 1 column 45 near "not b) (partition p0 values in (10, 20));" +-- case +-- error: line 1 column 46 near "not b );" +-- case +-- error: line 1 column 90 near "in (3, 4, 5)), partition p2 values less than (20));" +-- case +CREATE TABLE `t` (`id` INT) ENGINE = INNDB PARTITION BY RANGE (`id`) (PARTITION `p0` VALUES LESS THAN (10),PARTITION `p1` VALUES LESS THAN (20)) +-- case +CREATE TABLE `t` (`c` INT) PARTITION BY HASH (`c`) PARTITIONS 32 +-- case +-- error: [ddl:1480]Only RANGE PARTITIONING can use VALUES LESS THAN in partition definition +-- case +CREATE TABLE `t` (`c` INT) PARTITION BY RANGE (YEAR(`VDate`)) (PARTITION `p1980` VALUES LESS THAN (1980) ENGINE = MyISAM,PARTITION `p1990` VALUES LESS THAN (1990) ENGINE = MyISAM,PARTITION `pothers` VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) +-- case +CREATE TABLE `t` (`c` INT,`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '') PARTITION BY RANGE (UNIX_TIMESTAMP(`create_time`)) (PARTITION `p201610` VALUES LESS THAN (1477929600),PARTITION `p201611` VALUES LESS THAN (1480521600),PARTITION `p201612` VALUES LESS THAN (1483200000),PARTITION `p201701` VALUES LESS THAN (1485878400),PARTITION `p201702` VALUES LESS THAN (1488297600),PARTITION `p201703` VALUES LESS THAN (1490976000)) +-- case +CREATE TABLE `md_product_shop` (`shopCode` VARCHAR(4) DEFAULT NULL COMMENT '地点') ENGINE = InnoDB DEFAULT CHARACTER SET = UTF8MB4 PARTITION BY KEY (`shopCode`) PARTITIONS 19 +-- case +CREATE TABLE `payinfo1` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`oderTime` DATETIME NOT NULL) ENGINE = InnoDB AUTO_INCREMENT = 641533032 DEFAULT CHARACTER SET = UTF8 ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 PARTITION BY RANGE COLUMNS (`oderTime`) (PARTITION `P2011` VALUES LESS THAN (_UTF8MB4'2012-01-01 00:00:00') ENGINE = InnoDB,PARTITION `P1201` VALUES LESS THAN (_UTF8MB4'2012-02-01 00:00:00') ENGINE = InnoDB,PARTITION `PMAX` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) +-- case +CREATE TABLE `app_channel_daily_report` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`app_version` VARCHAR(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT _UTF8MB4'default',`gmt_create` DATETIME NOT NULL COMMENT '创建时间',PRIMARY KEY(`id`)) ENGINE = InnoDB AUTO_INCREMENT = 33703438 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_UNICODE_CI PARTITION BY RANGE (MONTH(`gmt_create`)-1) (PARTITION `part0` VALUES LESS THAN (1) COMMENT = '1月份' ENGINE = InnoDB,PARTITION `part1` VALUES LESS THAN (2) COMMENT = '2月份' ENGINE = InnoDB,PARTITION `part2` VALUES LESS THAN (3) COMMENT = '3月份' ENGINE = InnoDB,PARTITION `part3` VALUES LESS THAN (4) COMMENT = '4月份' ENGINE = InnoDB,PARTITION `part4` VALUES LESS THAN (5) COMMENT = '5月份' ENGINE = InnoDB,PARTITION `part5` VALUES LESS THAN (6) COMMENT = '6月份' ENGINE = InnoDB,PARTITION `part6` VALUES LESS THAN (7) COMMENT = '7月份' ENGINE = InnoDB,PARTITION `part7` VALUES LESS THAN (8) COMMENT = '8月份' ENGINE = InnoDB,PARTITION `part8` VALUES LESS THAN (9) COMMENT = '9月份' ENGINE = InnoDB,PARTITION `part9` VALUES LESS THAN (10) COMMENT = '10月份' ENGINE = InnoDB,PARTITION `part10` VALUES LESS THAN (11) COMMENT = '11月份' ENGINE = InnoDB,PARTITION `part11` VALUES LESS THAN (12) COMMENT = '12月份' ENGINE = InnoDB) +-- case +-- error: line 1 column 37 near "primary_region="us";" +-- case +-- error: line 1 column 30 near "regions="us,3";" +-- case +-- error: line 1 column 32 near "followers="us,3";" +-- case +-- error: line 1 column 32 near "followers=3;" +-- case +-- error: line 1 column 32 near "followers=0;" +-- case +-- error: line 1 column 29 near "voters=3;" +-- case +-- error: line 1 column 31 near "learners="us,3";" +-- case +-- error: line 1 column 31 near "learners=3;" +-- case +-- error: line 1 column 31 near "schedule="even";" +-- case +-- error: line 1 column 34 near "constraints="ww";" +-- case +-- error: line 1 column 41 near "leader_constraints="ww";" +-- case +-- error: line 1 column 43 near "follower_constraints="ww";" +-- case +-- error: line 1 column 40 near "voter_constraints="ww";" +-- case +-- error: line 1 column 42 near "learner_constraints="ww";" +-- case +-- error: line 1 column 42 near "survival_preference="ww";" +-- case +-- error: line 1 column 53 near "primary_region="us" */;" +-- case +-- error: line 1 column 46 near "regions="us,3" */;" +-- case +-- error: line 1 column 48 near "followers="us,3 */";" +-- case +-- error: line 1 column 48 near "followers=3 */;" +-- case +-- error: line 1 column 48 near "followers=0 */;" +-- case +-- error: line 1 column 45 near "voters="us,3" */;" +-- case +-- error: line 1 column 53 near "primary_region="us" regions="us,3" */;" +-- case +CREATE TABLE `t` (`c` INT) PLACEMENT POLICY = `ww` +-- case +CREATE TABLE `t` (`c` INT) PLACEMENT POLICY = `x` +-- case +CREATE TABLE `t` (`c` INT) PLACEMENT POLICY = `y` +-- case +-- error: line 1 column 28 near "primary_region="us";" +-- case +-- error: line 1 column 21 near "regions="us,3";" +-- case +-- error: line 1 column 23 near "followers=3;" +-- case +-- error: line 1 column 23 near "followers=0;" +-- case +-- error: line 1 column 20 near "voters=3;" +-- case +-- error: line 1 column 22 near "learners=3;" +-- case +-- error: line 1 column 22 near "schedule="even";" +-- case +-- error: line 1 column 25 near "constraints="ww";" +-- case +-- error: line 1 column 32 near "leader_constraints="ww";" +-- case +-- error: line 1 column 34 near "follower_constraints="ww";" +-- case +-- error: line 1 column 31 near "voter_constraints="ww";" +-- case +-- error: line 1 column 33 near "learner_constraints="ww";" +-- case +-- error: line 1 column 44 near "primary_region="us" */;" +-- case +ALTER TABLE `t` PLACEMENT POLICY = `ww` +-- case +ALTER TABLE `t` PLACEMENT POLICY = `ww` +-- case +ALTER TABLE `t` COMPACT +-- case +ALTER TABLE `t` COMPACT TIFLASH REPLICA +-- case +ALTER TABLE `t` COMPACT PARTITION `p1`,`p2` +-- case +ALTER TABLE `t` COMPACT PARTITION `p1`,`p2` TIFLASH REPLICA +-- case +-- error: line 1 column 32 near "primary_region="us";" +-- case +-- error: line 1 column 25 near "regions="us,3";" +-- case +-- error: line 1 column 27 near "followers=3;" +-- case +-- error: line 1 column 27 near "followers=0;" +-- case +-- error: line 1 column 24 near "voters=3;" +-- case +-- error: line 1 column 26 near "learners=3;" +-- case +-- error: line 1 column 26 near "schedule="even";" +-- case +-- error: line 1 column 29 near "constraints="ww";" +-- case +-- error: line 1 column 36 near "leader_constraints="ww";" +-- case +-- error: line 1 column 38 near "follower_constraints="ww";" +-- case +-- error: line 1 column 35 near "voter_constraints="ww";" +-- case +-- error: line 1 column 37 near "learner_constraints="ww";" +-- case +-- error: line 1 column 48 near "primary_region="us" */;" +-- case +CREATE DATABASE `t` PLACEMENT POLICY = `ww` +-- case +CREATE DATABASE `t` PLACEMENT POLICY = `ww` +-- case +CREATE DATABASE `t` PLACEMENT POLICY = `ww` +-- case +-- error: line 1 column 31 near "primary_region="us";" +-- case +-- error: line 1 column 24 near "regions="us,3";" +-- case +-- error: line 1 column 26 near "followers=3;" +-- case +-- error: line 1 column 26 near "followers=0;" +-- case +-- error: line 1 column 23 near "voters=3;" +-- case +-- error: line 1 column 25 near "learners=3;" +-- case +-- error: line 1 column 25 near "schedule="even";" +-- case +-- error: line 1 column 28 near "constraints="ww";" +-- case +-- error: line 1 column 35 near "leader_constraints="ww";" +-- case +-- error: line 1 column 37 near "follower_constraints="ww";" +-- case +-- error: line 1 column 34 near "voter_constraints="ww";" +-- case +-- error: line 1 column 36 near "learner_constraints="ww";" +-- case +-- error: line 1 column 47 near "primary_region="us" */;" +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `ww` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `ww` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT` +-- case +ALTER DATABASE `t` PLACEMENT POLICY = `DEFAULT` +-- case +-- error: line 1 column 97 near "primary_region="us");" +-- case +-- error: line 1 column 90 near "regions="us,3");" +-- case +-- error: line 1 column 92 near "followers=3);" +-- case +-- error: line 1 column 89 near "voters=3);" +-- case +-- error: line 1 column 91 near "learners=3);" +-- case +-- error: line 1 column 91 near "schedule="even");" +-- case +-- error: line 1 column 94 near "constraints="ww");" +-- case +-- error: line 1 column 101 near "leader_constraints="ww");" +-- case +-- error: line 1 column 103 near "follower_constraints="ww");" +-- case +-- error: line 1 column 100 near "voter_constraints="ww");" +-- case +-- error: line 1 column 102 near "learner_constraints="ww");" +-- case +CREATE TABLE `m` (`c` INT) PARTITION BY RANGE (`c`) (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`) +-- case +CREATE TABLE `m` (`c` INT) PARTITION BY RANGE (`c`) (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`) +-- case +-- error: line 1 column 40 near "primary_region="us";" +-- case +-- error: line 1 column 33 near "regions="us,3";" +-- case +-- error: line 1 column 35 near "followers=3;" +-- case +-- error: line 1 column 40 near "primary_region="us" followers=3;" +-- case +-- error: line 1 column 32 near "voters=3;" +-- case +-- error: line 1 column 34 near "learners=3;" +-- case +-- error: line 1 column 34 near "schedule="even";" +-- case +-- error: line 1 column 37 near "constraints="ww";" +-- case +-- error: line 1 column 44 near "leader_constraints="ww";" +-- case +-- error: line 1 column 46 near "follower_constraints="ww";" +-- case +-- error: line 1 column 43 near "voter_constraints="ww";" +-- case +-- error: line 1 column 45 near "learner_constraints="ww";" +-- case +ALTER TABLE `m` PARTITION `t` PLACEMENT POLICY = `ww` +-- case +ALTER TABLE `m` PARTITION `t` PLACEMENT POLICY = `ww` +-- case +-- error: line 1 column 79 near "primary_region="us");" +-- case +-- error: line 1 column 72 near "regions="us,3");" +-- case +-- error: line 1 column 74 near "followers=3);" +-- case +-- error: line 1 column 71 near "voters=3);" +-- case +-- error: line 1 column 73 near "learners=3);" +-- case +-- error: line 1 column 73 near "schedule="even");" +-- case +-- error: line 1 column 76 near "constraints="ww");" +-- case +-- error: line 1 column 83 near "leader_constraints="ww");" +-- case +-- error: line 1 column 85 near "follower_constraints="ww");" +-- case +-- error: line 1 column 82 near "voter_constraints="ww");" +-- case +-- error: line 1 column 84 near "learner_constraints="ww");" +-- case +ALTER TABLE `m` ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`) +-- case +ALTER TABLE `m` ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200) PLACEMENT POLICY = `ww`) +-- case +ALTER TABLE `m` ADD COLUMN `a` INT, ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200)) +-- case +ALTER TABLE `m` ADD PARTITION (PARTITION `p1` VALUES LESS THAN (200)), ADD COLUMN `a` INT +-- case +CREATE TABLE `t` (`c1` TINYINT(1),`c2` TINYINT(1),CHECK(`c1` IN (0,1)) NOT ENFORCED,CHECK(`c2` IN (0,1)) ENFORCED) +-- case +CREATE TABLE `Customer` (`SD` INT CHECK(`SD`>0) ENFORCED,`First_Name` VARCHAR(30)) +-- case +CREATE TABLE `Customer` (`SD` INT CHECK(`SD`>0) NOT ENFORCED,`SS` VARCHAR(30) CHECK(`ss`=_UTF8MB4'test') ENFORCED) +-- case +CREATE TABLE `Customer` (`SD` INT CHECK(`SD`>0) ENFORCED NOT NULL,`First_Name` VARCHAR(30) COMMENT 'string' NOT NULL) +-- case +CREATE TABLE `Customer` (`SD` INT COMMENT 'string' CHECK(`SD`>0) ENFORCED NOT NULL) +-- case +-- error: line 1 column 63 near "enforced, First_Name varchar(30));" +-- case +-- error: line 1 column 46 near "enforced, First_Name varchar(30));" +-- case +CREATE DATABASE `xxx` +-- case +-- error: line 1 column 25 near "exists xxx" +-- case +CREATE DATABASE IF NOT EXISTS `xxx` +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'N' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'N' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'N' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'N' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'Y' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'Y' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'Y' +-- case +CREATE DATABASE `xxx` ENCRYPTION = 'Y' +-- case +-- error: line 1 column 34 near "N" +-- case +CREATE DATABASE `xxx` +-- case +-- error: line 1 column 23 near "exists xxx" +-- case +CREATE DATABASE IF NOT EXISTS `xxx` +-- case +DROP DATABASE `xxx` +-- case +DROP DATABASE IF EXISTS `xxx` +-- case +-- error: line 1 column 20 near "not exists xxx" +-- case +DROP DATABASE `xxx` +-- case +DROP DATABASE IF EXISTS `xxx` +-- case +-- error: line 1 column 18 near "not exists xxx" +-- case +-- error: line 1 column 10 near "" +-- case +-- error: line 1 column 26 near "'xyz" +-- case +-- error: line 1 column 23 near "'" +-- case +-- error: line 1 column 23 near "`" +-- case +-- error: line 1 column 23 near "'" +-- case +-- error: line 1 column 23 near """ +-- case +DROP TABLE `xxx` +-- case +DROP TABLE `xxx`, `yyy` +-- case +DROP TABLE `xxx` +-- case +DROP TABLE `xxx`, `yyy` +-- case +DROP TABLE IF EXISTS `xxx` +-- case +DROP TABLE IF EXISTS `xxx`, `yyy` +-- case +-- error: line 1 column 17 near "not exists xxx" +-- case +DROP TABLE `xxx` +-- case +DROP TABLE `xxx`, `yyy` +-- case +DROP TABLE IF EXISTS `xxx` +-- case +-- error: line 1 column 9 near "" +-- case +DROP VIEW `xxx` +-- case +DROP VIEW `xxx`, `yyy` +-- case +DROP VIEW IF EXISTS `xxx` +-- case +DROP VIEW IF EXISTS `xxx`, `yyy` +-- case +DROP STATS `t` +-- case +DROP STATS `t1`, `t2`, `t3` +-- case +DROP STATS `t` GLOBAL +-- case +DROP STATS `t` PARTITION `p0` +-- case +DROP STATS `t` PARTITION `p0`,`p1`,`p2` +-- case +CREATE TABLE `address` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(128) NOT NULL,`address_detail` VARCHAR(128) NOT NULL,`cellphone` VARCHAR(16) NOT NULL,`latitude` DOUBLE NOT NULL,`longitude` DOUBLE NOT NULL,`name` VARCHAR(16) NOT NULL,`sex` TINYINT(1) NOT NULL,`user_id` BIGINT(20) NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `FK_7rod8a71yep5vxasb0ms3osbg` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`),INDEX `FK_7rod8a71yep5vxasb0ms3osbg`(`user_id`)) ENGINE = InnoDB AUTO_INCREMENT = 30 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0 +-- case +CREATE TABLE `test_data` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(255) NOT NULL,`amount` DECIMAL(19,2) DEFAULT NULL,`charge_id` VARCHAR(32) DEFAULT NULL,`paid_amount` DECIMAL(19,2) DEFAULT NULL,`transaction_no` VARCHAR(64) DEFAULT NULL,`wx_mp_app_id` VARCHAR(32) DEFAULT NULL,`contacts` VARCHAR(50) DEFAULT NULL,`deliver_fee` DECIMAL(19,2) DEFAULT NULL,`deliver_info` VARCHAR(255) DEFAULT NULL,`deliver_time` VARCHAR(255) DEFAULT NULL,`description` VARCHAR(255) DEFAULT NULL,`invoice` VARCHAR(255) DEFAULT NULL,`order_from` INT(11) DEFAULT NULL,`order_state` INT(11) NOT NULL,`packing_fee` DECIMAL(19,2) DEFAULT NULL,`payment_time` DATETIME DEFAULT NULL,`payment_type` INT(11) DEFAULT NULL,`phone` VARCHAR(50) NOT NULL,`store_employee_id` BIGINT(20) DEFAULT NULL,`store_id` BIGINT(20) NOT NULL,`user_id` BIGINT(20) NOT NULL,`payment_mode` INT(11) NOT NULL,`current_latitude` DOUBLE NOT NULL,`current_longitude` DOUBLE NOT NULL,`address_latitude` DOUBLE NOT NULL,`address_longitude` DOUBLE NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `food_order_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`),CONSTRAINT `food_order_ibfk_2` FOREIGN KEY (`store_id`) REFERENCES `waimaiqa`.`store`(`id`),CONSTRAINT `food_order_ibfk_3` FOREIGN KEY (`store_employee_id`) REFERENCES `waimaiqa`.`store_employee`(`id`),UNIQUE `FK_UNIQUE_charge_id`(`charge_id`) USING BTREE,INDEX `FK_eqst2x1xisn3o0wbrlahnnqq8`(`store_employee_id`) USING BTREE,INDEX `FK_8jcmec4kb03f4dod0uqwm54o9`(`store_id`) USING BTREE,INDEX `FK_a3t0m9apja9jmrn60uab30pqd`(`user_id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 95 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0 +-- case +CREATE TABLE `t` (`c` INT PRIMARY KEY) +-- case +CREATE TABLE `address` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(128) NOT NULL,`address_detail` VARCHAR(128) NOT NULL,`cellphone` VARCHAR(16) NOT NULL,`latitude` DOUBLE NOT NULL,`longitude` DOUBLE NOT NULL,`name` VARCHAR(16) NOT NULL,`sex` TINYINT(1) NOT NULL,`user_id` BIGINT(20) NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `FK_7rod8a71yep5vxasb0ms3osbg` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION,INDEX `FK_7rod8a71yep5vxasb0ms3osbg`(`user_id`)) ENGINE = InnoDB AUTO_INCREMENT = 30 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0 +-- case +CREATE TABLE `address` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`create_at` DATETIME NOT NULL,`deleted` TINYINT(1) NOT NULL,`update_at` DATETIME NOT NULL,`version` BIGINT(20) DEFAULT NULL,`address` VARCHAR(128) NOT NULL,`address_detail` VARCHAR(128) NOT NULL,`cellphone` VARCHAR(16) NOT NULL,`latitude` DOUBLE NOT NULL,`longitude` DOUBLE NOT NULL,`name` VARCHAR(16) NOT NULL,`sex` TINYINT(1) NOT NULL,`user_id` BIGINT(20) NOT NULL,PRIMARY KEY(`id`),CONSTRAINT `FK_7rod8a71yep5vxasb0ms3osbg` FOREIGN KEY (`user_id`) REFERENCES `waimaiqa`.`user`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION,INDEX `FK_7rod8a71yep5vxasb0ms3osbg`(`user_id`)) ENGINE = InnoDB AUTO_INCREMENT = 30 DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI ROW_FORMAT = COMPACT COMMENT = '' CHECKSUM = 0 DELAY_KEY_WRITE = 0 +-- case +CREATE TABLE `t1` (`accout_id` INT(11) DEFAULT _UTF8MB4'0',`summoner_id` INT(11) DEFAULT _UTF8MB4'0',`union_name` VARBINARY(52) NOT NULL,`union_id` INT(11) DEFAULT _UTF8MB4'0',PRIMARY KEY(`union_name`)) ENGINE = MyISAM DEFAULT CHARACTER SET = BINARY +-- case +CREATE TABLE `t` (`a` DECIMAL(20,0),`b` DECIMAL(30),`c` FLOAT(25,0)) +-- case +CREATE TABLE `t` (`c` INT,INDEX `ci`(`c`) USING BTREE COMMENT '123') +-- case +CREATE TABLE `sbtest` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`k` INT UNSIGNED DEFAULT _UTF8MB4'0' NOT NULL,`c` CHAR(120) DEFAULT _UTF8MB4'' NOT NULL,`pad` CHAR(60) DEFAULT _UTF8MB4'' NOT NULL,PRIMARY KEY(`id`)) +-- case +CREATE TABLE `test` (`create_date` TIMESTAMP NOT NULL COMMENT '创建日期 create date' DEFAULT CURRENT_TIMESTAMP()) +-- case +CREATE TABLE `ts` (`t` INT,`v` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3)) +-- case +CREATE TABLE IF NOT EXISTS `t` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '消息ID',PRIMARY KEY `pk_id`(`id`)) +-- case +CREATE TABLE `a` LIKE `b` +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON DELETE NO ACTION) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON UPDATE SET DEFAULT) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON DELETE SET NULL ON UPDATE CASCADE) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON DELETE RESTRICT ON UPDATE SET DEFAULT) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) MATCH FULL ON DELETE NO ACTION) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) MATCH PARTIAL ON UPDATE NO ACTION) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) MATCH SIMPLE ON UPDATE NO ACTION) +-- case +CREATE TABLE `a` (`id` INT REFERENCES `a`(`id`) ON UPDATE SET DEFAULT) +-- case +-- error: line 1 column 72 near "update CURRENT_TIMESTAMP)" +-- case +-- error: line 1 column 90 near "CURRENT_TIMESTAMP)" +-- case +CREATE TABLE `a` LIKE `b` +-- case +CREATE TABLE IF NOT EXISTS `a` LIKE `b` +-- case +CREATE TABLE IF NOT EXISTS `a` LIKE `b` +-- case +-- error: line 1 column 35 near "(b)" +-- case +-- error: line 1 column 27 near "like b" +-- case +-- error: line 1 column 27 near "like (b)" +-- case +CREATE TABLE `a` AS SELECT * FROM `b` +-- case +CREATE TABLE `a` AS SELECT * FROM `b` +-- case +CREATE TABLE `a` (`m` INT,`n` DATETIME) AS SELECT * FROM `b` +-- case +CREATE TABLE `a` (UNIQUE(`n`)) AS SELECT `n` FROM `b` +-- case +CREATE TABLE `a` IGNORE AS SELECT `n` FROM `b` +-- case +CREATE TABLE `a` REPLACE AS SELECT `n` FROM `b` +-- case +CREATE TABLE `a` (`m` INT) REPLACE AS (SELECT `n` AS `m` FROM `b` UNION SELECT `n`+1 AS `m` FROM `c` GROUP BY 1 LIMIT 2) +-- case +CREATE TABLE `a` +-- case +-- error: line 1 column 39 near "now)" +-- case +CREATE TABLE `t` (`a` TIMESTAMP DEFAULT CURRENT_TIMESTAMP()) +-- case +CREATE TABLE `t` (`a` TIMESTAMP DEFAULT CURRENT_TIMESTAMP()) +-- case +-- error: line 1 column 55 near "now)" +-- case +CREATE TABLE `t` (`a` TIMESTAMP DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP()) +-- case +-- error: line 1 column 53 near "(now()))" +-- case +CREATE TABLE `t` (`c` TEXT) DEFAULT CHARACTER SET = UTF8 DEFAULT COLLATE = UTF8_GENERAL_CI +-- case +CREATE TABLE `t` (`c` TEXT) SHARD_ROW_ID_BITS = 1 +-- case +CREATE TABLE `t` (`c` TEXT) SHARD_ROW_ID_BITS = 1 PRE_SPLIT_REGIONS = 1 +-- case +CREATE TABLE IF NOT EXISTS `general_log` (`event_time` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` MEDIUMTEXT NOT NULL,`thread_id` BIGINT(20) UNSIGNED NOT NULL,`server_id` INT(10) UNSIGNED NOT NULL,`command_type` VARCHAR(64) NOT NULL,`argument` MEDIUMBLOB NOT NULL) ENGINE = CSV DEFAULT CHARACTER SET = UTF8 COMMENT = 'General log' +-- case +CREATE TABLE `followers` (`f1` INT NOT NULL REFERENCES `user_profiles`(`uid`)) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (RAND())) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (RAND(1))) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (RAND())) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (RAND(1))) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (RAND())) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (RAND(1))) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE())) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE())) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE())) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE())) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE())) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (CURRENT_DATE())) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m'))) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m'))) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m-%d'))) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m-%d %H.%i.%s'))) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%Y-%m-%d %H:%i:%s'))) +-- case +CREATE TABLE `t` (`d` DATE DEFAULT (DATE_FORMAT(NOW(), _UTF8MB4'%b %d %Y %h:%i %p'))) +-- case +CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(UPPER(UUID()), _UTF8MB4'-', _UTF8MB4''))) +-- case +CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(UPPER(UUID()), _UTF8MB4'-', _UTF8MB4''))) +-- case +CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(CONVERT(UPPER(UUID()) USING 'utf8mb4'), _UTF8MB4'-', _UTF8MB4''))) +-- case +CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (REPLACE(CONVERT(UPPER(UUID()) USING 'utf8mb4'), _UTF8MB4'-', _UTF8MB4''))) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (UPPER(SUBSTRING_INDEX(USER(), _UTF8MB4'@', 1)))) +-- case +CREATE TABLE `t` (`a` INT DEFAULT (UPPER(SUBSTRING_INDEX(USER(), _UTF8MB4'@', 1)))) +-- case +CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (STR_TO_DATE(_UTF8MB4'1980-01-01', _UTF8MB4'%Y-%m-%d'))) +-- case +CREATE TABLE `t` (`a` VARCHAR(32) DEFAULT (STR_TO_DATE(_UTF8MB4'1980-01-01', _UTF8MB4'%Y-%m-%d'))) +-- case +CREATE TABLE `t` (`j` JSON DEFAULT (JSON_OBJECT())) +-- case +CREATE TABLE `t` (`j` JSON DEFAULT (JSON_ARRAY())) +-- case +CREATE TABLE `t` (`j` JSON DEFAULT (JSON_QUOTE())) +-- case +CREATE TABLE `t` (`j` JSON DEFAULT (JSON_OBJECT(_UTF8MB4'foo', 5, _UTF8MB4'bar', _UTF8MB4'barfoo'))) +-- case +CREATE TABLE `t` (`j` JSON DEFAULT (JSON_ARRAY(1, 2, 3))) +-- case +CREATE TABLE `t` (`j` JSON DEFAULT (JSON_QUOTE(_UTF8MB4'foobar'))) +-- case +CREATE TABLE `t` (`c` CHAR(33) DEFAULT (NONEXISTINGFUNC(_UTF8MB4'foobar'))) +-- case +CREATE TABLE `t` (`c` CHAR(33) DEFAULT _UTF8MB4'foobar') +-- case +CREATE TABLE `t` (`c` CHAR(33) DEFAULT _UTF8MB4'foobar') +-- case +CREATE TABLE `t` (`i` INT DEFAULT 0) +-- case +CREATE TABLE `t` (`i` INT DEFAULT -1) +-- case +CREATE TABLE `t` (`i` INT DEFAULT +1) +-- case +CREATE TABLE `t` (`a` INT,`b` INT,`c` CHAR(33) DEFAULT (`b`)) +-- case +-- error: line 1 column 53 near ")" +-- case +CREATE TABLE `t` (`a` INT) ENCRYPTION = 'n' +-- case +CREATE TABLE `t` (`a` INT) ENCRYPTION = 'n' +-- case +ALTER TABLE `t` ENCRYPTION = 'y' +-- case +ALTER TABLE `t` ENCRYPTION = 'y' +-- case +CREATE TABLE `t` (`a` INT PRIMARY KEY GLOBAL) +-- case +CREATE TABLE `t` (`a` INT PRIMARY KEY) +-- case +CREATE TABLE `t` (`a` INT PRIMARY KEY) +-- case +CREATE TABLE `t` (`a` INT PRIMARY KEY GLOBAL) +-- case +CREATE TABLE `t` (`a` INT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` INT UNIQUE KEY GLOBAL) +-- case +CREATE TABLE `t` (`a` INT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` INT UNIQUE KEY GLOBAL) +-- case +ALTER TABLE `t` ADD INDEX(`a`) +-- case +ALTER TABLE `t` ADD INDEX(`a`) +-- case +ALTER TABLE `t` ADD INDEX(`a`) GLOBAL +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) GLOBAL +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) GLOBAL +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`) GLOBAL +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`) +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`) +-- case +CREATE INDEX `i` ON `t` (`a`) +-- case +CREATE INDEX `i` ON `t` (`a`) +-- case +CREATE INDEX `i` ON `t` (`a`) GLOBAL +-- case +ALTER DATABASE `t` CHARACTER SET = utf8 +-- case +ALTER DATABASE CHARACTER SET = utf8 +-- case +ALTER DATABASE `t` CHARACTER SET = utf8 +-- case +ALTER DATABASE `t` CHARACTER SET = utf8 +-- case +ALTER DATABASE CHARACTER SET = utf8 +-- case +ALTER DATABASE `t` CHARACTER SET = utf8 +-- case +ALTER DATABASE `t` COLLATE = binary +-- case +ALTER DATABASE `t` CHARACTER SET = binary COLLATE = binary +-- case +ALTER DATABASE `t` COLLATE = utf8_bin +-- case +ALTER DATABASE COLLATE = utf8_bin +-- case +ALTER DATABASE `t` COLLATE = utf8_bin +-- case +ALTER DATABASE `t` COLLATE = utf8_bin +-- case +ALTER DATABASE COLLATE = utf8_bin +-- case +ALTER DATABASE `` COLLATE = utf8_bin +-- case +ALTER DATABASE `t` CHARACTER SET = utf8mb4 COLLATE = utf8_bin +-- case +ALTER DATABASE `t` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci CHARACTER SET = utf8 COLLATE = utf8mb4_bin +-- case +ALTER DATABASE CHARACTER SET = utf8mb4 COLLATE = utf8_bin +-- case +ALTER DATABASE CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci CHARACTER SET = utf8 COLLATE = utf8mb4_bin +-- case +ALTER TABLE `t` ADD COLUMN (`a` SMALLINT UNSIGNED) +-- case +-- error: line 1 column 15 near "* ADD COLUMN (a SMALLINT UNSIGNED)" +-- case +ALTER TABLE `t` ADD COLUMN IF NOT EXISTS (`a` SMALLINT UNSIGNED) +-- case +-- error: line 1 column 15 near "ADD COLUMN (a SMALLINT UNSIGNED)" +-- case +ALTER TABLE `t` ADD COLUMN (`a` SMALLINT UNSIGNED, `b` VARCHAR(255)) +-- case +ALTER TABLE `t` ADD COLUMN IF NOT EXISTS (`a` SMALLINT UNSIGNED, `b` VARCHAR(255)) +-- case +-- error: line 1 column 51 near "FIRST)" +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED FIRST +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED AFTER `b` +-- case +ALTER TABLE `t` ADD COLUMN IF NOT EXISTS `a` SMALLINT UNSIGNED AFTER `b` +-- case +ALTER TABLE `employees` ADD PARTITION +-- case +ALTER TABLE `employees` ADD PARTITION (PARTITION `P1` VALUES LESS THAN (2010)) +-- case +ALTER TABLE `employees` ADD PARTITION (PARTITION `P2` VALUES LESS THAN (MAXVALUE)) +-- case +ALTER TABLE `employees` ADD PARTITION IF NOT EXISTS (PARTITION `P2` VALUES LESS THAN (MAXVALUE)) +-- case +ALTER TABLE `employees` ADD PARTITION IF NOT EXISTS PARTITIONS 5 +-- case +ALTER TABLE `employees` ADD PARTITION (PARTITION `P1` VALUES LESS THAN (2010), PARTITION `P2` VALUES LESS THAN (2015), PARTITION `P3` VALUES LESS THAN (MAXVALUE)) +-- case +ALTER TABLE `t` ADD PARTITION (PARTITION `x` VALUES IN ((3, 4), (5, 6))) +-- case +ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG PARTITIONS 10 +-- case +ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE `employees` ADD PARTITION NO_WRITE_TO_BINLOG PARTITIONS 10 +-- case +ALTER TABLE `t_n` REBUILD PARTITION ALL +-- case +ALTER TABLE `d_n`.`t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG ALL +-- case +ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `ident` +-- case +ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `ident`,`ident` +-- case +-- error: line 1 column 39 near "" +-- case +ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `local` +-- case +ALTER TABLE `t_n` REBUILD PARTITION NO_WRITE_TO_BINLOG `local`,`local` +-- case +ALTER TABLE `t` DROP PARTITION `p1` +-- case +ALTER TABLE `t` DROP PARTITION `p2` +-- case +ALTER TABLE `t` DROP PARTITION IF EXISTS `p2` +-- case +ALTER TABLE `t` DROP PARTITION `p1`,`p2` +-- case +ALTER TABLE `t` DROP PARTITION IF EXISTS `p1`,`p2` +-- case +ALTER TABLE `t` CHECK PARTITION ALL +-- case +ALTER TABLE `t` CHECK PARTITION `p` +-- case +ALTER TABLE `t` CHECK PARTITION `p1`,`p2` +-- case +ALTER TABLE `employees` ADD PARTITION PARTITIONS 1 +-- case +ALTER TABLE `employees` ADD PARTITION PARTITIONS 2 +-- case +ALTER TABLE `clients` COALESCE PARTITION 3 +-- case +ALTER TABLE `clients` COALESCE PARTITION 4 +-- case +ALTER TABLE `clients` COALESCE PARTITION NO_WRITE_TO_BINLOG 4 +-- case +ALTER TABLE `clients` COALESCE PARTITION NO_WRITE_TO_BINLOG 4 +-- case +ALTER TABLE `t` DISABLE KEYS +-- case +ALTER TABLE `t` ENABLE KEYS +-- case +ALTER TABLE `t` MODIFY COLUMN `a` VARCHAR(255) +-- case +ALTER TABLE `t` MODIFY COLUMN IF EXISTS `a` VARCHAR(255) +-- case +ALTER TABLE `t` CHANGE COLUMN `a` `b` VARCHAR(255) +-- case +ALTER TABLE `t` CHANGE COLUMN IF EXISTS `a` `b` VARCHAR(255) +-- case +ALTER TABLE `t` CHANGE COLUMN `a` `b` VARCHAR(255) BINARY CHARACTER SET UTF8 +-- case +ALTER TABLE `t` CHANGE COLUMN `a` `b` VARCHAR(255) FIRST +-- case +ALTER TABLE `db`.`t` RENAME AS `db1`.`t1` +-- case +ALTER TABLE `db`.`t` RENAME AS `db1`.`t1` +-- case +ALTER TABLE `db`.`t` RENAME AS `db1`.`t1` +-- case +ALTER TABLE `db`.`t` RENAME AS `db1`.`t1` +-- case +ALTER TABLE `t` RENAME AS `t1` +-- case +ALTER TABLE `t` RENAME AS `t1` +-- case +ALTER TABLE `t` RENAME AS `t1` +-- case +ALTER TABLE `t` RENAME AS `t1` +-- case +ALTER TABLE `t_n` ORDER BY `ident` +-- case +ALTER TABLE `t_n` ORDER BY `ident` +-- case +ALTER TABLE `t_n` ORDER BY `ident` DESC +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2` +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2` +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2` +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2` DESC +-- case +ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2` +-- case +ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2` +-- case +ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2` DESC +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3` +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3` +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3` DESC +-- case +ALTER TABLE `t_n` ORDER BY `ident1`,`ident2`,`ident3` +-- case +ALTER TABLE `t_n` ORDER BY `ident1` DESC,`ident2` DESC,`ident3` DESC +-- case +ALTER TABLE `t` RENAME COLUMN `a` TO `b` +-- case +-- error: line 1 column 30 near ".a TO t.b" +-- case +-- error: line 1 column 35 near ".b" +-- case +-- error: line 1 column 30 near ".a TO b" +-- case +ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT 1 +-- case +ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT 1 +-- case +-- error: line 1 column 58 near "CURRENT_TIMESTAMP" +-- case +-- error: line 1 column 44 near "NOW()" +-- case +-- error: line 1 column 43 near "+1" +-- case +ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT (CURRENT_TIMESTAMP()) +-- case +ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT (NOW()) +-- case +ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT (1+1) +-- case +ALTER TABLE `t` ALTER COLUMN `a` SET DEFAULT 1 +-- case +ALTER TABLE `t` ALTER COLUMN `a` DROP DEFAULT +-- case +ALTER TABLE `t` ALTER COLUMN `a` DROP DEFAULT +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = NONE +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = DEFAULT +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = SHARED +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = EXCLUSIVE +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = NONE +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = DEFAULT +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = SHARED +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = EXCLUSIVE +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = NONE +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = DEFAULT +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = SHARED +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, LOCK = EXCLUSIVE +-- case +ALTER TABLE `t` ADD FULLTEXT `FullText`(`name`) +-- case +ALTER TABLE `t` ADD FULLTEXT `FullText`(`name`) +-- case +ALTER TABLE `t` ADD FULLTEXT `FullText`(`name`) +-- case +ALTER TABLE `t` ADD INDEX(`a`) USING BTREE COMMENT 'a' +-- case +ALTER TABLE `t` ADD INDEX IF NOT EXISTS(`a`) USING BTREE COMMENT 'a' +-- case +ALTER TABLE `t` ADD INDEX(`a`) USING RTREE COMMENT 'a' +-- case +ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = 4 +-- case +ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = 4 +-- case +-- error: line 1 column 51 near "'a'" +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`) CLUSTERED PRE_SPLIT_REGIONS = 4 +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`) NONCLUSTERED PRE_SPLIT_REGIONS = 4 +-- case +ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = (BETWEEN (1,_UTF8MB4'a') AND (2,_UTF8MB4'b') REGIONS 4) +-- case +ALTER TABLE `t` ADD INDEX(`a`) PRE_SPLIT_REGIONS = (BY (1,_UTF8MB4'a'),(2,_UTF8MB4'b'),(3,_UTF8MB4'c')) +-- case +ALTER TABLE `t` ADD INDEX(`a`) COMMENT 'a' PRE_SPLIT_REGIONS = (BETWEEN (1,_UTF8MB4'a') AND (2,_UTF8MB4'b') REGIONS 4) +-- case +CREATE INDEX `idx` ON `t` (`a`, `b`) PRE_SPLIT_REGIONS = 100 +-- case +CREATE INDEX `idx` ON `t` (`a`, `b`) PRE_SPLIT_REGIONS = (BETWEEN (1,_UTF8MB4'a') AND (2,_UTF8MB4'b') REGIONS 4) +-- case +ALTER TABLE `t` ADD INDEX `idx`(`a`) PRE_SPLIT_REGIONS = 100, ADD INDEX `idx2`(`b`) PRE_SPLIT_REGIONS = (BY (1),(2),(3)) +-- case +ALTER TABLE `t` ADD INDEX(`a`) USING HASH COMMENT 'a' +-- case +ALTER TABLE `t` ADD INDEX(`a`) USING BTREE COMMENT 'a' GLOBAL +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) GLOBAL +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD INDEX IF NOT EXISTS(`a`) USING HASH COMMENT 'a' +-- case +ALTER TABLE `t` ADD PRIMARY KEY `ident`(`a` DESC, `b`) USING RTREE +-- case +ALTER TABLE `t` ADD INDEX(`a`) USING RTREE +-- case +ALTER TABLE `t` ADD INDEX(`ident`, `ident`(123)) USING RTREE +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`) COMMENT 'a' +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) COMMENT 'a' +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) COMMENT 'a' +-- case +ALTER TABLE `t` ADD UNIQUE(`a`) COMMENT 'a' +-- case +-- error: line 1 column 26 near "(a) USING HNSW COMMENT 'a'" +-- case +-- error: line 1 column 26 near "(VEC_COSINE_DISTANCE(a)) USING HNSW COMMENT 'a'" +-- case +-- error: line 1 column 26 near "((VEC_COSINE_DISTANCE(a))) USING HASH COMMENT 'a'" +-- case +-- error: line 1 column 26 near "((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a'" +-- case +-- error: line 1 column 28 near "KEY ((VEC_COSINE_DISTANCE(a, b))) USING HNSW COMMENT 'a'" +-- case +ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`, `b`))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE `t` ADD VECTOR INDEX((LOWER(`a`))) USING HNSW COMMENT 'a' +-- case +-- error: line 1 column 56 near ", a)) USING HNSW COMMENT 'a'" +-- case +ALTER TABLE `t` ADD VECTOR INDEX(`a`, (VEC_COSINE_DISTANCE(`a`))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`))) USING HYPO COMMENT 'a' +-- case +ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`))) COMMENT 'a' +-- case +ALTER TABLE `t` ADD VECTOR INDEX((VEC_COSINE_DISTANCE(`a`))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE `t` ADD VECTOR INDEX IF NOT EXISTS((VEC_COSINE_DISTANCE(`a`))) USING HNSW COMMENT 'a' +-- case +ALTER TABLE `t` ADD VECTOR INDEX IF NOT EXISTS((VEC_COSINE_DISTANCE(`a`))) ADD_COLUMNAR_REPLICA_ON_DEMAND USING HNSW COMMENT 'a' +-- case +-- error: line 1 column 28 near "(a) USING INVERTED COMMENT 'a'" +-- case +-- error: line 1 column 28 near "((a - 1)) USING INVERTED COMMENT 'a'" +-- case +-- error: line 1 column 28 near "(a) USING HASH COMMENT 'a'" +-- case +-- error: line 1 column 28 near "(a, b) USING INVERTED COMMENT 'a'" +-- case +-- error: line 1 column 30 near "KEY (a, b) USING INVERTED COMMENT 'a'" +-- case +ALTER TABLE `t` ADD COLUMNAR INDEX(`a`, `b`) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE `t` ADD COLUMNAR INDEX(`a`) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE `t` ADD COLUMNAR INDEX(`a`) USING HYPO COMMENT 'a' +-- case +ALTER TABLE `t` ADD COLUMNAR INDEX((`a`-1)) USING HYPO COMMENT 'a' +-- case +ALTER TABLE `t` ADD COLUMNAR INDEX IF NOT EXISTS(`a`) USING INVERTED COMMENT 'a' +-- case +ALTER TABLE `t` ADD CONSTRAINT `fk_t2_id` FOREIGN KEY (`t2_id`) REFERENCES `t`(`id`) +-- case +ALTER TABLE `t` ADD CONSTRAINT `fk_t2_id` FOREIGN KEY IF NOT EXISTS (`t2_id`) REFERENCES `t`(`id`) +-- case +ALTER TABLE `t` ADD CONSTRAINT `c_1` CHECK(1+1) NOT ENFORCED, ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD CONSTRAINT `c_1` CHECK(1+1) ENFORCED, ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ADD CONSTRAINT `c_1` CHECK(1+1) ENFORCED, ADD UNIQUE(`a`) +-- case +ALTER TABLE `t` ENGINE = '' +-- case +ALTER TABLE `t` ENGINE = '' +-- case +ALTER TABLE `t` ENGINE = innodb +-- case +ALTER TABLE `t` ENGINE = innodb +-- case +ALTER TABLE `db`.`t` ENGINE = '' +-- case +ALTER TABLE `t` INSERT_METHOD = FIRST +-- case +ALTER TABLE `t` INSERT_METHOD = LAST +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT UNSIGNED, ADD COLUMN `a` SMALLINT +-- case +ALTER TABLE `t` ADD COLUMN `a` SMALLINT, ENGINE = '', DEFAULT COLLATE = UTF8_GENERAL_CI +-- case +ALTER TABLE `t` ENGINE = '', COMMENT = '', DEFAULT COLLATE = UTF8_GENERAL_CI +-- case +ALTER TABLE `t` ENGINE = '', ADD COLUMN `a` SMALLINT +-- case +ALTER TABLE `t` DEFAULT COLLATE = UTF8_GENERAL_CI, ENGINE = '', ADD COLUMN `a` SMALLINT +-- case +ALTER TABLE `t` SHARD_ROW_ID_BITS = 1 +-- case +ALTER TABLE `t` AUTO_INCREMENT = 3 +-- case +ALTER TABLE `t` AUTO_INCREMENT = 3 +-- case +ALTER TABLE `t` FORCE AUTO_INCREMENT = 3 +-- case +ALTER TABLE `t` FORCE AUTO_INCREMENT = 3 +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = DEFAULT +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = INPLACE +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = COPY +-- case +ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` MEDIUMTEXT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci NOT NULL, ALGORITHM = INSTANT +-- case +ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8 +-- case +ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8 +-- case +ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_BIN +-- case +ALTER TABLE `t` CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_BIN +-- case +ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT +-- case +ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT +-- case +ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT +-- case +ALTER TABLE `d_n`.`t_n` CONVERT TO CHARACTER SET DEFAULT COLLATE UTF8MB4_0900_AI_CI +-- case +ALTER TABLE `t` FORCE /* AlterTableForce is not supported */ +-- case +-- error: line 1 column 25 near ";" +-- case +ALTER TABLE `t` DROP INDEX `a` +-- case +ALTER TABLE `t` DROP INDEX IF EXISTS `a` +-- case +ALTER TABLE `t` ALTER INDEX `a` INVISIBLE +-- case +ALTER TABLE `t` ALTER INDEX `a` VISIBLE +-- case +ALTER TABLE `t` DROP FOREIGN KEY `a` +-- case +ALTER TABLE `t` DROP COLUMN `a` +-- case +ALTER TABLE `t` DROP COLUMN IF EXISTS `a` +-- case +ALTER TABLE `testTableCompression` COMPRESSION = 'LZ4' +-- case +ALTER TABLE `t1` COMPRESSION = 'zlib' +-- case +ALTER TABLE `t1` +-- case +-- error: line 1 column 16 near "," +-- case +ALTER TABLE `t` RENAME INDEX `a` TO `b` +-- case +ALTER TABLE `t` RENAME INDEX `a` TO `b` +-- case +ALTER TABLE `d_n`.`t_n` DROP CHECK `ident` +-- case +ALTER TABLE `t_n` LOCK = DEFAULT, DROP CHECK `ident` +-- case +ALTER TABLE `t_n` ALTER CHECK `ident` ENFORCED +-- case +ALTER TABLE `t_n` ALTER CHECK `ident` NOT ENFORCED +-- case +ALTER TABLE `t_n` DROP CHECK `ident` +-- case +ALTER TABLE `t_n` DROP CHECK `ident` +-- case +-- error: line 1 column 38 near "" +-- case +ALTER TABLE `t_n` ALTER CHECK `ident` ENFORCED +-- case +ALTER TABLE `t_n` ALTER CHECK `ident` NOT ENFORCED +-- case +ANALYZE TABLE `t` PARTITION `a` +-- case +ANALYZE TABLE `t` PARTITION `a` WITH 4 BUCKETS +-- case +ANALYZE TABLE `t` PARTITION `a` INDEX `b` +-- case +ANALYZE TABLE `t` PARTITION `a` INDEX `b` WITH 4 BUCKETS +-- case +ALTER TABLE `t` PARTITION BY HASH (`a`) PARTITIONS 1 +-- case +ALTER TABLE `t` ADD COLUMN `a` INT PARTITION BY HASH (`a`) PARTITIONS 1 +-- case +ALTER TABLE `t` ADD COLUMN `a` INT PARTITION BY HASH (`a`) PARTITIONS 1 UPDATE INDEXES (`idx_a` GLOBAL) +-- case +ALTER TABLE `t` ADD COLUMN `a` INT PARTITION BY HASH (`a`) PARTITIONS 1 UPDATE INDEXES (`idx_a` GLOBAL,`idx_b` LOCAL) +-- case +-- error: line 1 column 80 near "normal)" +-- case +-- error: line 1 column 75 near ")" +-- case +-- error: [ddl:1492]For RANGE partitions each partition must be defined +-- case +-- error: [ddl:1492]For RANGE partitions each partition must be defined +-- case +ALTER TABLE `t` PARTITION BY RANGE (`a`) (PARTITION `x` VALUES LESS THAN (75)) +-- case +-- error: line 1 column 41 near "partition by range(a) (partition x values less than (75))" +-- case +ALTER TABLE `t` COMMENT = 'cmt' PARTITION BY HASH (`a`) PARTITIONS 1 +-- case +ALTER TABLE `t` ENABLE KEYS, COMMENT = 'cmt' PARTITION BY HASH (`a`) PARTITIONS 1 +-- case +-- error: line 1 column 53 near "partition by hash(a)" +-- case +-- error: line 1 column 41 near "enable keys" +-- case +-- error: line 1 column 35 near ", enable keys" +-- case +ALTER TABLE `t` PARTITION BY RANGE COLUMNS (`a`) (PARTITION `x` VALUES LESS THAN (MAXVALUE)) +-- case +ALTER TABLE `t` PARTITION BY LIST COLUMNS (`a`) (PARTITION `p0` VALUES IN (5, 10, 15)) +-- case +ALTER TABLE `t` PARTITION BY RANGE COLUMNS (`a`,`b`,`c`) (PARTITION `p1` VALUES LESS THAN (1, 1, 1)) +-- case +ALTER TABLE `t` PARTITION BY LIST COLUMNS (`a`,`b`,`c`) (PARTITION `p0` VALUES IN ((5, 10, 15))) +-- case +ALTER TABLE `t` WITH VALIDATION, ADD COLUMN `b` INT GENERATED ALWAYS AS(`a`+1) VIRTUAL +-- case +ALTER TABLE `t` WITHOUT VALIDATION, ADD COLUMN `b` INT GENERATED ALWAYS AS(`a`+1) VIRTUAL +-- case +ALTER TABLE `t` WITHOUT VALIDATION, WITH VALIDATION, ADD COLUMN `b` INT GENERATED ALWAYS AS(`a`+1) VIRTUAL +-- case +ALTER TABLE `t` WITH VALIDATION, MODIFY COLUMN `b` INT GENERATED ALWAYS AS(`a`+2) VIRTUAL +-- case +ALTER TABLE `t` WITH VALIDATION, CHANGE COLUMN `b` `c` INT GENERATED ALWAYS AS(`a`+2) VIRTUAL +-- case +ALTER TABLE `d_n`.`t_n` ADD PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE `d_n`.`t_n` ADD PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE `t` WITH VALIDATION, EXCHANGE PARTITION `p` WITH TABLE `nt` WITHOUT VALIDATION +-- case +ALTER TABLE `t` EXCHANGE PARTITION `p` WITH TABLE `nt` +-- case +ALTER TABLE `t` REORGANIZE PARTITION +-- case +ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG +-- case +ALTER TABLE `members` REORGANIZE PARTITION `n0` INTO (PARTITION `s0` VALUES LESS THAN (1960), PARTITION `s1` VALUES LESS THAN (1970)) +-- case +ALTER TABLE `members` REORGANIZE PARTITION NO_WRITE_TO_BINLOG `n0` INTO (PARTITION `s0` VALUES LESS THAN (1960), PARTITION `s1` VALUES LESS THAN (1970)) +-- case +ALTER TABLE `members` REORGANIZE PARTITION `p1`,`p2`,`p3` INTO (PARTITION `s0` VALUES LESS THAN (1960), PARTITION `s1` VALUES LESS THAN (1970)) +-- case +-- error: line 1 column 51 near "partition;" +-- case +ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG `remove` INTO (PARTITION `p0` VALUES LESS THAN (1991)) +-- case +ALTER TABLE `t` ATTRIBUTES='str' +-- case +ALTER TABLE `t` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` ATTRIBUTES=DEFAULT +-- case +ALTER TABLE `t` ATTRIBUTES=DEFAULT +-- case +ALTER TABLE `t` ATTRIBUTES=DEFAULT +-- case +-- error: line 1 column 24 near "" +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str' +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES='str1,str2' +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES=DEFAULT +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES=DEFAULT +-- case +ALTER TABLE `t` PARTITION `p` ATTRIBUTES=DEFAULT +-- case +-- error: line 1 column 36 near "" +-- case +CREATE TABLE `t1` (`attributes` INT) +-- case +CREATE INDEX `idx` ON `t` (`a`) +-- case +CREATE INDEX IF NOT EXISTS `idx` ON `t` (`a`) +-- case +CREATE UNIQUE INDEX `idx` ON `t` (`a`) +-- case +CREATE UNIQUE INDEX IF NOT EXISTS `idx` ON `t` (`a`) +-- case +CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING BTREE +-- case +CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING HASH +-- case +CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING RTREE +-- case +CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING BTREE +-- case +CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING BTREE +-- case +CREATE SPATIAL INDEX `idx` ON `t` (`a`) +-- case +CREATE SPATIAL INDEX IF NOT EXISTS `idx` ON `t` (`a`) +-- case +CREATE FULLTEXT INDEX `idx` ON `t` (`a`) +-- case +CREATE FULLTEXT INDEX IF NOT EXISTS `idx` ON `t` (`a`) +-- case +CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` +-- case +CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` COMMENT 'string' +-- case +CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` COMMENT 'string' +-- case +CREATE FULLTEXT INDEX `idx` ON `t` (`a`) WITH PARSER `ident` COMMENT 'string' +-- case +CREATE INDEX `idx` ON `t` (`a`) USING HASH +-- case +CREATE INDEX `idx` ON `t` (`a`) COMMENT 'foo' +-- case +CREATE INDEX `idx` ON `t` (`a`) USING HASH COMMENT 'foo' +-- case +CREATE INDEX `idx` ON `t` (`a`) LOCK = NONE +-- case +CREATE INDEX `idx` ON `t` (`a`) USING HASH COMMENT 'foo' +-- case +CREATE INDEX `idx` ON `t` (`a`) USING BTREE +-- case +CREATE INDEX `idx` ON `t` (`a`) VISIBLE +-- case +CREATE INDEX `idx` ON `t` (`a`) INVISIBLE +-- case +CREATE INDEX `idx` ON `t` (`a`) VISIBLE +-- case +CREATE INDEX `idx` ON `t` (`a`) INVISIBLE +-- case +CREATE INDEX `idx` ON `t` (`a`) USING HASH VISIBLE +-- case +CREATE INDEX `idx` ON `t` (`a`) USING HASH INVISIBLE +-- case +CREATE VECTOR INDEX `idx` ON `t` (`a`) USING HNSW +-- case +CREATE VECTOR INDEX `idx` ON `t` (`a`, `b`) USING HNSW +-- case +CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) +-- case +CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING BTREE +-- case +-- error: line 1 column 34 near "USING HNSW ((VEC_COSINE_DISTANCE(a)))" +-- case +-- error: line 1 column 17 near "idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW" +-- case +CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`)), `a`) USING HNSW +-- case +CREATE VECTOR INDEX `idx` ON `t` (`a`, (VEC_COSINE_DISTANCE(`a`))) USING HNSW +-- case +-- error: line 1 column 17 near "KEY idx ON t ((VEC_COSINE_DISTANCE(a))) USING HNSW" +-- case +CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW +-- case +CREATE VECTOR INDEX IF NOT EXISTS `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW +-- case +CREATE VECTOR INDEX IF NOT EXISTS `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW +-- case +CREATE VECTOR INDEX `ident` ON `d_n`.`t_n` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW +-- case +CREATE VECTOR INDEX `idx` ON `t` ((VEC_COSINE_DISTANCE(`a`))) USING HNSW +-- case +CREATE VECTOR INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING HNSW +-- case +CREATE UNIQUE INDEX `ident` ON `d_n`.`t_n` (`ident`, `ident`) USING HNSW +-- case +CREATE INDEX `idx` ON `t` (`a`) +-- case +CREATE INDEX `idx` ON `t` (`a`) +-- case +CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE +-- case +CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE +-- case +CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = COPY +-- case +CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = COPY +-- case +CREATE INDEX `idx` ON `t` (`a`) +-- case +CREATE INDEX `idx` ON `t` (`a`) +-- case +CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE LOCK = EXCLUSIVE +-- case +CREATE INDEX `idx` ON `t` (`a`) ALGORITHM = INPLACE LOCK = EXCLUSIVE +-- case +-- error: [parser:1800]Unknown ALGORITHM 'ALGORITHM' +-- case +-- error: [parser:1800]Unknown ALGORITHM 'ALGORITHM' +-- case +DROP INDEX `a` ON `t` +-- case +DROP INDEX `a` ON `db`.`t` +-- case +DROP INDEX `a` ON `db`.`tb-ttb` +-- case +DROP INDEX IF EXISTS `a` ON `t` +-- case +DROP INDEX IF EXISTS `a` ON `db`.`t` +-- case +DROP INDEX IF EXISTS `a` ON `db`.`tb-ttb` +-- case +DROP INDEX `idx` ON `t` +-- case +DROP INDEX `idx` ON `t` +-- case +DROP INDEX `idx` ON `t` ALGORITHM = INPLACE +-- case +DROP INDEX `idx` ON `t` ALGORITHM = INPLACE +-- case +DROP INDEX `idx` ON `t` +-- case +DROP INDEX `idx` ON `t` +-- case +DROP INDEX `idx` ON `t` LOCK = SHARED +-- case +DROP INDEX `idx` ON `t` LOCK = SHARED +-- case +DROP INDEX `idx` ON `t` +-- case +DROP INDEX `idx` ON `t` +-- case +DROP INDEX `idx` ON `t` ALGORITHM = INPLACE LOCK = EXCLUSIVE +-- case +DROP INDEX `idx` ON `t` ALGORITHM = INPLACE LOCK = EXCLUSIVE +-- case +-- error: [parser:1800]Unknown ALGORITHM 'algorithm' +-- case +-- error: [parser:1800]Unknown ALGORITHM 'algorithm' +-- case +-- error: [parser:1801]Unknown LOCK type 'lock_type' +-- case +-- error: [parser:1801]Unknown LOCK type 'lock_type' +-- case +RENAME TABLE `t` TO `t1` +-- case +-- error: line 1 column 17 near "t1" +-- case +RENAME TABLE `d`.`t` TO `d1`.`t1` +-- case +RENAME TABLE `t1` TO `t2`, `t3` TO `t4` +-- case +TRUNCATE TABLE `t1` +-- case +TRUNCATE TABLE `t1` +-- case +-- error: line 1 column 26 near ") " +-- case +-- error: line 1 column 27 near ")" +-- case +-- error: line 1 column 33 near ")" +-- case +-- error: line 1 column 31 near ")" +-- case +ALTER TABLE `d_n`.`t_n` SECONDARY_LOAD +-- case +ALTER TABLE `d_n`.`t_n` SECONDARY_UNLOAD +-- case +ALTER TABLE `t_n` LOCK = DEFAULT, SECONDARY_LOAD +-- case +ALTER TABLE `d_n`.`t_n` ALGORITHM = DEFAULT, SECONDARY_LOAD +-- case +ALTER TABLE `d_n`.`t_n` ALGORITHM = DEFAULT, SECONDARY_UNLOAD +-- case +CREATE TABLE `a` (`process` DOUBLE) +-- case +CREATE TABLE `t` (`a` TINYINT,`b` SMALLINT,`c` MEDIUMINT,`d` INT,`e` BIGINT) +-- case +CREATE TABLE `t` (`lv` MEDIUMTEXT NULL) +-- case +CREATE TABLE `cdp_test`.`test2-1` (`id` INT(11) DEFAULT NULL,INDEX(`id`)) +-- case +CREATE TABLE `miantiao` (`扁豆焖面` INT(11)) +-- case +CREATE TABLE `bar` (`m` INT) AS SELECT `n` FROM `foo` +-- case +CREATE TABLE `bar` (`m` INT) IGNORE AS SELECT `n` FROM `foo` +-- case +CREATE TABLE `bar` (`m` INT) REPLACE AS SELECT `n` FROM `foo` +-- case +-- error: [ddl:1221]Incorrect usage of ON UPDATE and generated column +-- case +-- error: [ddl:1221]Incorrect usage of AUTO_INCREMENT and generated column +-- case +-- error: [ddl:1221]Incorrect usage of DEFAULT and generated column +-- case +CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL) +-- case +CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL) +-- case +CREATE TABLE `t` (`a` BIGINT,`b` BIGINT GENERATED ALWAYS AS(`a`+1) VIRTUAL NOT NULL COMMENT 'ttt') +-- case +CREATE TABLE `t` (`a` INT,INDEX `idx`((CAST(`a` AS BINARY(1))))) +-- case +-- error: [ddl:1221]Incorrect usage of DEFAULT and generated column +-- case +-- error: [ddl:1221]Incorrect usage of DEFAULT and generated column +-- case +CREATE TABLE `t` (`a` INT COLUMN_FORMAT FIXED) +-- case +CREATE TABLE `t` (`a` INT COLUMN_FORMAT DEFAULT) +-- case +CREATE TABLE `t` (`a` INT COLUMN_FORMAT DYNAMIC) +-- case +ALTER TABLE `t` MODIFY COLUMN `a` BIGINT COLUMN_FORMAT DEFAULT +-- case +RECOVER TABLE BY JOB 11 +-- case +-- error: line 1 column 24 near ",12,13" +-- case +-- error: line 1 column 20 near "" +-- case +RECOVER TABLE BY JOB 0 +-- case +RECOVER TABLE `t1` +-- case +-- error: line 1 column 17 near ",t2" +-- case +-- error: line 1 column 14 near "" +-- case +RECOVER TABLE `t1` 100 +-- case +-- error: line 1 column 20 near "abc" +-- case +FLASHBACK TABLE `t` +-- case +FLASHBACK TABLE `t` TO `t1` +-- case +FLASHBACK TABLE `t` TO `timestamp` +-- case +FLASHBACK DATABASE `db1` +-- case +FLASHBACK DATABASE `db1` +-- case +FLASHBACK DATABASE `db1` TO `db2` +-- case +FLASHBACK DATABASE `db1` TO `db2` +-- case +FLASHBACK CLUSTER TO TIMESTAMP '2021-05-26 16:45:26' +-- case +FLASHBACK TABLE `t` TO TIMESTAMP '2021-05-26 16:45:26' +-- case +FLASHBACK TABLE `t`, `t1` TO TIMESTAMP '2021-05-26 16:45:26' +-- case +FLASHBACK DATABASE `test` TO TIMESTAMP '2021-05-26 16:45:26' +-- case +FLASHBACK DATABASE `test` TO TIMESTAMP '2021-05-26 16:45:26' +-- case +-- error: line 1 column 20 near "to timestamp TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())" +-- case +-- error: line 1 column 20 near "to timestamp DATE_SUB(NOW(), INTERVAL 3 SECOND)" +-- case +-- error: line 1 column 28 near "timestamp '2021-05-26 16:45:26'" +-- case +-- error: line 1 column 31 near "timestamp '2021-05-26 16:45:26'" +-- case +FLASHBACK CLUSTER TO TSO 445494955052105721 +-- case +FLASHBACK TABLE `t` TO TSO 445494955052105722 +-- case +FLASHBACK TABLE `t`, `t1` TO TSO 445494955052105723 +-- case +FLASHBACK DATABASE `test` TO TSO 445494955052105724 +-- case +FLASHBACK DATABASE `test` TO TSO 445494955052105725 +-- case +-- error: line 1 column 22 near "tso 445494955052105726" +-- case +-- error: line 1 column 25 near "tso 445494955052105727" +-- case +-- error: line 1 column 30 near ""Invalid TSO value provided: 0 +-- case +-- error: line 1 column 30 near "-100" +-- case +ALTER TABLE `t` REMOVE PARTITIONING +-- case +ALTER TABLE `db`.`ident` REMOVE PARTITIONING +-- case +ALTER TABLE `t` LOCK = DEFAULT REMOVE PARTITIONING +-- case +ALTER TABLE `t` ADD COLUMN `a` INT REMOVE PARTITIONING +-- case +ALTER TABLE `t` ADD COLUMN `a` INT, ADD INDEX(`c`) REMOVE PARTITIONING +-- case +-- error: line 1 column 38 near "remove partitioning" +-- case +-- error: line 1 column 53 near "remove partitioning" +-- case +-- error: line 1 column 37 near "add column a int" +-- case +-- error: line 1 column 34 near ", add column a int" +-- case +ALTER TABLE `t` ADD COLUMN `a` DOUBLE(4,2) UNSIGNED ZEROFILL REFERENCES `b` MATCH FULL ON UPDATE SET NULL FIRST +-- case +ALTER TABLE `d_n`.`t_n` ADD CONSTRAINT `ident` FOREIGN KEY (`ident`(1)) REFERENCES `d_n`.`t_n` MATCH FULL ON DELETE SET NULL +-- case +ALTER TABLE `t_n` ADD CONSTRAINT `ident` FOREIGN KEY (`ident`, `ident`(1)) REFERENCES `t_n` MATCH FULL ON DELETE RESTRICT ON UPDATE SET NULL +-- case +ALTER TABLE `d_n`.`t_n` ADD CONSTRAINT `ident` FOREIGN KEY (`ident`, `ident`(1)) REFERENCES `t_n` MATCH PARTIAL ON DELETE CASCADE REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` ADD CONSTRAINT FOREIGN KEY (`ident`) REFERENCES `d_n`.`t_n` MATCH SIMPLE ON DELETE CASCADE ON UPDATE CASCADE +-- case +CREATE TABLE `t` (`a` VARCHAR(1)) +-- case +CREATE TABLE `t` (`a` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(1)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(1),`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` CHAR) +-- case +CREATE TABLE `t` (`a` CHAR) +-- case +CREATE TABLE `t` (`a` VARCHAR(50),`b` INT) +-- case +CREATE TABLE `t` (`a` CHAR,`b` INT) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` CHAR) +-- case +CREATE TABLE `t` (`a` CHAR) +-- case +CREATE TABLE `t` (`a` CHAR) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +-- error: line 1 column 35 near ");" +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `t` (`a` VARCHAR(50)) +-- case +CREATE TABLE `nchar` (`a` INT) +-- case +CREATE TABLE `nchar` (`a` INT,`b` CHAR) +-- case +CREATE TABLE `nchar` (`a` INT,`b` CHAR(50)) +-- case +ALTER TABLE `t_n` STORAGE DISK, MODIFY COLUMN `ident` VARCHAR(12) COLUMN_FORMAT FIXED FIRST +-- case +CREATE TABLE `t` (`a` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY NULL) +-- case +CREATE TABLE `t` (`b` INT,`a` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` INT NOT NULL AUTO_INCREMENT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` INT NOT NULL AUTO_INCREMENT UNIQUE KEY NULL) +-- case +CREATE TABLE `t` (`a` BIGINT NOT NULL AUTO_INCREMENT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` SMALLINT NOT NULL AUTO_INCREMENT UNIQUE KEY) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT,`b` MEDIUMTEXT,`c` MEDIUMTEXT,`d` MEDIUMTEXT,`e` MEDIUMTEXT,`f` MEDIUMTEXT,`g` MEDIUMTEXT) +-- case +CREATE TABLE `t` (`a` MEDIUMBLOB) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT,`b` MEDIUMBLOB) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8) +-- case +ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING +-- case +ALTER TABLE `d_n`.`t_n` MODIFY COLUMN `ident` MEDIUMTEXT AFTER `ident` REMOVE PARTITIONING +-- case +ALTER TABLE `t_n` CHANGE COLUMN `ident` `ident` MEDIUMTEXT BINARY CHARACTER SET UTF8 FIRST, TABLESPACE = `ident` +-- case +ALTER TABLE `t_n` CHANGE COLUMN `ident` `ident` MEDIUMTEXT BINARY CHARACTER SET UTF8 FIRST, TABLESPACE = `ident` +-- case +-- error: line 1 column 43 near ";"The value of STATS_AUTO_RECALC must be one of [0|1|DEFAULT]. +-- case +-- error: line 1 column 46 near ";"The value of STATS_AUTO_RECALC must be one of [0|1|DEFAULT]. +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 0 +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = DEFAULT +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 0 +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1 +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = DEFAULT +-- case +CREATE TABLE `t` (`a` INT) STATS_PERSISTENT = DEFAULT /* TableOptionStatsPersistent is not supported */ STATS_AUTO_RECALC = 1 +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1 STATS_SAMPLE_PAGES = 25 +-- case +ALTER TABLE `t` MODIFY COLUMN `a` BIGINT, ENGINE = InnoDB, STATS_AUTO_RECALC = 0 +-- case +CREATE TABLE `stats_auto_recalc` (`a` INT) +-- case +CREATE TABLE `stats_auto_recalc` (`a` INT) STATS_AUTO_RECALC = 1 +-- case +CREATE TABLE `t` (`a` INT,PRIMARY KEY `type`(`a`) USING BTREE) +-- case +-- error: line 1 column 45 near "btree (a));" +-- case +CREATE TABLE `t` (`a` INT,PRIMARY KEY(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,PRIMARY KEY(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,PRIMARY KEY(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,UNIQUE `type`(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,UNIQUE `type`(`a`) USING BTREE) +-- case +-- error: line 1 column 46 near "btree (a));" +-- case +CREATE TABLE `t` (`a` INT,UNIQUE(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,UNIQUE(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,UNIQUE(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,INDEX `type`(`a`) USING BTREE) +-- case +-- error: line 1 column 39 near "btree (a));" +-- case +CREATE TABLE `t` (`a` INT,INDEX `type`(`a`) USING BTREE) +-- case +CREATE TABLE `t` (`a` INT,INDEX(`a`) USING BTREE) +-- case +ALTER TABLE `d_n`.`t_n` WITHOUT VALIDATION, ADD PARTITION (PARTITION `ident` VALUES LESS THAN (MAXVALUE) ENGINE = text_string MAX_ROWS = 12) +-- case +ALTER TABLE `d_n`.`t_n` WITH VALIDATION, ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION `ident` VALUES LESS THAN (MAXVALUE) ENGINE = text_string, PARTITION `ident` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `text_string` MIN_ROWS = 11)) +-- case +ALTER TABLE `d_n`.`t_n` WITHOUT VALIDATION, ADD PARTITION (PARTITION `ident` DEFAULT ENGINE = text_string MAX_ROWS = 12) +-- case +ALTER TABLE `d_n`.`t_n` WITH VALIDATION, ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION `ident` DEFAULT ENGINE = text_string MAX_ROWS = 12) +-- case +ALTER TABLE `d_n`.`t_n` ADD PARTITION (PARTITION `ident` DEFAULT, PARTITION `ptext` VALUES IN (_UTF8MB4'default')) +-- case +ALTER TABLE `d_n`.`t_n` WITH VALIDATION, ADD PARTITION NO_WRITE_TO_BINLOG (PARTITION `ident` VALUES LESS THAN (MAXVALUE) ENGINE = text_string, PARTITION `ident` DEFAULT (SUBPARTITION `text_string` MIN_ROWS = 11)) +-- case +ALTER TABLE `d_n`.`t_n` ADD PARTITION (PARTITION `ident` DEFAULT) +-- case +ALTER TABLE `d_n`.`t_n` ADD PARTITION (PARTITION `ident` VALUES IN (1, DEFAULT)) +-- case +ALTER TABLE `t` IMPORT TABLESPACE +-- case +ALTER TABLE `t` DISCARD TABLESPACE +-- case +ALTER TABLE `db`.`t` IMPORT TABLESPACE +-- case +ALTER TABLE `db`.`t` DISCARD TABLESPACE +-- case +ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (CONSTRAINT `ident` CHECK(1>2) NOT ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (`b` INT, UNIQUE `c`(`b`)) +-- case +ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (CHECK(TRUE) ENFORCED, CHECK(TRUE) ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, CONSTRAINT `b1` CHECK(`a1`>0) ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, `a2` INT, CONSTRAINT `b1` CHECK(`a1`>0) ENFORCED, CONSTRAINT `b2` CHECK(`a2`<10) ENFORCED) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, PRIMARY KEY(`a1`)) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, PRIMARY KEY(`a1`)) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, `a2` INT, PRIMARY KEY(`a1`), UNIQUE(`a2`)) +-- case +ALTER TABLE `t` ADD COLUMN (`a1` INT, `a2` INT, PRIMARY KEY(`a1`), UNIQUE `b2`(`a2`)) +-- case +ALTER TABLE `ident` ADD COLUMN (CONSTRAINT `ident` FOREIGN KEY (`EXECUTE`(123)) REFERENCES `t`(`a`) MATCH SIMPLE ON DELETE CASCADE ON UPDATE SET NULL) +-- case +ALTER TABLE `t` ADD COLUMN `a` DATE CHECK(`a`>0) ENFORCED FIRST +-- case +ALTER TABLE `t` ADD COLUMN `a1` INT CONSTRAINT `ident` CHECK(`a1`>1) ENFORCED REFERENCES `b` ON DELETE CASCADE ON UPDATE CASCADE +-- case +ALTER TABLE `t` ADD COLUMN `a` DATE CHECK(`a`>0) ENFORCED FIRST +-- case +ALTER TABLE `t` ADD COLUMN `a` TINYBLOB CONSTRAINT `ident` CHECK(1>2) ENFORCED REFERENCES `b` ON DELETE CASCADE ON UPDATE CASCADE +-- case +ALTER TABLE `t` ADD COLUMN `a2` INT CONSTRAINT `ident` CHECK(`a2`>1) ENFORCED +-- case +ALTER TABLE `t` ADD COLUMN `a2` INT CONSTRAINT `ident` CHECK(`a2`>1) NOT ENFORCED +-- case +-- error: line 1 column 49 near "primary key REFERENCES b ON DELETE CASCADE ON UPDATE CASCADE;" +-- case +-- error: line 1 column 49 near "primary key (a2))" +-- case +-- error: line 1 column 48 near "unique key (a2))" +-- case +ALTER TABLE `t` SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b' +-- case +ALTER TABLE `t` SET TIFLASH REPLICA 0 +-- case +ALTER DATABASE `t` SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b' +-- case +ALTER DATABASE `t` SET TIFLASH REPLICA 0 +-- case +ALTER DATABASE `t` SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b' +-- case +ALTER DATABASE `t` SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 +-- case +ALTER DATABASE `t` SET TIFLASH REPLICA 1 LOCATION LABELS 'a', 'b' SET TIFLASH REPLICA 2 +-- case +ALTER DATABASE `t` SET TIFLASH REPLICA 1 LOCATION LABELS 'a', 'b' SET TIFLASH REPLICA 2 LOCATION LABELS 'a', 'b' +-- case +CREATE TABLE IF NOT EXISTS `table_ident` (`a` YEAR(4),`b` YEAR) +-- case +CREATE TABLE IF NOT EXISTS `table_ident` (`ident1` TINYINT(1) COMMENT 'text_string' UNIQUE KEY,`ident2` YEAR(4)) +-- case +CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR) +-- case +CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR) +-- case +INSERT INTO `t` SET `a`=DEFAULT +-- case +INSERT INTO `t` SET `a`=DEFAULT +-- case +REPLACE INTO `t` SET `a`=DEFAULT +-- case +UPDATE `t` SET `a`=DEFAULT +-- case +INSERT INTO `t` SET `a`=DEFAULT ON DUPLICATE KEY UPDATE `a`=DEFAULT +-- case +-- error: line 1 column 33 near "ascii)" +-- case +-- error: line 1 column 35 near "charset latin1)" +-- case +CREATE TABLE `t` (`a` LONGTEXT CHARACTER SET LATIN1) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET LATIN1) +-- case +CREATE TABLE `t` (`a` TINYTEXT CHARACTER SET LATIN1) +-- case +CREATE TABLE `t` (`a` BLOB) +-- case +CREATE TABLE `t` (`a` MEDIUMBLOB,`b` TEXT CHARACTER SET LATIN1) +-- case +CREATE TABLE `t` (`a` TEXT CHARACTER SET LATIN1,`b` MEDIUMTEXT CHARACTER SET LATIN1,`c` INT) +-- case +CREATE TABLE `t` (`a` INT,`b` TEXT CHARACTER SET LATIN1,`c` MEDIUMTEXT CHARACTER SET LATIN1) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET LATIN1,`b` MEDIUMTEXT CHARACTER SET LATIN1) +-- case +CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET UTF8MB4,`b` MEDIUMTEXT CHARACTER SET UTF8MB4,`c` MEDIUMTEXT CHARACTER SET UTF8MB4) +-- case +CREATE TABLE `t` (`a` INT STORAGE MEMORY,`b` VARCHAR(255) STORAGE MEMORY) +-- case +CREATE TABLE `t` (`a` INT STORAGE DISK,`b` VARCHAR(255) STORAGE DEFAULT) +-- case +CREATE TABLE `t` (`a` INT STORAGE DEFAULT,`b` VARCHAR(255) STORAGE DISK) +-- case +CREATE TABLE `t` (`a` DECIMAL(6,3),`b` DECIMAL PRIMARY KEY) +-- case +CREATE TABLE `t` (`a` DECIMAL,`b` DECIMAL(6)) +-- case +CREATE TABLE `t` (`a` DECIMAL(65,30) UNSIGNED ZEROFILL,`b` DECIMAL,`c` DECIMAL(65) UNSIGNED ZEROFILL) +-- case +-- error: line 1 column 33 near "a)));" +-- case +-- error: line 1 column 28 near "+1));" +-- case +-- error: line 1 column 31 near "+1));" +-- case +CREATE TABLE `a` (`a` INT,`b` INT,INDEX((`a`+1), (`b`+1))) +-- case +CREATE TABLE `a` (`a` INT,`b` INT,INDEX(`a`, (`b`+1))) +-- case +CREATE TABLE `a` (`a` INT,`b` INT,INDEX((`a`+1), `b`)) +-- case +CREATE TABLE `a` (`a` INT,`b` INT,INDEX((`a`+1) DESC)) +-- case +CREATE SEQUENCE `sequence` +-- case +CREATE SEQUENCE `seq` +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` +-- case +CREATE SEQUENCE `seq` +-- case +CREATE SEQUENCE `seq` +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` +-- case +-- error: line 1 column 43 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1 +-- case +-- error: line 1 column 42 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` MINVALUE 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` MINVALUE 1 +-- case +-- error: line 1 column 36 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NO MINVALUE +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NO MINVALUE +-- case +-- error: line 1 column 42 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` MAXVALUE 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` MAXVALUE 1 +-- case +-- error: line 1 column 36 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NO MAXVALUE +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NO MAXVALUE +-- case +-- error: line 1 column 39 near "" +-- case +-- error: line 1 column 44 near "" +-- case +-- error: line 1 column 41 near "" +-- case +-- error: line 1 column 44 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` START WITH 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` START WITH 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` START WITH 1 +-- case +-- error: line 1 column 39 near "" +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` CACHE 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` CACHE 1 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NOCACHE +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NOCACHE +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` CYCLE +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NOCYCLE +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` NOCYCLE +-- case +CREATE SEQUENCE `seq` INCREMENT BY 1 START WITH 0 MINVALUE 0 MAXVALUE 1000 +-- case +CREATE SEQUENCE `seq` INCREMENT BY 1 START WITH 0 MINVALUE 0 MAXVALUE 1000 +-- case +CREATE SEQUENCE `seq` INCREMENT BY 10 START WITH 0 MINVALUE 0 MAXVALUE 1000 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` CACHE 1 INCREMENT BY 1 START WITH -1 MINVALUE 0 MAXVALUE 1000 +-- case +CREATE SEQUENCE `sEq` START WITH 0 MINVALUE 0 MAXVALUE 1000 +-- case +CREATE SEQUENCE IF NOT EXISTS `seq` INCREMENT BY 1 START WITH 0 MINVALUE -2 MAXVALUE 1000 +-- case +CREATE SEQUENCE `seq` INCREMENT BY -1 START WITH -1 MINVALUE -1 MAXVALUE -1000 CACHE 10 NOCYCLE +-- case +CREATE TABLE `sequence` (`a` INT) +-- case +CREATE TABLE `t` (`sequence` INT) +-- case +-- error: line 1 column 13 near "" +-- case +DROP SEQUENCE `seq` +-- case +DROP SEQUENCE IF EXISTS `seq` +-- case +DROP SEQUENCE `seq` +-- case +DROP SEQUENCE IF EXISTS `seq` +-- case +DROP SEQUENCE IF EXISTS `seq`, `seq2`, `seq3` +-- case +-- error: line 1 column 22 near "seq2" +-- case +DROP SEQUENCE `seq`, `seq2` +-- case +CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(3) PRIMARY KEY,`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM PRIMARY KEY,`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` BIGINT PRIMARY KEY AUTO_RANDOM(4),`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` BIGINT PRIMARY KEY AUTO_RANDOM(3) PRIMARY KEY UNIQUE KEY,`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(5, 53) PRIMARY KEY,`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(15, 32) PRIMARY KEY,`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` INT) AUTO_ID_CACHE = 1 +-- case +CREATE TABLE `t` (`a` INT AUTO_INCREMENT PRIMARY KEY) AUTO_ID_CACHE = 10 +-- case +CREATE TABLE `t` (`a` BIGINT,`b` VARCHAR(255)) AUTO_ID_CACHE = 50 +-- case +CREATE TABLE `t` (`a` BIGINT AUTO_RANDOM(3) PRIMARY KEY) AUTO_RANDOM_BASE = 10 +-- case +CREATE TABLE `t` (`a` BIGINT PRIMARY KEY AUTO_RANDOM(4),`b` VARCHAR(100)) AUTO_RANDOM_BASE = 200 +-- case +ALTER TABLE `t` AUTO_RANDOM_BASE = 50 +-- case +ALTER TABLE `t` AUTO_INCREMENT = 30, AUTO_RANDOM_BASE = 40 +-- case +ALTER TABLE `t` FORCE AUTO_RANDOM_BASE = 50 +-- case +ALTER TABLE `t` AUTO_INCREMENT = 30, FORCE AUTO_RANDOM_BASE = 40 +-- case +-- error: line 1 column 18 near "" +-- case +-- error: line 1 column 26 near "comment="haha"" +-- case +ALTER SEQUENCE `seq` START WITH 1 +-- case +ALTER SEQUENCE `seq` START WITH 1 INCREMENT BY 1 +-- case +ALTER SEQUENCE `seq` START WITH 1 INCREMENT BY 2 MINVALUE 0 MAXVALUE 100 +-- case +ALTER SEQUENCE `seq` INCREMENT BY -1 START WITH -1 MINVALUE -1 MAXVALUE -1000 CACHE 10 NOCYCLE +-- case +ALTER SEQUENCE IF EXISTS `seq2` INCREMENT BY 2 +-- case +ALTER SEQUENCE `seq` RESTART +-- case +ALTER SEQUENCE `seq` START WITH 3 RESTART WITH 5 +-- case +ALTER SEQUENCE `seq` RESTART WITH 5 +-- case +-- error: line 1 column 27 near "restart = 5" +-- case +CREATE TABLE `t` (`a` INT,INDEX ``(`a`)) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) CLUSTERED) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) NONCLUSTERED) +-- case +CREATE TABLE `t` (`a` INT PRIMARY KEY NONCLUSTERED,`b` VARCHAR(255)) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255) PRIMARY KEY CLUSTERED) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255) DEFAULT _UTF8MB4'a' PRIMARY KEY CLUSTERED) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255) PRIMARY KEY NONCLUSTERED,PRIMARY KEY(`b`, `a`) NONCLUSTERED) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) NONCLUSTERED USING RTREE) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) NONCLUSTERED USING RTREE) +-- case +CREATE TABLE `t` (`a` INT,`b` VARCHAR(255),PRIMARY KEY(`b`, `a`) CLUSTERED USING RTREE) +-- case +-- error: line 1 column 47 near "clustered primary key)" +-- case +-- error: line 1 column 72 near "clustered)" +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`, `b`) CLUSTERED +-- case +ALTER TABLE `t` ADD PRIMARY KEY(`a`, `b`) NONCLUSTERED +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX(`b`) USING HNSW) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX(`a`, `b`) USING HNSW) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`)))) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`))) USING HASH) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX(`a`, (VEC_COSINE_DISTANCE(`b`))) USING HNSW) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`)), `a`) USING HNSW) +-- case +-- error: line 1 column 69 near "b)) USING HNSW);" +-- case +-- error: line 1 column 45 near "key((VEC_COSINE_DISTANCE(b))) TYPE HNSW);" +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((`b`+1)) USING HNSW) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`a`, `b`))) USING HNSW) +-- case +CREATE TABLE `t` (`a` INT,`b` VECTOR(3),VECTOR INDEX((VEC_COSINE_DISTANCE(`b`))) USING HNSW) +-- case +DROP PLACEMENT POLICY `x` +-- case +-- error: line 1 column 24 near ", y" +-- case +DROP PLACEMENT POLICY IF EXISTS `x` +-- case +-- error: line 1 column 34 near ", y" +-- case +SHOW CREATE PLACEMENT POLICY `x` +-- case +-- error: line 1 column 31 near "if exists x" +-- case +-- error: line 1 column 31 near ", y" +-- case +SHOW CREATE PLACEMENT POLICY `placement` +-- case +CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'us' +-- case +-- error: line 1 column 32 near "region='us, 3'" +-- case +CREATE PLACEMENT POLICY `x` FOLLOWERS = 3 +-- case +-- error: line 1 column 37 near ""FOLLOWERS must be positive +-- case +CREATE PLACEMENT POLICY `x` VOTERS = 3 +-- case +CREATE PLACEMENT POLICY `x` LEARNERS = 3 +-- case +CREATE PLACEMENT POLICY `x` SCHEDULE = 'even' +-- case +CREATE PLACEMENT POLICY `x` CONSTRAINTS = 'ww' +-- case +CREATE PLACEMENT POLICY `x` LEADER_CONSTRAINTS = 'ww' +-- case +CREATE PLACEMENT POLICY `x` FOLLOWER_CONSTRAINTS = 'ww' +-- case +CREATE PLACEMENT POLICY `x` VOTER_CONSTRAINTS = 'ww' +-- case +CREATE PLACEMENT POLICY `x` LEARNER_CONSTRAINTS = 'ww' +-- case +CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' REGIONS = 'us' SCHEDULE = 'even' +-- case +CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' LEADER_CONSTRAINTS = 'ww' LEADER_CONSTRAINTS = 'yy' +-- case +CREATE PLACEMENT POLICY IF NOT EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy' +-- case +CREATE OR REPLACE PLACEMENT POLICY `x` REGIONS = 'us' +-- case +-- error: line 1 column 35 near "placement policy y" +-- case +CREATE TABLE `masking` (`id` INT) +-- case +SELECT `masking` FROM `t` +-- case +ALTER TABLE `t` ADD COLUMN `masking` INT +-- case +ALTER TABLE `t` DROP COLUMN `masking` +-- case +ALTER TABLE `t` MODIFY COLUMN `masking` INT +-- case +CREATE MASKING POLICY `p` ON `t` (`c`) AS `c` +-- case +CREATE MASKING POLICY `p` ON `t` (`c`) AS `c` ENABLE +-- case +CREATE MASKING POLICY IF NOT EXISTS `p` ON `t` (`c`) AS `c` DISABLE +-- case +CREATE OR REPLACE MASKING POLICY `p` ON `t` (`c`) AS `c` +-- case +CREATE MASKING POLICY `p` ON `t` (`c`) AS `c` +-- case +-- error: line 1 column 61 near ""'OR REPLACE' and 'IF NOT EXISTS' are mutually exclusive +-- case +CREATE MASKING POLICY `p` ON `t` (`c`) AS CASE WHEN CURRENT_USER()=_UTF8MB4'root' THEN `c` ELSE _UTF8MB4'xxx' END ENABLE +-- case +CREATE MASKING POLICY `p` ON `t` (`c`) AS `c` RESTRICT ON (INSERT_INTO_SELECT, DELETE_SELECT) ENABLE +-- case +CREATE MASKING POLICY `p` ON `t` (`c`) AS CASE WHEN CURRENT_USER() NOT IN (_UTF8MB4'root@%',_UTF8MB4'u@%') THEN _UTF8MB4'x' ELSE `c` END +-- case +ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c` +-- case +ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c` +-- case +ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c` DISABLE +-- case +ALTER TABLE `t` ADD MASKING POLICY `p` ON (`c`) AS `c` RESTRICT ON (UPDATE_SELECT, CTAS) DISABLE +-- case +ALTER TABLE `t` MODIFY MASKING POLICY `p` SET EXPRESSION = CASE WHEN CURRENT_ROLE() IN (_UTF8MB4'r1',_UTF8MB4'r2') THEN `c` ELSE _UTF8MB4'x' END +-- case +-- error: line 1 column 57 near "case when current_role() in ('r1', 'r2') then c else 'x' end" +-- case +ALTER TABLE `t` MODIFY MASKING POLICY `p` SET RESTRICT ON (INSERT_INTO_SELECT, UPDATE_SELECT, DELETE_SELECT, CTAS) +-- case +ALTER TABLE `t` MODIFY MASKING POLICY `p` SET RESTRICT ON NONE +-- case +ALTER TABLE `t` ENABLE MASKING POLICY `p` +-- case +ALTER TABLE `t` DISABLE MASKING POLICY `p` +-- case +ALTER TABLE `t` DROP MASKING POLICY `p` +-- case +SHOW MASKING POLICIES FOR `t` +-- case +SHOW MASKING POLICIES FOR `t` WHERE `column_name`=_UTF8MB4'c' +-- case +ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'us' +-- case +-- error: line 1 column 31 near "region='us, 3'" +-- case +ALTER PLACEMENT POLICY `x` FOLLOWERS = 3 +-- case +ALTER PLACEMENT POLICY `x` VOTERS = 3 +-- case +ALTER PLACEMENT POLICY `x` LEARNERS = 3 +-- case +ALTER PLACEMENT POLICY `x` SCHEDULE = 'even' +-- case +ALTER PLACEMENT POLICY `x` CONSTRAINTS = 'ww' +-- case +ALTER PLACEMENT POLICY `x` LEADER_CONSTRAINTS = 'ww' +-- case +ALTER PLACEMENT POLICY `x` FOLLOWER_CONSTRAINTS = 'ww' +-- case +ALTER PLACEMENT POLICY `x` VOTER_CONSTRAINTS = 'ww' +-- case +ALTER PLACEMENT POLICY `x` LEARNER_CONSTRAINTS = 'ww' +-- case +ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' REGIONS = 'us' SCHEDULE = 'even' +-- case +ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' LEADER_CONSTRAINTS = 'ww' LEADER_CONSTRAINTS = 'yy' +-- case +ALTER PLACEMENT POLICY IF EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy' +-- case +-- error: line 1 column 34 near "placement policy y" +-- case +-- error: line 1 column 27 near "cpu ='8c'" +-- case +-- error: line 1 column 30 near "region ='us, 3'" +-- case +-- error: line 1 column 27 near "cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s'" +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 2000 +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 200000 +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED +-- case +-- error: line 1 column 42 near "'check'" +-- case +-- error: line 1 column 33 near "followers=0" +-- case +-- error: line 1 column 38 near "true" +-- case +-- error: line 1 column 39 near "false" +-- case +-- error: line 1 column 41 near "disable" +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 2000 +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 3000, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000 +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 4000 +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000 +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 4000 +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = LOW, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `default` RU_PER_SEC = 20, PRIORITY = LOW, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `default` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000 +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = UNLIMITED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = OFF +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 2000 +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 2000 +-- case +CREATE RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 2000 +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = UNLIMITED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = OFF +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, PRIORITY = LOW, BURSTABLE = UNLIMITED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, PRIORITY = LOW, BURSTABLE = OFF +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, PRIORITY = LOW, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = UNLIMITED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = OFF +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, PRIORITY = LOW, BURSTABLE = MODERATED +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = DRYRUN) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10m' ACTION = COOLDOWN) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (ACTION = KILL EXEC_ELAPSED = '10m') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' WATCH = SIMILAR DURATION = '10m' ACTION = COOLDOWN) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '9s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '8s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '7s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '7s' ACTION = COOLDOWN WATCH = EXACT DURATION = UNLIMITED) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' RU = 100 ACTION = DRYRUN) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' PROCESSED_KEYS = 100 ACTION = DRYRUN) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' WATCH = SIMILAR DURATION = '10m' ACTION = COOLDOWN) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (TASK_TYPES = '') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (UTILIZATION_LIMIT = 50) +-- case +-- error: line 1 column 77 near ""NAN")" +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (TASK_TYPES = 'br,lightning') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, BACKGROUND = (TASK_TYPES = 'br,lightning', UTILIZATION_LIMIT = 50) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = PLAN DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = PLAN DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning', UTILIZATION_LIMIT = 10) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = PLAN DURATION = '10m'), BACKGROUND = (TASK_TYPES = 'br,lightning') +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s') +-- case +-- error: line 1 column 45 near "QUERY=(EXEC_ELAPSED '10s')" +-- case +-- error: line 1 column 64 near "EXEC_ELAPSED '10s'" +-- case +-- error: line 1 column 73 near "" +-- case +-- error: line 1 column 45 near "LIMIT=(EXEC_ELAPSED '10s')" +-- case +-- error: line 1 column 100 near ")"Dupliated runaway options specified +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (PROCESSED_KEYS = 100) +-- case +-- error: line 1 column 45 near "QUERY=(PROCESSED_KEYS 100)" +-- case +-- error: line 1 column 66 near "PROCESSED_KEYS 100" +-- case +-- error: line 1 column 73 near "" +-- case +-- error: line 1 column 45 near "LIMIT=(PROCESSED_KEYS 100)" +-- case +-- error: line 1 column 100 near ")"Dupliated runaway options specified +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (RU = 100) +-- case +-- error: line 1 column 45 near "QUERY=(RU 100)" +-- case +-- error: line 1 column 54 near "RU 100" +-- case +-- error: line 1 column 61 near "" +-- case +-- error: line 1 column 45 near "LIMIT=(RU 100)" +-- case +-- error: line 1 column 88 near ")"Dupliated runaway options specified +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' PROCESSED_KEYS = 100) +-- case +CREATE RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' PROCESSED_KEYS = 100 RU = 100) +-- case +-- error: line 1 column 26 near "cpu ='8c'" +-- case +-- error: line 1 column 29 near "region ='us, 3'" +-- case +-- error: line 1 column 37 near "true" +-- case +-- error: line 1 column 38 near "false" +-- case +-- error: line 1 column 40 near "disable" +-- case +ALTER RESOURCE GROUP `default` PRIORITY = HIGH +-- case +-- error: line 1 column 26 near "cpu='8c', io_read_bandwidth='2GB/s', io_write_bandwidth='200MB/s'" +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000 +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = MODERATED +-- case +-- error: line 1 column 41 near "'check', BURSTABLE" +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 3000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000 +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 2000, BURSTABLE = OFF +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, BURSTABLE = OFF +-- case +-- error: line 1 column 41 near "'check', BURSTABLE" +-- case +-- error: line 1 column 53 near "yes" +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 3000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 3000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 3000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = UNLIMITED, RU_PER_SEC = 4000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED, RU_PER_SEC = 4000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = OFF, RU_PER_SEC = 4000 +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = MODERATED +-- case +-- error: line 1 column 32 near "followers=0" +-- case +-- error: line 1 column 49 near "MID BURSTABLE" +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` BURSTABLE = OFF +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 200000, BURSTABLE = OFF +-- case +-- error: line 1 column 32 near "followers=0" +-- case +-- error: line 1 column 49 near "MID" +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = HIGH, BURSTABLE = UNLIMITED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = HIGH, BURSTABLE = MODERATED +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 20, PRIORITY = HIGH, BURSTABLE = OFF +-- case +ALTER RESOURCE GROUP `x` QUERY_LIMIT = NULL +-- case +ALTER RESOURCE GROUP `x` QUERY_LIMIT = NULL +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = DRYRUN) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = NULL +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10m' ACTION = COOLDOWN) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (ACTION = KILL EXEC_ELAPSED = '10m') +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' WATCH = SIMILAR DURATION = '10m' ACTION = COOLDOWN) +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m') +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = UNLIMITED, QUERY_LIMIT = (EXEC_ELAPSED = '10s' ACTION = COOLDOWN WATCH = EXACT DURATION = '10m') +-- case +ALTER RESOURCE GROUP `x` RU_PER_SEC = 1000, QUERY_LIMIT = (EXEC_ELAPSED = '10s') +-- case +-- error: line 1 column 63 near "EXEC_ELAPSED '10s'" +-- case +-- error: line 1 column 99 near ")"Dupliated runaway options specified +-- case +-- error: line 1 column 132 near ")"Dupliated runaway options specified +-- case +ALTER RESOURCE GROUP `x` BACKGROUND = NULL +-- case +ALTER RESOURCE GROUP `x` BACKGROUND = NULL +-- case +ALTER RESOURCE GROUP `default` PRIORITY = LOW, BACKGROUND = (TASK_TYPES = 'ttl') +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = UNLIMITED, BACKGROUND = (TASK_TYPES = 'a,b,c') +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = MODERATED, BACKGROUND = (TASK_TYPES = 'a,b,c') +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = OFF, BACKGROUND = (TASK_TYPES = 'a,b,c') +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = UNLIMITED, BACKGROUND = (UTILIZATION_LIMIT = 20) +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = MODERATED, BACKGROUND = (UTILIZATION_LIMIT = 20) +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = OFF, BACKGROUND = (UTILIZATION_LIMIT = 20) +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = UNLIMITED, BACKGROUND = (TASK_TYPES = 'a,b,c', UTILIZATION_LIMIT = 20) +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = MODERATED, BACKGROUND = (TASK_TYPES = 'a,b,c', UTILIZATION_LIMIT = 20) +-- case +ALTER RESOURCE GROUP `default` BURSTABLE = OFF, BACKGROUND = (TASK_TYPES = 'a,b,c', UTILIZATION_LIMIT = 20) +-- case +-- error: line 1 column 87 near "'abc' )" +-- case +-- error: line 1 column 87 near "'abc' )" +-- case +-- error: line 1 column 81 near "'abc' )" +-- case +DROP RESOURCE GROUP `x` +-- case +DROP RESOURCE GROUP `DEFAULT` +-- case +DROP RESOURCE GROUP IF EXISTS `x` +-- case +-- error: line 1 column 22 near ",y" +-- case +-- error: line 1 column 32 near ",y" +-- case +SET RESOURCE GROUP `x` +-- case +SET RESOURCE GROUP `` +-- case +SET RESOURCE GROUP `default` +-- case +SET RESOURCE GROUP `default` +-- case +-- error: line 1 column 22 near "y" +-- case +CREATE ROLE `RESOURCE`@`%` +-- case +-- error: line 1 column 20 near "" +-- case +CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 +-- case +-- error: line 1 column 42 near "'abc'" +-- case +-- error: line 1 column 37 near "" +-- case +CREATE TABLE `t` (`a` INT) STATS_TOPN = 1 +-- case +-- error: line 1 column 39 near "'abc'" +-- case +CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1 +-- case +-- error: line 1 column 46 near "'abc'" +-- case +CREATE TABLE `t` (`a` INT) STATS_SAMPLE_RATE = 0.1 +-- case +-- error: line 1 column 46 near "'abc'" +-- case +CREATE TABLE `t` (`a` INT) STATS_COL_CHOICE = 'all' +-- case +CREATE TABLE `t` (`a` INT) STATS_COL_CHOICE = 'list' +-- case +-- error: line 1 column 41 near "1" +-- case +CREATE TABLE `t` (`a` INT,`b` INT) STATS_COL_LIST = 'a,b' +-- case +-- error: line 1 column 46 near "1" +-- case +CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 STATS_TOPN = 1 +-- case +CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 STATS_TOPN = 1 PARTITION BY RANGE (`a`) (PARTITION `p1` VALUES LESS THAN (200)) +-- case +ALTER TABLE `t` STATS_OPTIONS='str' +-- case +ALTER TABLE `t` STATS_OPTIONS='str1,str2' +-- case +ALTER TABLE `t` STATS_OPTIONS='str1,str2' +-- case +ALTER TABLE `t` STATS_OPTIONS='str1,str2' +-- case +ALTER TABLE `t` STATS_OPTIONS='str1,str2' +-- case +ALTER TABLE `t` STATS_OPTIONS=DEFAULT +-- case +ALTER TABLE `t` STATS_OPTIONS=DEFAULT +-- case +ALTER TABLE `t` STATS_OPTIONS=DEFAULT +-- case +-- error: line 1 column 27 near "" +-- case +CREATE TABLE `t` (`a` INT) INSERT_METHOD = FIRST diff --git a/parser/testdata/parser/deallocate/input.sql b/parser/testdata/parser/deallocate/input.sql new file mode 100644 index 0000000..0fe13ca --- /dev/null +++ b/parser/testdata/parser/deallocate/input.sql @@ -0,0 +1,3 @@ +DEALLOCATE PREPARE test +-- case +DEALLOCATE PREPARE `` diff --git a/parser/testdata/parser/deallocate/output.sql b/parser/testdata/parser/deallocate/output.sql new file mode 100644 index 0000000..d6c507d --- /dev/null +++ b/parser/testdata/parser/deallocate/output.sql @@ -0,0 +1,3 @@ +DEALLOCATE PREPARE `test` +-- case +DEALLOCATE PREPARE `` diff --git a/parser/testdata/parser/dml_stmt/input.sql b/parser/testdata/parser/dml_stmt/input.sql new file mode 100644 index 0000000..86854ef --- /dev/null +++ b/parser/testdata/parser/dml_stmt/input.sql @@ -0,0 +1,1051 @@ + +-- case +; +-- case +INSERT INTO foo VALUES (1234) +-- case +INSERT INTO foo VALUES (1234, 5678) +-- case +INSERT INTO t1 (SELECT * FROM t2) +-- case +INSERT INTO t partition (p0) values(1234) +-- case +REPLACE INTO t partition (p0) values(1234) +-- case +INSERT INTO t partition (p0, p1, p2) values(1234) +-- case +REPLACE INTO t partition (p0, p1, p2) values(1234) +-- case +INSERT INTO foo VALUES (1 || 2) +-- case +INSERT INTO foo VALUES (1 | 2) +-- case +INSERT INTO foo VALUES (false || true) +-- case +INSERT INTO foo VALUES (bar(5678)) +-- case +INSERT INTO foo VALUES () +-- case +SELECT * FROM t +-- case +SELECT * FROM t AS u +-- case +SELECT * FROM t, v +-- case +SELECT * FROM t AS u, v +-- case +SELECT * FROM t, v AS w +-- case +SELECT * FROM t AS u, v AS w +-- case +SELECT * FROM foo, bar, foo +-- case +SELECT DISTINCTS * FROM t +-- case +SELECT DISTINCT * FROM t +-- case +SELECT DISTINCTROW * FROM t +-- case +SELECT ALL * FROM t +-- case +SELECT DISTINCT ALL * FROM t +-- case +SELECT DISTINCTROW ALL * FROM t +-- case +INSERT INTO foo (a) VALUES (42) +-- case +INSERT INTO foo (a,) VALUES (42,) +-- case +INSERT INTO foo (a,b) VALUES (42,314) +-- case +INSERT INTO foo (a,b,) VALUES (42,314) +-- case +INSERT INTO foo (a,b,) VALUES (42,314,) +-- case +INSERT INTO foo () VALUES () +-- case +INSERT INTO foo VALUE () +-- case +INSERT INTO tt VALUES (01000001783); +-- case +INSERT INTO tt VALUES (default); +-- case +REPLACE INTO foo VALUES (1 || 2) +-- case +REPLACE INTO foo VALUES (1 | 2) +-- case +REPLACE INTO foo VALUES (false || true) +-- case +REPLACE INTO foo VALUES (bar(5678)) +-- case +REPLACE INTO foo VALUES () +-- case +REPLACE INTO foo (a,b) VALUES (42,314) +-- case +REPLACE INTO foo (a,b,) VALUES (42,314) +-- case +REPLACE INTO foo (a,b,) VALUES (42,314,) +-- case +REPLACE INTO foo () VALUES () +-- case +REPLACE INTO foo VALUE () +-- case +SELECT stuff.id + FROM stuff + WHERE stuff.value >= ALL (SELECT stuff.value + FROM stuff) +-- case +BEGIN +-- case +START TRANSACTION +-- case +COMMIT +-- case +COMMIT AND NO CHAIN +-- case +COMMIT NO RELEASE +-- case +COMMIT AND NO CHAIN NO RELEASE +-- case +COMMIT AND NO CHAIN RELEASE +-- case +COMMIT AND CHAIN NO RELEASE +-- case +COMMIT AND CHAIN RELEASE +-- case +ROLLBACK +-- case +ROLLBACK AND NO CHAIN +-- case +ROLLBACK NO RELEASE +-- case +ROLLBACK AND NO CHAIN NO RELEASE +-- case +ROLLBACK AND NO CHAIN RELEASE +-- case +ROLLBACK AND CHAIN NO RELEASE +-- case +ROLLBACK AND CHAIN RELEASE +-- case +BEGIN; + INSERT INTO foo VALUES (42, 3.14); + INSERT INTO foo VALUES (-1, 2.78); + COMMIT; +-- case +BEGIN; + INSERT INTO tmp SELECT * from bar; + SELECT * from tmp; + ROLLBACK; +-- case +SAVEPOINT x +-- case +RELEASE SAVEPOINT x +-- case +ROLLBACK TO x +-- case +ROLLBACK TO X +-- case +ROLLBACK TO SAVEPOINT x +-- case +TABLE t +-- case +(TABLE t) +-- case +TABLE t1, t2 +-- case +TABLE t ORDER BY b +-- case +TABLE t LIMIT 3 +-- case +TABLE t ORDER BY b LIMIT 3 +-- case +TABLE t ORDER BY b LIMIT 3 OFFSET 2 +-- case +TABLE t ORDER BY b LIMIT 2,3 +-- case +INSERT INTO ta TABLE tb +-- case +INSERT INTO t.a TABLE t.b +-- case +REPLACE INTO ta TABLE tb +-- case +REPLACE INTO t.a TABLE t.b +-- case +TABLE t1 INTO OUTFILE 'a.txt' +-- case +TABLE t ORDER BY a INTO OUTFILE '/tmp/abc' +-- case +CREATE TABLE t.a TABLE t.b +-- case +CREATE TABLE ta TABLE tb +-- case +CREATE TABLE ta (x INT) TABLE tb +-- case +CREATE VIEW v AS TABLE t +-- case +CREATE VIEW v AS (TABLE t) +-- case +SELECT * FROM t1 WHERE a IN (TABLE t2) +-- case +VALUES ROW(1) +-- case +VALUES ROW() +-- case +VALUES ROW(1, default) +-- case +VALUES ROW(1), ROW(2,3) +-- case +VALUES (1,2) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) +-- case +VALUES ROW(1,s,3.1), ROW(5,y,9.9) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) LIMIT 3 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY a +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY a LIMIT 2 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) INTO OUTFILE 'a.txt' +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) ORDER BY a INTO OUTFILE '/tmp/abc' +-- case +CREATE TABLE ta VALUES ROW(1) +-- case +CREATE TABLE ta AS VALUES ROW(1) +-- case +CREATE VIEW a AS VALUES ROW(1) +-- case +SELECT a.b.c FROM t +-- case +SELECT a.b.*.c FROM t +-- case +SELECT a.b.* FROM t +-- case +SELECT a FROM t +-- case +SELECT a.b.c.d FROM t +-- case +DO 1 +-- case +DO 1, sleep(1) +-- case +DO 1 from t +-- case +load data local infile '/tmp/t.csv' into table t1 fields terminated by ',' optionally enclosed by '"' ignore 1 lines +-- case +load data infile '/tmp/t.csv' into table t +-- case +load data infile '/tmp/t.csv' into table t character set utf8 +-- case +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' +-- case +load data infile '/tmp/t.csv' into table t columns terminated by 'ab' +-- case +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' +-- case +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' +-- case +load data infile '/tmp/t.csv' into table t lines starting by 'ab' +-- case +load data infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' +-- case +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy' +-- case +load data infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab' +-- case +load data local infile '/tmp/t.csv' into table t +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' +-- case +load data local infile '/tmp/t.csv' into table t columns terminated by 'ab' +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' +-- case +load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*' +-- case +load data local infile '/tmp/t.csv' into table t lines starting by 'ab' +-- case +load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy' +-- case +load data local infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab' +-- case +load data infile '/tmp/t.csv' into table t (a,b) +-- case +load data local infile '/tmp/t.csv' into table t (a,b) +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t columns terminated by 'ab' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t lines starting by 'ab' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' lines terminated by 'xy' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy' (a,b) +-- case +load data local infile '/tmp/t.csv' into table t (a,b) fields terminated by 'ab' +-- case +load data local infile '/tmp/t.csv' into table t ignore 1 lines +-- case +load data local infile '/tmp/t.csv' into table t ignore -1 lines +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b) ignore 1 lines +-- case +load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' ignore 1 lines +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' ignore 1 lines (a,b) +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '' +-- case +load data local infile '~/1.csv' into table `t_ascii` fields terminated by X'6B6B'; +-- case +load data local infile '~/1.csv' into table `t_ascii` fields terminated by X'6B6B' enclosed by X'0D'; +-- case +load data local infile '~/1.csv' into table `t_ascii` fields terminated by X'6B6B' enclosed by X'0D0D'; +-- case +load data local infile '~/1.csv' into table `t_ascii` fields terminated by B'110101101101011'; +-- case +load data local infile '~/1.csv' into table `t_ascii` fields terminated by B'110101101101011' enclosed by B'1101'; +-- case +load data local infile '~/1.csv' into table `t_ascii` fields terminated by B'110101101101011' enclosed by B'110100001101'; +-- case +load data local infile '~/1.csv' into table `t_ascii` lines starting by B'110101101101011' terminated by B'110101101101011'; +-- case +load data local infile '~/1.csv' into table `t_ascii` lines starting by X'6B6B' terminated by X'6B6B'; +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' enclosed by 'b' +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' escaped by '' enclosed by 'b' +-- case +load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' escaped by '' enclosed by 'b' SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-3), 2, 10) AS UNSIGNED) +-- case +load data infile '/tmp/t.csv' into table t fields enclosed by '' +-- case +load data infile '/tmp/t.csv' into table t fields enclosed by 'a' +-- case +load data infile '/tmp/t.csv' into table t fields enclosed by 'aa' +-- case +load data infile '/tmp/t.csv' into table t fields escaped by '' +-- case +load data infile '/tmp/t.csv' into table t fields escaped by 'a' +-- case +load data infile '/tmp/t.csv' into table t fields escaped by 'aa' +-- case +LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @dummy, column2, @dummy, column3) +-- case +LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1) SET column2 = @var1/100 +-- case +LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1, @var2) SET column2 = @var1/100, column3 = DEFAULT, column4=CURRENT_TIMESTAMP, column5=@var2+1 +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +'; +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +'; +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +'; +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' REPLACE INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +'; +-- case +load data infile 's3://bucket-name/t.csv' into table t +-- case +load data infile '/tmp/t.csv' into table t fields defined null by 'nil' +-- case +load data infile '/tmp/t.csv' into table t fields defined null by X'00' +-- case +load data infile '/tmp/t.csv' into table t fields defined null by 'NULL' optionally enclosed ignore 1 lines +-- case +load data infile '/tmp/t.csv' format 'delimited data' into table t (column1, @var1) SET column2 = @var1/100 +-- case +load data local infile '/tmp/t.sql' format 'sql file' replace into table t (a,b) +-- case +load data infile '/tmp/t.parquet' format 'parquet' into table t (column1, @var1) SET column2 = @var1/100 +-- case +load data infile '/tmp/t.csv' into table t with detached +-- case +load data infile '/tmp/t.csv' into table `t` with threads=10 +-- case +load data infile '/tmp/t.csv' into table `t` with threads=10, detached +-- case +import into t from '/file.csv' +-- case +import into t (a,b) from '/file.csv' +-- case +import into t (a,@1) from '/file.csv' +-- case +import into t (a,@1) set b=@1+100 from '/file.csv' +-- case +import into t from '/file.csv' format 'sql file' +-- case +import into t from '/file.csv' with detached +-- case +import into `t` from '/file.csv' with thread=1 +-- case +import into `t` from '/file.csv' with detached, thread=1 +-- case +select * from t for update +-- case +select * from t for share +-- case +select * from t for update nowait +-- case +select * from t for update wait 5 +-- case +select * from t limit 1 for update wait 11 +-- case +select * from t for share nowait +-- case +select * from t for update skip locked +-- case +select * from t for share skip locked +-- case +select * from t lock in share mode +-- case +select * from t lock in share mode nowait +-- case +select * from t lock in share mode skip locked +-- case +select * from t for update of t +-- case +select * from t for share of t +-- case +select * from t for update of t nowait +-- case +select * from t for update of t wait 5 +-- case +select * from t limit 1 for update of t wait 11 +-- case +select * from t for share of t nowait +-- case +select * from t for update of t skip locked +-- case +select * from t for share of t skip locked +-- case +select a, b from t into outfile '/tmp/result.txt' +-- case +select a from t order by a into outfile '/tmp/abc' +-- case +select 1 into outfile '/tmp/1.csv' +-- case +select 1 for update into outfile '/tmp/1.csv' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' enclosed BY '"' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' optionally enclosed BY '"' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' lines terminated BY ' +' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' optionally enclosed BY '"' lines terminated BY ' ' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' enclosed BY '"' lines terminated BY ' ' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' optionally enclosed BY '"' lines starting by 'xy' terminated BY ' ' +-- case +select a,b,a+b from t into outfile '/tmp/result.txt' fields terminated BY ',' enclosed BY '"' lines starting by 'xy' terminated BY ' ' +-- case +SELECT * from t1, t2, t3 +-- case +select * from t1 join t2 left join t3 on t2.id = t3.id +-- case +select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id +-- case +select * from t1 right join t2 on t1.id = t2.id left join t3 +-- case +select * from t1 join t2 left join t3 using (id) +-- case +select * from t1 right join t2 using (id) left join t3 using (id) +-- case +select * from t1 right join t2 using (id) left join t3 +-- case +select * from t1 natural join t2 +-- case +select * from t1 natural right join t2 +-- case +select * from t1 natural left outer join t2 +-- case +select * from t1 natural inner join t2 +-- case +select * from t1 natural cross join t2 +-- case +select * from t3 join t1 join t2 on t1.a=t2.a on t3.b=t2.b +-- case +select * from t1 straight_join t2 on t1.id = t2.id +-- case +select straight_join * from t1 join t2 on t1.id = t2.id +-- case +select straight_join * from t1 left join t2 on t1.id = t2.id +-- case +select straight_join * from t1 right join t2 on t1.id = t2.id +-- case +select straight_join * from t1 straight_join t2 on t1.id = t2.id +-- case +DELETE from t1 +-- case +DELETE from t1.* +-- case +DELETE LOW_priORITY from t1 +-- case +DELETE quick from t1 +-- case +DELETE ignore from t1 +-- case +DELETE low_priority quick ignore from t1 +-- case +DELETE FROM t1 WHERE t1.a > 0 ORDER BY t1.a +-- case +delete from t1 where a=26 +-- case +DELETE from t1 where a=1 limit 1 +-- case +DELETE FROM t1 WHERE t1.a > 0 ORDER BY t1.a LIMIT 1 +-- case +DELETE FROM x.y z WHERE z.a > 0 +-- case +DELETE FROM t1 AS w WHERE a > 0 +-- case +DELETE from t1 partition (p0,p1) +-- case +delete low_priority t1, t2 from t1, t2 +-- case +delete quick t1, t2 from t1, t2 +-- case +delete ignore t1, t2 from t1, t2 +-- case +delete ignore t1, t2 from t1 partition (p0,p1), t2 +-- case +delete low_priority quick ignore t1, t2 from t1, t2 where t1.a > 5 +-- case +delete t1, t2 from t1, t2 +-- case +delete t1, t2 from t1, t2 where t1.a = 1 and t2.b <> 1 +-- case +delete t1 from t1, t2 +-- case +delete t2 from t1, t2 +-- case +delete t1 from t1 +-- case +delete t1,t2,t3 from t1, t2, t3 +-- case +delete t1,t2,t3 from t1, t2, t3 where t3.c < 5 and t1.a = 3 +-- case +delete t1 from t1, t1 as t2 where t1.b = t2.b and t1.a > t2.a +-- case +delete t1.*,t2 from t1, t2 +-- case +delete t.t1.*,t2 from t1, t2 +-- case +delete t1.*, t2.* from t1, t2 +-- case +delete t11.*, t12.* from t11, t12 where t11.a = t12.a and t11.b <> 1 +-- case +DELETE quick FROM t1,t2 USING t1,t2 +-- case +DELETE low_priority ignore FROM t1,t2 USING t1,t2 +-- case +DELETE low_priority quick ignore FROM t1,t2 USING t1,t2 +-- case +DELETE FROM t1 USING t1 WHERE post='1' +-- case +DELETE FROM t1,t2 USING t1,t2 +-- case +DELETE FROM t1,t2,t3 USING t1,t2,t3 where t3.a = 1 +-- case +DELETE FROM t2,t3 USING t1,t2,t3 where t1.a = 1 +-- case +DELETE FROM t2.*,t3.* USING t1,t2,t3 where t1.a = 1 +-- case +DELETE FROM t1,t2.*,t3.* USING t1,t2,t3 where t1.a = 1 +-- case +DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id; +-- case +DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id; +-- case +DELETE /*+ TiDB_INLJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id; +-- case +DELETE /*+ TiDB_HJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id +-- case +DELETE /*+ TiDB_SMJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id +-- case +DELETE FROM t1 USE INDEX(idx_a) WHERE t1.id=1; +-- case +DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 WHERE t1.id=t2.id; +-- case +DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 USE INDEX(idx_a) WHERE t1.id=t2.id; +-- case +DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id limit 10; +-- case +DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id order by t1.id; +-- case +INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); +-- case +INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c:=VALUES(a)+VALUES(b); +-- case +INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); +-- case +INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c:=VALUES(a)+VALUES(b); +-- case +INSERT INTO odk (id, v) VALUES (1, 10) AS new ON DUPLICATE KEY UPDATE v = new.v; +-- case +INSERT INTO odk (id, v) VALUES (1, 10) AS new(nid, nv) ON DUPLICATE KEY UPDATE v = nv; +-- case +INSERT INTO odk VALUES (1, 10) AS new ON DUPLICATE KEY UPDATE v = new.v; +-- case +INSERT IGNORE INTO odk (id, v) VALUES (1, 10) AS new ON DUPLICATE KEY UPDATE v = new.v; +-- case +INSERT INTO odk SET id = 1, v = 10 AS new ON DUPLICATE KEY UPDATE v = new.v; +-- case +INSERT INTO odk (id, v) SELECT id, v FROM staging AS s AS new ON DUPLICATE KEY UPDATE v = new.v; +-- case +INSERT INTO t SET a=1,b=2 +-- case +INSERT INTO t (a) SET a=1 +-- case +UPDATE LOW_PRIORITY IGNORE t SET id = id + 1 ORDER BY id DESC; +-- case +UPDATE t SET id = id + 1 ORDER BY id DESC; +-- case +UPDATE t SET id = id + 1 ORDER BY id DESC limit 3 ; +-- case +UPDATE t SET id = id + 1, name = 'jojo'; +-- case +UPDATE items,month SET items.price=month.price WHERE items.id=month.id; +-- case +UPDATE user T0 LEFT OUTER JOIN user_profile T1 ON T1.id = T0.profile_id SET T0.profile_id = 1 WHERE T0.profile_id IN (1); +-- case +UPDATE t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba +-- case +UPDATE /*+ TiDB_INLJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba +-- case +UPDATE /*+ TiDB_SMJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba +-- case +UPDATE /*+ TiDB_HJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba +-- case +UPDATE items,month SET items.price=month.price WHERE items.id=month.id LIMIT 10; +-- case +UPDATE items,month SET items.price=month.price WHERE items.id=month.id order by month.id; +-- case +UPDATE t1 USE INDEX(idx_a) SET t1.price=3.25 WHERE t1.id=1; +-- case +UPDATE t1 USE INDEX(idx_a) JOIN t2 SET t1.price=t2.price WHERE t1.id=t2.id; +-- case +UPDATE t1 USE INDEX(idx_a) JOIN t2 USE INDEX(idx_a) SET t1.price=t2.price WHERE t1.id=t2.id; +-- case +SELECT * FROM t WHERE 1 = 1 +-- case +SELECT * FROM t FETCH FIRST 5 ROW ONLY +-- case +SELECT * FROM t FETCH NEXT 5 ROW ONLY +-- case +SELECT * FROM t FETCH FIRST 5 ROWS ONLY +-- case +SELECT * FROM t FETCH NEXT 5 ROWS ONLY +-- case +SELECT * FROM t FETCH FIRST ROW ONLY +-- case +SELECT * FROM t FETCH NEXT ROW ONLY +-- case +select 1 from dual +-- case +select 1 from dual limit 1 +-- case +select 1 where exists (select 2) +-- case +select 1 from dual where not exists (select 2) +-- case +select 1 as a from dual order by a +-- case +select 1 as a from dual where 1 < any (select 2) order by a +-- case +select 1 order by 1 +-- case +(select 1); +-- case +select 1 where 1=1 +-- case +select 1 group by 1 +-- case +select 1 from dual group by 1 +-- case +select min(b) b from (select min(t.b) b from t where t.a = ''); +-- case +select min(b) b from (select min(t.b) b from t where t.a = '') as t1; +-- case +SELECT /*!40001 SQL_NO_CACHE */ * FROM test WHERE 1 limit 0, 2000; +-- case +ANALYZE TABLE t +-- case +/** 20180417 **/ show databases; +-- case +/* 20180417 **/ show databases; +-- case +/** 20180417 */ show databases; +-- case +/** 20180417 ******/ show databases; +-- case +/**/show databases; +-- case +/*+*/show databases; +-- case +select/*+*/1; +-- case +/*T*/show databases; +-- case +/*M*/show databases; +-- case +/*!*/show databases; +-- case +/*T!*/show databases; +-- case +/*M!*/show databases; +-- case +BINLOG ' +BxSFVw8JAAAA8QAAAPUAAAAAAAQANS41LjQ0LU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA5gm5Mg== +'/*!*/; +-- case +select * from t1 partition (p1) +-- case +select * from t1 partition (p1,p2) +-- case +select * from t1 partition (`p1`, p2, p3) +-- case +select * from t1 partition () +-- case +split table t1 index idx1 by ('a'),('b'),('c') +-- case +split table t1 index idx1 by (1) +-- case +split table t1 index idx1 by ('abc',123), ('xyz'), ('yz', 1000) +-- case +split table t1 index idx1 by +-- case +split table t1 index idx1 between ('a') and ('z') regions 10 +-- case +split table t1 index idx1 between ('a',1) and ('z',2) regions 10 +-- case +split table t1 index idx1 between () and () regions 10 +-- case +split table t1 index by (1) +-- case +split region for table t1 index idx1 by ('a'),('b'),('c') +-- case +split partition table t1 index idx1 by ('a'),('b'),('c') +-- case +split region for partition table t1 index idx1 by ('a'),('b'),('c') +-- case +split region for table t1 index idx1 between ('a') and ('z') regions 10 +-- case +split partition table t1 index idx1 between ('a') and ('z') regions 10 +-- case +split region for partition table t1 index idx1 between ('a') and ('z') regions 10 +-- case +split region for table t1 partition (p0,p1) index idx1 by ('a'),('b'),('c') +-- case +split partition table t1 partition (p0) index idx1 by ('a'),('b'),('c') +-- case +split region for partition table t1 partition (p0) index idx1 by ('a'),('b'),('c') +-- case +split region for table t1 partition (p0) index idx1 between ('a') and ('z') regions 10 +-- case +split partition table t1 partition (p0) index idx1 between ('a') and ('z') regions 10 +-- case +split region for partition table t1 partition (p0) index idx1 between ('a') and ('z') regions 10 +-- case +split table t1 by ('a'),('b'),('c') +-- case +split table t1 by (1) +-- case +split table t1 by ('abc',123), ('xyz'), ('yz', 1000) +-- case +split table t1 by +-- case +split table t1 between ('a') and ('z') regions 10 +-- case +split table t1 between ('a',1) and ('z',2) regions 10 +-- case +split table t1 between () and () regions 10 +-- case +split region for table t1 by ('a'),('b'),('c') +-- case +split partition table t1 by ('a'),('b'),('c') +-- case +split region for partition table t1 by ('a'),('b'),('c') +-- case +split region for table t1 between (1) and (1000) regions 10 +-- case +split partition table t1 between (1) and (1000) regions 10 +-- case +split region for partition table t1 between (1) and (1000) regions 10 +-- case +show table t1 regions +-- case +show table t1 regions where a=1 +-- case +show table t1 +-- case +show table t1 index idx1 regions +-- case +show table t1 index idx1 regions where a=2 +-- case +show table t1 index idx1 +-- case +show table t1 partition (p0,p1) regions +-- case +show table t1 partition (p0) regions where a=1 +-- case +show table t1 partition +-- case +show table t1 partition (p0) index idx1 regions +-- case +show table t1 partition (p0,p1) index idx1 regions where a=2 +-- case +show table t1 partition index idx1 +-- case +show table t1 distributions +-- case +show table t1 distributions where a=1 +-- case +show table t1 partition (p0,p1) distributions +-- case +show table t1 partition (p0,p1) distributions where a=1 +-- case +distribute table t1 +-- case +distribute table t1 partition(p0) +-- case +distribute table t1 partition(p0,p1) +-- case +distribute table t1 partition(p0,p1) engine = tikv +-- case +distribute table t1 rule = 'leader-scatter' engine = 'tikv' +-- case +distribute table t1 rule = "leader-scatter" engine = "tikv" +-- case +distribute table t1 partition(p0,p1) rule = 'learner-scatter' engine = 'tikv' +-- case +distribute table t1 partition(p0) rule = 'peer-scatter' engine = 'tiflash' +-- case +distribute table t1 partition(p0) rule = 'peer-scatter' engine = 'tiflash' timeout = '30m' +-- case +show distribution jobs 1 +-- case +show distribution jobs +-- case +show distribution jobs where id > 0 +-- case +show distribution job 1 where id > 0 +-- case +show distribution job 1 +-- case +cancel distribution job +-- case +cancel distribution job 1 +-- case +show table t1.t1 next_row_id +-- case +show table t1 next_row_id +-- case +show table next_row_id +-- case +begin pessimistic +-- case +begin optimistic +-- case +ADMIN REPAIR TABLE t CREATE TABLE t (a int) +-- case +ADMIN REPAIR TABLE t CREATE TABLE t (a char(1)) +-- case +ADMIN REPAIR TABLE t CREATE TABLE t (a char(1), b int) +-- case +ADMIN REPAIR TABLE t CREATE TABLE t (c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2)); +-- case +ADMIN REPAIR TABLE t CREATE TABLE t (a TINYINT UNSIGNED); +-- case +ADMIN REPAIR TABLE t CREATE TABLE t (name CHAR(50) CHARACTER SET UTF8) +-- case +ALTER INSTANCE RELOAD TLS +-- case +ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR +-- case +ALTER RANGE global PLACEMENT POLICY mypolicy +-- case +ALTER RANGE global PLACEMENT POLICY default +-- case +ALTER RANGE meta PLACEMENT POLICY mypolicy +-- case +CREATE SEQUENCE seq INCREMENT - 9223372036854775807 +-- case +CREATE SEQUENCE seq INCREMENT - 9223372036854775808 +-- case +CREATE SEQUENCE seq INCREMENT -9223372036854775808 +-- case +CREATE SEQUENCE seq INCREMENT -9223372036854775809 +-- case +select `t`.`1a`.1 from t; +-- case +select * from 1db.1table; +-- case +select * from t where t. status = 1; +-- case +SHOW PLACEMENT +-- case +SHOW PLACEMENT LIKE 'POLICY foo%' +-- case +SHOW PLACEMENT WHERE Target='TABLE test.t1' +-- case +SHOW PLACEMENT FOR DATABASE db1 +-- case +SHOW PLACEMENT FOR SCHEMA db1 +-- case +SHOW PLACEMENT FOR TABLE tb1 +-- case +SHOW PLACEMENT FOR TABLE db1.tb1 +-- case +SHOW PLACEMENT FOR TABLE tb1 PARTITION p1 +-- case +SHOW PLACEMENT FOR TABLE db1.tb1 PARTITION p1 +-- case +SHOW PLACEMENT FOR +-- case +SHOW PLACEMENT DATABASE db1 +-- case +SHOW PLACEMENT FOR DB db1 +-- case +SHOW PLACEMENT FOR DATABASE db1 TABLE tb1 +-- case +SHOW PLACEMENT FOR PARTITION p1 +-- case +SHOW PLACEMENT FOR DB LIKE '%' +-- case +SHOW PLACEMENT FOR DB db1 LIKE '%' +-- case +SHOW PLACEMENT LABELS +-- case +SHOW PLACEMENT LABELS LIKE '%zone%' +-- case +SHOW PLACEMENT LABELS WHERE label='l123' +-- case +SHOW SESSION_STATES +-- case +SET SESSION_STATES 'x' +-- case +SET SESSION_STATES +-- case +SET SESSION_STATES 1 +-- case +SET SESSION_STATES now() +-- case +calibrate resource +-- case +calibrate resource START_TIME '2021-04-15 00:00:00' +-- case +calibrate resource START_TIME '2023-04-01 13:00:00' END_TIME '2023-04-01 16:00:00' +-- case +calibrate resource START_TIME '2023-04-01 13:00:00' DURATION '20m' +-- case +calibrate resource START_TIME '2023-04-01 13:00:00' END_TIME '2023-04-01 16:00:00' DURATION '20m' +-- case +calibrate resource START_TIME '2023-04-01 13:00:00',END_TIME='2023-04-01 16:00:00' +-- case +calibrate resource START_TIME '2023-04-01 13:00:00',DURATION='20m' +-- case +calibrate resource DURATION='20m' START_TIME '2023-04-01 13:00:00' +-- case +calibrate resource START_TIME '2023-04-01 13:00:00' END_TIME='2023-04-01 16:00:00',DURATION '20m' +-- case +calibrate resource START_TIME CURRENT_TIMESTAMP() END_TIME current_timestamp() +-- case +calibrate resource END_TIME now() +-- case +calibrate resource START_TIME now() +-- case +calibrate resource START_TIME NOW() END_TIME now() +-- case +calibrate resource START_TIME CURRENT_TIMESTAMP() - interval 10 minute END_TIME now() +-- case +calibrate resource START_TIME now() - 1000 END_TIME current_timestamp() +-- case +calibrate resource START_TIME CURRENT_TIMESTAMP() - interval 20 minute DURATION interval 15 minute +-- case +calibrate resource START_TIME CURRENT_TIMESTAMP() - interval 20 minute DURATION '15m' +-- case +calibrate resource END_TIME now() START_TIME CURRENT_TIMESTAMP() - interval 20 minute +-- case +calibrate resource workload +-- case +calibrate resource workload tpcc +-- case +calibrate resource workload oltp_read_write +-- case +calibrate resource workload oltp_read_only +-- case +calibrate resource workload oltp_write_only +-- case +calibrate resource workload = oltp_read_write START_TIME '2023-04-01 13:00:00' +-- case +query watch add SQL DIGEST b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377 +-- case +query watch add SQL DIGEST b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377 +-- case +query watch add SQL DIGEST 'b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377' +-- case +query watch add PLAN DIGEST `5e3ddd388f6012e328233dbcdda5d48f404e0536c6c54d9618233210f3d5762a` +-- case +query watch add PLAN DIGEST @digest1 +-- case +query watch add SQL TEXT SIMILAR to 'select 1' +-- case +query watch add SQL TEXT EXACT to 'select 1' +-- case +query watch add SQL TEXT PLAN to 'select 1' +-- case +query watch add resource group `default` SQL TEXT SIMILAR to 'select 1' +-- case +query watch add resource group @rg SQL TEXT SIMILAR to @sql1 +-- case +query watch add resource group rg1 SQL TEXT SIMILAR to 'select 1' +-- case +query watch add SQL TEXT SIMILAR to 'select 1' resource group rg1 +-- case +query watch add ACTION = KILL SQL TEXT SIMILAR to 'select 1' +-- case +query watch add ACTION COOLDOWN resource group rg1 SQL TEXT SIMILAR to 'select 1' +-- case +query watch add resource group `default` resource group `rg1` SQL TEXT SIMILAR to 'select 1' +-- case +query watch add SQL SIMILAR to 'select 1' +-- case +query watch add SQL TEXT SIMILAR 'select 1' +-- case +query watch remove 1 +-- case +query watch remove resource group rg1 +-- case +query watch remove resource group @rg +-- case +query watch remove +-- case +replace /*+ SET_VAR(sql_mode='ALLOW_INVALID_DATES') */ into t values ('2004-04-31'); diff --git a/parser/testdata/parser/dml_stmt/output.sql b/parser/testdata/parser/dml_stmt/output.sql new file mode 100644 index 0000000..a0b728d --- /dev/null +++ b/parser/testdata/parser/dml_stmt/output.sql @@ -0,0 +1,1042 @@ + +-- case + +-- case +INSERT INTO `foo` VALUES (1234) +-- case +INSERT INTO `foo` VALUES (1234,5678) +-- case +INSERT INTO `t1` (SELECT * FROM `t2`) +-- case +INSERT INTO `t` PARTITION(`p0`) VALUES (1234) +-- case +REPLACE INTO `t` PARTITION(`p0`) VALUES (1234) +-- case +INSERT INTO `t` PARTITION(`p0`, `p1`, `p2`) VALUES (1234) +-- case +REPLACE INTO `t` PARTITION(`p0`, `p1`, `p2`) VALUES (1234) +-- case +INSERT INTO `foo` VALUES (1 OR 2) +-- case +INSERT INTO `foo` VALUES (1|2) +-- case +INSERT INTO `foo` VALUES (FALSE OR TRUE) +-- case +INSERT INTO `foo` VALUES (BAR(5678)) +-- case +INSERT INTO `foo` VALUES () +-- case +SELECT * FROM `t` +-- case +SELECT * FROM `t` AS `u` +-- case +SELECT * FROM (`t`) JOIN `v` +-- case +SELECT * FROM (`t` AS `u`) JOIN `v` +-- case +SELECT * FROM (`t`) JOIN `v` AS `w` +-- case +SELECT * FROM (`t` AS `u`) JOIN `v` AS `w` +-- case +SELECT * FROM ((`foo`) JOIN `bar`) JOIN `foo` +-- case +-- error: line 1 column 23 near "FROM t" +-- case +SELECT DISTINCT * FROM `t` +-- case +SELECT DISTINCT * FROM `t` +-- case +SELECT ALL * FROM `t` +-- case +-- error: [parser:1221]Incorrect usage of ALL and DISTINCT +-- case +-- error: [parser:1221]Incorrect usage of ALL and DISTINCT +-- case +INSERT INTO `foo` (`a`) VALUES (42) +-- case +-- error: line 1 column 20 near ") VALUES (42,)" +-- case +INSERT INTO `foo` (`a`,`b`) VALUES (42,314) +-- case +-- error: line 1 column 22 near ") VALUES (42,314)" +-- case +-- error: line 1 column 22 near ") VALUES (42,314,)" +-- case +INSERT INTO `foo` () VALUES () +-- case +INSERT INTO `foo` VALUES () +-- case +INSERT INTO `tt` VALUES (1000001783) +-- case +INSERT INTO `tt` VALUES (DEFAULT) +-- case +REPLACE INTO `foo` VALUES (1 OR 2) +-- case +REPLACE INTO `foo` VALUES (1|2) +-- case +REPLACE INTO `foo` VALUES (FALSE OR TRUE) +-- case +REPLACE INTO `foo` VALUES (BAR(5678)) +-- case +REPLACE INTO `foo` VALUES () +-- case +REPLACE INTO `foo` (`a`,`b`) VALUES (42,314) +-- case +-- error: line 1 column 23 near ") VALUES (42,314)" +-- case +-- error: line 1 column 23 near ") VALUES (42,314,)" +-- case +REPLACE INTO `foo` () VALUES () +-- case +REPLACE INTO `foo` VALUES () +-- case +SELECT `stuff`.`id` FROM `stuff` WHERE `stuff`.`value`>=ALL (SELECT `stuff`.`value` FROM `stuff`) +-- case +START TRANSACTION +-- case +START TRANSACTION +-- case +COMMIT +-- case +COMMIT +-- case +COMMIT +-- case +COMMIT +-- case +COMMIT RELEASE +-- case +COMMIT AND CHAIN +-- case +-- error: line 1 column 24 near "RELEASE" +-- case +ROLLBACK +-- case +ROLLBACK +-- case +ROLLBACK +-- case +ROLLBACK +-- case +ROLLBACK RELEASE +-- case +ROLLBACK AND CHAIN +-- case +-- error: line 1 column 26 near "RELEASE" +-- case +START TRANSACTION; INSERT INTO `foo` VALUES (42,3.14); INSERT INTO `foo` VALUES (-1,2.78); COMMIT +-- case +START TRANSACTION; INSERT INTO `tmp` SELECT * FROM `bar`; SELECT * FROM `tmp`; ROLLBACK +-- case +SAVEPOINT x +-- case +RELEASE SAVEPOINT x +-- case +ROLLBACK TO x +-- case +ROLLBACK TO X +-- case +ROLLBACK TO x +-- case +TABLE `t` +-- case +(TABLE `t`) +-- case +-- error: line 1 column 9 near ", t2" +-- case +TABLE `t` ORDER BY `b` +-- case +TABLE `t` LIMIT 3 +-- case +TABLE `t` ORDER BY `b` LIMIT 3 +-- case +TABLE `t` ORDER BY `b` LIMIT 2,3 +-- case +TABLE `t` ORDER BY `b` LIMIT 2,3 +-- case +INSERT INTO `ta` TABLE `tb` +-- case +INSERT INTO `t`.`a` TABLE `t`.`b` +-- case +REPLACE INTO `ta` TABLE `tb` +-- case +REPLACE INTO `t`.`a` TABLE `t`.`b` +-- case +TABLE `t1` INTO OUTFILE 'a.txt' +-- case +TABLE `t` ORDER BY `a` INTO OUTFILE '/tmp/abc' +-- case +CREATE TABLE `t`.`a` AS TABLE `t`.`b` +-- case +CREATE TABLE `ta` AS TABLE `tb` +-- case +CREATE TABLE `ta` (`x` INT) AS TABLE `tb` +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS TABLE `t` +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (TABLE `t`) +-- case +SELECT * FROM `t1` WHERE `a` IN (TABLE `t2`) +-- case +VALUES ROW(1) +-- case +VALUES ROW() +-- case +VALUES ROW(1,DEFAULT) +-- case +VALUES ROW(1), ROW(2,3) +-- case +-- error: line 1 column 8 near "(1,2)" +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) +-- case +VALUES ROW(1,`s`,3.1), ROW(5,`y`,9.9) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) LIMIT 3 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY `a` +-- case +VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY `a` LIMIT 2 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) INTO OUTFILE 'a.txt' +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) ORDER BY `a` INTO OUTFILE '/tmp/abc' +-- case +CREATE TABLE `ta` AS VALUES ROW(1) +-- case +CREATE TABLE `ta` AS VALUES ROW(1) +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `a` AS VALUES ROW(1) +-- case +SELECT `a`.`b`.`c` FROM `t` +-- case +-- error: line 1 column 13 near ".c FROM t" +-- case +SELECT `a`.`b`.* FROM `t` +-- case +SELECT `a` FROM `t` +-- case +-- error: line 1 column 13 near ".d FROM t" +-- case +DO 1 +-- case +DO 1, SLEEP(1) +-- case +-- error: line 1 column 9 near "from t" +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' IGNORE 1 LINES +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` CHARACTER SET utf8 +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` LINES STARTING BY 'ab' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy' +-- case +-- error: line 1 column 53 near "terminated by 'xy' fields terminated by 'ab'" +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` CHARACTER SET utf8 FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy' +-- case +-- error: line 1 column 59 near "terminated by 'xy' fields terminated by 'ab'" +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` CHARACTER SET utf8 FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` CHARACTER SET utf8 FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy' (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' LINES TERMINATED BY 'xy' (`a`,`b`) +-- case +-- error: line 1 column 61 near "fields terminated by 'ab'" +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` IGNORE 1 LINES +-- case +-- error: line 1 column 57 near "-1 lines" +-- case +-- error: line 1 column 103 near "ignore 1 lines" +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` LINES STARTING BY 'ab' TERMINATED BY 'xy' IGNORE 1 LINES +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '*' IGNORE 1 LINES (`a`,`b`) +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '' +-- case +LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk' +-- case +LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk' ENCLOSED BY ' ' +-- case +-- error: [parser:1083]Field separator argument is not what is expected; check the manual +-- case +LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk' +-- case +LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` FIELDS TERMINATED BY 'kk' ENCLOSED BY ' ' +-- case +-- error: [parser:1083]Field separator argument is not what is expected; check the manual +-- case +LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` LINES STARTING BY 'kk' TERMINATED BY 'kk' +-- case +LOAD DATA LOCAL INFILE '~/1.csv' IGNORE INTO TABLE `t_ascii` LINES STARTING BY 'kk' TERMINATED BY 'kk' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t` FIELDS TERMINATED BY 'ab' ENCLOSED BY 'b' ESCAPED BY '' SET `b`=CAST(CONV(MID(@`var1`, 3, LENGTH(@`var1`)-3), 2, 10) AS UNSIGNED) +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ENCLOSED BY '' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ENCLOSED BY 'a' +-- case +-- error: [parser:1083]Field separator argument is not what is expected; check the manual +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ESCAPED BY '' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS ESCAPED BY 'a' +-- case +-- error: [parser:1083]Field separator argument is not what is expected; check the manual +-- case +LOAD DATA INFILE 'file.txt' INTO TABLE `t1` (`column1`,@`dummy`,`column2`,@`dummy`,`column3`) +-- case +LOAD DATA INFILE 'file.txt' INTO TABLE `t1` (`column1`,@`var1`) SET `column2`=@`var1`/100 +-- case +LOAD DATA INFILE 'file.txt' INTO TABLE `t1` (`column1`,@`var1`,@`var2`) SET `column2`=@`var1`/100, `column3`=DEFAULT, `column4`=CURRENT_TIMESTAMP(), `column5`=@`var2`+1 +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' IGNORE INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +' +-- case +LOAD DATA LOCAL INFILE '/tmp/t.csv' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',' LINES TERMINATED BY ' +' +-- case +LOAD DATA INFILE 's3://bucket-name/t.csv' INTO TABLE `t` +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS DEFINED NULL BY 'nil' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS DEFINED NULL BY '' +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` FIELDS DEFINED NULL BY 'NULL' OPTIONALLY ENCLOSED IGNORE 1 LINES +-- case +LOAD DATA INFILE '/tmp/t.csv' FORMAT 'delimited data' INTO TABLE `t` (`column1`,@`var1`) SET `column2`=@`var1`/100 +-- case +LOAD DATA LOCAL INFILE '/tmp/t.sql' FORMAT 'sql file' REPLACE INTO TABLE `t` (`a`,`b`) +-- case +LOAD DATA INFILE '/tmp/t.parquet' FORMAT 'parquet' INTO TABLE `t` (`column1`,@`var1`) SET `column2`=@`var1`/100 +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` WITH detached +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` WITH threads=10 +-- case +LOAD DATA INFILE '/tmp/t.csv' INTO TABLE `t` WITH threads=10, detached +-- case +IMPORT INTO `t` FROM '/file.csv' +-- case +IMPORT INTO `t` (`a`,`b`) FROM '/file.csv' +-- case +IMPORT INTO `t` (`a`,@`1`) FROM '/file.csv' +-- case +IMPORT INTO `t` (`a`,@`1`) SET `b`=@`1`+100 FROM '/file.csv' +-- case +IMPORT INTO `t` FROM '/file.csv' FORMAT 'sql file' +-- case +IMPORT INTO `t` FROM '/file.csv' WITH detached +-- case +IMPORT INTO `t` FROM '/file.csv' WITH thread=1 +-- case +IMPORT INTO `t` FROM '/file.csv' WITH detached, thread=1 +-- case +SELECT * FROM `t` FOR UPDATE +-- case +SELECT * FROM `t` FOR SHARE +-- case +SELECT * FROM `t` FOR UPDATE NOWAIT +-- case +SELECT * FROM `t` FOR UPDATE WAIT 5 +-- case +SELECT * FROM `t` LIMIT 1 FOR UPDATE WAIT 11 +-- case +SELECT * FROM `t` FOR SHARE NOWAIT +-- case +SELECT * FROM `t` FOR UPDATE SKIP LOCKED +-- case +SELECT * FROM `t` FOR SHARE SKIP LOCKED +-- case +SELECT * FROM `t` FOR SHARE +-- case +-- error: line 1 column 41 near "nowait" +-- case +-- error: line 1 column 39 near "skip locked" +-- case +SELECT * FROM `t` FOR UPDATE OF `t` +-- case +SELECT * FROM `t` FOR SHARE OF `t` +-- case +SELECT * FROM `t` FOR UPDATE OF `t` NOWAIT +-- case +SELECT * FROM `t` FOR UPDATE OF `t` WAIT 5 +-- case +SELECT * FROM `t` LIMIT 1 FOR UPDATE OF `t` WAIT 11 +-- case +SELECT * FROM `t` FOR SHARE OF `t` NOWAIT +-- case +SELECT * FROM `t` FOR UPDATE OF `t` SKIP LOCKED +-- case +SELECT * FROM `t` FOR SHARE OF `t` SKIP LOCKED +-- case +SELECT `a`,`b` FROM `t` INTO OUTFILE '/tmp/result.txt' +-- case +SELECT `a` FROM `t` ORDER BY `a` INTO OUTFILE '/tmp/abc' +-- case +SELECT 1 INTO OUTFILE '/tmp/1.csv' +-- case +SELECT 1 FOR UPDATE INTO OUTFILE '/tmp/1.csv' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '"' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' LINES TERMINATED BY ' +' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY ' ' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'xy' TERMINATED BY ' ' +-- case +SELECT `a`,`b`,`a`+`b` FROM `t` INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES STARTING BY 'xy' TERMINATED BY ' ' +-- case +SELECT * FROM ((`t1`) JOIN `t2`) JOIN `t3` +-- case +SELECT * FROM (`t1` JOIN `t2`) LEFT JOIN `t3` ON `t2`.`id`=`t3`.`id` +-- case +SELECT * FROM (`t1` RIGHT JOIN `t2` ON `t1`.`id`=`t2`.`id`) LEFT JOIN `t3` ON `t3`.`id`=`t2`.`id` +-- case +-- error: line 1 column 60 near "" +-- case +SELECT * FROM (`t1` JOIN `t2`) LEFT JOIN `t3` USING (`id`) +-- case +SELECT * FROM (`t1` RIGHT JOIN `t2` USING (`id`)) LEFT JOIN `t3` USING (`id`) +-- case +-- error: line 1 column 54 near "" +-- case +SELECT * FROM `t1` NATURAL JOIN `t2` +-- case +SELECT * FROM `t1` NATURAL RIGHT JOIN `t2` +-- case +SELECT * FROM `t1` NATURAL LEFT JOIN `t2` +-- case +-- error: line 1 column 30 near "inner join t2" +-- case +-- error: line 1 column 30 near "cross join t2" +-- case +SELECT * FROM `t3` JOIN (`t1` JOIN `t2` ON `t1`.`a`=`t2`.`a`) ON `t3`.`b`=`t2`.`b` +-- case +SELECT * FROM `t1` STRAIGHT_JOIN `t2` ON `t1`.`id`=`t2`.`id` +-- case +SELECT STRAIGHT_JOIN * FROM `t1` JOIN `t2` ON `t1`.`id`=`t2`.`id` +-- case +SELECT STRAIGHT_JOIN * FROM `t1` LEFT JOIN `t2` ON `t1`.`id`=`t2`.`id` +-- case +SELECT STRAIGHT_JOIN * FROM `t1` RIGHT JOIN `t2` ON `t1`.`id`=`t2`.`id` +-- case +SELECT STRAIGHT_JOIN * FROM `t1` STRAIGHT_JOIN `t2` ON `t1`.`id`=`t2`.`id` +-- case +DELETE FROM `t1` +-- case +-- error: line 1 column 16 near "" +-- case +DELETE LOW_PRIORITY FROM `t1` +-- case +DELETE QUICK FROM `t1` +-- case +DELETE IGNORE FROM `t1` +-- case +DELETE LOW_PRIORITY QUICK IGNORE FROM `t1` +-- case +DELETE FROM `t1` WHERE `t1`.`a`>0 ORDER BY `t1`.`a` +-- case +DELETE FROM `t1` WHERE `a`=26 +-- case +DELETE FROM `t1` WHERE `a`=1 LIMIT 1 +-- case +DELETE FROM `t1` WHERE `t1`.`a`>0 ORDER BY `t1`.`a` LIMIT 1 +-- case +DELETE FROM `x`.`y` AS `z` WHERE `z`.`a`>0 +-- case +DELETE FROM `t1` AS `w` WHERE `a`>0 +-- case +DELETE FROM `t1` PARTITION(`p0`, `p1`) +-- case +DELETE LOW_PRIORITY `t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE QUICK `t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE IGNORE `t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE IGNORE `t1`,`t2` FROM (`t1` PARTITION(`p0`, `p1`)) JOIN `t2` +-- case +DELETE LOW_PRIORITY QUICK IGNORE `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`a`>5 +-- case +DELETE `t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`a`=1 AND `t2`.`b`!=1 +-- case +DELETE `t1` FROM (`t1`) JOIN `t2` +-- case +DELETE `t2` FROM (`t1`) JOIN `t2` +-- case +DELETE `t1` FROM `t1` +-- case +DELETE `t1`,`t2`,`t3` FROM ((`t1`) JOIN `t2`) JOIN `t3` +-- case +DELETE `t1`,`t2`,`t3` FROM ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t3`.`c`<5 AND `t1`.`a`=3 +-- case +DELETE `t1` FROM (`t1`) JOIN `t1` AS `t2` WHERE `t1`.`b`=`t2`.`b` AND `t1`.`a`>`t2`.`a` +-- case +DELETE `t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE `t`.`t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE `t1`,`t2` FROM (`t1`) JOIN `t2` +-- case +DELETE `t11`,`t12` FROM (`t11`) JOIN `t12` WHERE `t11`.`a`=`t12`.`a` AND `t11`.`b`!=1 +-- case +DELETE QUICK FROM `t1`,`t2` USING (`t1`) JOIN `t2` +-- case +DELETE LOW_PRIORITY IGNORE FROM `t1`,`t2` USING (`t1`) JOIN `t2` +-- case +DELETE LOW_PRIORITY QUICK IGNORE FROM `t1`,`t2` USING (`t1`) JOIN `t2` +-- case +DELETE FROM `t1` USING `t1` WHERE `post`=_UTF8MB4'1' +-- case +DELETE FROM `t1`,`t2` USING (`t1`) JOIN `t2` +-- case +DELETE FROM `t1`,`t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t3`.`a`=1 +-- case +DELETE FROM `t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t1`.`a`=1 +-- case +DELETE FROM `t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t1`.`a`=1 +-- case +DELETE FROM `t1`,`t2`,`t3` USING ((`t1`) JOIN `t2`) JOIN `t3` WHERE `t1`.`a`=1 +-- case +DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id` +-- case +DELETE FROM `t1`,`t2` USING (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id` +-- case +DELETE /*+ TIDB_INLJ(`t1`, `t2`)*/ `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id` +-- case +DELETE /*+ TIDB_HJ(`t1`, `t2`)*/ `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id` +-- case +DELETE /*+ TIDB_SMJ(`t1`, `t2`)*/ `t1`,`t2` FROM (`t1`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id` +-- case +DELETE FROM `t1` USE INDEX (`idx_a`) WHERE `t1`.`id`=1 +-- case +DELETE `t1`,`t2` FROM `t1` USE INDEX (`idx_a`) JOIN `t2` WHERE `t1`.`id`=`t2`.`id` +-- case +DELETE `t1`,`t2` FROM `t1` USE INDEX (`idx_a`) JOIN `t2` USE INDEX (`idx_a`) WHERE `t1`.`id`=`t2`.`id` +-- case +-- error: line 1 column 89 near "limit 10;" +-- case +-- error: line 1 column 89 near "order by t1.id;" +-- case +INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`) +-- case +INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`) +-- case +INSERT IGNORE INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`) +-- case +INSERT IGNORE INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`) +-- case +INSERT INTO `odk` (`id`,`v`) VALUES (1,10) AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v` +-- case +INSERT INTO `odk` (`id`,`v`) VALUES (1,10) AS `new`(`nid`,`nv`) ON DUPLICATE KEY UPDATE `v`=`nv` +-- case +INSERT INTO `odk` VALUES (1,10) AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v` +-- case +INSERT IGNORE INTO `odk` (`id`,`v`) VALUES (1,10) AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v` +-- case +INSERT INTO `odk` SET `id`=1,`v`=10 AS `new` ON DUPLICATE KEY UPDATE `v`=`new`.`v` +-- case +-- error: line 1 column 57 near "AS new ON DUPLICATE KEY UPDATE v = new.v;" +-- case +INSERT INTO `t` SET `a`=1,`b`=2 +-- case +-- error: line 1 column 21 near "SET a=1" +-- case +UPDATE LOW_PRIORITY IGNORE `t` SET `id`=`id`+1 ORDER BY `id` DESC +-- case +UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC +-- case +UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC LIMIT 3 +-- case +UPDATE `t` SET `id`=`id`+1, `name`=_UTF8MB4'jojo' +-- case +UPDATE (`items`) JOIN `month` SET `items`.`price`=`month`.`price` WHERE `items`.`id`=`month`.`id` +-- case +UPDATE `user` AS `T0` LEFT JOIN `user_profile` AS `T1` ON `T1`.`id`=`T0`.`profile_id` SET `T0`.`profile_id`=1 WHERE `T0`.`profile_id` IN (1) +-- case +UPDATE (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba` +-- case +UPDATE /*+ TIDB_INLJ(`t1`, `t2`)*/ (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba` +-- case +UPDATE /*+ TIDB_SMJ(`t1`, `t2`)*/ (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba` +-- case +UPDATE /*+ TIDB_HJ(`t1`, `t2`)*/ (`t1`) JOIN `t2` SET `t1`.`profile_id`=1, `t2`.`profile_id`=1 WHERE `ta`.`a`=`t`.`ba` +-- case +-- error: line 1 column 76 near "LIMIT 10;" +-- case +-- error: line 1 column 76 near "order by month.id;" +-- case +UPDATE `t1` USE INDEX (`idx_a`) SET `t1`.`price`=3.25 WHERE `t1`.`id`=1 +-- case +UPDATE `t1` USE INDEX (`idx_a`) JOIN `t2` SET `t1`.`price`=`t2`.`price` WHERE `t1`.`id`=`t2`.`id` +-- case +UPDATE `t1` USE INDEX (`idx_a`) JOIN `t2` USE INDEX (`idx_a`) SET `t1`.`price`=`t2`.`price` WHERE `t1`.`id`=`t2`.`id` +-- case +SELECT * FROM `t` WHERE 1=1 +-- case +SELECT * FROM `t` LIMIT 5 +-- case +SELECT * FROM `t` LIMIT 5 +-- case +SELECT * FROM `t` LIMIT 5 +-- case +SELECT * FROM `t` LIMIT 5 +-- case +SELECT * FROM `t` LIMIT 1 +-- case +SELECT * FROM `t` LIMIT 1 +-- case +SELECT 1 +-- case +SELECT 1 LIMIT 1 +-- case +SELECT 1 FROM DUAL WHERE EXISTS (SELECT 2) +-- case +SELECT 1 FROM DUAL WHERE NOT EXISTS (SELECT 2) +-- case +SELECT 1 AS `a` ORDER BY `a` +-- case +SELECT 1 AS `a` FROM DUAL WHERE 10 +-- case +-- error: line 1 column 29 near "where id > 0" +-- case +SHOW DISTRIBUTION JOB 1 +-- case +-- error: line 1 column 23 near "" +-- case +CANCEL DISTRIBUTION JOB 1 +-- case +SHOW TABLE `t1`.`t1` NEXT_ROW_ID +-- case +SHOW TABLE `t1` NEXT_ROW_ID +-- case +-- error: line 1 column 22 near "" +-- case +BEGIN PESSIMISTIC +-- case +BEGIN OPTIMISTIC +-- case +ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` INT) +-- case +ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` CHAR(1)) +-- case +ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` CHAR(1),`b` INT) +-- case +ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2)) +-- case +ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` TINYINT UNSIGNED) +-- case +ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`name` CHAR(50) CHARACTER SET UTF8) +-- case +ALTER INSTANCE RELOAD TLS +-- case +ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR +-- case +ALTER RANGE `global` PLACEMENT POLICY = `mypolicy` +-- case +ALTER RANGE `global` PLACEMENT POLICY = `default` +-- case +ALTER RANGE `meta` PLACEMENT POLICY = `mypolicy` +-- case +CREATE SEQUENCE `seq` INCREMENT BY -9223372036854775807 +-- case +CREATE SEQUENCE `seq` INCREMENT BY -9223372036854775808 +-- case +CREATE SEQUENCE `seq` INCREMENT BY -9223372036854775808 +-- case +-- error: line 1 column 50 near ""the Signed Value should be at the range of [-9223372036854775808, 9223372036854775807]. +-- case +SELECT `t`.`1a`.`1` FROM `t` +-- case +SELECT * FROM `1db`.`1table` +-- case +SELECT * FROM `t` WHERE `t`.`status`=1 +-- case +SHOW PLACEMENT +-- case +SHOW PLACEMENT LIKE _UTF8MB4'POLICY foo%' +-- case +SHOW PLACEMENT WHERE `Target`=_UTF8MB4'TABLE test.t1' +-- case +SHOW PLACEMENT FOR DATABASE `db1` +-- case +SHOW PLACEMENT FOR DATABASE `db1` +-- case +SHOW PLACEMENT FOR TABLE `tb1` +-- case +SHOW PLACEMENT FOR TABLE `db1`.`tb1` +-- case +SHOW PLACEMENT FOR TABLE `tb1` PARTITION `p1` +-- case +SHOW PLACEMENT FOR TABLE `db1`.`tb1` PARTITION `p1` +-- case +-- error: line 1 column 18 near "" +-- case +-- error: line 1 column 23 near "DATABASE db1" +-- case +-- error: line 1 column 21 near "DB db1" +-- case +-- error: line 1 column 37 near "TABLE tb1" +-- case +-- error: line 1 column 28 near "PARTITION p1" +-- case +-- error: line 1 column 21 near "DB LIKE '%'" +-- case +-- error: line 1 column 21 near "DB db1 LIKE '%'" +-- case +SHOW PLACEMENT LABELS +-- case +SHOW PLACEMENT LABELS LIKE _UTF8MB4'%zone%' +-- case +SHOW PLACEMENT LABELS WHERE `label`=_UTF8MB4'l123' +-- case +SHOW SESSION_STATES +-- case +SET SESSION_STATES 'x' +-- case +-- error: line 1 column 18 near "" +-- case +-- error: line 1 column 20 near "1" +-- case +-- error: line 1 column 22 near "now()" +-- case +CALIBRATE RESOURCE +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2021-04-15 00:00:00' +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00' +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' DURATION '20m' +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00' DURATION '20m' +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00' +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' DURATION '20m' +-- case +CALIBRATE RESOURCE DURATION '20m' START_TIME _UTF8MB4'2023-04-01 13:00:00' +-- case +CALIBRATE RESOURCE START_TIME _UTF8MB4'2023-04-01 13:00:00' END_TIME _UTF8MB4'2023-04-01 16:00:00' DURATION '20m' +-- case +CALIBRATE RESOURCE START_TIME CURRENT_TIMESTAMP() END_TIME CURRENT_TIMESTAMP() +-- case +CALIBRATE RESOURCE END_TIME NOW() +-- case +CALIBRATE RESOURCE START_TIME NOW() +-- case +CALIBRATE RESOURCE START_TIME NOW() END_TIME NOW() +-- case +CALIBRATE RESOURCE START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE) END_TIME NOW() +-- case +CALIBRATE RESOURCE START_TIME NOW()-1000 END_TIME CURRENT_TIMESTAMP() +-- case +CALIBRATE RESOURCE START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE) DURATION INTERVAL 15 MINUTE +-- case +CALIBRATE RESOURCE START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE) DURATION '15m' +-- case +CALIBRATE RESOURCE END_TIME NOW() START_TIME DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE) +-- case +-- error: line 1 column 27 near "" +-- case +CALIBRATE RESOURCE WORKLOAD TPCC +-- case +CALIBRATE RESOURCE WORKLOAD OLTP_READ_WRITE +-- case +CALIBRATE RESOURCE WORKLOAD OLTP_READ_ONLY +-- case +CALIBRATE RESOURCE WORKLOAD OLTP_WRITE_ONLY +-- case +-- error: line 1 column 29 near "= oltp_read_write START_TIME '2023-04-01 13:00:00'" +-- case +QUERY WATCH ADD SQL DIGEST `b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377` +-- case +QUERY WATCH ADD SQL DIGEST `b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377` +-- case +QUERY WATCH ADD SQL DIGEST _UTF8MB4'b13858789fce00208f9a262c99621b7045f4869807cd4e6568008ae7ca19a377' +-- case +QUERY WATCH ADD PLAN DIGEST `5e3ddd388f6012e328233dbcdda5d48f404e0536c6c54d9618233210f3d5762a` +-- case +QUERY WATCH ADD PLAN DIGEST @`digest1` +-- case +QUERY WATCH ADD SQL TEXT SIMILAR TO _UTF8MB4'select 1' +-- case +QUERY WATCH ADD SQL TEXT EXACT TO _UTF8MB4'select 1' +-- case +QUERY WATCH ADD SQL TEXT PLAN TO _UTF8MB4'select 1' +-- case +QUERY WATCH ADD RESOURCE GROUP `default` SQL TEXT SIMILAR TO _UTF8MB4'select 1' +-- case +QUERY WATCH ADD RESOURCE GROUP @`rg` SQL TEXT SIMILAR TO @`sql1` +-- case +QUERY WATCH ADD RESOURCE GROUP `rg1` SQL TEXT SIMILAR TO _UTF8MB4'select 1' +-- case +QUERY WATCH ADD SQL TEXT SIMILAR TO _UTF8MB4'select 1' RESOURCE GROUP `rg1` +-- case +QUERY WATCH ADD ACTION = KILL SQL TEXT SIMILAR TO _UTF8MB4'select 1' +-- case +QUERY WATCH ADD ACTION = COOLDOWN RESOURCE GROUP `rg1` SQL TEXT SIMILAR TO _UTF8MB4'select 1' +-- case +-- error: line 1 column 65 near "SQL TEXT SIMILAR to 'select 1'"Dupliated options specified +-- case +-- error: line 1 column 27 near "SIMILAR to 'select 1'" +-- case +-- error: line 1 column 43 near "'select 1'" +-- case +QUERY WATCH REMOVE 1 +-- case +QUERY WATCH REMOVE RESOURCE GROUP `rg1` +-- case +QUERY WATCH REMOVE RESOURCE GROUP @`rg` +-- case +-- error: line 1 column 18 near "" +-- case +REPLACE /*+ SET_VAR(sql_mode = 'ALLOW_INVALID_DATES')*/ INTO `t` VALUES (_UTF8MB4'2004-04-31') diff --git a/parser/testdata/parser/escape/input.sql b/parser/testdata/parser/escape/input.sql new file mode 100644 index 0000000..e8e23f0 --- /dev/null +++ b/parser/testdata/parser/escape/input.sql @@ -0,0 +1,13 @@ +select """; +-- case +select """"; +-- case +select "汉字"; +-- case +select 'abc"def'; +-- case +select 'a\r\n'; +-- case +select "\a\r\n" +-- case +select "\xFF" diff --git a/parser/testdata/parser/escape/output.sql b/parser/testdata/parser/escape/output.sql new file mode 100644 index 0000000..cee18b8 --- /dev/null +++ b/parser/testdata/parser/escape/output.sql @@ -0,0 +1,15 @@ +-- error: line 1 column 11 near """";" +-- case +SELECT _UTF8MB4'"' +-- case +SELECT _UTF8MB4'汉字' +-- case +SELECT _UTF8MB4'abc"def' +-- case +SELECT _UTF8MB4'a +' +-- case +SELECT _UTF8MB4'a +' +-- case +SELECT _UTF8MB4'xFF' diff --git a/parser/testdata/parser/execute/input.sql b/parser/testdata/parser/execute/input.sql new file mode 100644 index 0000000..7aa98c7 --- /dev/null +++ b/parser/testdata/parser/execute/input.sql @@ -0,0 +1,5 @@ +EXECUTE test +-- case +EXECUTE test USING @var1,@var2 +-- case +EXECUTE `` USING @var1,@var2 diff --git a/parser/testdata/parser/execute/output.sql b/parser/testdata/parser/execute/output.sql new file mode 100644 index 0000000..d35dc61 --- /dev/null +++ b/parser/testdata/parser/execute/output.sql @@ -0,0 +1,5 @@ +EXECUTE `test` +-- case +EXECUTE `test` USING @`var1`,@`var2` +-- case +EXECUTE `` USING @`var1`,@`var2` diff --git a/parser/testdata/parser/explain/input.sql b/parser/testdata/parser/explain/input.sql new file mode 100644 index 0000000..bfa3368 --- /dev/null +++ b/parser/testdata/parser/explain/input.sql @@ -0,0 +1,107 @@ +explain select c1 from t1 +-- case +explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; +-- case +explain insert into t values (1), (2), (3) +-- case +explain replace into foo values (1 || 2) +-- case +explain update t set id = id + 1 order by id desc; +-- case +explain select c1 from t1 union (select c2 from t2) limit 1, 1 +-- case +explain format = "row" select c1 from t1 union (select c2 from t2) limit 1, 1 +-- case +explain format = 'brief' select * from t +-- case +DESC SCHE.TABL +-- case +DESC SCHE.TABL COLUM +-- case +DESCRIBE SCHE.TABL COLUM +-- case +EXPLAIN ANALYZE SELECT 1 +-- case +EXPLAIN ANALYZE format=VERBOSE SELECT 1 +-- case +EXPLAIN ANALYZE format=TRUE_CARD_COST SELECT 1 +-- case +EXPLAIN ANALYZE format='VERBOSE' SELECT 1 +-- case +EXPLAIN ANALYZE format='TRUE_CARD_COST' SELECT 1 +-- case +EXPLAIN FORMAT = 'dot' SELECT 1 +-- case +EXPLAIN FORMAT = DOT SELECT 1 +-- case +EXPLAIN FORMAT = 'row' SELECT 1 +-- case +EXPLAIN FORMAT = 'ROW' SELECT 1 +-- case +EXPLAIN FORMAT = 'BRIEF' SELECT 1 +-- case +EXPLAIN FORMAT = BRIEF SELECT 1 +-- case +EXPLAIN FORMAT = 'verbose' SELECT 1 +-- case +EXPLAIN FORMAT = 'VERBOSE' SELECT 1 +-- case +EXPLAIN FORMAT = VERBOSE SELECT 1 +-- case +EXPLAIN SELECT 1 +-- case +EXPLAIN FOR CONNECTION 1 +-- case +EXPLAIN FOR connection 42 +-- case +EXPLAIN FORMAT = 'dot' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = DOT FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'row' FOR connection 1 +-- case +EXPLAIN FORMAT = ROW FOR connection 1 +-- case +EXPLAIN FORMAT = TRADITIONAL FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = TRADITIONAL SELECT 1 +-- case +EXPLAIN FORMAT = BRIEF SELECT 1 +-- case +EXPLAIN FORMAT = 'brief' SELECT 1 +-- case +EXPLAIN FORMAT = DOT SELECT 1 +-- case +EXPLAIN FORMAT = 'dot' SELECT 1 +-- case +EXPLAIN FORMAT = VERBOSE SELECT 1 +-- case +EXPLAIN FORMAT = 'verbose' SELECT 1 +-- case +EXPLAIN FORMAT = JSON FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = JSON SELECT 1 +-- case +EXPLAIN FORMAT = 'hint' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'verbose' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1 +-- case +EXPLAIN ALTER TABLE t1 ADD INDEX (a) +-- case +EXPLAIN ALTER TABLE t1 ADD a varchar(255) +-- case +EXPLAIN FORMAT = TIDB_JSON FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = tidb_json SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = tidb_json SELECT 1 +-- case +EXPLAIN 'sqldigest' +-- case +EXPLAIN ANALYZE 'sqldigest' +-- case +EXPLAIN format='json' 'sqldigest' +-- case +EXPLAIN ANALYZE format='json' 'sqldigest' diff --git a/parser/testdata/parser/explain/output.sql b/parser/testdata/parser/explain/output.sql new file mode 100644 index 0000000..c15a486 --- /dev/null +++ b/parser/testdata/parser/explain/output.sql @@ -0,0 +1,107 @@ +EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1` +-- case +EXPLAIN FORMAT = 'row' DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id` +-- case +EXPLAIN FORMAT = 'row' INSERT INTO `t` VALUES (1),(2),(3) +-- case +EXPLAIN FORMAT = 'row' REPLACE INTO `foo` VALUES (1 OR 2) +-- case +EXPLAIN FORMAT = 'row' UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC +-- case +EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +EXPLAIN FORMAT = 'brief' SELECT * FROM `t` +-- case +DESC `SCHE`.`TABL` +-- case +DESC `SCHE`.`TABL` `COLUM` +-- case +DESC `SCHE`.`TABL` `COLUM` +-- case +EXPLAIN ANALYZE SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'VERBOSE' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'TRUE_CARD_COST' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'VERBOSE' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'TRUE_CARD_COST' SELECT 1 +-- case +EXPLAIN FORMAT = 'dot' SELECT 1 +-- case +EXPLAIN FORMAT = 'DOT' SELECT 1 +-- case +EXPLAIN FORMAT = 'row' SELECT 1 +-- case +EXPLAIN FORMAT = 'ROW' SELECT 1 +-- case +EXPLAIN FORMAT = 'BRIEF' SELECT 1 +-- case +EXPLAIN FORMAT = 'BRIEF' SELECT 1 +-- case +EXPLAIN FORMAT = 'verbose' SELECT 1 +-- case +EXPLAIN FORMAT = 'VERBOSE' SELECT 1 +-- case +EXPLAIN FORMAT = 'VERBOSE' SELECT 1 +-- case +EXPLAIN FORMAT = 'row' SELECT 1 +-- case +EXPLAIN FORMAT = 'row' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'row' FOR CONNECTION 42 +-- case +EXPLAIN FORMAT = 'dot' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'DOT' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'row' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'ROW' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'TRADITIONAL' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'TRADITIONAL' SELECT 1 +-- case +EXPLAIN FORMAT = 'BRIEF' SELECT 1 +-- case +EXPLAIN FORMAT = 'brief' SELECT 1 +-- case +EXPLAIN FORMAT = 'DOT' SELECT 1 +-- case +EXPLAIN FORMAT = 'dot' SELECT 1 +-- case +EXPLAIN FORMAT = 'VERBOSE' SELECT 1 +-- case +EXPLAIN FORMAT = 'verbose' SELECT 1 +-- case +EXPLAIN FORMAT = 'JSON' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'JSON' SELECT 1 +-- case +EXPLAIN FORMAT = 'hint' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'verbose' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1 +-- case +EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD INDEX(`a`) +-- case +EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD COLUMN `a` VARCHAR(255) +-- case +EXPLAIN FORMAT = 'TIDB_JSON' FOR CONNECTION 1 +-- case +EXPLAIN FORMAT = 'tidb_json' SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = 'tidb_json' SELECT 1 +-- case +EXPLAIN FORMAT = 'row' 'sqldigest' +-- case +EXPLAIN ANALYZE 'sqldigest' +-- case +EXPLAIN FORMAT = 'json' 'sqldigest' +-- case +EXPLAIN ANALYZE FORMAT = 'json' 'sqldigest' diff --git a/parser/testdata/parser/explain_explore/input.sql b/parser/testdata/parser/explain_explore/input.sql new file mode 100644 index 0000000..a312c11 --- /dev/null +++ b/parser/testdata/parser/explain_explore/input.sql @@ -0,0 +1,7 @@ +explain explore 'digestxxx' +-- case +explain explore select 1 from t +-- case +explain explore select 1 from t1, t2 +-- case +explain explore select 1 from t where t1.a > (select max(a) from t2) diff --git a/parser/testdata/parser/explain_explore/output.sql b/parser/testdata/parser/explain_explore/output.sql new file mode 100644 index 0000000..5460557 --- /dev/null +++ b/parser/testdata/parser/explain_explore/output.sql @@ -0,0 +1,7 @@ +EXPLAIN EXPLORE 'digestxxx' +-- case +EXPLAIN EXPLORE SELECT 1 FROM `t` +-- case +EXPLAIN EXPLORE SELECT 1 FROM (`t1`) JOIN `t2` +-- case +EXPLAIN EXPLORE SELECT 1 FROM `t` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`) diff --git a/parser/testdata/parser/expression/input.sql b/parser/testdata/parser/expression/input.sql new file mode 100644 index 0000000..08e8214 --- /dev/null +++ b/parser/testdata/parser/expression/input.sql @@ -0,0 +1,73 @@ +SELECT ++1 +-- case +SELECT -*1 +-- case +SELECT -+1 +-- case +SELECT -1 +-- case +SELECT --1 +-- case +select '''a''', """a""" +-- case +select ''a'' +-- case +select ""a"" +-- case +select '''a'''; +-- case +select '\'a\''; +-- case +select "\"a\""; +-- case +select """a"""; +-- case +select _utf8"string"; +-- case +select _binary"string"; +-- case +select N'string' +-- case +select n'string' +-- case +select _utf8 0xD0B1; +-- case +select _utf8 X'D0B1'; +-- case +select _utf8 0b1101000010110001; +-- case +select _utf8 B'1101000010110001'; +-- case +select 1 <=> 0, 1 <=> null, 1 = null +-- case +select date'1989-09-10' +-- case +select date 19890910 +-- case +select time '00:00:00.111' +-- case +select time 19890910 +-- case +select timestamp '1989-09-10 11:11:11' +-- case +select timestamp 19890910 +-- case +select {ts '1989-09-10 11:11:11'} +-- case +select {d '1989-09-10'} +-- case +select {t '00:00:00.111'} +-- case +select * from t where a > {ts '1989-09-10 11:11:11'} +-- case +select * from t where a > {ts {abc '1989-09-10 11:11:11'}} +-- case +select {ts123 '1989-09-10 11:11:11'} +-- case +select {ts123 123} +-- case +select {ts123 1 xor 1} +-- case +select * from t where a > {ts123 '1989-09-10 11:11:11'} +-- case +select .t.a from t diff --git a/parser/testdata/parser/expression/output.sql b/parser/testdata/parser/expression/output.sql new file mode 100644 index 0000000..c69397e --- /dev/null +++ b/parser/testdata/parser/expression/output.sql @@ -0,0 +1,73 @@ +SELECT ++1 +-- case +-- error: line 1 column 9 near "*1" +-- case +SELECT -+1 +-- case +SELECT -1 +-- case +SELECT --1 +-- case +SELECT _UTF8MB4'''a''',_UTF8MB4'"a"' +-- case +-- error: line 1 column 12 near "''" +-- case +-- error: line 1 column 12 near """" +-- case +SELECT _UTF8MB4'''a''' +-- case +SELECT _UTF8MB4'''a''' +-- case +SELECT _UTF8MB4'"a"' +-- case +SELECT _UTF8MB4'"a"' +-- case +SELECT _UTF8'string' +-- case +SELECT _BINARY'string' +-- case +SELECT _UTF8'string' +-- case +SELECT _UTF8'string' +-- case +SELECT _UTF8 x'd0b1' +-- case +SELECT _UTF8 x'd0b1' +-- case +SELECT _UTF8 b'1101000010110001' +-- case +SELECT _UTF8 b'1101000010110001' +-- case +SELECT 1<=>0,1<=>NULL,1=NULL +-- case +SELECT DATE '1989-09-10' +-- case +-- error: line 1 column 20 near "19890910" +-- case +SELECT TIME '00:00:00.111' +-- case +-- error: line 1 column 20 near "19890910" +-- case +SELECT TIMESTAMP '1989-09-10 11:11:11' +-- case +-- error: line 1 column 25 near "19890910" +-- case +SELECT TIMESTAMP '1989-09-10 11:11:11' +-- case +SELECT DATE '1989-09-10' +-- case +SELECT TIME '00:00:00.111' +-- case +SELECT * FROM `t` WHERE `a`>TIMESTAMP '1989-09-10 11:11:11' +-- case +SELECT * FROM `t` WHERE `a`>TIMESTAMP '1989-09-10 11:11:11' +-- case +SELECT _UTF8MB4'1989-09-10 11:11:11' +-- case +SELECT 123 +-- case +SELECT 1 XOR 1 +-- case +SELECT * FROM `t` WHERE `a`>_UTF8MB4'1989-09-10 11:11:11' +-- case +-- error: line 1 column 8 near ".t.a from t" diff --git a/parser/testdata/parser/help/input.sql b/parser/testdata/parser/help/input.sql new file mode 100644 index 0000000..e02c6a2 --- /dev/null +++ b/parser/testdata/parser/help/input.sql @@ -0,0 +1 @@ +HELP 'select' diff --git a/parser/testdata/parser/help/output.sql b/parser/testdata/parser/help/output.sql new file mode 100644 index 0000000..e02c6a2 --- /dev/null +++ b/parser/testdata/parser/help/output.sql @@ -0,0 +1 @@ +HELP 'select' diff --git a/parser/testdata/parser/index_hint/input.sql b/parser/testdata/parser/index_hint/input.sql new file mode 100644 index 0000000..9be097a --- /dev/null +++ b/parser/testdata/parser/index_hint/input.sql @@ -0,0 +1,19 @@ +select * from t use index (primary) +-- case +select * from t use index (`primary`) +-- case +select * from t use index (); +-- case +select * from t use index (idx); +-- case +select * from t use index (idx1, idx2); +-- case +select * from t ignore key (idx1) +-- case +select * from t force index for join (idx1) +-- case +select * from t use index for order by (idx1) +-- case +select * from t force index for group by (idx1) +-- case +select * from t use index for group by (idx1) use index for order by (idx2), t2 diff --git a/parser/testdata/parser/index_hint/output.sql b/parser/testdata/parser/index_hint/output.sql new file mode 100644 index 0000000..5ca300b --- /dev/null +++ b/parser/testdata/parser/index_hint/output.sql @@ -0,0 +1,19 @@ +SELECT * FROM `t` USE INDEX (`primary`) +-- case +SELECT * FROM `t` USE INDEX (`primary`) +-- case +SELECT * FROM `t` USE INDEX () +-- case +SELECT * FROM `t` USE INDEX (`idx`) +-- case +SELECT * FROM `t` USE INDEX (`idx1`, `idx2`) +-- case +SELECT * FROM `t` IGNORE INDEX (`idx1`) +-- case +SELECT * FROM `t` FORCE INDEX FOR JOIN (`idx1`) +-- case +SELECT * FROM `t` USE INDEX FOR ORDER BY (`idx1`) +-- case +SELECT * FROM `t` FORCE INDEX FOR GROUP BY (`idx1`) +-- case +SELECT * FROM (`t` USE INDEX FOR GROUP BY (`idx1`) USE INDEX FOR ORDER BY (`idx2`)) JOIN `t2` diff --git a/parser/testdata/parser/interval_partition/input.sql b/parser/testdata/parser/interval_partition/input.sql new file mode 100644 index 0000000..fb08c5f --- /dev/null +++ b/parser/testdata/parser/interval_partition/input.sql @@ -0,0 +1,25 @@ +CREATE TABLE t (c1 integer,c2 integer) PARTITION BY RANGE (c1) INTERVAL (1000) +-- case +CREATE TABLE t (c1 int, c2 date) PARTITION BY RANGE (c2) INTERVAL (1 Month) +-- case +CREATE TABLE t (c1 int, c2 date) PARTITION BY RANGE (c1) (partition p1 values less than (22)) +-- case +CREATE TABLE t (c1 int, c2 date) PARTITION BY RANGE COLUMNS (c2) INTERVAL (1 year) first partition less than ("2022-02-01") +-- case +CREATE TABLE t (c1 int, c2 datetime) PARTITION BY RANGE COLUMNS (c2) INTERVAL (1 day) first partition less than ("2022-01-02") last partition less than ("2022-06-01") NULL PARTITION MAXVALUE PARTITION +-- case +ALTER TABLE t LAST PARTITION LESS THAN (1000) +-- case +ALTER TABLE t REORGANIZE MAX PARTITION INTO NEW LAST PARTITION LESS THAN (1000) +-- case +ALTER TABLE t REORGANIZE MAX PARTITION INTO LAST PARTITION LESS THAN (1000) +-- case +ALTER TABLE t REORGANIZE MAXVALUE PARTITION INTO NEW LAST PARTITION LESS THAN (1000) +-- case +ALTER TABLE t REORGANIZE MAXVALUE PARTITION INTO LAST PARTITION LESS THAN (1000) +-- case +ALTER TABLE t split MAXVALUE PARTITION LESS THAN (1000) +-- case +ALTER TABLE t merge first PARTITION LESS THAN (1000) +-- case +ALTER TABLE t first PARTITION LESS THAN (1000) diff --git a/parser/testdata/parser/interval_partition/output.sql b/parser/testdata/parser/interval_partition/output.sql new file mode 100644 index 0000000..7348257 --- /dev/null +++ b/parser/testdata/parser/interval_partition/output.sql @@ -0,0 +1,25 @@ +CREATE TABLE `t` (`c1` INT,`c2` INT) PARTITION BY RANGE (`c1`) INTERVAL (1000) +-- case +CREATE TABLE `t` (`c1` INT,`c2` DATE) PARTITION BY RANGE (`c2`) INTERVAL (1 MONTH) +-- case +CREATE TABLE `t` (`c1` INT,`c2` DATE) PARTITION BY RANGE (`c1`) (PARTITION `p1` VALUES LESS THAN (22)) +-- case +-- error: line 1 column 123 near "" +-- case +CREATE TABLE `t` (`c1` INT,`c2` DATETIME) PARTITION BY RANGE COLUMNS (`c2`) INTERVAL (1 DAY) FIRST PARTITION LESS THAN (_UTF8MB4'2022-01-02') LAST PARTITION LESS THAN (_UTF8MB4'2022-06-01') NULL PARTITION MAXVALUE PARTITION +-- case +ALTER TABLE `t` LAST PARTITION LESS THAN (1000) +-- case +-- error: line 1 column 28 near "MAX PARTITION INTO NEW LAST PARTITION LESS THAN (1000)" +-- case +-- error: line 1 column 28 near "MAX PARTITION INTO LAST PARTITION LESS THAN (1000)" +-- case +-- error: line 1 column 33 near "MAXVALUE PARTITION INTO NEW LAST PARTITION LESS THAN (1000)" +-- case +-- error: line 1 column 33 near "MAXVALUE PARTITION INTO LAST PARTITION LESS THAN (1000)" +-- case +ALTER TABLE `t` SPLIT MAXVALUE PARTITION LESS THAN (1000) +-- case +ALTER TABLE `t` MERGE FIRST PARTITION LESS THAN (1000) +-- case +ALTER TABLE `t` FIRST PARTITION LESS THAN (1000) diff --git a/parser/testdata/parser/like_escape/input.sql b/parser/testdata/parser/like_escape/input.sql new file mode 100644 index 0000000..e5f1c01 --- /dev/null +++ b/parser/testdata/parser/like_escape/input.sql @@ -0,0 +1,9 @@ +select "abc_" like "abc\\_" escape '' +-- case +select "abc_" like "abc\\_" escape '\\' +-- case +select "abc_" like "abc\\_" escape '||' +-- case +select "abc" like "escape" escape '+' +-- case +select '''_' like '''_' escape '''' diff --git a/parser/testdata/parser/like_escape/output.sql b/parser/testdata/parser/like_escape/output.sql new file mode 100644 index 0000000..01868e0 --- /dev/null +++ b/parser/testdata/parser/like_escape/output.sql @@ -0,0 +1,9 @@ +SELECT _UTF8MB4'abc_' LIKE _UTF8MB4'abc\_' ESCAPE '' +-- case +SELECT _UTF8MB4'abc_' LIKE _UTF8MB4'abc\_' +-- case +-- error: [parser:1210]Incorrect arguments to ESCAPE +-- case +SELECT _UTF8MB4'abc' LIKE _UTF8MB4'escape' ESCAPE '+' +-- case +SELECT _UTF8MB4'''_' LIKE _UTF8MB4'''_' ESCAPE '''' diff --git a/parser/testdata/parser/lock_unlock_tables/input.sql b/parser/testdata/parser/lock_unlock_tables/input.sql new file mode 100644 index 0000000..c0db4fd --- /dev/null +++ b/parser/testdata/parser/lock_unlock_tables/input.sql @@ -0,0 +1,39 @@ +UNLOCK TABLES; +-- case +LOCK TABLES t1 READ; +-- case +LOCK TABLES t1 READ LOCAL; +-- case +show table status like 't' +-- case +LOCK TABLES t2 WRITE +-- case +LOCK TABLES t2 WRITE LOCAL; +-- case +LOCK TABLES t1 WRITE, t2 READ; +-- case +LOCK TABLES t1 WRITE LOCAL, t2 READ LOCAL; +-- case +UNLOCK TABLE; +-- case +LOCK TABLE t1 READ; +-- case +LOCK TABLE t1 READ LOCAL; +-- case +show table status like 't' +-- case +LOCK TABLE t2 WRITE +-- case +LOCK TABLE t2 WRITE LOCAL; +-- case +LOCK TABLE t1 WRITE, t2 READ; +-- case +ADMIN CLEANUP TABLE LOCK +-- case +ADMIN CLEANUP TABLE LOCK t +-- case +ADMIN CLEANUP TABLE LOCK t1,t2 +-- case +ALTER TABLE t READ ONLY +-- case +ALTER TABLE t READ WRITE diff --git a/parser/testdata/parser/lock_unlock_tables/output.sql b/parser/testdata/parser/lock_unlock_tables/output.sql new file mode 100644 index 0000000..e2626fa --- /dev/null +++ b/parser/testdata/parser/lock_unlock_tables/output.sql @@ -0,0 +1,39 @@ +UNLOCK TABLES +-- case +LOCK TABLES `t1` READ +-- case +LOCK TABLES `t1` READ LOCAL +-- case +SHOW TABLE STATUS LIKE _UTF8MB4't' +-- case +LOCK TABLES `t2` WRITE +-- case +LOCK TABLES `t2` WRITE LOCAL +-- case +LOCK TABLES `t1` WRITE, `t2` READ +-- case +LOCK TABLES `t1` WRITE LOCAL, `t2` READ LOCAL +-- case +UNLOCK TABLES +-- case +LOCK TABLES `t1` READ +-- case +LOCK TABLES `t1` READ LOCAL +-- case +SHOW TABLE STATUS LIKE _UTF8MB4't' +-- case +LOCK TABLES `t2` WRITE +-- case +LOCK TABLES `t2` WRITE LOCAL +-- case +LOCK TABLES `t1` WRITE, `t2` READ +-- case +-- error: line 1 column 24 near "" +-- case +ADMIN CLEANUP TABLE LOCK `t` +-- case +ADMIN CLEANUP TABLE LOCK `t1`, `t2` +-- case +ALTER TABLE `t` READ ONLY +-- case +ALTER TABLE `t` READ WRITE diff --git a/parser/testdata/parser/my_sql_reserved_word_compat/input.sql b/parser/testdata/parser/my_sql_reserved_word_compat/input.sql new file mode 100644 index 0000000..bb41975 --- /dev/null +++ b/parser/testdata/parser/my_sql_reserved_word_compat/input.sql @@ -0,0 +1,27 @@ +create table cube (a int) +-- case +create table external (a int) +-- case +create table qualify (a int) +-- case +select cube from t +-- case +select external from t +-- case +select qualify from t +-- case +create table `cube` (a int) +-- case +create table `external` (a int) +-- case +create table `qualify` (a int) +-- case +select t.cube from t +-- case +select t.external from t +-- case +select t.qualify from t +-- case +create table manual (parallel int) +-- case +select manual, parallel from t diff --git a/parser/testdata/parser/my_sql_reserved_word_compat/output.sql b/parser/testdata/parser/my_sql_reserved_word_compat/output.sql new file mode 100644 index 0000000..22df6e5 --- /dev/null +++ b/parser/testdata/parser/my_sql_reserved_word_compat/output.sql @@ -0,0 +1,27 @@ +-- error: line 1 column 17 near "cube (a int)" +-- case +-- error: line 1 column 21 near "external (a int)" +-- case +-- error: line 1 column 20 near "qualify (a int)" +-- case +-- error: line 1 column 11 near "cube from t" +-- case +-- error: line 1 column 15 near "external from t" +-- case +-- error: line 1 column 14 near "qualify from t" +-- case +CREATE TABLE `cube` (`a` INT) +-- case +CREATE TABLE `external` (`a` INT) +-- case +CREATE TABLE `qualify` (`a` INT) +-- case +SELECT `t`.`cube` FROM `t` +-- case +SELECT `t`.`external` FROM `t` +-- case +SELECT `t`.`qualify` FROM `t` +-- case +CREATE TABLE `manual` (`parallel` INT) +-- case +SELECT `manual`,`parallel` FROM `t` diff --git a/parser/testdata/parser/non_transactional_dml/input.sql b/parser/testdata/parser/non_transactional_dml/input.sql new file mode 100644 index 0000000..475762b --- /dev/null +++ b/parser/testdata/parser/non_transactional_dml/input.sql @@ -0,0 +1,47 @@ +batch on c limit 10 delete from t where c = 10 +-- case +batch on c limit 10 dry run delete from t where c = 10 +-- case +batch on c limit 10 dry run query delete from t where c = 10 +-- case +batch limit 10 delete from t where c = 10 +-- case +batch limit 10 dry run delete from t where c = 10 +-- case +batch limit 10 dry run query delete from t where c = 10 +-- case +batch on c limit 10 update t set c = 10 +-- case +batch on c limit 10 dry run update t set c = 10 +-- case +batch on c limit 10 dry run query update t set c = 10 +-- case +batch limit 10 update t set c = 10 +-- case +batch limit 10 dry run update t set c = 10 +-- case +batch limit 10 dry run query update t set c = 10 +-- case +batch on c limit 10 insert into t1 select * from t2 where c = 10 +-- case +batch on c limit 10 dry run insert into t1 select * from t2 where c = 10 +-- case +batch on c limit 10 dry run query insert into t1 select * from t2 where c = 10 +-- case +batch limit 10 insert into t1 select * from t2 where c = 10 +-- case +batch limit 10 dry run insert into t1 select * from t2 where c = 10 +-- case +batch limit 10 dry run query insert into t1 select * from t2 where c = 10 +-- case +batch on c limit 10 insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val +-- case +batch on c limit 10 dry run insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val +-- case +batch on c limit 10 dry run query insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val +-- case +batch limit 10 insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val +-- case +batch limit 10 dry run insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val +-- case +batch limit 10 dry run query insert into t1 select * from t2 where c = 10 on duplicate key update t1.val = t2.val diff --git a/parser/testdata/parser/non_transactional_dml/output.sql b/parser/testdata/parser/non_transactional_dml/output.sql new file mode 100644 index 0000000..4139b7c --- /dev/null +++ b/parser/testdata/parser/non_transactional_dml/output.sql @@ -0,0 +1,47 @@ +BATCH ON `c` LIMIT 10 DELETE FROM `t` WHERE `c`=10 +-- case +BATCH ON `c` LIMIT 10 DRY RUN DELETE FROM `t` WHERE `c`=10 +-- case +BATCH ON `c` LIMIT 10 DRY RUN QUERY DELETE FROM `t` WHERE `c`=10 +-- case +BATCH LIMIT 10 DELETE FROM `t` WHERE `c`=10 +-- case +BATCH LIMIT 10 DRY RUN DELETE FROM `t` WHERE `c`=10 +-- case +BATCH LIMIT 10 DRY RUN QUERY DELETE FROM `t` WHERE `c`=10 +-- case +BATCH ON `c` LIMIT 10 UPDATE `t` SET `c`=10 +-- case +BATCH ON `c` LIMIT 10 DRY RUN UPDATE `t` SET `c`=10 +-- case +BATCH ON `c` LIMIT 10 DRY RUN QUERY UPDATE `t` SET `c`=10 +-- case +BATCH LIMIT 10 UPDATE `t` SET `c`=10 +-- case +BATCH LIMIT 10 DRY RUN UPDATE `t` SET `c`=10 +-- case +BATCH LIMIT 10 DRY RUN QUERY UPDATE `t` SET `c`=10 +-- case +BATCH ON `c` LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 +-- case +BATCH ON `c` LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 +-- case +BATCH ON `c` LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 +-- case +BATCH LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 +-- case +BATCH LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 +-- case +BATCH LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 +-- case +BATCH ON `c` LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val` +-- case +BATCH ON `c` LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val` +-- case +BATCH ON `c` LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val` +-- case +BATCH LIMIT 10 INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val` +-- case +BATCH LIMIT 10 DRY RUN INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val` +-- case +BATCH LIMIT 10 DRY RUN QUERY INSERT INTO `t1` SELECT * FROM `t2` WHERE `c`=10 ON DUPLICATE KEY UPDATE `t1`.`val`=`t2`.`val` diff --git a/parser/testdata/parser/parse_show_open_tables/input.sql b/parser/testdata/parser/parse_show_open_tables/input.sql new file mode 100644 index 0000000..e08cfb4 --- /dev/null +++ b/parser/testdata/parser/parse_show_open_tables/input.sql @@ -0,0 +1,5 @@ +SHOW OPEN TABLES +-- case +SHOW OPEN TABLES IN test +-- case +SHOW OPEN TABLES FROM test diff --git a/parser/testdata/parser/parse_show_open_tables/output.sql b/parser/testdata/parser/parse_show_open_tables/output.sql new file mode 100644 index 0000000..847ca3e --- /dev/null +++ b/parser/testdata/parser/parse_show_open_tables/output.sql @@ -0,0 +1,5 @@ +SHOW OPEN TABLES +-- case +SHOW OPEN TABLES IN `test` +-- case +SHOW OPEN TABLES IN `test` diff --git a/parser/testdata/parser/partial_index/input.sql b/parser/testdata/parser/partial_index/input.sql new file mode 100644 index 0000000..1925ec9 --- /dev/null +++ b/parser/testdata/parser/partial_index/input.sql @@ -0,0 +1,5 @@ +create table `t` (`id` int primary key,`col` int,index(`col`) where `col`>100) +-- case +create index `idx` on `t` (`col`) where `col`>100 +-- case +alter table `t` add index `idx`(`col`) where `col`>100 diff --git a/parser/testdata/parser/partial_index/output.sql b/parser/testdata/parser/partial_index/output.sql new file mode 100644 index 0000000..7f5f11e --- /dev/null +++ b/parser/testdata/parser/partial_index/output.sql @@ -0,0 +1,5 @@ +CREATE TABLE `t` (`id` INT PRIMARY KEY,`col` INT,INDEX(`col`) WHERE `col`>100) +-- case +CREATE INDEX `idx` ON `t` (`col`) WHERE `col`>100 +-- case +ALTER TABLE `t` ADD INDEX `idx`(`col`) WHERE `col`>100 diff --git a/parser/testdata/parser/partition_key_algorithm/input.sql b/parser/testdata/parser/partition_key_algorithm/input.sql new file mode 100644 index 0000000..2820e30 --- /dev/null +++ b/parser/testdata/parser/partition_key_algorithm/input.sql @@ -0,0 +1,7 @@ +CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 1 (c1,c2) PARTITIONS 4 +-- case +CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = -1 (c1,c2) PARTITIONS 4 +-- case +CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 0 (c1,c2) PARTITIONS 4 +-- case +CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 3 (c1,c2) PARTITIONS 4 diff --git a/parser/testdata/parser/partition_key_algorithm/output.sql b/parser/testdata/parser/partition_key_algorithm/output.sql new file mode 100644 index 0000000..b179962 --- /dev/null +++ b/parser/testdata/parser/partition_key_algorithm/output.sql @@ -0,0 +1,7 @@ +CREATE TABLE `t` (`c1` INT,`c2` INT) PARTITION BY LINEAR KEY ALGORITHM = 1 (`c1`,`c2`) PARTITIONS 4 +-- case +-- error: line 1 column 78 near "-1 (c1,c2) PARTITIONS 4" +-- case +-- error: [parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use +-- case +-- error: [parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use diff --git a/parser/testdata/parser/plan_replayer/input.sql b/parser/testdata/parser/plan_replayer/input.sql new file mode 100644 index 0000000..37a87b3 --- /dev/null +++ b/parser/testdata/parser/plan_replayer/input.sql @@ -0,0 +1,37 @@ +PLAN REPLAYER DUMP EXPLAIN SELECT a FROM t +-- case +PLAN REPLAYER DUMP EXPLAIN SELECT * FROM t WHERE a > 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SELECT * FROM t WHERE a > 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE a > 10 and t < 1 ORDER BY t LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE a > 10 and t < 1 ORDER BY t LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE a > 10 and t < 1 LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE a > 10 and t < 1 LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY +-- case +PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip' +-- case +PLAN REPLAYER DUMP EXPLAIN 'sql.txt' +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE 'sql.txt' +-- case +PLAN REPLAYER DUMP EXPLAIN ('SELECT * FROM t1') +-- case +PLAN REPLAYER DUMP EXPLAIN ( 'SELECT * FROM t1' , 'SELECT * FROM t2' ) +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE ('SELECT * FROM t1', 'SELECT * FROM t2 WHERE id = 1') +-- case +PLAN REPLAYER CAPTURE '123' '123' +-- case +PLAN REPLAYER CAPTURE REMOVE '123' '123' diff --git a/parser/testdata/parser/plan_replayer/output.sql b/parser/testdata/parser/plan_replayer/output.sql new file mode 100644 index 0000000..bba0109 --- /dev/null +++ b/parser/testdata/parser/plan_replayer/output.sql @@ -0,0 +1,37 @@ +PLAN REPLAYER DUMP EXPLAIN SELECT `a` FROM `t` +-- case +PLAN REPLAYER DUMP EXPLAIN SELECT * FROM `t` WHERE `a`>10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SELECT * FROM `t` WHERE `a`>10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE `a`>10 AND `t`<1 ORDER BY `t` LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE `a`>10 AND `t`<1 ORDER BY `t` LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY WHERE `a`>10 AND `t`<1 LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY WHERE `a`>10 AND `t`<1 LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY LIMIT 10 +-- case +PLAN REPLAYER DUMP EXPLAIN SLOW QUERY +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY +-- case +PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip' +-- case +PLAN REPLAYER DUMP EXPLAIN 'sql.txt' +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE 'sql.txt' +-- case +PLAN REPLAYER DUMP EXPLAIN ('SELECT * FROM t1') +-- case +PLAN REPLAYER DUMP EXPLAIN ('SELECT * FROM t1', 'SELECT * FROM t2') +-- case +PLAN REPLAYER DUMP EXPLAIN ANALYZE ('SELECT * FROM t1', 'SELECT * FROM t2 WHERE id = 1') +-- case +PLAN REPLAYER CAPTURE '123' '123' +-- case +PLAN REPLAYER CAPTURE REMOVE '123' '123' diff --git a/parser/testdata/parser/prepare/input.sql b/parser/testdata/parser/prepare/input.sql new file mode 100644 index 0000000..85e5ebb --- /dev/null +++ b/parser/testdata/parser/prepare/input.sql @@ -0,0 +1,5 @@ +PREPARE pname FROM 'SELECT ?' +-- case +PREPARE pname FROM @test +-- case +PREPARE `` FROM @test diff --git a/parser/testdata/parser/prepare/output.sql b/parser/testdata/parser/prepare/output.sql new file mode 100644 index 0000000..a573eec --- /dev/null +++ b/parser/testdata/parser/prepare/output.sql @@ -0,0 +1,5 @@ +PREPARE `pname` FROM 'SELECT ?' +-- case +PREPARE `pname` FROM @`test` +-- case +PREPARE `` FROM @`test` diff --git a/parser/testdata/parser/priority/input.sql b/parser/testdata/parser/priority/input.sql new file mode 100644 index 0000000..93848e4 --- /dev/null +++ b/parser/testdata/parser/priority/input.sql @@ -0,0 +1,29 @@ +select high_priority * from t +-- case +select low_priority * from t +-- case +select delayed * from t +-- case +insert high_priority into t values (1) +-- case +insert LOW_PRIORITY into t values (1) +-- case +insert delayed into t values (1) +-- case +update low_priority t set a = 2 +-- case +update high_priority t set a = 2 +-- case +update delayed t set a = 2 +-- case +delete low_priority from t where a = 2 +-- case +delete high_priority from t where a = 2 +-- case +delete delayed from t where a = 2 +-- case +replace high_priority into t values (1) +-- case +replace LOW_PRIORITY into t values (1) +-- case +replace delayed into t values (1) diff --git a/parser/testdata/parser/priority/output.sql b/parser/testdata/parser/priority/output.sql new file mode 100644 index 0000000..d1b553d --- /dev/null +++ b/parser/testdata/parser/priority/output.sql @@ -0,0 +1,29 @@ +SELECT HIGH_PRIORITY * FROM `t` +-- case +SELECT LOW_PRIORITY * FROM `t` +-- case +SELECT DELAYED * FROM `t` +-- case +INSERT HIGH_PRIORITY INTO `t` VALUES (1) +-- case +INSERT LOW_PRIORITY INTO `t` VALUES (1) +-- case +INSERT DELAYED INTO `t` VALUES (1) +-- case +UPDATE LOW_PRIORITY `t` SET `a`=2 +-- case +UPDATE HIGH_PRIORITY `t` SET `a`=2 +-- case +UPDATE DELAYED `t` SET `a`=2 +-- case +DELETE LOW_PRIORITY FROM `t` WHERE `a`=2 +-- case +DELETE HIGH_PRIORITY FROM `t` WHERE `a`=2 +-- case +DELETE DELAYED FROM `t` WHERE `a`=2 +-- case +REPLACE HIGH_PRIORITY INTO `t` VALUES (1) +-- case +REPLACE LOW_PRIORITY INTO `t` VALUES (1) +-- case +REPLACE DELAYED INTO `t` VALUES (1) diff --git a/parser/testdata/parser/privilege/input.sql b/parser/testdata/parser/privilege/input.sql new file mode 100644 index 0000000..1265961 --- /dev/null +++ b/parser/testdata/parser/privilege/input.sql @@ -0,0 +1,273 @@ +CREATE USER 'ttt' REQUIRE X509; +-- case +CREATE USER 'ttt' REQUIRE SSL; +-- case +CREATE USER 'ttt' REQUIRE NONE; +-- case +CREATE USER 'ttt' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA'; +-- case +CREATE USER 'ttt' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' CIPHER 'EDH-RSA-DES-CBC3-SHA' SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com'; +-- case +CREATE USER 'ttt' REQUIRE SAN 'DNS:mysql-user, URI:spiffe://example.org/myservice' +-- case +CREATE USER 'ttt' WITH MAX_QUERIES_PER_HOUR 2; +-- case +CREATE USER 'ttt'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK; +-- case +CREATE USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK ; +-- case +CREATE USER 'test' +-- case +CREATE USER test +-- case +CREATE USER `test` +-- case +CREATE USER test-user +-- case +CREATE USER test.user +-- case +CREATE USER 'test-user' +-- case +CREATE USER `test-user` +-- case +CREATE USER test.user +-- case +CREATE USER 'test.user' +-- case +CREATE USER `test.user` +-- case +CREATE USER uesr1@LOCALhost +-- case +CREATE USER `uesr1`@localhost +-- case +CREATE USER uesr1@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER 'uesr1'@localhost +-- case +CREATE USER uesr1@'localhost' +-- case +CREATE USER 'uesr1'@'localhost' +-- case +CREATE USER 'uesr1'@`localhost` +-- case +CREATE USER `uesr1`@'localhost' +-- case +create user 'test@localhost' password expire; +-- case +create user 'test@localhost' password expire never; +-- case +create user 'test@localhost' password expire default; +-- case +create user 'test@localhost' password expire interval 3 day; +-- case +create user 'test@localhost' identified by 'password' failed_login_attempts 3 password_lock_time 3; +-- case +create user 'test@localhost' identified by 'password' failed_login_attempts 3 password_lock_time unbounded; +-- case +create user 'test@localhost' identified by 'password' failed_login_attempts 3; +-- case +create user 'test@localhost' identified by 'password' password_lock_time 3; +-- case +create user 'test@localhost' identified by 'password' password_lock_time unbounded; +-- case +CREATE USER 'sha_test'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY 'sha_test' +-- case +CREATE USER 'sha_test3'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x24412430303524255B03496C662C1055127B3B654A2F04207D01485276703644704B76303247474564416A516662346C5868646D32764C6B514F43585A473779565947514F34 +-- case +CREATE USER 'sha_test4'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[Ilf,U{;eJ/ }HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4' +-- case +CREATE USER `user@pingcap.com`@'localhost' IDENTIFIED WITH 'tidb_auth_token' REQUIRE token_issuer 'issuer-abc' ATTRIBUTE '{"email": "user@pingcap.com"}' +-- case +CREATE USER 'nopwd_native'@'localhost' IDENTIFIED WITH 'mysql_native_password' +-- case +CREATE USER 'nopwd_sha'@'localhost' IDENTIFIED WITH 'caching_sha2_password' +-- case +CREATE ROLE `test-role`, `role1`@'localhost' +-- case +CREATE ROLE `test-role` +-- case +CREATE ROLE role1 +-- case +CREATE ROLE `role1`@'localhost' +-- case +create user 'bug19354014user'@'%' identified WITH mysql_native_password +-- case +create user 'bug19354014user'@'%' identified WITH mysql_native_password by 'new-password' +-- case +create user 'bug19354014user'@'%' identified WITH mysql_native_password as 'hashstring' +-- case +CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password' +-- case +CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password' +-- case +CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring' +-- case +CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring' +-- case +CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'hashstring' RESOURCE GROUP rg1 +-- case +ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password' +-- case +ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password' +-- case +ALTER USER 'root'@'localhost' RESOURCE GROUP rg2 +-- case +ALTER USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring' +-- case +ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring' +-- case +ALTER USER USER() IDENTIFIED BY 'new-password' +-- case +ALTER USER IF EXISTS USER() IDENTIFIED BY 'new-password' +-- case +alter user 'test@localhost' password expire; +-- case +alter user 'test@localhost' password expire never; +-- case +alter user 'test@localhost' password expire default; +-- case +alter user 'test@localhost' password expire interval 3 day; +-- case +ALTER USER 'ttt' REQUIRE X509; +-- case +ALTER USER 'ttt' REQUIRE SSL; +-- case +ALTER USER 'ttt' REQUIRE NONE; +-- case +ALTER USER 'ttt' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA'; +-- case +ALTER USER 'ttt' WITH MAX_QUERIES_PER_HOUR 2; +-- case +ALTER USER 'ttt' WITH MAX_UPDATES_PER_HOUR 2; +-- case +ALTER USER 'ttt' WITH MAX_CONNECTIONS_PER_HOUR 2; +-- case +ALTER USER 'ttt' WITH MAX_USER_CONNECTIONS 2; +-- case +ALTER USER 'ttt'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK; +-- case +DROP USER 'root'@'localhost', 'root1'@'localhost' +-- case +DROP USER IF EXISTS 'root'@'localhost' +-- case +RENAME USER 'root'@'localhost' TO 'root'@'%' +-- case +RENAME USER 'fred' TO 'barry' +-- case +RENAME USER u1 to u2, u3 to u4 +-- case +DROP ROLE 'role'@'localhost', 'role1'@'localhost' +-- case +DROP ROLE 'administrator', 'developer'; +-- case +DROP ROLE IF EXISTS 'role'@'localhost' +-- case +GRANT ALL ON db1.* TO 'jeffrey'@'localhost' REQUIRE X509; +-- case +GRANT ALL ON db1.* TO 'jeffrey'@'LOCALhost' REQUIRE SSL; +-- case +GRANT ALL ON db1.* TO 'jeffrey'@'localhost' REQUIRE NONE; +-- case +GRANT ALL ON db1.* TO 'jeffrey'@'localhost' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA'; +-- case +GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; +-- case +GRANT ALL ON TABLE db1.* TO 'jeffrey'@'localhost'; +-- case +GRANT ALL ON db1.* TO 'jeffrey'@'localhost' WITH GRANT OPTION; +-- case +GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost'; +-- case +GRANT ALL ON *.* TO 'someuser'@'somehost'; +-- case +GRANT ALL ON *.* TO 'SOMEuser'@'SOMEhost'; +-- case +GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost'; +-- case +GRANT ALL ON mydb.* TO 'someuser'@'somehost'; +-- case +GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost'; +-- case +GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost'; +-- case +GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost'; +-- case +GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost'; +-- case +grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'password'; +-- case +GRANT SELECT ON test.* to 'test' +-- case +grant PROCESS,usage, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'xxxxxxxxxx'@'%' identified by password 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx' +-- case +/* rds internal mark */ GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, RELOAD, PROCESS, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER on *.* to 'root2'@'%' identified by password '*sdsadsdsadssadsadsadsadsada' with grant option +-- case +GRANT 'role1', 'role2' TO 'user1'@'LOCalhost', 'user2'@'LOcalhost'; +-- case +GRANT 'u1' TO 'u1'; +-- case +GRANT 'app_read'@'%','app_write'@'%' TO 'rw_user1'@'localhost' +-- case +GRANT 'app_developer' TO 'dev1'@'localhost'; +-- case +GRANT SHUTDOWN ON *.* TO 'dev1'@'localhost'; +-- case +GRANT CONFIG ON *.* TO 'dev1'@'localhost'; +-- case +GRANT CREATE ON *.* TO 'dev1'@'localhost'; +-- case +GRANT CREATE TABLESPACE ON *.* TO 'dev1'@'localhost'; +-- case +GRANT EXECUTE ON FUNCTION db1.anomaly_score TO 'user1'@'domain-or-ip-address1' +-- case +GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost' +-- case +GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN ON *.* TO 'root'@'localhost' +-- case +GRANT LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA, INVOKE SAGEMAKER, INVOKE COMPREHEND ON *.* TO 'root'@'localhost' +-- case +GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost' +-- case +GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION +-- case +GRANT PROXY ON 'proxied_user' TO 'proxy_user1', 'proxy_user2' +-- case +grant grant option on *.* to u1 +-- case +REVOKE ALL ON db1.* FROM 'jeffrey'@'LOCalhost'; +-- case +REVOKE SELECT ON db2.invoice FROM 'jeffrey'@'localhost'; +-- case +REVOKE ALL ON *.* FROM 'someuser'@'somehost'; +-- case +REVOKE SELECT, INSERT ON *.* FROM 'someuser'@'somehost'; +-- case +REVOKE ALL ON mydb.* FROM 'someuser'@'somehost'; +-- case +REVOKE SELECT, INSERT ON mydb.* FROM 'someuser'@'somehost'; +-- case +REVOKE ALL ON mydb.mytbl FROM 'someuser'@'somehost'; +-- case +REVOKE SELECT, INSERT ON mydb.mytbl FROM 'someuser'@'somehost'; +-- case +REVOKE SELECT (col1), INSERT (col1,col2) ON mydb.mytbl FROM 'someuser'@'somehost'; +-- case +REVOKE all privileges on zabbix.* FROM 'zabbix'@'localhost' identified by 'password'; +-- case +REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost'; +-- case +REVOKE SHUTDOWN ON *.* FROM 'dev1'@'localhost'; +-- case +REVOKE CONFIG ON *.* FROM 'dev1'@'localhost'; +-- case +REVOKE EXECUTE ON FUNCTION db.func FROM 'user'@'localhost' +-- case +REVOKE EXECUTE ON PROCEDURE db.func FROM 'user'@'localhost' +-- case +REVOKE APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN ON *.* FROM 'root'@'localhost' +-- case +revoke all privileges, grant option from u1 +-- case +revoke all privileges, grant option from u1, u2, u3 diff --git a/parser/testdata/parser/privilege/output.sql b/parser/testdata/parser/privilege/output.sql new file mode 100644 index 0000000..bb1aabe --- /dev/null +++ b/parser/testdata/parser/privilege/output.sql @@ -0,0 +1,273 @@ +CREATE USER `ttt`@`%` REQUIRE X509 +-- case +CREATE USER `ttt`@`%` REQUIRE SSL +-- case +CREATE USER `ttt`@`%` REQUIRE NONE +-- case +CREATE USER `ttt`@`%` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA' +-- case +CREATE USER `ttt`@`%` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA' AND SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' +-- case +CREATE USER `ttt`@`%` REQUIRE SAN 'DNS:mysql-user, URI:spiffe://example.org/myservice' +-- case +CREATE USER `ttt`@`%` WITH MAX_QUERIES_PER_HOUR 2 +-- case +CREATE USER `ttt`@`localhost` REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK +-- case +CREATE USER `u1`@`%` IDENTIFIED WITH 'mysql_native_password' AS '' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK +-- case +CREATE USER `test`@`%` +-- case +CREATE USER `test`@`%` +-- case +CREATE USER `test`@`%` +-- case +-- error: line 1 column 17 near "-user" +-- case +-- error: line 1 column 17 near ".user" +-- case +CREATE USER `test-user`@`%` +-- case +CREATE USER `test-user`@`%` +-- case +-- error: line 1 column 17 near ".user" +-- case +CREATE USER `test.user`@`%` +-- case +CREATE USER `test.user`@`%` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `uesr1`@`localhost` +-- case +CREATE USER `test@localhost`@`%` PASSWORD EXPIRE +-- case +CREATE USER `test@localhost`@`%` PASSWORD EXPIRE NEVER +-- case +CREATE USER `test@localhost`@`%` PASSWORD EXPIRE DEFAULT +-- case +CREATE USER `test@localhost`@`%` PASSWORD EXPIRE INTERVAL 3 DAY +-- case +CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3 +-- case +CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED +-- case +CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' FAILED_LOGIN_ATTEMPTS 3 +-- case +CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' PASSWORD_LOCK_TIME 3 +-- case +CREATE USER `test@localhost`@`%` IDENTIFIED BY 'password' PASSWORD_LOCK_TIME UNBOUNDED +-- case +CREATE USER `sha_test`@`localhost` IDENTIFIED WITH 'caching_sha2_password' BY 'sha_test' +-- case +CREATE USER `sha_test3`@`localhost` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[Ilf,U{;eJ/ }HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4' +-- case +CREATE USER `sha_test4`@`localhost` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$%[Ilf,U{;eJ/ }HRvp6DpKv02GGEdAjQfb4lXhdm2vLkQOCXZG7yVYGQO4' +-- case +CREATE USER `user@pingcap.com`@`localhost` IDENTIFIED WITH 'tidb_auth_token' REQUIRE TOKEN_ISSUER 'issuer-abc' ATTRIBUTE '{"email": "user@pingcap.com"}' +-- case +CREATE USER `nopwd_native`@`localhost` IDENTIFIED WITH 'mysql_native_password' +-- case +CREATE USER `nopwd_sha`@`localhost` IDENTIFIED WITH 'caching_sha2_password' +-- case +CREATE ROLE `test-role`@`%`, `role1`@`localhost` +-- case +CREATE ROLE `test-role`@`%` +-- case +CREATE ROLE `role1`@`%` +-- case +CREATE ROLE `role1`@`localhost` +-- case +CREATE USER `bug19354014user`@`%` IDENTIFIED WITH 'mysql_native_password' +-- case +CREATE USER `bug19354014user`@`%` IDENTIFIED WITH 'mysql_native_password' BY 'new-password' +-- case +CREATE USER `bug19354014user`@`%` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring' +-- case +CREATE USER IF NOT EXISTS `root`@`localhost` IDENTIFIED BY 'new-password' +-- case +CREATE USER `root`@`localhost` IDENTIFIED BY 'new-password' +-- case +CREATE USER `root`@`localhost` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring' +-- case +CREATE USER `root`@`localhost` IDENTIFIED BY 'new-password', `root`@`127.0.0.1` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring' +-- case +CREATE USER `root`@`127.0.0.1` IDENTIFIED BY 'hashstring' RESOURCE GROUP `rg1` +-- case +ALTER USER IF EXISTS `root`@`localhost` IDENTIFIED BY 'new-password' +-- case +ALTER USER `root`@`localhost` IDENTIFIED BY 'new-password' +-- case +ALTER USER `root`@`localhost` RESOURCE GROUP `rg2` +-- case +ALTER USER `root`@`localhost` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring' +-- case +ALTER USER `root`@`localhost` IDENTIFIED BY 'new-password', `root`@`127.0.0.1` IDENTIFIED WITH 'mysql_native_password' AS 'hashstring' +-- case +ALTER USER USER() IDENTIFIED BY 'new-password' +-- case +ALTER USER IF EXISTS USER() IDENTIFIED BY 'new-password' +-- case +ALTER USER `test@localhost`@`%` PASSWORD EXPIRE +-- case +ALTER USER `test@localhost`@`%` PASSWORD EXPIRE NEVER +-- case +ALTER USER `test@localhost`@`%` PASSWORD EXPIRE DEFAULT +-- case +ALTER USER `test@localhost`@`%` PASSWORD EXPIRE INTERVAL 3 DAY +-- case +ALTER USER `ttt`@`%` REQUIRE X509 +-- case +ALTER USER `ttt`@`%` REQUIRE SSL +-- case +ALTER USER `ttt`@`%` REQUIRE NONE +-- case +ALTER USER `ttt`@`%` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA' +-- case +ALTER USER `ttt`@`%` WITH MAX_QUERIES_PER_HOUR 2 +-- case +ALTER USER `ttt`@`%` WITH MAX_UPDATES_PER_HOUR 2 +-- case +ALTER USER `ttt`@`%` WITH MAX_CONNECTIONS_PER_HOUR 2 +-- case +ALTER USER `ttt`@`%` WITH MAX_USER_CONNECTIONS 2 +-- case +ALTER USER `ttt`@`localhost` REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 10 PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK +-- case +DROP USER `root`@`localhost`, `root1`@`localhost` +-- case +DROP USER IF EXISTS `root`@`localhost` +-- case +RENAME USER `root`@`localhost` TO `root`@`%` +-- case +RENAME USER `fred`@`%` TO `barry`@`%` +-- case +RENAME USER `u1`@`%` TO `u2`@`%`, `u3`@`%` TO `u4`@`%` +-- case +DROP ROLE `role`@`localhost`, `role1`@`localhost` +-- case +DROP ROLE `administrator`@`%`, `developer`@`%` +-- case +DROP ROLE IF EXISTS `role`@`localhost` +-- case +GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE X509 +-- case +GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE SSL +-- case +GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE NONE +-- case +GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA' +-- case +GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` +-- case +GRANT ALL ON TABLE `db1`.* TO `jeffrey`@`localhost` +-- case +GRANT ALL ON `db1`.* TO `jeffrey`@`localhost` WITH GRANT OPTION +-- case +GRANT SELECT ON `db2`.`invoice` TO `jeffrey`@`localhost` +-- case +GRANT ALL ON *.* TO `someuser`@`somehost` +-- case +GRANT ALL ON *.* TO `SOMEuser`@`somehost` +-- case +GRANT SELECT, INSERT ON *.* TO `someuser`@`somehost` +-- case +GRANT ALL ON `mydb`.* TO `someuser`@`somehost` +-- case +GRANT SELECT, INSERT ON `mydb`.* TO `someuser`@`somehost` +-- case +GRANT ALL ON `mydb`.`mytbl` TO `someuser`@`somehost` +-- case +GRANT SELECT, INSERT ON `mydb`.`mytbl` TO `someuser`@`somehost` +-- case +GRANT SELECT (`col1`), INSERT (`col1`,`col2`) ON `mydb`.`mytbl` TO `someuser`@`somehost` +-- case +GRANT ALL ON `zabbix`.* TO `zabbix`@`localhost` IDENTIFIED BY 'password' +-- case +GRANT SELECT ON `test`.* TO `test`@`%` +-- case +GRANT PROCESS, USAGE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `xxxxxxxxxx`@`%` IDENTIFIED WITH 'mysql_native_password' AS 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx' +-- case +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, RELOAD, PROCESS, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO `root2`@`%` IDENTIFIED WITH 'mysql_native_password' AS '*sdsadsdsadssadsadsadsadsada' WITH GRANT OPTION +-- case +GRANT `role1`@`%`, `role2`@`%` TO `user1`@`localhost`, `user2`@`localhost` +-- case +GRANT `u1`@`%` TO `u1`@`%` +-- case +GRANT `app_read`@`%`, `app_write`@`%` TO `rw_user1`@`localhost` +-- case +GRANT `app_developer`@`%` TO `dev1`@`localhost` +-- case +GRANT SHUTDOWN ON *.* TO `dev1`@`localhost` +-- case +GRANT CONFIG ON *.* TO `dev1`@`localhost` +-- case +GRANT CREATE ON *.* TO `dev1`@`localhost` +-- case +GRANT CREATE TABLESPACE ON *.* TO `dev1`@`localhost` +-- case +GRANT EXECUTE ON FUNCTION `db1`.`anomaly_score` TO `user1`@`domain-or-ip-address1` +-- case +GRANT EXECUTE ON PROCEDURE `mydb`.`myproc` TO `someuser`@`somehost` +-- case +GRANT APPLICATION_PASSWORD_ADMIN, AUDIT_ADMIN ON *.* TO `root`@`localhost` +-- case +GRANT LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA, INVOKE SAGEMAKER, INVOKE COMPREHEND ON *.* TO `root`@`localhost` +-- case +GRANT PROXY ON `localuser`@`localhost` TO `externaluser`@`somehost` +-- case +GRANT PROXY ON ``@`` TO `root`@`localhost` WITH GRANT OPTION +-- case +GRANT PROXY ON `proxied_user`@`%` TO `proxy_user1`@`%`, `proxy_user2`@`%` +-- case +GRANT GRANT OPTION ON *.* TO `u1`@`%` +-- case +REVOKE ALL ON `db1`.* FROM `jeffrey`@`localhost` +-- case +REVOKE SELECT ON `db2`.`invoice` FROM `jeffrey`@`localhost` +-- case +REVOKE ALL ON *.* FROM `someuser`@`somehost` +-- case +REVOKE SELECT, INSERT ON *.* FROM `someuser`@`somehost` +-- case +REVOKE ALL ON `mydb`.* FROM `someuser`@`somehost` +-- case +REVOKE SELECT, INSERT ON `mydb`.* FROM `someuser`@`somehost` +-- case +REVOKE ALL ON `mydb`.`mytbl` FROM `someuser`@`somehost` +-- case +REVOKE SELECT, INSERT ON `mydb`.`mytbl` FROM `someuser`@`somehost` +-- case +REVOKE SELECT (`col1`), INSERT (`col1`,`col2`) ON `mydb`.`mytbl` FROM `someuser`@`somehost` +-- case +REVOKE ALL ON `zabbix`.* FROM `zabbix`@`localhost` IDENTIFIED BY 'password' +-- case +REVOKE `role1`@`%`, `role2`@`%` FROM `user1`@`localhost`, `user2`@`localhost` +-- case +REVOKE SHUTDOWN ON *.* FROM `dev1`@`localhost` +-- case +REVOKE CONFIG ON *.* FROM `dev1`@`localhost` +-- case +REVOKE EXECUTE ON FUNCTION `db`.`func` FROM `user`@`localhost` +-- case +REVOKE EXECUTE ON PROCEDURE `db`.`func` FROM `user`@`localhost` +-- case +REVOKE APPLICATION_PASSWORD_ADMIN, AUDIT_ADMIN ON *.* FROM `root`@`localhost` +-- case +REVOKE ALL, GRANT OPTION ON *.* FROM `u1`@`%` +-- case +REVOKE ALL, GRANT OPTION ON *.* FROM `u1`@`%`, `u2`@`%`, `u3`@`%` diff --git a/parser/testdata/parser/privilege_maria_db_disabled/input.sql b/parser/testdata/parser/privilege_maria_db_disabled/input.sql new file mode 100644 index 0000000..9c1be86 --- /dev/null +++ b/parser/testdata/parser/privilege_maria_db_disabled/input.sql @@ -0,0 +1 @@ +GRANT BINLOG MONITOR ON *.* TO 'user1'@'localhost' diff --git a/parser/testdata/parser/privilege_maria_db_disabled/output.sql b/parser/testdata/parser/privilege_maria_db_disabled/output.sql new file mode 100644 index 0000000..5a37e44 --- /dev/null +++ b/parser/testdata/parser/privilege_maria_db_disabled/output.sql @@ -0,0 +1 @@ +-- error: [parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use diff --git a/parser/testdata/parser/privilege_maria_db_enabled/input.sql b/parser/testdata/parser/privilege_maria_db_enabled/input.sql new file mode 100644 index 0000000..06d2a5d --- /dev/null +++ b/parser/testdata/parser/privilege_maria_db_enabled/input.sql @@ -0,0 +1,2 @@ +-- flags: mariadb +GRANT BINLOG MONITOR ON *.* TO 'user1'@'localhost' diff --git a/parser/testdata/parser/privilege_maria_db_enabled/output.sql b/parser/testdata/parser/privilege_maria_db_enabled/output.sql new file mode 100644 index 0000000..6f309e0 --- /dev/null +++ b/parser/testdata/parser/privilege_maria_db_enabled/output.sql @@ -0,0 +1 @@ +GRANT REPLICATION CLIENT ON *.* TO `user1`@`localhost` diff --git a/parser/testdata/parser/recommend_index/input.sql b/parser/testdata/parser/recommend_index/input.sql new file mode 100644 index 0000000..6456f76 --- /dev/null +++ b/parser/testdata/parser/recommend_index/input.sql @@ -0,0 +1,23 @@ +recommend index run +-- case +recommend index run with A = 1 +-- case +recommend index run with A = 1, B = 2 +-- case +recommend index run for 'select * from t where a=1' +-- case +recommend index run for 'select * from t where a=1' with A = 1 +-- case +recommend index run for 'select * from t where a=1' with A = 1, B = 2 +-- case +recommend index show option +-- case +recommend index apply 1 +-- case +recommend index ignore 1 +-- case +recommend index set A = 1 +-- case +recommend index set A = 1, B = 2 +-- case +recommend index set A = 1, B = 2, C = 3 diff --git a/parser/testdata/parser/recommend_index/output.sql b/parser/testdata/parser/recommend_index/output.sql new file mode 100644 index 0000000..7b7a59b --- /dev/null +++ b/parser/testdata/parser/recommend_index/output.sql @@ -0,0 +1,23 @@ +RECOMMEND INDEX RUN +-- case +RECOMMEND INDEX RUN WITH A = 1 +-- case +RECOMMEND INDEX RUN WITH A = 1, B = 2 +-- case +RECOMMEND INDEX RUN FOR 'select * from t where a=1' +-- case +RECOMMEND INDEX RUN FOR 'select * from t where a=1' WITH A = 1 +-- case +RECOMMEND INDEX RUN FOR 'select * from t where a=1' WITH A = 1, B = 2 +-- case +RECOMMEND INDEX SHOW OPTION +-- case +RECOMMEND INDEX APPLY 1 +-- case +RECOMMEND INDEX IGNORE 1 +-- case +RECOMMEND INDEX SET A = 1 +-- case +RECOMMEND INDEX SET A = 1, B = 2 +-- case +RECOMMEND INDEX SET A = 1, B = 2, C = 3 diff --git a/parser/testdata/parser/secondary_engine_attribute/input.sql b/parser/testdata/parser/secondary_engine_attribute/input.sql new file mode 100644 index 0000000..47c65a9 --- /dev/null +++ b/parser/testdata/parser/secondary_engine_attribute/input.sql @@ -0,0 +1,37 @@ +CREATE TABLE t (id INT) PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE='{"key":"value"}',PARTITION p1 VALUES LESS THAN (20) SECONDARY_ENGINE_ATTRIBUTE='{"key":"value2"}') +-- case +CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE='{"key":"value"}' +-- case +CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE='{"key":"value"}' PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE='{"key":"partition_value"}') +-- case +CREATE TABLE t (id INT SECONDARY_ENGINE_ATTRIBUTE='{"key":"value"}') +-- case +CREATE TABLE t (id INT) TABLESPACE ts1 SECONDARY_ENGINE_ATTRIBUTE='{"key":"value"}' +-- case +CREATE TABLE t (id INT,INDEX idx (id) INVISIBLE SECONDARY_ENGINE_ATTRIBUTE='{"key1":"value1"}') +-- case +CREATE TABLE t (id INT) PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE=) +-- case +CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE= +-- case +CREATE TABLE t (id INT SECONDARY_ENGINE_ATTRIBUTE=) +-- case +CREATE TABLE t (id INT) TABLESPACE ts1 SECONDARY_ENGINE_ATTRIBUTE= +-- case +CREATE TABLE t (id INT, INDEX idx (id) SECONDARY_ENGINE_ATTRIBUTE=) +-- case +CREATE TABLE t (id INT) PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE) +-- case +CREATE TABLE t (id INT) SECONDARY_ENGINE_ATTRIBUTE +-- case +CREATE TABLE t (id INT SECONDARY_ENGINE_ATTRIBUTE) +-- case +CREATE TABLE t (id INT) TABLESPACE ts1 SECONDARY_ENGINE_ATTRIBUTE +-- case +CREATE TABLE t (id INT, INDEX idx (id) SECONDARY_ENGINE_ATTRIBUTE) +-- case +CREATE INDEX i ON t (a) SECONDARY_ENGINE_ATTRIBUTE = '{}' +-- case +CREATE INDEX i ON t (a) SECONDARY_ENGINE_ATTRIBUTE '{}' +-- case +CREATE INDEX i ON t (a) SECONDARY_ENGINE_ATTRIBUTE diff --git a/parser/testdata/parser/secondary_engine_attribute/output.sql b/parser/testdata/parser/secondary_engine_attribute/output.sql new file mode 100644 index 0000000..b56f41b --- /dev/null +++ b/parser/testdata/parser/secondary_engine_attribute/output.sql @@ -0,0 +1,37 @@ +CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) (PARTITION `p0` VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE = '{"key":"value"}',PARTITION `p1` VALUES LESS THAN (20) SECONDARY_ENGINE_ATTRIBUTE = '{"key":"value2"}') +-- case +CREATE TABLE `t` (`id` INT) SECONDARY_ENGINE_ATTRIBUTE = '{"key":"value"}' +-- case +CREATE TABLE `t` (`id` INT) SECONDARY_ENGINE_ATTRIBUTE = '{"key":"value"}' PARTITION BY RANGE (`id`) (PARTITION `p0` VALUES LESS THAN (10) SECONDARY_ENGINE_ATTRIBUTE = '{"key":"partition_value"}') +-- case +CREATE TABLE `t` (`id` INT SECONDARY_ENGINE_ATTRIBUTE = '{"key":"value"}') +-- case +CREATE TABLE `t` (`id` INT) TABLESPACE = `ts1` SECONDARY_ENGINE_ATTRIBUTE = '{"key":"value"}' +-- case +CREATE TABLE `t` (`id` INT,INDEX `idx`(`id`) INVISIBLE SECONDARY_ENGINE_ATTRIBUTE = '{"key1":"value1"}') +-- case +-- error: line 1 column 112 near ")" +-- case +-- error: line 1 column 51 near "" +-- case +-- error: line 1 column 51 near ")" +-- case +-- error: line 1 column 66 near "" +-- case +-- error: line 1 column 67 near ")" +-- case +-- error: line 1 column 111 near ")" +-- case +-- error: line 1 column 50 near "" +-- case +-- error: line 1 column 50 near ")" +-- case +-- error: line 1 column 65 near "" +-- case +-- error: line 1 column 66 near ")" +-- case +CREATE INDEX `i` ON `t` (`a`) SECONDARY_ENGINE_ATTRIBUTE = '{}' +-- case +CREATE INDEX `i` ON `t` (`a`) SECONDARY_ENGINE_ATTRIBUTE = '{}' +-- case +-- error: line 1 column 50 near "" diff --git a/parser/testdata/parser/session_manage/input.sql b/parser/testdata/parser/session_manage/input.sql new file mode 100644 index 0000000..a8c1730 --- /dev/null +++ b/parser/testdata/parser/session_manage/input.sql @@ -0,0 +1,21 @@ +kill 23123 +-- case +kill CONNECTION_ID() +-- case +kill connection 23123 +-- case +kill query 23123 +-- case +kill tidb 23123 +-- case +kill tidb connection 23123 +-- case +kill tidb query 23123 +-- case +show processlist +-- case +show full processlist +-- case +shutdown +-- case +restart diff --git a/parser/testdata/parser/session_manage/output.sql b/parser/testdata/parser/session_manage/output.sql new file mode 100644 index 0000000..09202f6 --- /dev/null +++ b/parser/testdata/parser/session_manage/output.sql @@ -0,0 +1,21 @@ +KILL 23123 +-- case +KILL CONNECTION_ID() +-- case +KILL 23123 +-- case +KILL QUERY 23123 +-- case +KILL TIDB 23123 +-- case +KILL TIDB 23123 +-- case +KILL TIDB QUERY 23123 +-- case +SHOW PROCESSLIST +-- case +SHOW FULL PROCESSLIST +-- case +SHUTDOWN +-- case +RESTART diff --git a/parser/testdata/parser/set_operator/input.sql b/parser/testdata/parser/set_operator/input.sql new file mode 100644 index 0000000..05a5822 --- /dev/null +++ b/parser/testdata/parser/set_operator/input.sql @@ -0,0 +1,207 @@ +select c1 from t1 union select c2 from t2 +-- case +select c1 from t1 union (select c2 from t2) +-- case +select c1 from t1 union (select c2 from t2) order by c1 +-- case +select c1 from t1 union select c2 from t2 order by c2 +-- case +select c1 from t1 union (select c2 from t2) limit 1 +-- case +select c1 from t1 union (select c2 from t2) limit 1, 1 +-- case +select c1 from t1 union (select c2 from t2) order by c1 limit 1 +-- case +(select c1 from t1) union distinct select c2 from t2 +-- case +(select c1 from t1) union distinctrow select c2 from t2 +-- case +(select c1 from t1) union all select c2 from t2 +-- case +(select c1 from t1) union distinct all select c2 from t2 +-- case +(select c1 from t1) union distinctrow all select c2 from t2 +-- case +(select c1 from t1) union (select c2 from t2) order by c1 union select c3 from t3 +-- case +(select c1 from t1) union (select c2 from t2) limit 1 union select c3 from t3 +-- case +(select c1 from t1) union select c2 from t2 union (select c3 from t3) order by c1 limit 1 +-- case +select (select 1 union select 1) as a +-- case +select * from (select 1 union select 2) as a +-- case +insert into t select c1 from t1 union select c2 from t2 +-- case +insert into t (c) select c1 from t1 union select c2 from t2 +-- case +select 2 as a from dual union select 1 as b from dual order by a +-- case +table t1 union table t2 +-- case +table t1 union (table t2) +-- case +table t1 union select * from t2 +-- case +select * from t1 union table t2 +-- case +table t1 union (select c2 from t2) order by c1 limit 1 +-- case +select c1 from t1 union (table t2) order by c1 limit 1 +-- case +(select c1 from t1) union table t2 union (select c3 from t3) order by c1 limit 1 +-- case +(table t1) union select c2 from t2 union (table t3) order by c1 limit 1 +-- case +values row(1,-2,3), row(5,7,9) union values row(1,-2,3), row(5,7,9) +-- case +values row(1,-2,3), row(5,7,9) union (values row(1,-2,3), row(5,7,9)) +-- case +values row(1,-2,3), row(5,7,9) union select * from t +-- case +values row(1,-2,3), row(5,7,9) union table t +-- case +select * from t union values row(1,-2,3), row(5,7,9) +-- case +table t union values row(1,-2,3), row(5,7,9) +-- case +select c1 from t1 except select c2 from t2 +-- case +select c1 from t1 except (select c2 from t2) +-- case +select c1 from t1 except (select c2 from t2) order by c1 +-- case +select c1 from t1 except select c2 from t2 order by c2 +-- case +select c1 from t1 except (select c2 from t2) limit 1 +-- case +select c1 from t1 except (select c2 from t2) limit 1, 1 +-- case +select c1 from t1 except (select c2 from t2) order by c1 limit 1 +-- case +(select c1 from t1) except (select c2 from t2) order by c1 except select c3 from t3 +-- case +(select c1 from t1) except (select c2 from t2) limit 1 except select c3 from t3 +-- case +(select c1 from t1) except select c2 from t2 except (select c3 from t3) order by c1 limit 1 +-- case +select (select 1 except select 1) as a +-- case +select * from (select 1 except select 2) as a +-- case +insert into t select c1 from t1 except select c2 from t2 +-- case +insert into t (c) select c1 from t1 except select c2 from t2 +-- case +select 2 as a from dual except select 1 as b from dual order by a +-- case +table t1 except table t2 +-- case +table t1 except (table t2) +-- case +table t1 except select * from t2 +-- case +select * from t1 except table t2 +-- case +table t1 except (select c2 from t2) order by c1 limit 1 +-- case +select c1 from t1 except (table t2) order by c1 limit 1 +-- case +(select c1 from t1) except table t2 except (select c3 from t3) order by c1 limit 1 +-- case +(table t1) except select c2 from t2 except (table t3) order by c1 limit 1 +-- case +values row(1,-2,3), row(5,7,9) except values row(1,-2,3), row(5,7,9) +-- case +values row(1,-2,3), row(5,7,9) except (values row(1,-2,3), row(5,7,9)) +-- case +values row(1,-2,3), row(5,7,9) except select * from t +-- case +values row(1,-2,3), row(5,7,9) except table t +-- case +select * from t except values row(1,-2,3), row(5,7,9) +-- case +table t except values row(1,-2,3), row(5,7,9) +-- case +select c1 from t1 intersect select c2 from t2 +-- case +select c1 from t1 intersect (select c2 from t2) +-- case +select c1 from t1 intersect (select c2 from t2) order by c1 +-- case +select c1 from t1 intersect select c2 from t2 order by c2 +-- case +select c1 from t1 intersect (select c2 from t2) limit 1 +-- case +select c1 from t1 intersect (select c2 from t2) limit 1, 1 +-- case +select c1 from t1 intersect (select c2 from t2) order by c1 limit 1 +-- case +(select c1 from t1) intersect (select c2 from t2) order by c1 intersect select c3 from t3 +-- case +(select c1 from t1) intersect (select c2 from t2) limit 1 intersect select c3 from t3 +-- case +(select c1 from t1) intersect select c2 from t2 intersect (select c3 from t3) order by c1 limit 1 +-- case +select (select 1 intersect select 1) as a +-- case +select * from (select 1 intersect select 2) as a +-- case +insert into t select c1 from t1 intersect select c2 from t2 +-- case +insert into t (c) select c1 from t1 intersect select c2 from t2 +-- case +select 2 as a from dual intersect select 1 as b from dual order by a +-- case +table t1 intersect table t2 +-- case +table t1 intersect (table t2) +-- case +table t1 intersect select * from t2 +-- case +select * from t1 intersect table t2 +-- case +table t1 intersect (select c2 from t2) order by c1 limit 1 +-- case +select c1 from t1 intersect (table t2) order by c1 limit 1 +-- case +(select c1 from t1) intersect table t2 intersect (select c3 from t3) order by c1 limit 1 +-- case +(table t1) intersect select c2 from t2 intersect (table t3) order by c1 limit 1 +-- case +values row(1,-2,3), row(5,7,9) intersect values row(1,-2,3), row(5,7,9) +-- case +values row(1,-2,3), row(5,7,9) intersect (values row(1,-2,3), row(5,7,9)) +-- case +values row(1,-2,3), row(5,7,9) intersect select * from t +-- case +values row(1,-2,3), row(5,7,9) intersect table t +-- case +select * from t intersect values row(1,-2,3), row(5,7,9) +-- case +table t intersect values row(1,-2,3), row(5,7,9) +-- case +(select c1 from t1) intersect select c2 from t2 union (select c3 from t3) order by c1 limit 1 +-- case +(select c1 from t1) union all select c2 from t2 except (select c3 from t3) order by c1 limit 1 +-- case +(select c1 from t1) except select c2 from t2 intersect (select c3 from t3) order by c1 limit 1 +-- case +select 1 union distinct select 1 except select 1 intersect select 1 +-- case +(select c1 from t1) intersect all (select c2 from t2 union (select c3 from t3)) order by c1 limit 1 +-- case +(select c1 from t1) union all (select c2 from t2 except select c3 from t3) order by c1 limit 1 +-- case +((select c1 from t1) except select c2 from t2) intersect all (select c3 from t3) order by c1 limit 1 +-- case +select 1 union distinct (select 1 except all select 1 intersect select 1) +-- case +select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1) +-- case +select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1) order by pk limit 2 +-- case +(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk limit 2 +-- case +(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk diff --git a/parser/testdata/parser/set_operator/output.sql b/parser/testdata/parser/set_operator/output.sql new file mode 100644 index 0000000..0e7c2b6 --- /dev/null +++ b/parser/testdata/parser/set_operator/output.sql @@ -0,0 +1,207 @@ +SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2` +-- case +SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) +-- case +SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) ORDER BY `c1` +-- case +SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2` ORDER BY `c2` +-- case +SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1 +-- case +SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) UNION SELECT `c2` FROM `t2` +-- case +(SELECT `c1` FROM `t1`) UNION SELECT `c2` FROM `t2` +-- case +(SELECT `c1` FROM `t1`) UNION ALL SELECT `c2` FROM `t2` +-- case +-- error: line 1 column 38 near "all select c2 from t2" +-- case +-- error: line 1 column 41 near "all select c2 from t2" +-- case +-- error: line 1 column 63 near "union select c3 from t3" +-- case +-- error: line 1 column 59 near "union select c3 from t3" +-- case +(SELECT `c1` FROM `t1`) UNION SELECT `c2` FROM `t2` UNION (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +SELECT (SELECT 1 UNION SELECT 1) AS `a` +-- case +SELECT * FROM (SELECT 1 UNION SELECT 2) AS `a` +-- case +INSERT INTO `t` SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2` +-- case +INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2` +-- case +SELECT 2 AS `a` UNION SELECT 1 AS `b` ORDER BY `a` +-- case +TABLE `t1` UNION TABLE `t2` +-- case +TABLE `t1` UNION (TABLE `t2`) +-- case +TABLE `t1` UNION SELECT * FROM `t2` +-- case +SELECT * FROM `t1` UNION TABLE `t2` +-- case +TABLE `t1` UNION (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1 +-- case +SELECT `c1` FROM `t1` UNION (TABLE `t2`) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) UNION TABLE `t2` UNION (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +(TABLE `t1`) UNION SELECT `c2` FROM `t2` UNION (TABLE `t3`) ORDER BY `c1` LIMIT 1 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) UNION VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) UNION (VALUES ROW(1,-2,3), ROW(5,7,9)) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) UNION SELECT * FROM `t` +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) UNION TABLE `t` +-- case +SELECT * FROM `t` UNION VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +TABLE `t` UNION VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2` +-- case +SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) +-- case +SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) ORDER BY `c1` +-- case +SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2` ORDER BY `c2` +-- case +SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) LIMIT 1 +-- case +SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +SELECT `c1` FROM `t1` EXCEPT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1 +-- case +-- error: line 1 column 65 near "except select c3 from t3" +-- case +-- error: line 1 column 61 near "except select c3 from t3" +-- case +(SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2` EXCEPT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +SELECT (SELECT 1 EXCEPT SELECT 1) AS `a` +-- case +SELECT * FROM (SELECT 1 EXCEPT SELECT 2) AS `a` +-- case +INSERT INTO `t` SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2` +-- case +INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` EXCEPT SELECT `c2` FROM `t2` +-- case +SELECT 2 AS `a` EXCEPT SELECT 1 AS `b` ORDER BY `a` +-- case +TABLE `t1` EXCEPT TABLE `t2` +-- case +TABLE `t1` EXCEPT (TABLE `t2`) +-- case +TABLE `t1` EXCEPT SELECT * FROM `t2` +-- case +SELECT * FROM `t1` EXCEPT TABLE `t2` +-- case +TABLE `t1` EXCEPT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1 +-- case +SELECT `c1` FROM `t1` EXCEPT (TABLE `t2`) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) EXCEPT TABLE `t2` EXCEPT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +(TABLE `t1`) EXCEPT SELECT `c2` FROM `t2` EXCEPT (TABLE `t3`) ORDER BY `c1` LIMIT 1 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT (VALUES ROW(1,-2,3), ROW(5,7,9)) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT SELECT * FROM `t` +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) EXCEPT TABLE `t` +-- case +SELECT * FROM `t` EXCEPT VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +TABLE `t` EXCEPT VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2` +-- case +SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) +-- case +SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) ORDER BY `c1` +-- case +SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2` ORDER BY `c2` +-- case +SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) LIMIT 1 +-- case +SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +SELECT `c1` FROM `t1` INTERSECT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1 +-- case +-- error: line 1 column 71 near "intersect select c3 from t3" +-- case +-- error: line 1 column 67 near "intersect select c3 from t3" +-- case +(SELECT `c1` FROM `t1`) INTERSECT SELECT `c2` FROM `t2` INTERSECT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +SELECT (SELECT 1 INTERSECT SELECT 1) AS `a` +-- case +SELECT * FROM (SELECT 1 INTERSECT SELECT 2) AS `a` +-- case +INSERT INTO `t` SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2` +-- case +INSERT INTO `t` (`c`) SELECT `c1` FROM `t1` INTERSECT SELECT `c2` FROM `t2` +-- case +SELECT 2 AS `a` INTERSECT SELECT 1 AS `b` ORDER BY `a` +-- case +TABLE `t1` INTERSECT TABLE `t2` +-- case +TABLE `t1` INTERSECT (TABLE `t2`) +-- case +TABLE `t1` INTERSECT SELECT * FROM `t2` +-- case +SELECT * FROM `t1` INTERSECT TABLE `t2` +-- case +TABLE `t1` INTERSECT (SELECT `c2` FROM `t2`) ORDER BY `c1` LIMIT 1 +-- case +SELECT `c1` FROM `t1` INTERSECT (TABLE `t2`) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) INTERSECT TABLE `t2` INTERSECT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +(TABLE `t1`) INTERSECT SELECT `c2` FROM `t2` INTERSECT (TABLE `t3`) ORDER BY `c1` LIMIT 1 +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT (VALUES ROW(1,-2,3), ROW(5,7,9)) +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT SELECT * FROM `t` +-- case +VALUES ROW(1,-2,3), ROW(5,7,9) INTERSECT TABLE `t` +-- case +SELECT * FROM `t` INTERSECT VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +TABLE `t` INTERSECT VALUES ROW(1,-2,3), ROW(5,7,9) +-- case +(SELECT `c1` FROM `t1`) INTERSECT SELECT `c2` FROM `t2` UNION (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) UNION ALL SELECT `c2` FROM `t2` EXCEPT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2` INTERSECT (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +SELECT 1 UNION SELECT 1 EXCEPT SELECT 1 INTERSECT SELECT 1 +-- case +(SELECT `c1` FROM `t1`) INTERSECT ALL (SELECT `c2` FROM `t2` UNION (SELECT `c3` FROM `t3`)) ORDER BY `c1` LIMIT 1 +-- case +(SELECT `c1` FROM `t1`) UNION ALL (SELECT `c2` FROM `t2` EXCEPT SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +((SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2`) INTERSECT ALL (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1 +-- case +SELECT 1 UNION (SELECT 1 EXCEPT ALL SELECT 1 INTERSECT SELECT 1) +-- case +SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1) +-- case +SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2 +-- case +(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2 +-- case +(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` diff --git a/parser/testdata/parser/split_partition/input.sql b/parser/testdata/parser/split_partition/input.sql new file mode 100644 index 0000000..9fc4c3b --- /dev/null +++ b/parser/testdata/parser/split_partition/input.sql @@ -0,0 +1,11 @@ +create table t (id BIGINT, user_id BIGINT, action_type VARCHAR(20), PRIMARY KEY (id), INDEX idx_user_id (user_id)) SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX idx_user_id BETWEEN (1000) AND (100000) REGIONS 3 +-- case +alter table t SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4 +-- case +alter table t SPLIT INDEX ss BETWEEN (0) AND (1000000) REGIONS 3 +-- case +create table t (id BIGINT) SPLIT BETWEEN (0) AND (1000000) REGIONS 4 +-- case +create table t (id BIGINT, INDEX idx(id)) SPLIT BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX idx BETWEEN (0) AND (1000000) REGIONS 2 +-- case +alter table t SPLIT BETWEEN (0) AND (1000000) REGIONS 3 diff --git a/parser/testdata/parser/split_partition/output.sql b/parser/testdata/parser/split_partition/output.sql new file mode 100644 index 0000000..426fbf7 --- /dev/null +++ b/parser/testdata/parser/split_partition/output.sql @@ -0,0 +1,11 @@ +CREATE TABLE `t` (`id` BIGINT,`user_id` BIGINT,`action_type` VARCHAR(20),PRIMARY KEY(`id`),INDEX `idx_user_id`(`user_id`)) SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX `idx_user_id` BETWEEN (1000) AND (100000) REGIONS 3 +-- case +ALTER TABLE `t` SPLIT PRIMARY KEY BETWEEN (0) AND (1000000) REGIONS 4 +-- case +ALTER TABLE `t` SPLIT INDEX `ss` BETWEEN (0) AND (1000000) REGIONS 3 +-- case +CREATE TABLE `t` (`id` BIGINT) SPLIT BETWEEN (0) AND (1000000) REGIONS 4 +-- case +CREATE TABLE `t` (`id` BIGINT,INDEX `idx`(`id`)) SPLIT BETWEEN (0) AND (1000000) REGIONS 4 SPLIT INDEX `idx` BETWEEN (0) AND (1000000) REGIONS 2 +-- case +ALTER TABLE `t` SPLIT BETWEEN (0) AND (1000000) REGIONS 3 diff --git a/parser/testdata/parser/sql_result/input.sql b/parser/testdata/parser/sql_result/input.sql new file mode 100644 index 0000000..7f1a012 --- /dev/null +++ b/parser/testdata/parser/sql_result/input.sql @@ -0,0 +1,11 @@ +select SQL_BIG_RESULT c1 from t group by c1 +-- case +select SQL_SMALL_RESULT c1 from t group by c1 +-- case +select SQL_BUFFER_RESULT * from t +-- case +select sql_small_result sql_big_result sql_buffer_result 1 +-- case +select STRAIGHT_JOIN SQL_SMALL_RESULT * from t +-- case +select SQL_CALC_FOUND_ROWS DISTINCT * from t diff --git a/parser/testdata/parser/sql_result/output.sql b/parser/testdata/parser/sql_result/output.sql new file mode 100644 index 0000000..8edfb42 --- /dev/null +++ b/parser/testdata/parser/sql_result/output.sql @@ -0,0 +1,11 @@ +SELECT SQL_BIG_RESULT `c1` FROM `t` GROUP BY `c1` +-- case +SELECT SQL_SMALL_RESULT `c1` FROM `t` GROUP BY `c1` +-- case +SELECT SQL_BUFFER_RESULT * FROM `t` +-- case +SELECT SQL_SMALL_RESULT SQL_BIG_RESULT SQL_BUFFER_RESULT 1 +-- case +SELECT SQL_SMALL_RESULT STRAIGHT_JOIN * FROM `t` +-- case +SELECT SQL_CALC_FOUND_ROWS DISTINCT * FROM `t` diff --git a/parser/testdata/parser/start_transaction/input.sql b/parser/testdata/parser/start_transaction/input.sql new file mode 100644 index 0000000..d7822ed --- /dev/null +++ b/parser/testdata/parser/start_transaction/input.sql @@ -0,0 +1,19 @@ +START TRANSACTION READ WRITE +-- case +START TRANSACTION WITH CONSISTENT SNAPSHOT +-- case +START TRANSACTION WITH CAUSAL CONSISTENCY ONLY +-- case +START TRANSACTION READ ONLY +-- case +START TRANSACTION READ ONLY AS OF +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP '2015-09-21 00:07:01' +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', '2021-04-27 11:26:13') diff --git a/parser/testdata/parser/start_transaction/output.sql b/parser/testdata/parser/start_transaction/output.sql new file mode 100644 index 0000000..4b9c012 --- /dev/null +++ b/parser/testdata/parser/start_transaction/output.sql @@ -0,0 +1,19 @@ +START TRANSACTION +-- case +START TRANSACTION +-- case +START TRANSACTION WITH CAUSAL CONSISTENCY ONLY +-- case +START TRANSACTION READ ONLY +-- case +-- error: line 1 column 33 near "" +-- case +-- error: line 1 column 43 near "" +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP _UTF8MB4'2015-09-21 00:07:01' +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13') diff --git a/parser/testdata/parser/statistics_ops/input.sql b/parser/testdata/parser/statistics_ops/input.sql new file mode 100644 index 0000000..678994b --- /dev/null +++ b/parser/testdata/parser/statistics_ops/input.sql @@ -0,0 +1,19 @@ +create statistics stats1 (cardinality) on t(a,b,c) +-- case +create statistics stats2 (dependency) on t(a,b) +-- case +create statistics stats3 (correlation) on t(a,b) +-- case +create statistics stats3 on t(a,b) +-- case +create statistics if not exists stats1 (cardinality) on t(a,b,c) +-- case +create statistics if not exists stats2 (dependency) on t(a,b) +-- case +create statistics if not exists stats3 (correlation) on t(a,b) +-- case +create statistics if not exists stats3 on t(a,b) +-- case +create statistics stats1(cardinality) on t(a,b,c) +-- case +drop statistics stats1 diff --git a/parser/testdata/parser/statistics_ops/output.sql b/parser/testdata/parser/statistics_ops/output.sql new file mode 100644 index 0000000..ab32230 --- /dev/null +++ b/parser/testdata/parser/statistics_ops/output.sql @@ -0,0 +1,19 @@ +CREATE STATISTICS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`) +-- case +CREATE STATISTICS `stats2` (DEPENDENCY) ON `t`(`a`, `b`) +-- case +CREATE STATISTICS `stats3` (CORRELATION) ON `t`(`a`, `b`) +-- case +-- error: line 1 column 27 near "on t(a,b)" +-- case +CREATE STATISTICS IF NOT EXISTS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`) +-- case +CREATE STATISTICS IF NOT EXISTS `stats2` (DEPENDENCY) ON `t`(`a`, `b`) +-- case +CREATE STATISTICS IF NOT EXISTS `stats3` (CORRELATION) ON `t`(`a`, `b`) +-- case +-- error: line 1 column 41 near "on t(a,b)" +-- case +CREATE STATISTICS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`) +-- case +DROP STATISTICS `stats1` diff --git a/parser/testdata/parser/subquery/input.sql b/parser/testdata/parser/subquery/input.sql new file mode 100644 index 0000000..8f31f13 --- /dev/null +++ b/parser/testdata/parser/subquery/input.sql @@ -0,0 +1,51 @@ +SELECT 1 > (select 1) +-- case +SELECT 1 > ANY (select 1) +-- case +SELECT 1 > ALL (select 1) +-- case +SELECT 1 > SOME (select 1) +-- case +SELECT EXISTS select 1 +-- case +SELECT EXISTS (select 1) +-- case +SELECT + EXISTS (select 1) +-- case +SELECT - EXISTS (select 1) +-- case +SELECT NOT EXISTS (select 1) +-- case +SELECT + NOT EXISTS (select 1) +-- case +SELECT - NOT EXISTS (select 1) +-- case +SELECT * FROM t where t.a in (select a from t limit 1, 10) +-- case +SELECT * FROM t where t.a in ((select a from t limit 1, 10)) +-- case +SELECT * FROM t where t.a in ((select a from t limit 1, 10), 1) +-- case +select * from ((select a from t) t1 join t t2) join t3 +-- case +SELECT t1.a AS a FROM ((SELECT a FROM t) AS t1) +-- case +select count(*) from (select a, b from x1 union all select a, b from x3 union all (select x1.a, x3.b from (select * from x3 union all select * from x2) x3 left join x1 on x3.a = x1.b)) +-- case +(SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2) +-- case +((select * from t1)) union (select * from t1) +-- case +(((select * from t1))) union (select * from t1) +-- case +select * from (((select * from t1)) union (select * from t1) union (select * from t1)) a +-- case +SELECT COUNT(*) FROM plan_executions WHERE (EXISTS((SELECT * FROM triggers WHERE plan_executions.trigger_id=triggers.id AND triggers.type='CRON'))) +-- case +select exists((select 1)); +-- case +select * from ((SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)) t order by a,b +-- case +select (select * from t1 where a != t.a union all (select * from t2 where a != t.a) order by a limit 1) from t1 t +-- case +(WITH v0 AS (SELECT TRUE) (SELECT 'abc' EXCEPT (SELECT TRUE))) diff --git a/parser/testdata/parser/subquery/output.sql b/parser/testdata/parser/subquery/output.sql new file mode 100644 index 0000000..be9bd84 --- /dev/null +++ b/parser/testdata/parser/subquery/output.sql @@ -0,0 +1,51 @@ +SELECT 1>(SELECT 1) +-- case +SELECT 1>ANY (SELECT 1) +-- case +SELECT 1>ALL (SELECT 1) +-- case +SELECT 1>ANY (SELECT 1) +-- case +-- error: line 1 column 20 near "select 1" +-- case +SELECT EXISTS (SELECT 1) +-- case +SELECT +EXISTS (SELECT 1) +-- case +SELECT -EXISTS (SELECT 1) +-- case +SELECT NOT EXISTS (SELECT 1) +-- case +-- error: line 1 column 12 near "NOT EXISTS (select 1)" +-- case +-- error: line 1 column 12 near "NOT EXISTS (select 1)" +-- case +SELECT * FROM `t` WHERE `t`.`a` IN (SELECT `a` FROM `t` LIMIT 1,10) +-- case +SELECT * FROM `t` WHERE `t`.`a` IN ((SELECT `a` FROM `t` LIMIT 1,10)) +-- case +SELECT * FROM `t` WHERE `t`.`a` IN ((SELECT `a` FROM `t` LIMIT 1,10),1) +-- case +SELECT * FROM ((SELECT `a` FROM `t`) AS `t1` JOIN `t` AS `t2`) JOIN `t3` +-- case +SELECT `t1`.`a` AS `a` FROM (SELECT `a` FROM `t`) AS `t1` +-- case +SELECT COUNT(1) FROM (SELECT `a`,`b` FROM `x1` UNION ALL SELECT `a`,`b` FROM `x3` UNION ALL (SELECT `x1`.`a`,`x3`.`b` FROM (SELECT * FROM `x3` UNION ALL SELECT * FROM `x2`) AS `x3` LEFT JOIN `x1` ON `x3`.`a`=`x1`.`b`)) +-- case +(SELECT 1 AS `a`,3 AS `b`) UNION (SELECT 2,1) ORDER BY (SELECT 2) +-- case +(SELECT * FROM `t1`) UNION (SELECT * FROM `t1`) +-- case +(SELECT * FROM `t1`) UNION (SELECT * FROM `t1`) +-- case +SELECT * FROM ((SELECT * FROM `t1`) UNION (SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)) AS `a` +-- case +SELECT COUNT(1) FROM `plan_executions` WHERE (EXISTS (SELECT * FROM `triggers` WHERE `plan_executions`.`trigger_id`=`triggers`.`id` AND `triggers`.`type`=_UTF8MB4'CRON')) +-- case +SELECT EXISTS (SELECT 1) +-- case +SELECT * FROM ((SELECT 1 AS `a`,3 AS `b`) UNION (SELECT 2,1) ORDER BY (SELECT 2)) AS `t` ORDER BY `a`,`b` +-- case +SELECT (SELECT * FROM `t1` WHERE `a`!=`t`.`a` UNION ALL (SELECT * FROM `t2` WHERE `a`!=`t`.`a`) ORDER BY `a` LIMIT 1) FROM `t1` AS `t` +-- case +WITH `v0` AS (SELECT TRUE) (SELECT _UTF8MB4'abc' EXCEPT (SELECT TRUE)) diff --git a/parser/testdata/parser/table_affinity_option/input.sql b/parser/testdata/parser/table_affinity_option/input.sql new file mode 100644 index 0000000..6bc6c3c --- /dev/null +++ b/parser/testdata/parser/table_affinity_option/input.sql @@ -0,0 +1,27 @@ +create table t (a int) AFFINITY = 'table' +-- case +create table t (a int) affinity 'TABLE' +-- case +create table t (a int) affinity 'partition' +-- case +create table t (a int) AFFINITY = '' +-- case +create table t (a int) AFFINITY 'none' +-- case +create table t (a int) AFFINITY 'PARTITION' partition by hash ( a ) PARTITIONS 1 +-- case +create table t (a int) /*T![affinity] AFFINITY = 'table'*/ +-- case +create table t (a int) AFFINITY 'abcd' +-- case +alter table t AFFINITY = 'table' +-- case +alter table t affinity 'TABLE' +-- case +alter table t /*T![affinity] affinity 'table'*/ +-- case +create table t (a int) AFFINITY 1 +-- case +create table t (a int) AFFINITY = 1 +-- case +create table t (a int) AFFINITY diff --git a/parser/testdata/parser/table_affinity_option/output.sql b/parser/testdata/parser/table_affinity_option/output.sql new file mode 100644 index 0000000..45036c2 --- /dev/null +++ b/parser/testdata/parser/table_affinity_option/output.sql @@ -0,0 +1,27 @@ +CREATE TABLE `t` (`a` INT) AFFINITY = 'table' +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = 'TABLE' +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = 'partition' +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = '' +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = 'none' +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = 'PARTITION' PARTITION BY HASH (`a`) PARTITIONS 1 +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = 'table' +-- case +CREATE TABLE `t` (`a` INT) AFFINITY = 'abcd' +-- case +ALTER TABLE `t` AFFINITY = 'table' +-- case +ALTER TABLE `t` AFFINITY = 'TABLE' +-- case +ALTER TABLE `t` AFFINITY = 'table' +-- case +-- error: line 1 column 33 near "1" +-- case +-- error: line 1 column 35 near "1" +-- case +-- error: line 1 column 31 near "" diff --git a/parser/testdata/parser/table_partition/input.sql b/parser/testdata/parser/table_partition/input.sql new file mode 100644 index 0000000..fd9f533 --- /dev/null +++ b/parser/testdata/parser/table_partition/input.sql @@ -0,0 +1,262 @@ +ALTER TABLE t1 TRUNCATE PARTITION p0 +-- case +ALTER TABLE t1 TRUNCATE PARTITION p0, p1 +-- case +ALTER TABLE t1 TRUNCATE PARTITION ALL +-- case +ALTER TABLE t1 TRUNCATE PARTITION ALL, p0 +-- case +ALTER TABLE t1 TRUNCATE PARTITION p0, ALL +-- case +ALTER TABLE t1 OPTIMIZE PARTITION p0 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION NO_WRITE_TO_BINLOG p0 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION LOCAL p0 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION p0, p1 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION NO_WRITE_TO_BINLOG p0, p1 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION LOCAL p0, p1 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION ALL +-- case +ALTER TABLE t1 OPTIMIZE PARTITION NO_WRITE_TO_BINLOG ALL +-- case +ALTER TABLE t1 OPTIMIZE PARTITION LOCAL ALL +-- case +ALTER TABLE t1 OPTIMIZE PARTITION ALL, p0 +-- case +ALTER TABLE t1 OPTIMIZE PARTITION p0, ALL +-- case +ALTER TABLE t_n OPTIMIZE PARTITION LOCAL +-- case +ALTER TABLE t_n OPTIMIZE PARTITION LOCAL local +-- case +ALTER TABLE t_n OPTIMIZE PARTITION LOCAL local, local +-- case +ALTER TABLE t1 REPAIR PARTITION p0 +-- case +ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG p0 +-- case +ALTER TABLE t1 REPAIR PARTITION LOCAL p0 +-- case +ALTER TABLE t1 REPAIR PARTITION p0, p1 +-- case +ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG p0, p1 +-- case +ALTER TABLE t1 REPAIR PARTITION LOCAL p0, p1 +-- case +ALTER TABLE t1 REPAIR PARTITION ALL +-- case +ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG ALL +-- case +ALTER TABLE t1 REPAIR PARTITION LOCAL ALL +-- case +ALTER TABLE t1 REPAIR PARTITION ALL, p0 +-- case +ALTER TABLE t1 REPAIR PARTITION p0, ALL +-- case +ALTER TABLE t_n REPAIR PARTITION LOCAL +-- case +ALTER TABLE t_n REPAIR PARTITION LOCAL local +-- case +ALTER TABLE t_n REPAIR PARTITION LOCAL local, local +-- case +ALTER TABLE t1 IMPORT PARTITION p0 TABLESPACE +-- case +ALTER TABLE t1 IMPORT PARTITION p0, p1 TABLESPACE +-- case +ALTER TABLE t1 IMPORT PARTITION ALL TABLESPACE +-- case +ALTER TABLE t1 IMPORT PARTITION ALL, p0 TABLESPACE +-- case +ALTER TABLE t1 IMPORT PARTITION p0, ALL TABLESPACE +-- case +ALTER TABLE t1 DISCARD PARTITION p0 TABLESPACE +-- case +ALTER TABLE t1 DISCARD PARTITION p0, p1 TABLESPACE +-- case +ALTER TABLE t1 DISCARD PARTITION ALL TABLESPACE +-- case +ALTER TABLE t1 DISCARD PARTITION ALL, p0 TABLESPACE +-- case +ALTER TABLE t1 DISCARD PARTITION p0, ALL TABLESPACE +-- case +ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT 'APSTART \' APEND') +-- case +ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'xxx') +-- case +CREATE TABLE t1 (a int not null,b int not null,c int not null,primary key(a,b)) + partition by range (a) + partitions 3 + (partition x1 values less than (5), + partition x2 values less than (10), + partition x3 values less than maxvalue); +-- case +CREATE TABLE t1 (a int not null) partition by range (a) (partition x1 values less than (5) tablespace ts1) +-- case +create table t (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM, + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE MyISAM) +-- case +create table t (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM COMMENT 'xxx', + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM) +-- case +create table t1 (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) COMMENT 'xxx' ENGINE = MyISAM , + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM) +-- case +create table t (id int) + partition by range (id) + subpartition by key (id) subpartitions 2 + (partition p0 values less than (42)) +-- case +create table t (id int) + partition by range (id) + subpartition by hash (id) + (partition p0 values less than (42)) +-- case +create table t1 (a varchar(5), b int signed, c varchar(10), d datetime) + partition by range columns(b,c) + subpartition by hash(to_seconds(d)) + ( partition p0 values less than (2, 'b'), + partition p1 values less than (4, 'd'), + partition p2 values less than (10, 'za')); +-- case +CREATE TABLE t1 (a INT, b TIMESTAMP DEFAULT '0000-00-00 00:00:00') +ENGINE=INNODB PARTITION BY LINEAR HASH (a) PARTITIONS 1; +-- case +create table t1 (a int) partition by hash (a) (partition x, partition y) +-- case +create table t1 (a int) partition by key (a) (partition x, partition y) +-- case +create table t1 (a int) partition by range (a) (partition x, partition y) +-- case +create table t1 (a int) partition by list (a) (partition x, partition y) +-- case +create table t1 (a int) partition by system_time (partition x, partition y) +-- case +create table t1 (a int) partition by hash (a) (partition x values less than (10)) +-- case +create table t1 (a int) partition by key (a) (partition x values less than (10)) +-- case +create table t1 (a int) partition by range (a) (partition x values less than (maxvalue)) +-- case +create table t1 (a int) partition by range (a) (partition x values less than (default)) +-- case +create table t (a varchar(100), b int) partition by list columns (a) (partition p1 values in ('a','b','DEFAULT'), partition pDef values in (default)) +-- case +create table t1 (a int) partition by range (a) (partition x values less than (10)) +-- case +create table t1 (a int) partition by list (a) (partition x values less than (10)) +-- case +create table t1 (a int) partition by system_time (partition x values less than (10)) +-- case +create table t1 (a int) partition by hash (a) (partition x values in (10)) +-- case +create table t1 (a int) partition by key (a) (partition x values in (10)) +-- case +create table t1 (a int) partition by range (a) (partition x values in (10)) +-- case +create table t1 (a int) partition by list (a) (partition x values in (10)) +-- case +create table t1 (a int) partition by list (a) (partition x values in (default)) +-- case +create table t1 (a int) partition by list (a) (partition x values in (maxvalue)) +-- case +create table t1 (a int) partition by list (a) (partition x values in (default, 10)) +-- case +create table t1 (a int) partition by system_time (partition x values in (10)) +-- case +create table t1 (a int) partition by hash (a) (partition x history, partition y current) +-- case +create table t1 (a int) partition by key (a) (partition x history, partition y current) +-- case +create table t1 (a int) partition by range (a) (partition x history, partition y current) +-- case +create table t1 (a int) partition by list (a) (partition x history, partition y current) +-- case +create table t1 (a int) partition by system_time (partition x history, partition y current) +-- case +create table t1 (a int) partition by hash (a) +-- case +create table t1 (a int) partition by key (a) +-- case +create table t1 (a int) partition by range (a) +-- case +create table t1 (a int) partition by list (a) +-- case +create table t1 (a int) partition by system_time +-- case +create table t1 (a int) partition by system_time (partition x history) +-- case +create table t1 (a int) partition by system_time (partition x current) +-- case +create table t1 (a int, b int) partition by range (a) (partition x values less than (10, 20)) +-- case +create table t (id int) partition by range columns (id) (partition p0 values less than (1, 2)) +-- case +create table t1 (a int, b int) partition by range columns (a, b) (partition x values less than (10, 20)) +-- case +create table t1 (a int, b int) partition by range columns (a, b) (partition x values less than (10)) +-- case +create table t1 (a int, b int) partition by range columns (a, b) (partition x values less than maxvalue) +-- case +create table t1 (a int, b int) partition by list (a) (partition x values in ((10, 20))) +-- case +create table t1 (a int, b int) partition by list columns (a, b) (partition x values in ((10, 20))) +-- case +create table t1 (a int, b int) partition by list columns (a, b) (partition x values in (10, 20)) +-- case +create table t1 (a int, b int) partition by list columns (a, b) (partition x values in (10, (20, 30))) +-- case +create table t1 (a int, b int) partition by list columns (a, b) (partition x values in ((10, 20), 30)) +-- case +create table t1 (a int, b int) partition by list columns (a, b) (partition x values in ((10, 20), (30, 40, 50))) +-- case +create table t1 (a int) partition by hash (a) () +-- case +create table t1 (a int primary key) partition by key () +-- case +create table t1 (a int) partition by range columns () (partition x values less than maxvalue) +-- case +create table t1 (a int) partition by list columns () (partition x default) +-- case +create table t1 (a int) partition by range (a) (partition x values less than ()) +-- case +create table t1 (a int) partition by list (a) (partition x values in ()) +-- case +create table t1 (a int) partition by list (a) (partition x default) +-- case +create table t1 (a int, b int) partition by range (a) subpartition by range (b) (partition x values less than maxvalue) +-- case +create table t1 (a int) partition by hash (a) partitions 2 (partition x) +-- case +create table t1 (a int) partition by hash (a) partitions 2 (partition x, partition y) +-- case +create table t1 (a int, b int) partition by range (a) subpartition by hash (b) subpartitions 2 (partition x values less than maxvalue (subpartition y)) +-- case +create table t1 (a int, b int) partition by range (a) subpartition by hash (b) subpartitions 2 (partition x values less than maxvalue (subpartition y, subpartition z)) +-- case +create table t1 (a int, b int) partition by range (a) subpartition by hash (b) (partition x values less than (10) (subpartition y,subpartition z),partition a values less than (20) (subpartition b,subpartition c)) +-- case +create table t1 (a int, b int) partition by range (a) subpartition by hash (b) (partition x values less than (10) (subpartition y),partition a values less than (20) (subpartition b,subpartition c)) +-- case +create table t1 (a int, b int) partition by range (a) (partition x values less than (10) (subpartition y)) +-- case +create table t1 (a int) partition by hash (a) partitions 0 +-- case +create table t1 (a int, b int) partition by range (a) subpartition by hash (b) subpartitions 0 (partition x values less than (10)) +-- case +create table t1 (a int) partition by system_time interval 7 day limit 50000 (partition x history, partition y current) +-- case +create table t1 (a int) partition by system_time interval 7 day (partition x history, partition y current) +-- case +create table t1 (a int) partition by system_time limit 50000 (partition x history, partition y current) +-- case +create table t1 (a int) partition by hash(a) (partition x engine InnoDB comment 'xxxx' data directory '/var/data' index directory '/var/index' max_rows 70000 min_rows 50 tablespace `innodb_file_per_table` nodegroup 255) +-- case +create table t1 (a int, b int) partition by range(a) subpartition by hash(b) (partition x values less than maxvalue (subpartition y engine InnoDB comment 'xxxx' data directory '/var/data' index directory '/var/index' max_rows 70000 min_rows 50 tablespace `innodb_file_per_table` nodegroup 255)) diff --git a/parser/testdata/parser/table_partition/output.sql b/parser/testdata/parser/table_partition/output.sql new file mode 100644 index 0000000..9ebb1d0 --- /dev/null +++ b/parser/testdata/parser/table_partition/output.sql @@ -0,0 +1,239 @@ +ALTER TABLE `t1` TRUNCATE PARTITION `p0` +-- case +ALTER TABLE `t1` TRUNCATE PARTITION `p0`,`p1` +-- case +ALTER TABLE `t1` TRUNCATE PARTITION ALL +-- case +-- error: line 1 column 41 near "p0" +-- case +-- error: line 1 column 41 near "ALL" +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION `p0` +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0` +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0` +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION `p0`,`p1` +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0`,`p1` +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `p0`,`p1` +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION ALL +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG ALL +-- case +ALTER TABLE `t1` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG ALL +-- case +-- error: line 1 column 41 near "p0" +-- case +-- error: line 1 column 41 near "ALL" +-- case +-- error: line 1 column 40 near "" +-- case +ALTER TABLE `t_n` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `local` +-- case +ALTER TABLE `t_n` OPTIMIZE PARTITION NO_WRITE_TO_BINLOG `local`,`local` +-- case +ALTER TABLE `t1` REPAIR PARTITION `p0` +-- case +ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0` +-- case +ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0` +-- case +ALTER TABLE `t1` REPAIR PARTITION `p0`,`p1` +-- case +ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0`,`p1` +-- case +ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG `p0`,`p1` +-- case +ALTER TABLE `t1` REPAIR PARTITION ALL +-- case +ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG ALL +-- case +ALTER TABLE `t1` REPAIR PARTITION NO_WRITE_TO_BINLOG ALL +-- case +-- error: line 1 column 39 near "p0" +-- case +-- error: line 1 column 39 near "ALL" +-- case +-- error: line 1 column 38 near "" +-- case +ALTER TABLE `t_n` REPAIR PARTITION NO_WRITE_TO_BINLOG `local` +-- case +ALTER TABLE `t_n` REPAIR PARTITION NO_WRITE_TO_BINLOG `local`,`local` +-- case +ALTER TABLE `t1` IMPORT PARTITION `p0` TABLESPACE +-- case +ALTER TABLE `t1` IMPORT PARTITION `p0`,`p1` TABLESPACE +-- case +ALTER TABLE `t1` IMPORT PARTITION ALL TABLESPACE +-- case +-- error: line 1 column 36 near ", p0 TABLESPACE" +-- case +-- error: line 1 column 39 near "ALL TABLESPACE" +-- case +ALTER TABLE `t1` DISCARD PARTITION `p0` TABLESPACE +-- case +ALTER TABLE `t1` DISCARD PARTITION `p0`,`p1` TABLESPACE +-- case +ALTER TABLE `t1` DISCARD PARTITION ALL TABLESPACE +-- case +-- error: line 1 column 37 near ", p0 TABLESPACE" +-- case +-- error: line 1 column 40 near "ALL TABLESPACE" +-- case +ALTER TABLE `t1` ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'APSTART '' APEND') +-- case +ALTER TABLE `t1` ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'xxx') +-- case +CREATE TABLE `t1` (`a` INT NOT NULL,`b` INT NOT NULL,`c` INT NOT NULL,PRIMARY KEY(`a`, `b`)) PARTITION BY RANGE (`a`) (PARTITION `x1` VALUES LESS THAN (5),PARTITION `x2` VALUES LESS THAN (10),PARTITION `x3` VALUES LESS THAN (MAXVALUE)) +-- case +CREATE TABLE `t1` (`a` INT NOT NULL) PARTITION BY RANGE (`a`) (PARTITION `x1` VALUES LESS THAN (5) TABLESPACE = `ts1`) +-- case +CREATE TABLE `t` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (63340531200) ENGINE = MyISAM,PARTITION `p1` VALUES LESS THAN (63342604800) ENGINE = MyISAM) +-- case +CREATE TABLE `t` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (63340531200) ENGINE = MyISAM COMMENT = 'xxx',PARTITION `p1` VALUES LESS THAN (63342604800) ENGINE = MyISAM) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `p0` VALUES LESS THAN (63340531200) COMMENT = 'xxx' ENGINE = MyISAM,PARTITION `p1` VALUES LESS THAN (63342604800) ENGINE = MyISAM) +-- case +CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) SUBPARTITION BY KEY (`id`) SUBPARTITIONS 2 (PARTITION `p0` VALUES LESS THAN (42)) +-- case +CREATE TABLE `t` (`id` INT) PARTITION BY RANGE (`id`) SUBPARTITION BY HASH (`id`) (PARTITION `p0` VALUES LESS THAN (42)) +-- case +CREATE TABLE `t1` (`a` VARCHAR(5),`b` INT,`c` VARCHAR(10),`d` DATETIME) PARTITION BY RANGE COLUMNS (`b`,`c`) SUBPARTITION BY HASH (TO_SECONDS(`d`)) (PARTITION `p0` VALUES LESS THAN (2, _UTF8MB4'b'),PARTITION `p1` VALUES LESS THAN (4, _UTF8MB4'd'),PARTITION `p2` VALUES LESS THAN (10, _UTF8MB4'za')) +-- case +CREATE TABLE `t1` (`a` INT,`b` TIMESTAMP DEFAULT _UTF8MB4'0000-00-00 00:00:00') ENGINE = INNODB PARTITION BY LINEAR HASH (`a`) PARTITIONS 1 +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) (PARTITION `x`,PARTITION `y`) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY KEY (`a`) (PARTITION `x`,PARTITION `y`) +-- case +-- error: [ddl:1479]Syntax : RANGE PARTITIONING requires definition of VALUES LESS THAN for each partition +-- case +-- error: [ddl:1479]Syntax : LIST PARTITIONING requires definition of VALUES IN for each partition +-- case +-- error: [ddl:4128]Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT +-- case +-- error: [ddl:1480]Only RANGE PARTITIONING can use VALUES LESS THAN in partition definition +-- case +-- error: [ddl:1480]Only RANGE PARTITIONING can use VALUES LESS THAN in partition definition +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `x` VALUES LESS THAN (MAXVALUE)) +-- case +-- error: line 1 column 86 near "))" +-- case +CREATE TABLE `t` (`a` VARCHAR(100),`b` INT) PARTITION BY LIST COLUMNS (`a`) (PARTITION `p1` VALUES IN (_UTF8MB4'a', _UTF8MB4'b', _UTF8MB4'DEFAULT'),PARTITION `pDef` DEFAULT) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY RANGE (`a`) (PARTITION `x` VALUES LESS THAN (10)) +-- case +-- error: [ddl:1480]Only RANGE PARTITIONING can use VALUES LESS THAN in partition definition +-- case +-- error: [ddl:4128]Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT +-- case +-- error: [ddl:1480]Only LIST PARTITIONING can use VALUES IN in partition definition +-- case +-- error: [ddl:1480]Only LIST PARTITIONING can use VALUES IN in partition definition +-- case +-- error: [ddl:1480]Only LIST PARTITIONING can use VALUES IN in partition definition +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` VALUES IN (10)) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` DEFAULT) +-- case +-- error: line 1 column 78 near "maxvalue))" +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` VALUES IN (DEFAULT, 10)) +-- case +-- error: [ddl:4128]Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT +-- case +-- error: [ddl:4113]Wrong partitioning type, expected type: `SYSTEM_TIME` +-- case +-- error: [ddl:4113]Wrong partitioning type, expected type: `SYSTEM_TIME` +-- case +-- error: [ddl:4113]Wrong partitioning type, expected type: `SYSTEM_TIME` +-- case +-- error: [ddl:4113]Wrong partitioning type, expected type: `SYSTEM_TIME` +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY SYSTEM_TIME (PARTITION `x` HISTORY,PARTITION `y` CURRENT) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) PARTITIONS 1 +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY KEY (`a`) PARTITIONS 1 +-- case +-- error: [ddl:1492]For RANGE partitions each partition must be defined +-- case +-- error: [ddl:1492]For LIST partitions each partition must be defined +-- case +-- error: [ddl:4128]Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT +-- case +-- error: [ddl:4128]Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT +-- case +-- error: [ddl:4128]Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT +-- case +-- error: [ddl:1657]Cannot have more than one value for this type of RANGE partitioning +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE COLUMNS (`a`,`b`) (PARTITION `x` VALUES LESS THAN (10, 20)) +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +-- error: [ddl:1658]Row expressions in VALUES IN only allowed for multi-field column partitioning +-- case +CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY LIST COLUMNS (`a`,`b`) (PARTITION `x` VALUES IN ((10, 20))) +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +-- error: [ddl:1653]Inconsistency in usage of column lists for partitioning +-- case +-- error: line 1 column 48 near ")" +-- case +CREATE TABLE `t1` (`a` INT PRIMARY KEY) PARTITION BY KEY () PARTITIONS 1 +-- case +-- error: line 1 column 53 near ") (partition x values less than maxvalue)" +-- case +-- error: line 1 column 52 near ") (partition x default)" +-- case +-- error: line 1 column 79 near "))" +-- case +-- error: line 1 column 71 near "))" +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY LIST (`a`) (PARTITION `x` DEFAULT) +-- case +-- error: line 1 column 75 near "range (b) (partition x values less than maxvalue)" +-- case +-- error: [ddl:1484]Wrong number of partitions defined, mismatch with previous setting +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) (PARTITION `x`,PARTITION `y`) +-- case +-- error: [ddl:1485]Wrong number of subpartitions defined, mismatch with previous setting +-- case +CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 2 (PARTITION `x` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `y`,SUBPARTITION `z`)) +-- case +CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 2 (PARTITION `x` VALUES LESS THAN (10) (SUBPARTITION `y`,SUBPARTITION `z`),PARTITION `a` VALUES LESS THAN (20) (SUBPARTITION `b`,SUBPARTITION `c`)) +-- case +-- error: [ddl:1485]Wrong number of subpartitions defined, mismatch with previous setting +-- case +-- error: [ddl:1500]It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning +-- case +-- error: [ddl:1504]Number of partitions = 0 is not an allowed value +-- case +-- error: [ddl:1504]Number of subpartitions = 0 is not an allowed value +-- case +-- error: line 1 column 69 near "limit 50000 (partition x history, partition y current)" +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY SYSTEM_TIME INTERVAL 7 DAY (PARTITION `x` HISTORY,PARTITION `y` CURRENT) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY SYSTEM_TIME LIMIT 50000 (PARTITION `x` HISTORY,PARTITION `y` CURRENT) +-- case +CREATE TABLE `t1` (`a` INT) PARTITION BY HASH (`a`) (PARTITION `x` ENGINE = InnoDB COMMENT = 'xxxx' DATA DIRECTORY = '/var/data' INDEX DIRECTORY = '/var/index' MAX_ROWS = 70000 MIN_ROWS = 50 TABLESPACE = `innodb_file_per_table` NODEGROUP = 255) +-- case +CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 1 (PARTITION `x` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `y` ENGINE = InnoDB COMMENT = 'xxxx' DATA DIRECTORY = '/var/data' INDEX DIRECTORY = '/var/index' MAX_ROWS = 70000 MIN_ROWS = 50 TABLESPACE = `innodb_file_per_table` NODEGROUP = 255)) diff --git a/parser/testdata/parser/table_sample/input.sql b/parser/testdata/parser/table_sample/input.sql new file mode 100644 index 0000000..3f75666 --- /dev/null +++ b/parser/testdata/parser/table_sample/input.sql @@ -0,0 +1,57 @@ +select * from tbl tablesample system (50); +-- case +select * from tbl tablesample system (50 percent); +-- case +select * from tbl tablesample system (49.9 percent); +-- case +select * from tbl tablesample system (120 rows); +-- case +select * from tbl tablesample bernoulli (50); +-- case +select * from tbl tablesample (50); +-- case +select * from tbl tablesample (50) repeatable (123456789); +-- case +select * from tbl as a tablesample (50); +-- case +select * from tbl `tablesample` tablesample (50); +-- case +select * from tbl tablesample (50) where id > 20; +-- case +select * from tbl partition (p0) tablesample (50); +-- case +select * from tbl tablesample (0 percent); +-- case +select * from tbl tablesample (100 percent); +-- case +select * from tbl tablesample (0 rows); +-- case +select * from tbl tablesample ('34'); +-- case +select * from tbl1 tablesample (10), tbl2 tablesample (20); +-- case +select * from tbl1 a tablesample (10) join tbl2 b tablesample (20) on a.id <> b.id; +-- case +select * from demo tablesample bernoulli(50) limit 1 into outfile '/tmp/sample.csv'; +-- case +select * from demo tablesample bernoulli(50) order by a, b into outfile '/tmp/sample.csv'; +-- case +select * from tbl tablesample system(50) a; +-- case +select * from tbl tablesample (50) partition (p0); +-- case +select * from tbl where id > 20 tablesample system(50); +-- case +select * from (select * from tbl) a tablesample system(50); +-- case +select * from tbl tablesample system(50) tablesample system(50); +-- case +select * from tbl tablesample system(50, 50); +-- case +select * from tbl tablesample dhfksdlfljcoew(50); +-- case +select * from tbl tablesample system; +-- case +select * from tbl tablesample system (33) repeatable; +-- case +select 1 from dual tablesample system (50); diff --git a/parser/testdata/parser/table_sample/output.sql b/parser/testdata/parser/table_sample/output.sql new file mode 100644 index 0000000..0175547 --- /dev/null +++ b/parser/testdata/parser/table_sample/output.sql @@ -0,0 +1,57 @@ +SELECT * FROM `tbl` TABLESAMPLE SYSTEM (50) +-- case +SELECT * FROM `tbl` TABLESAMPLE SYSTEM (50 PERCENT) +-- case +SELECT * FROM `tbl` TABLESAMPLE SYSTEM (49.9 PERCENT) +-- case +SELECT * FROM `tbl` TABLESAMPLE SYSTEM (120 ROWS) +-- case +SELECT * FROM `tbl` TABLESAMPLE BERNOULLI (50) +-- case +SELECT * FROM `tbl` TABLESAMPLE (50) +-- case +SELECT * FROM `tbl` TABLESAMPLE (50) REPEATABLE(123456789) +-- case +SELECT * FROM `tbl` AS `a` TABLESAMPLE (50) +-- case +SELECT * FROM `tbl` AS `tablesample` TABLESAMPLE (50) +-- case +SELECT * FROM `tbl` TABLESAMPLE (50) WHERE `id`>20 +-- case +SELECT * FROM `tbl` PARTITION(`p0`) TABLESAMPLE (50) +-- case +SELECT * FROM `tbl` TABLESAMPLE (0 PERCENT) +-- case +SELECT * FROM `tbl` TABLESAMPLE (100 PERCENT) +-- case +SELECT * FROM `tbl` TABLESAMPLE (0 ROWS) +-- case +SELECT * FROM `tbl` TABLESAMPLE (_UTF8MB4'34') +-- case +SELECT * FROM (`tbl1` TABLESAMPLE (10)) JOIN `tbl2` TABLESAMPLE (20) +-- case +SELECT * FROM `tbl1` AS `a` TABLESAMPLE (10) JOIN `tbl2` AS `b` TABLESAMPLE (20) ON `a`.`id`!=`b`.`id` +-- case +SELECT * FROM `demo` TABLESAMPLE BERNOULLI (50) LIMIT 1 INTO OUTFILE '/tmp/sample.csv' +-- case +SELECT * FROM `demo` TABLESAMPLE BERNOULLI (50) ORDER BY `a`,`b` INTO OUTFILE '/tmp/sample.csv' +-- case +-- error: line 1 column 42 near "a;" +-- case +-- error: line 1 column 44 near "partition (p0);" +-- case +-- error: line 1 column 43 near "tablesample system(50);" +-- case +-- error: line 1 column 47 near "tablesample system(50);" +-- case +-- error: line 1 column 52 near "tablesample system(50);" +-- case +-- error: line 1 column 40 near ", 50);" +-- case +-- error: line 1 column 44 near "dhfksdlfljcoew(50);" +-- case +-- error: line 1 column 37 near ";" +-- case +-- error: line 1 column 53 near ";" +-- case +-- error: line 1 column 30 near "tablesample system (50);" diff --git a/parser/testdata/parser/timestamp_diff_unit/input.sql b/parser/testdata/parser/timestamp_diff_unit/input.sql new file mode 100644 index 0000000..96f9ca5 --- /dev/null +++ b/parser/testdata/parser/timestamp_diff_unit/input.sql @@ -0,0 +1,21 @@ +SELECT TIMESTAMPDIFF(SECOND_MICROSECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(MINUTE_MICROSECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(MINUTE_SECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(HOUR_MICROSECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(HOUR_SECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(HOUR_MINUTE,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(DAY_MICROSECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(DAY_SECOND,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(DAY_MINUTE,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(DAY_HOUR,'2003-02-01','2003-05-01') +-- case +SELECT TIMESTAMPDIFF(YEAR_MONTH,'2003-02-01','2003-05-01') diff --git a/parser/testdata/parser/timestamp_diff_unit/output.sql b/parser/testdata/parser/timestamp_diff_unit/output.sql new file mode 100644 index 0000000..8846aa4 --- /dev/null +++ b/parser/testdata/parser/timestamp_diff_unit/output.sql @@ -0,0 +1,21 @@ +-- error: line 1 column 39 near "SECOND_MICROSECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 39 near "MINUTE_MICROSECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 34 near "MINUTE_SECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 37 near "HOUR_MICROSECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 32 near "HOUR_SECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 32 near "HOUR_MINUTE,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 36 near "DAY_MICROSECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 31 near "DAY_SECOND,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 31 near "DAY_MINUTE,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 29 near "DAY_HOUR,'2003-02-01','2003-05-01')" +-- case +-- error: line 1 column 31 near "YEAR_MONTH,'2003-02-01','2003-05-01')" diff --git a/parser/testdata/parser/trace/input.sql b/parser/testdata/parser/trace/input.sql new file mode 100644 index 0000000..757b290 --- /dev/null +++ b/parser/testdata/parser/trace/input.sql @@ -0,0 +1,29 @@ +trace begin +-- case +trace commit +-- case +trace rollback +-- case +trace set a = 1 +-- case +trace select c1 from t1 +-- case +trace delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; +-- case +trace insert into t values (1), (2), (3) +-- case +trace replace into foo values (1 || 2) +-- case +trace update t set id = id + 1 order by id desc; +-- case +trace select c1 from t1 union (select c2 from t2) limit 1, 1 +-- case +trace format = 'row' select c1 from t1 union (select c2 from t2) limit 1, 1 +-- case +trace format = 'json' update t set id = id + 1 order by id desc; +-- case +trace plan select c1 from t1 +-- case +trace plan target = 'estimation' select c1 from t1 +-- case +trace plan target = 'arandomstring' select c1 from t1 diff --git a/parser/testdata/parser/trace/output.sql b/parser/testdata/parser/trace/output.sql new file mode 100644 index 0000000..866aba9 --- /dev/null +++ b/parser/testdata/parser/trace/output.sql @@ -0,0 +1,29 @@ +TRACE START TRANSACTION +-- case +TRACE COMMIT +-- case +TRACE ROLLBACK +-- case +TRACE SET @@SESSION.`a`=1 +-- case +TRACE SELECT `c1` FROM `t1` +-- case +TRACE DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id` +-- case +TRACE INSERT INTO `t` VALUES (1),(2),(3) +-- case +TRACE REPLACE INTO `foo` VALUES (1 OR 2) +-- case +TRACE UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC +-- case +TRACE SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +TRACE SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1 +-- case +TRACE FORMAT = 'json' UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC +-- case +TRACE PLAN SELECT `c1` FROM `t1` +-- case +TRACE PLAN TARGET = 'estimation' SELECT `c1` FROM `t1` +-- case +TRACE PLAN TARGET = 'arandomstring' SELECT `c1` FROM `t1` diff --git a/parser/testdata/parser/ttl_table_option/input.sql b/parser/testdata/parser/ttl_table_option/input.sql new file mode 100644 index 0000000..d1f6013 --- /dev/null +++ b/parser/testdata/parser/ttl_table_option/input.sql @@ -0,0 +1,43 @@ +create table t (created_at datetime) TTL = created_at + INTERVAL 3.1415 YEAR +-- case +create table t (created_at datetime) TTL = created_at + INTERVAL '1 1:1:1' DAY_SECOND +-- case +create table t (created_at datetime) TTL = created_at + INTERVAL 1 YEAR +-- case +create table t (created_at datetime) TTL = created_at + INTERVAL 1 YEAR TTL_ENABLE = 'OFF' +-- case +create table t (created_at datetime) TTL created_at + INTERVAL 1 YEAR TTL_ENABLE 'OFF' +-- case +create table t (created_at datetime) TTL created_at + INTERVAL 1 YEAR TTL_ENABLE 'OFF' TTL_JOB_INTERVAL='8h' +-- case +create table t (created_at datetime) /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON'*/ +-- case +alter table t TTL = created_at + INTERVAL 1 MONTH +-- case +alter table t TTL_ENABLE = 'ON' +-- case +alter table t TTL_ENABLE = 'OFF' +-- case +alter table t TTL = created_at + INTERVAL 1 MONTH TTL_ENABLE 'OFF' +-- case +alter table t TTL = created_at + INTERVAL 1 MONTH TTL_ENABLE 'OFF' TTL_JOB_INTERVAL '1h' +-- case +alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON'*/ +-- case +alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON' TTL_JOB_INTERVAL='8h'*/ +-- case +alter table t /*T![ttl] ttl=created_at + INTERVAL 1 YEAR ttl_enable='ON' TTL_JOB_INTERVAL='8.645124531235h'*/ +-- case +alter table t remove ttl +-- case +create table t (created_at datetime) TTL_ENABLE = 'test_case' +-- case +create table t (created_at datetime) /*T![ttl] TTL_ENABLE = 'test_case' */ +-- case +alter table t /*T![ttl] TTL_ENABLE = 'test_case' */ +-- case +create table t (created_at datetime) TTL_JOB_INTERVAL = '@monthly' +-- case +create table t (created_at datetime) TTL_JOB_INTERVAL = '10hourxx' +-- case +create table t (created_at datetime) TTL_JOB_INTERVAL = '10.10.255h' diff --git a/parser/testdata/parser/ttl_table_option/output.sql b/parser/testdata/parser/ttl_table_option/output.sql new file mode 100644 index 0000000..c3528d3 --- /dev/null +++ b/parser/testdata/parser/ttl_table_option/output.sql @@ -0,0 +1,43 @@ +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 3.1415 YEAR +-- case +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL _UTF8MB4'1 1:1:1' DAY_SECOND +-- case +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR +-- case +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF' +-- case +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF' +-- case +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '8h' +-- case +CREATE TABLE `t` (`created_at` DATETIME) TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' +-- case +ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH +-- case +ALTER TABLE `t` TTL_ENABLE = 'ON' +-- case +ALTER TABLE `t` TTL_ENABLE = 'OFF' +-- case +ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH TTL_ENABLE = 'OFF' +-- case +ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 MONTH TTL_ENABLE = 'OFF' TTL_JOB_INTERVAL = '1h' +-- case +ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' +-- case +ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' TTL_JOB_INTERVAL = '8h' +-- case +ALTER TABLE `t` TTL = `created_at` + INTERVAL 1 YEAR TTL_ENABLE = 'ON' TTL_JOB_INTERVAL = '8.645124531235h' +-- case +ALTER TABLE `t` REMOVE TTL +-- case +-- error: line 1 column 61 near ""The TTL_ENABLE option has to be set 'ON' or 'OFF' +-- case +-- error: line 1 column 74 near ""The TTL_ENABLE option has to be set 'ON' or 'OFF' +-- case +-- error: line 1 column 51 near ""The TTL_ENABLE option has to be set 'ON' or 'OFF' +-- case +-- error: line 1 column 66 near ""The TTL_JOB_INTERVAL option is not a valid duration: fail to read an integer +-- case +-- error: line 1 column 66 near ""The TTL_JOB_INTERVAL option is not a valid duration: fail to read an integer +-- case +-- error: line 1 column 68 near ""The TTL_JOB_INTERVAL option is not a valid duration: strconv.ParseFloat: parsing "10.10.255": invalid syntax diff --git a/parser/testdata/parser/type/input.sql b/parser/testdata/parser/type/input.sql new file mode 100644 index 0000000..c7bfce1 --- /dev/null +++ b/parser/testdata/parser/type/input.sql @@ -0,0 +1,37 @@ +CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) ); +-- case +select x'0a', X'11', 0x11 +-- case +select x'13181C76734725455A' +-- case +select x'0xaa' +-- case +select 0X11 +-- case +select 0x4920616D2061206C6F6E672068657820737472696E67 +-- case +select 0b01, 0b0, b'11', B'11' +-- case +create table t (c1 enum('a', 'b'), c2 set('a', 'b')) +-- case +create table t (c1 enum('a ', 'b '), c2 set('a ', 'b ')) +-- case +create table t (c1 enum('a', 'b') binary, c2 set('a', 'b') binary) +-- case +create table t (c1 enum(0x61, 'b'), c2 set(0x61, 'b')) +-- case +create table t (c1 enum(0b01100001, 'b'), c2 set(0b01100001, 'b')) +-- case +create table t (c1 enum) +-- case +create table t (c1 set) +-- case +create table t (c1 blob(1024), c2 text(1024)) +-- case +create table t (y year(4), y1 year) +-- case +create table t (y year(4) unsigned zerofill zerofill, y1 year signed unsigned zerofill) +-- case +create table t (c1 national char(2), c2 national varchar(2)) +-- case +create table t (a JSON); diff --git a/parser/testdata/parser/type/output.sql b/parser/testdata/parser/type/output.sql new file mode 100644 index 0000000..a7834a1 --- /dev/null +++ b/parser/testdata/parser/type/output.sql @@ -0,0 +1,37 @@ +CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2)) +-- case +SELECT x'0a',x'11',x'11' +-- case +SELECT x'13181c76734725455a' +-- case +-- error: line 1 column 10 near "x'0xaa'" +-- case +-- error: line 1 column 11 near "0X11"hex literal: invalid hexadecimal format 0X11 +-- case +SELECT x'4920616d2061206c6f6e672068657820737472696e67' +-- case +SELECT b'1',b'0',b'11',b'11' +-- case +CREATE TABLE `t` (`c1` ENUM('a','b'),`c2` SET('a','b')) +-- case +CREATE TABLE `t` (`c1` ENUM('a','b '),`c2` SET('a','b ')) +-- case +CREATE TABLE `t` (`c1` ENUM('a','b') BINARY,`c2` SET('a','b') BINARY) +-- case +CREATE TABLE `t` (`c1` ENUM('a','b'),`c2` SET('a','b')) +-- case +CREATE TABLE `t` (`c1` ENUM('a','b'),`c2` SET('a','b')) +-- case +-- error: line 1 column 24 near ")" +-- case +-- error: line 1 column 23 near ")" +-- case +CREATE TABLE `t` (`c1` BLOB(1024),`c2` TEXT(1024)) +-- case +CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR) +-- case +CREATE TABLE `t` (`y` YEAR(4),`y1` YEAR) +-- case +CREATE TABLE `t` (`c1` CHAR(2),`c2` VARCHAR(2)) +-- case +CREATE TABLE `t` (`a` JSON) diff --git a/parser/testdata/parser/vector/input.sql b/parser/testdata/parser/vector/input.sql new file mode 100644 index 0000000..e22bd47 --- /dev/null +++ b/parser/testdata/parser/vector/input.sql @@ -0,0 +1,11 @@ +CREATE TABLE t (a VECTOR) +-- case +CREATE TABLE t (a VECTOR) +-- case +CREATE TABLE t (a VECTOR) +-- case +CREATE TABLE t (a VECTOR) +-- case +CREATE TABLE t (a VECTOR) +-- case +CREATE TABLE t (a VECTOR(5)) diff --git a/parser/testdata/parser/vector/output.sql b/parser/testdata/parser/vector/output.sql new file mode 100644 index 0000000..14a71ba --- /dev/null +++ b/parser/testdata/parser/vector/output.sql @@ -0,0 +1,11 @@ +CREATE TABLE `t` (`a` VECTOR) +-- case +CREATE TABLE `t` (`a` VECTOR) +-- case +-- error: line 1 column 28 near "INT>)" +-- case +-- error: line 1 column 33 near ")"Only VECTOR is supported for now +-- case +-- error: line 1 column 28 near "ABC>)" +-- case +-- error: line 1 column 28 near ")" diff --git a/parser/testdata/parser/view/input.sql b/parser/testdata/parser/view/input.sql new file mode 100644 index 0000000..3c8197c --- /dev/null +++ b/parser/testdata/parser/view/input.sql @@ -0,0 +1,119 @@ +create view v as select * from t +-- case +create or replace view v as select * from t +-- case +create or replace algorithm = undefined view v as select * from t +-- case +create or replace algorithm = merge view v as select * from t +-- case +create or replace algorithm = temptable view v as select * from t +-- case +create or replace algorithm = merge definer = 'root' view v as select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with local check option +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with cascaded check option +-- case +create or replace algorithm = merge definer = current_user view v as select * from t +-- case +create view v as (select * from t) +-- case +create or replace view v as (select * from t) +-- case +create or replace algorithm = undefined view v as (select * from t) +-- case +create or replace algorithm = merge view v as (select * from t) +-- case +create or replace algorithm = temptable view v as (select * from t) +-- case +create or replace algorithm = merge definer = 'root' view v as (select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security definer view v as (select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v as (select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t) with local check option +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t) with cascaded check option +-- case +create or replace algorithm = merge definer = current_user view v as (select * from t) +-- case +create view v as select * from t union select * from t +-- case +create or replace view v as select * from t union select * from t +-- case +create or replace algorithm = undefined view v as select * from t union select * from t +-- case +create or replace algorithm = merge view v as select * from t union select * from t +-- case +create or replace algorithm = temptable view v as select * from t union select * from t +-- case +create or replace algorithm = merge definer = 'root' view v as select * from t union select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t union select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t union select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union select * from t with local check option +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union select * from t with cascaded check option +-- case +create or replace algorithm = merge definer = current_user view v as select * from t union select * from t +-- case +create view v as select * from t union all select * from t +-- case +create or replace view v as select * from t union all select * from t +-- case +create or replace algorithm = undefined view v as select * from t union all select * from t +-- case +create or replace algorithm = merge view v as select * from t union all select * from t +-- case +create or replace algorithm = temptable view v as select * from t union all select * from t +-- case +create or replace algorithm = merge definer = 'root' view v as select * from t union all select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t union all select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t union all select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union all select * from t +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union all select * from t with local check option +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t union all select * from t with cascaded check option +-- case +create or replace algorithm = merge definer = current_user view v as select * from t union all select * from t +-- case +create view v as (select * from t union all select * from t) +-- case +create or replace view v as (select * from t union all select * from t) +-- case +create or replace algorithm = undefined view v as (select * from t union all select * from t) +-- case +create or replace algorithm = merge view v as (select * from t union all select * from t) +-- case +create or replace algorithm = temptable view v as (select * from t union all select * from t) +-- case +create or replace algorithm = merge definer = 'root' view v as (select * from t union all select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security definer view v as (select * from t union all select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v as (select * from t union all select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t) +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t) with local check option +-- case +create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t) with cascaded check option +-- case +create or replace algorithm = merge definer = current_user view v as select * from t union all select * from t diff --git a/parser/testdata/parser/view/output.sql b/parser/testdata/parser/view/output.sql new file mode 100644 index 0000000..c4bd8a6 --- /dev/null +++ b/parser/testdata/parser/view/output.sql @@ -0,0 +1,119 @@ +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` WITH LOCAL CHECK OPTION +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t`) WITH LOCAL CHECK OPTION +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t`) +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION SELECT * FROM `t` WITH LOCAL CHECK OPTION +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION SELECT * FROM `t` +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` WITH LOCAL CHECK OPTION +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` +-- case +CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) WITH LOCAL CHECK OPTION +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`) +-- case +CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t` diff --git a/parser/testdata/parser/window_functions/input.sql b/parser/testdata/parser/window_functions/input.sql new file mode 100644 index 0000000..c4002fa --- /dev/null +++ b/parser/testdata/parser/window_functions/input.sql @@ -0,0 +1,106 @@ +-- flags: window_func +SELECT CUME_DIST() OVER w FROM t; +-- case +SELECT DENSE_RANK() OVER (w) FROM t; +-- case +SELECT FIRST_VALUE(val) OVER w FROM t; +-- case +SELECT FIRST_VALUE(val) RESPECT NULLS OVER w FROM t; +-- case +SELECT FIRST_VALUE(val) IGNORE NULLS OVER w FROM t; +-- case +SELECT LAG(val) OVER (w) FROM t; +-- case +SELECT LAG(val, 1) OVER (w) FROM t; +-- case +SELECT LAG(val, 1, def) OVER (w) FROM t; +-- case +SELECT LAST_VALUE(val) OVER (w) FROM t; +-- case +SELECT LEAD(val) OVER w FROM t; +-- case +SELECT LEAD(val, 1) OVER w FROM t; +-- case +SELECT LEAD(val, 1, def) OVER w FROM t; +-- case +SELECT NTH_VALUE(val, 233) OVER w FROM t; +-- case +SELECT NTH_VALUE(val, 233) FROM FIRST OVER w FROM t; +-- case +SELECT NTH_VALUE(val, 233) FROM LAST OVER w FROM t; +-- case +SELECT NTH_VALUE(val, 233) FROM LAST IGNORE NULLS OVER w FROM t; +-- case +SELECT NTH_VALUE(val) OVER w FROM t; +-- case +SELECT NTILE(233) OVER (w) FROM t; +-- case +SELECT PERCENT_RANK() OVER (w) FROM t; +-- case +SELECT RANK() OVER (w) FROM t; +-- case +SELECT ROW_NUMBER() OVER (w) FROM t; +-- case +SELECT n, LAG(n, 1, 0) OVER (w), LEAD(n, 1, 0) OVER w, n + LAG(n, 1, 0) OVER (w) FROM fib; +-- case +SELECT SUM(profit) OVER(PARTITION BY country) AS country_profit FROM sales; +-- case +SELECT SUM(profit) OVER() AS country_profit FROM sales; +-- case +SELECT AVG(profit) OVER() AS country_profit FROM sales; +-- case +SELECT BIT_XOR(profit) OVER() AS country_profit FROM sales; +-- case +SELECT COUNT(profit) OVER() AS country_profit FROM sales; +-- case +SELECT COUNT(ALL profit) OVER() AS country_profit FROM sales; +-- case +SELECT COUNT(*) OVER() AS country_profit FROM sales; +-- case +SELECT MAX(profit) OVER() AS country_profit FROM sales; +-- case +SELECT MIN(profit) OVER() AS country_profit FROM sales; +-- case +SELECT SUM(profit) OVER() AS country_profit FROM sales; +-- case +SELECT ROW_NUMBER() OVER(PARTITION BY country) AS row_num1 FROM sales; +-- case +SELECT ROW_NUMBER() OVER(PARTITION BY country, d ORDER BY year, product) AS row_num2 FROM sales; +-- case +SELECT SUM(val) OVER (PARTITION BY subject ORDER BY time ROWS UNBOUNDED PRECEDING) FROM t; +-- case +SELECT AVG(val) OVER (PARTITION BY subject ORDER BY time ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t; +-- case +SELECT AVG(val) OVER (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t; +-- case +SELECT AVG(val) OVER (ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) FROM t; +-- case +SELECT AVG(val) OVER (RANGE BETWEEN INTERVAL 5 DAY PRECEDING AND INTERVAL '2:30' MINUTE_SECOND FOLLOWING) FROM t; +-- case +SELECT AVG(val) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM t; +-- case +SELECT AVG(val) OVER (RANGE CURRENT ROW) FROM t; +-- case +SELECT RANK() OVER (w) FROM t WINDOW w AS (ORDER BY val); +-- case +SELECT RANK() OVER w FROM t WINDOW w AS (); +-- case +SELECT FIRST_VALUE(year) OVER (w ORDER BY year) AS first FROM sales WINDOW w AS (PARTITION BY country); +-- case +SELECT RANK() OVER (w1) FROM t WINDOW w1 AS (w2), w2 AS (), w3 AS (w1); +-- case +SELECT RANK() OVER w1 FROM t WINDOW w1 AS (w2), w2 AS (w3), w3 AS (w1); +-- case +select tidb_parse_tso(1) +-- case +select tidb_parse_tso_logical(1) +-- case +select tidb_bounded_staleness('2015-09-21 00:07:01', NOW()) +-- case +select tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +select tidb_bounded_staleness('2015-09-21 00:07:01', '2021-04-27 11:26:13') +-- case +select from_unixtime(404411537129996288) +-- case +select from_unixtime(404411537129996288.22) diff --git a/parser/testdata/parser/window_functions/output.sql b/parser/testdata/parser/window_functions/output.sql new file mode 100644 index 0000000..2b3c691 --- /dev/null +++ b/parser/testdata/parser/window_functions/output.sql @@ -0,0 +1,105 @@ +SELECT CUME_DIST() OVER `w` FROM `t` +-- case +SELECT DENSE_RANK() OVER (`w`) FROM `t` +-- case +SELECT FIRST_VALUE(`val`) OVER `w` FROM `t` +-- case +SELECT FIRST_VALUE(`val`) OVER `w` FROM `t` +-- case +SELECT FIRST_VALUE(`val`) IGNORE NULLS OVER `w` FROM `t` +-- case +SELECT LAG(`val`) OVER (`w`) FROM `t` +-- case +SELECT LAG(`val`, 1) OVER (`w`) FROM `t` +-- case +SELECT LAG(`val`, 1, `def`) OVER (`w`) FROM `t` +-- case +SELECT LAST_VALUE(`val`) OVER (`w`) FROM `t` +-- case +SELECT LEAD(`val`) OVER `w` FROM `t` +-- case +SELECT LEAD(`val`, 1) OVER `w` FROM `t` +-- case +SELECT LEAD(`val`, 1, `def`) OVER `w` FROM `t` +-- case +SELECT NTH_VALUE(`val`, 233) OVER `w` FROM `t` +-- case +SELECT NTH_VALUE(`val`, 233) OVER `w` FROM `t` +-- case +SELECT NTH_VALUE(`val`, 233) FROM LAST OVER `w` FROM `t` +-- case +SELECT NTH_VALUE(`val`, 233) FROM LAST IGNORE NULLS OVER `w` FROM `t` +-- case +-- error: line 1 column 21 near ") OVER w FROM t;" +-- case +SELECT NTILE(233) OVER (`w`) FROM `t` +-- case +SELECT PERCENT_RANK() OVER (`w`) FROM `t` +-- case +SELECT RANK() OVER (`w`) FROM `t` +-- case +SELECT ROW_NUMBER() OVER (`w`) FROM `t` +-- case +SELECT `n`,LAG(`n`, 1, 0) OVER (`w`),LEAD(`n`, 1, 0) OVER `w`,`n`+LAG(`n`, 1, 0) OVER (`w`) FROM `fib` +-- case +SELECT SUM(`profit`) OVER (PARTITION BY `country`) AS `country_profit` FROM `sales` +-- case +SELECT SUM(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT AVG(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT BIT_XOR(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT COUNT(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT COUNT(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT COUNT(1) OVER () AS `country_profit` FROM `sales` +-- case +SELECT MAX(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT MIN(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT SUM(`profit`) OVER () AS `country_profit` FROM `sales` +-- case +SELECT ROW_NUMBER() OVER (PARTITION BY `country`) AS `row_num1` FROM `sales` +-- case +SELECT ROW_NUMBER() OVER (PARTITION BY `country`, `d` ORDER BY `year`,`product`) AS `row_num2` FROM `sales` +-- case +SELECT SUM(`val`) OVER (PARTITION BY `subject` ORDER BY `time` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM `t` +-- case +SELECT AVG(`val`) OVER (PARTITION BY `subject` ORDER BY `time` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM `t` +-- case +SELECT AVG(`val`) OVER (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM `t` +-- case +SELECT AVG(`val`) OVER (ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) FROM `t` +-- case +SELECT AVG(`val`) OVER (RANGE BETWEEN INTERVAL 5 DAY PRECEDING AND INTERVAL _UTF8MB4'2:30' MINUTE_SECOND FOLLOWING) FROM `t` +-- case +SELECT AVG(`val`) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM `t` +-- case +SELECT AVG(`val`) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) FROM `t` +-- case +SELECT RANK() OVER (`w`) FROM `t` WINDOW `w` AS (ORDER BY `val`) +-- case +SELECT RANK() OVER `w` FROM `t` WINDOW `w` AS () +-- case +SELECT FIRST_VALUE(`year`) OVER (`w` ORDER BY `year`) AS `first` FROM `sales` WINDOW `w` AS (PARTITION BY `country`) +-- case +SELECT RANK() OVER (`w1`) FROM `t` WINDOW `w1` AS (`w2`),`w2` AS (),`w3` AS (`w1`) +-- case +SELECT RANK() OVER `w1` FROM `t` WINDOW `w1` AS (`w2`),`w2` AS (`w3`),`w3` AS (`w1`) +-- case +SELECT TIDB_PARSE_TSO(1) +-- case +SELECT TIDB_PARSE_TSO_LOGICAL(1) +-- case +SELECT TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', NOW()) +-- case +SELECT TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW()) +-- case +SELECT TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13') +-- case +SELECT FROM_UNIXTIME(404411537129996288) +-- case +SELECT FROM_UNIXTIME(404411537129996288.22) diff --git a/parser/testdata/parser/with_rollup/input.sql b/parser/testdata/parser/with_rollup/input.sql new file mode 100644 index 0000000..7e29718 --- /dev/null +++ b/parser/testdata/parser/with_rollup/input.sql @@ -0,0 +1,7 @@ +select * from t group by a, b rollup +-- case +select * from t group by a, b with rollup +-- case +select * from t group by (a, b) with rollup +-- case +select * from t group by (a+b) with rollup diff --git a/parser/testdata/parser/with_rollup/output.sql b/parser/testdata/parser/with_rollup/output.sql new file mode 100644 index 0000000..89c53a1 --- /dev/null +++ b/parser/testdata/parser/with_rollup/output.sql @@ -0,0 +1,7 @@ +-- error: line 1 column 36 near "rollup" +-- case +SELECT * FROM `t` GROUP BY `a`,`b` WITH ROLLUP +-- case +SELECT * FROM `t` GROUP BY ROW(`a`,`b`) WITH ROLLUP +-- case +SELECT * FROM `t` GROUP BY (`a`+`b`) WITH ROLLUP