From 0e84828595fc0e3425fd0e454c56448205aec260 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 20 Aug 2026 21:15:02 +0000 Subject: [PATCH] Add file-driven test cases for the clause-level MySQL 26.7 sweep The first coverage sweep (#38) probed the MySQL 26.7 reference manual at statement-family granularity (Chapter 15), which #39-#42 then implemented. This second sweep walks the remaining grammar surface: each Chapter 15 statement's full syntax diagram (every optional clause), Chapter 14 function-specific syntax, Chapter 11 lexical features, Chapter 13 type and column-attribute grammar, Chapter 10 optimizer hints, and Chapter 26 partitioning. Roughly 930 documented statements were probed; the 148 that fail to parse are recorded as error goldens in twelve new testdata groups: - mysql_unsupported_types: INVISIBLE/VISIBLE column attribute (including the GIPK SHOW CREATE TABLE round-trip and ALTER ... SET VISIBLE), column-level ENGINE_ATTRIBUTE, and DEFAULT (expr) with operators (only bare function calls currently parse) - mysql_unsupported_functions: JSON_TABLE, JSON_VALUE RETURNING / ON EMPTY / ON ERROR, CAST ... AT TIME ZONE, CAST AS NCHAR, SOUNDS LIKE - mysql_unsupported_routines: every CREATE PROCEDURE characteristic (COMMENT, LANGUAGE SQL, DETERMINISTIC, CONTAINS/NO SQL, READS/MODIFIES SQL DATA, SQL SECURITY), LANGUAGE JAVASCRIPT bodies with dollar-quoted strings, and CREATE LIBRARY $$-bodies with the USING clause - mysql_unsupported_account: IDENTIFIED BY RANDOM PASSWORD, multi-factor auth (AND IDENTIFIED, ADD/MODIFY/DROP n FACTOR, registration flow), dual-password clauses (REPLACE / RETAIN CURRENT PASSWORD / DISCARD OLD PASSWORD), DEFAULT ROLE on CREATE/ALTER USER, PASSWORD REQUIRE CURRENT, GRANT ... AS user WITH ROLE, GRANT role WITH ADMIN OPTION, REVOKE IF EXISTS / IGNORE UNKNOWN USER, REVOKE PROXY, SET PASSWORD TO RANDOM - mysql_unsupported_admin: histogram USING DATA and AUTO/MANUAL UPDATE, INSTALL COMPONENT SET PERSIST, DROP RESOURCE GROUP FORCE, SET RESOURCE GROUP ... FOR, FLUSH OPTIMIZER_COSTS / RELAY LOGS / USER_RESOURCES / TABLES FOR EXPORT / multi-option lists, and SET PERSIST / PERSIST_ONLY - mysql_unsupported_show: SHOW STORAGE ENGINES, SHOW WARNINGS/ERRORS LIMIT, SHOW EXTENDED INDEX, SHOW REPLICA STATUS FOR CHANNEL - mysql_unsupported_ddl: AUTOEXTEND_SIZE, CREATE TABLE ... START TRANSACTION, CREATE INDEX ENGINE_ATTRIBUTE, ALTER DATABASE READ ONLY, and WITH CHECK OPTION without a CASCADED/LOCAL qualifier - mysql_unsupported_dml: INTO OUTFILE ... CHARACTER SET, multiple locking clauses, INTO before a locking clause, derived-table column lists, LOAD DATA CONCURRENT / PARTITION / IGNORE n ROWS - mysql_unsupported_txn: BEGIN/COMMIT/ROLLBACK WORK, START TRANSACTION characteristic lists, LOCK TABLES aliases and LOW_PRIORITY WRITE - mysql_unsupported_replication: CHANGE REPLICATION SOURCE options with non-literal values (IGNORE_SERVER_IDS, PRIVILEGE_CHECKS_USER, REQUIRE_TABLE_PRIMARY_KEY_CHECK, ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS) and RESET BINARY LOGS AND GTIDS TO - mysql_unsupported_compound: DECLARE ... CONDITION and the LOOP statement - mysql_unsupported_utility: EXPLAIN FORMAT=TREE (bare keyword), EXPLAIN ... INTO @var, DESCRIBE tbl 'wildcard' The goldens document current behavior: when a statement gains support, its -- error segment turns into a Restore() golden and the diff makes the coverage change explicit. Chapters 10, 11 (except dollar quoting), 12, 26, and the hint sub-parser probes all passed and contributed no new groups. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01LUq2EgtMGE5ARXusR8mvDY --- .../mysql_unsupported_account/input.sql | 75 +++++++++++++++++++ .../mysql_unsupported_account/output.sql | 75 +++++++++++++++++++ .../parser/mysql_unsupported_admin/input.sql | 35 +++++++++ .../parser/mysql_unsupported_admin/output.sql | 35 +++++++++ .../mysql_unsupported_compound/input.sql | 9 +++ .../mysql_unsupported_compound/output.sql | 9 +++ .../parser/mysql_unsupported_ddl/input.sql | 13 ++++ .../parser/mysql_unsupported_ddl/output.sql | 13 ++++ .../parser/mysql_unsupported_dml/input.sql | 15 ++++ .../parser/mysql_unsupported_dml/output.sql | 15 ++++ .../mysql_unsupported_functions/input.sql | 21 ++++++ .../mysql_unsupported_functions/output.sql | 21 ++++++ .../mysql_unsupported_replication/input.sql | 21 ++++++ .../mysql_unsupported_replication/output.sql | 21 ++++++ .../mysql_unsupported_routines/input.sql | 49 ++++++++++++ .../mysql_unsupported_routines/output.sql | 49 ++++++++++++ .../parser/mysql_unsupported_show/input.sql | 13 ++++ .../parser/mysql_unsupported_show/output.sql | 13 ++++ .../parser/mysql_unsupported_txn/input.sql | 15 ++++ .../parser/mysql_unsupported_txn/output.sql | 15 ++++ .../parser/mysql_unsupported_types/input.sql | 23 ++++++ .../parser/mysql_unsupported_types/output.sql | 23 ++++++ .../mysql_unsupported_utility/input.sql | 9 +++ .../mysql_unsupported_utility/output.sql | 9 +++ 24 files changed, 596 insertions(+) create mode 100644 parser/testdata/parser/mysql_unsupported_account/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_account/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_admin/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_admin/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_compound/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_compound/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_ddl/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_ddl/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_dml/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_dml/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_functions/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_functions/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_replication/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_replication/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_routines/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_routines/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_show/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_show/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_txn/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_txn/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_types/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_types/output.sql create mode 100644 parser/testdata/parser/mysql_unsupported_utility/input.sql create mode 100644 parser/testdata/parser/mysql_unsupported_utility/output.sql diff --git a/parser/testdata/parser/mysql_unsupported_account/input.sql b/parser/testdata/parser/mysql_unsupported_account/input.sql new file mode 100644 index 0000000..2a9a442 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_account/input.sql @@ -0,0 +1,75 @@ +CREATE USER u IDENTIFIED BY RANDOM PASSWORD +-- case +CREATE USER u IDENTIFIED WITH caching_sha2_password BY RANDOM PASSWORD +-- case +ALTER USER u IDENTIFIED BY RANDOM PASSWORD +-- case +ALTER USER u IDENTIFIED BY RANDOM PASSWORD RETAIN CURRENT PASSWORD +-- case +CREATE USER u IDENTIFIED BY 'p1' AND IDENTIFIED WITH authentication_ldap_simple +-- case +CREATE USER u IDENTIFIED BY 'p1' AND IDENTIFIED WITH authentication_fido AND IDENTIFIED WITH authentication_ldap_simple BY 'p3' +-- case +ALTER USER u ADD 2 FACTOR IDENTIFIED WITH authentication_ldap_simple +-- case +ALTER USER u MODIFY 2 FACTOR IDENTIFIED WITH authentication_ldap_simple BY 'p' +-- case +ALTER USER u DROP 2 FACTOR +-- case +ALTER USER u 2 FACTOR INITIATE REGISTRATION +-- case +ALTER USER u 2 FACTOR FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'blob' +-- case +ALTER USER u 2 FACTOR UNREGISTER +-- case +CREATE USER u DEFAULT ROLE r1, r2 +-- case +CREATE USER u PASSWORD REQUIRE CURRENT +-- case +CREATE USER u PASSWORD REQUIRE CURRENT OPTIONAL +-- case +ALTER USER u IDENTIFIED BY 'p' REPLACE 'old' +-- case +ALTER USER u IDENTIFIED BY 'p' RETAIN CURRENT PASSWORD +-- case +ALTER USER u IDENTIFIED BY 'p' REPLACE 'old' RETAIN CURRENT PASSWORD +-- case +ALTER USER u DISCARD OLD PASSWORD +-- case +ALTER USER u DEFAULT ROLE ALL +-- case +ALTER USER u DEFAULT ROLE NONE +-- case +ALTER USER u DEFAULT ROLE r1, r2 +-- case +GRANT r1 TO u WITH ADMIN OPTION +-- case +GRANT SELECT ON *.* TO u AS root@localhost +-- case +GRANT SELECT ON *.* TO u AS root@localhost WITH ROLE DEFAULT +-- case +GRANT SELECT ON *.* TO u AS root@localhost WITH ROLE NONE +-- case +GRANT SELECT ON *.* TO u AS root@localhost WITH ROLE ALL +-- case +GRANT SELECT ON *.* TO u AS root@localhost WITH ROLE ALL EXCEPT r1, r2 +-- case +GRANT SELECT ON *.* TO u AS root@localhost WITH ROLE r1, r2 +-- case +REVOKE IF EXISTS SELECT ON db.t FROM u +-- case +REVOKE SELECT ON db.t FROM u IGNORE UNKNOWN USER +-- case +REVOKE IF EXISTS SELECT ON db.t FROM u IGNORE UNKNOWN USER +-- case +REVOKE PROXY ON pu FROM u +-- case +SET PASSWORD = 'p' REPLACE 'old' +-- case +SET PASSWORD FOR u = 'p' RETAIN CURRENT PASSWORD +-- case +SET PASSWORD TO RANDOM +-- case +SET PASSWORD FOR u TO RANDOM +-- case +SET PASSWORD FOR u TO RANDOM REPLACE 'old' diff --git a/parser/testdata/parser/mysql_unsupported_account/output.sql b/parser/testdata/parser/mysql_unsupported_account/output.sql new file mode 100644 index 0000000..e38570c --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_account/output.sql @@ -0,0 +1,75 @@ +-- error: line 1 column 34 near "RANDOM PASSWORD" +-- case +-- error: line 1 column 61 near "RANDOM PASSWORD" +-- case +-- error: line 1 column 33 near "RANDOM PASSWORD" +-- case +-- error: line 1 column 33 near "RANDOM PASSWORD RETAIN CURRENT PASSWORD" +-- case +-- error: line 1 column 36 near "AND IDENTIFIED WITH authentication_ldap_simple" +-- case +-- error: line 1 column 36 near "AND IDENTIFIED WITH authentication_fido AND IDENTIFIED WITH authentication_ldap_simple BY 'p3'" +-- case +-- error: line 1 column 16 near "ADD 2 FACTOR IDENTIFIED WITH authentication_ldap_simple" +-- case +-- error: line 1 column 19 near "MODIFY 2 FACTOR IDENTIFIED WITH authentication_ldap_simple BY 'p'" +-- case +-- error: line 1 column 17 near "DROP 2 FACTOR" +-- case +-- error: line 1 column 14 near "2 FACTOR INITIATE REGISTRATION" +-- case +-- error: line 1 column 14 near "2 FACTOR FINISH REGISTRATION SET CHALLENGE_RESPONSE AS 'blob'" +-- case +-- error: line 1 column 14 near "2 FACTOR UNREGISTER" +-- case +-- error: line 1 column 21 near "DEFAULT ROLE r1, r2" +-- case +-- error: line 1 column 38 near "" +-- case +-- error: line 1 column 47 near "OPTIONAL" +-- case +-- error: line 1 column 38 near "REPLACE 'old'" +-- case +-- error: line 1 column 37 near "RETAIN CURRENT PASSWORD" +-- case +-- error: line 1 column 38 near "REPLACE 'old' RETAIN CURRENT PASSWORD" +-- case +-- error: line 1 column 20 near "DISCARD OLD PASSWORD" +-- case +-- error: line 1 column 20 near "DEFAULT ROLE ALL" +-- case +-- error: line 1 column 20 near "DEFAULT ROLE NONE" +-- case +-- error: line 1 column 20 near "DEFAULT ROLE r1, r2" +-- case +-- error: line 1 column 18 near "WITH ADMIN OPTION" +-- case +-- error: line 1 column 27 near "AS root@localhost" +-- case +-- error: line 1 column 27 near "AS root@localhost WITH ROLE DEFAULT" +-- case +-- error: line 1 column 27 near "AS root@localhost WITH ROLE NONE" +-- case +-- error: line 1 column 27 near "AS root@localhost WITH ROLE ALL" +-- case +-- error: line 1 column 27 near "AS root@localhost WITH ROLE ALL EXCEPT r1, r2" +-- case +-- error: line 1 column 27 near "AS root@localhost WITH ROLE r1, r2" +-- case +-- error: line 1 column 9 near "IF EXISTS SELECT ON db.t FROM u" +-- case +-- error: line 1 column 35 near "IGNORE UNKNOWN USER" +-- case +-- error: line 1 column 9 near "IF EXISTS SELECT ON db.t FROM u IGNORE UNKNOWN USER" +-- case +-- error: line 1 column 12 near "PROXY ON pu FROM u" +-- case +-- error: line 1 column 26 near "REPLACE 'old'" +-- case +-- error: line 1 column 31 near "RETAIN CURRENT PASSWORD" +-- case +-- error: line 1 column 15 near "TO RANDOM" +-- case +-- error: line 1 column 21 near "TO RANDOM" +-- case +-- error: line 1 column 21 near "TO RANDOM REPLACE 'old'" diff --git a/parser/testdata/parser/mysql_unsupported_admin/input.sql b/parser/testdata/parser/mysql_unsupported_admin/input.sql new file mode 100644 index 0000000..d220f3a --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_admin/input.sql @@ -0,0 +1,35 @@ +ANALYZE TABLE t UPDATE HISTOGRAM ON c1 USING DATA 'json' +-- case +ANALYZE TABLE t UPDATE HISTOGRAM ON c1 AUTO UPDATE +-- case +ANALYZE TABLE t UPDATE HISTOGRAM ON c1 MANUAL UPDATE +-- case +ANALYZE TABLE t UPDATE HISTOGRAM ON c1 WITH 20 BUCKETS AUTO UPDATE +-- case +INSTALL COMPONENT 'file://c' SET PERSIST v1 = 1 +-- case +DROP RESOURCE GROUP rg FORCE +-- case +SET RESOURCE GROUP rg FOR 4 +-- case +SET RESOURCE GROUP rg FOR 4, 5, 6 +-- case +FLUSH OPTIMIZER_COSTS +-- case +FLUSH RELAY LOGS +-- case +FLUSH RELAY LOGS FOR CHANNEL 'ch' +-- case +FLUSH USER_RESOURCES +-- case +FLUSH TABLES t1, t2 FOR EXPORT +-- case +FLUSH BINARY LOGS, ERROR LOGS, STATUS +-- case +SET PERSIST max_connections = 200 +-- case +SET PERSIST_ONLY max_connections = 250 +-- case +SET PERSIST max_connections = 200, long_query_time = 0.5 +-- case +SET GLOBAL max_connections = 200, PERSIST long_query_time = 1 diff --git a/parser/testdata/parser/mysql_unsupported_admin/output.sql b/parser/testdata/parser/mysql_unsupported_admin/output.sql new file mode 100644 index 0000000..7144f5e --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_admin/output.sql @@ -0,0 +1,35 @@ +-- error: line 1 column 44 near "USING DATA 'json'" +-- case +-- error: line 1 column 43 near "AUTO UPDATE" +-- case +-- error: line 1 column 45 near "MANUAL UPDATE" +-- case +-- error: line 1 column 59 near "AUTO UPDATE" +-- case +-- error: line 1 column 43 near "v1 = 1" +-- case +-- error: line 1 column 28 near "FORCE" +-- case +-- error: line 1 column 25 near "FOR 4" +-- case +-- error: line 1 column 25 near "FOR 4, 5, 6" +-- case +-- error: line 1 column 21 near "OPTIMIZER_COSTS" +-- case +-- error: line 1 column 11 near "RELAY LOGS" +-- case +-- error: line 1 column 11 near "RELAY LOGS FOR CHANNEL 'ch'" +-- case +-- error: line 1 column 20 near "USER_RESOURCES" +-- case +-- error: line 1 column 23 near "FOR EXPORT" +-- case +-- error: line 1 column 18 near ", ERROR LOGS, STATUS" +-- case +-- error: line 1 column 27 near "max_connections = 200" +-- case +-- error: line 1 column 32 near "max_connections = 250" +-- case +-- error: line 1 column 27 near "max_connections = 200, long_query_time = 0.5" +-- case +-- error: line 1 column 57 near "long_query_time = 1" diff --git a/parser/testdata/parser/mysql_unsupported_compound/input.sql b/parser/testdata/parser/mysql_unsupported_compound/input.sql new file mode 100644 index 0000000..0ed938e --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_compound/input.sql @@ -0,0 +1,9 @@ +CREATE PROCEDURE p () BEGIN DECLARE e CONDITION FOR SQLSTATE '23000'; DECLARE EXIT HANDLER FOR e ROLLBACK; END +-- case +CREATE PROCEDURE p () BEGIN DECLARE e CONDITION FOR 1051; END +-- case +CREATE PROCEDURE p () LOOP SET @x = 1; END LOOP +-- case +CREATE PROCEDURE p () BEGIN LOOP SET @x = 1; END LOOP; END +-- case +CREATE PROCEDURE p () lbl: LOOP LEAVE lbl; END LOOP lbl diff --git a/parser/testdata/parser/mysql_unsupported_compound/output.sql b/parser/testdata/parser/mysql_unsupported_compound/output.sql new file mode 100644 index 0000000..6e1148b --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_compound/output.sql @@ -0,0 +1,9 @@ +-- error: line 1 column 47 near "CONDITION FOR SQLSTATE '23000'; DECLARE EXIT HANDLER FOR e ROLLBACK; END" +-- case +-- error: line 1 column 47 near "CONDITION FOR 1051; END" +-- case +-- error: line 1 column 26 near "LOOP SET @x = 1; END LOOP" +-- case +-- error: line 1 column 32 near "LOOP SET @x = 1; END LOOP; END" +-- case +-- error: line 1 column 31 near "LOOP LEAVE lbl; END LOOP lbl" diff --git a/parser/testdata/parser/mysql_unsupported_ddl/input.sql b/parser/testdata/parser/mysql_unsupported_ddl/input.sql new file mode 100644 index 0000000..38413b9 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_ddl/input.sql @@ -0,0 +1,13 @@ +CREATE TABLE t (a INT) AUTOEXTEND_SIZE = 4194304 +-- case +CREATE TABLE t (a INT) START TRANSACTION +-- case +CREATE INDEX i1 ON t (a) ENGINE_ATTRIBUTE = '{}' +-- case +ALTER DATABASE d READ ONLY = 1 +-- case +ALTER DATABASE d READ ONLY = DEFAULT +-- case +CREATE VIEW v AS SELECT 1 WITH CHECK OPTION +-- case +ALTER VIEW v AS SELECT 1 WITH CHECK OPTION diff --git a/parser/testdata/parser/mysql_unsupported_ddl/output.sql b/parser/testdata/parser/mysql_unsupported_ddl/output.sql new file mode 100644 index 0000000..87115a1 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_ddl/output.sql @@ -0,0 +1,13 @@ +-- error: line 1 column 48 near "4194304" +-- case +-- error: line 1 column 28 near "START TRANSACTION" +-- case +-- error: line 1 column 41 near "ENGINE_ATTRIBUTE = '{}'" +-- case +-- error: line 1 column 21 near "READ ONLY = 1" +-- case +-- error: line 1 column 21 near "READ ONLY = DEFAULT" +-- case +-- error: line 1 column 36 near "CHECK OPTION" +-- case +-- error: line 1 column 35 near "CHECK OPTION" diff --git a/parser/testdata/parser/mysql_unsupported_dml/input.sql b/parser/testdata/parser/mysql_unsupported_dml/input.sql new file mode 100644 index 0000000..a4b1811 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_dml/input.sql @@ -0,0 +1,15 @@ +SELECT a INTO OUTFILE '/tmp/f' CHARACTER SET utf8mb4 FROM t +-- case +SELECT a FROM t INTO OUTFILE '/tmp/f' CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' +-- case +SELECT * FROM t1, t2 FOR SHARE OF t1 NOWAIT FOR UPDATE OF t2 SKIP LOCKED +-- case +SELECT * FROM t INTO @a FOR UPDATE +-- case +SELECT * FROM (VALUES ROW(1, 2), ROW(3, 4)) AS v (c1, c2) +-- case +LOAD DATA CONCURRENT INFILE '/tmp/f' IGNORE INTO TABLE t +-- case +LOAD DATA INFILE '/tmp/f' INTO TABLE t PARTITION (p0) CHARACTER SET utf8mb4 +-- case +LOAD DATA INFILE '/tmp/f' INTO TABLE t COLUMNS TERMINATED BY ',' IGNORE 2 ROWS diff --git a/parser/testdata/parser/mysql_unsupported_dml/output.sql b/parser/testdata/parser/mysql_unsupported_dml/output.sql new file mode 100644 index 0000000..5d1ef88 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_dml/output.sql @@ -0,0 +1,15 @@ +-- error: line 1 column 40 near "CHARACTER SET utf8mb4 FROM t" +-- case +-- error: line 1 column 47 near "CHARACTER SET utf8mb4 FIELDS TERMINATED BY ','" +-- case +-- error: line 1 column 47 near "FOR UPDATE OF t2 SKIP LOCKED" +-- case +-- error: line 1 column 27 near "FOR UPDATE" +-- case +-- error: line 1 column 50 near "(c1, c2)" +-- case +-- error: line 1 column 20 near "CONCURRENT INFILE '/tmp/f' IGNORE INTO TABLE t" +-- case +-- error: line 1 column 48 near "PARTITION (p0) CHARACTER SET utf8mb4" +-- case +-- error: line 1 column 78 near "ROWS" diff --git a/parser/testdata/parser/mysql_unsupported_functions/input.sql b/parser/testdata/parser/mysql_unsupported_functions/input.sql new file mode 100644 index 0000000..287778b --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_functions/input.sql @@ -0,0 +1,21 @@ +SELECT CAST('a' AS NCHAR(5)) +-- case +SELECT CAST('a' AS NCHAR) +-- case +SELECT CAST(TIMESTAMP'2024-01-01 12:00:00' AT TIME ZONE 'UTC' AS DATETIME) +-- case +SELECT CAST(TIMESTAMP'2024-01-01 12:00:00' AT TIME ZONE '+00:00' AS DATETIME(3)) +-- case +SELECT * FROM JSON_TABLE('[{"a":1}]', '$[*]' COLUMNS (a INT PATH '$.a')) AS jt +-- case +SELECT * FROM JSON_TABLE('[]', '$[*]' COLUMNS (ord FOR ORDINALITY, x VARCHAR(10) PATH '$.x' DEFAULT '"d"' ON EMPTY NULL ON ERROR, y INT EXISTS PATH '$.y', NESTED PATH '$.z[*]' COLUMNS (z INT PATH '$'))) AS jt +-- case +SELECT t.id, jt.x FROM t, JSON_TABLE(t.j, '$[*]' COLUMNS (x VARCHAR(10) PATH '$.x' ERROR ON EMPTY)) AS jt +-- case +SELECT JSON_VALUE('{"a":42}', '$.a' RETURNING UNSIGNED) +-- case +SELECT JSON_VALUE('{"p":12.5}', '$.d' RETURNING DECIMAL(5,2) DEFAULT 0 ON EMPTY DEFAULT 99 ON ERROR) +-- case +SELECT JSON_VALUE('{}', '$.x' RETURNING CHAR(8) NULL ON EMPTY ERROR ON ERROR) +-- case +SELECT 'a' SOUNDS LIKE 'b' diff --git a/parser/testdata/parser/mysql_unsupported_functions/output.sql b/parser/testdata/parser/mysql_unsupported_functions/output.sql new file mode 100644 index 0000000..b360ed2 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_functions/output.sql @@ -0,0 +1,21 @@ +-- error: line 1 column 24 near "NCHAR(5))" +-- case +-- error: line 1 column 24 near "NCHAR)" +-- case +-- error: line 1 column 45 near "AT TIME ZONE 'UTC' AS DATETIME)" +-- case +-- error: line 1 column 45 near "AT TIME ZONE '+00:00' AS DATETIME(3))" +-- case +-- error: line 1 column 25 near "('[{"a":1}]', '$[*]' COLUMNS (a INT PATH '$.a')) AS jt" +-- case +-- error: line 1 column 25 near "('[]', '$[*]' COLUMNS (ord FOR ORDINALITY, x VARCHAR(10) PATH '$.x' DEFAULT '"d"' ON EMPTY NULL ON ERROR, y INT EXISTS PATH '$.y', NESTED PATH '$.z[*]' COLUMNS (z INT PATH '$'))) AS jt" +-- case +-- error: line 1 column 37 near "(t.j, '$[*]' COLUMNS (x VARCHAR(10) PATH '$.x' ERROR ON EMPTY)) AS jt" +-- case +-- error: line 1 column 45 near "RETURNING UNSIGNED)" +-- case +-- error: line 1 column 47 near "RETURNING DECIMAL(5,2) DEFAULT 0 ON EMPTY DEFAULT 99 ON ERROR)" +-- case +-- error: line 1 column 39 near "RETURNING CHAR(8) NULL ON EMPTY ERROR ON ERROR)" +-- case +-- error: line 1 column 22 near "LIKE 'b'" diff --git a/parser/testdata/parser/mysql_unsupported_replication/input.sql b/parser/testdata/parser/mysql_unsupported_replication/input.sql new file mode 100644 index 0000000..3f82f0a --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_replication/input.sql @@ -0,0 +1,21 @@ +CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = (1, 2) +-- case +CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = () +-- case +CHANGE REPLICATION SOURCE TO PRIVILEGE_CHECKS_USER = 'u'@'h' +-- case +CHANGE REPLICATION SOURCE TO PRIVILEGE_CHECKS_USER = NULL +-- case +CHANGE REPLICATION SOURCE TO REQUIRE_TABLE_PRIMARY_KEY_CHECK = ON +-- case +CHANGE REPLICATION SOURCE TO REQUIRE_TABLE_PRIMARY_KEY_CHECK = OFF +-- case +CHANGE REPLICATION SOURCE TO REQUIRE_TABLE_PRIMARY_KEY_CHECK = STREAM +-- case +CHANGE REPLICATION SOURCE TO REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE +-- case +CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = OFF +-- case +CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = LOCAL +-- case +RESET BINARY LOGS AND GTIDS TO 100 diff --git a/parser/testdata/parser/mysql_unsupported_replication/output.sql b/parser/testdata/parser/mysql_unsupported_replication/output.sql new file mode 100644 index 0000000..72147c8 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_replication/output.sql @@ -0,0 +1,21 @@ +-- error: line 1 column 50 near "(1, 2)" +-- case +-- error: line 1 column 50 near "()" +-- case +-- error: line 1 column 60 near "@'h'" +-- case +-- error: line 1 column 57 near "NULL" +-- case +-- error: line 1 column 65 near "ON" +-- case +-- error: line 1 column 66 near "OFF" +-- case +-- error: line 1 column 69 near "STREAM" +-- case +-- error: line 1 column 71 near "GENERATE" +-- case +-- error: line 1 column 73 near "OFF" +-- case +-- error: line 1 column 75 near "LOCAL" +-- case +-- error: line 1 column 30 near "TO 100" diff --git a/parser/testdata/parser/mysql_unsupported_routines/input.sql b/parser/testdata/parser/mysql_unsupported_routines/input.sql new file mode 100644 index 0000000..8102044 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_routines/input.sql @@ -0,0 +1,49 @@ +CREATE PROCEDURE p () COMMENT 'c' SELECT 1 +-- case +CREATE PROCEDURE p () LANGUAGE SQL SELECT 1 +-- case +CREATE PROCEDURE p () NOT DETERMINISTIC SELECT 1 +-- case +CREATE PROCEDURE p () CONTAINS SQL SELECT 1 +-- case +CREATE PROCEDURE p () NO SQL SELECT 1 +-- case +CREATE PROCEDURE p () READS SQL DATA SELECT 1 +-- case +CREATE PROCEDURE p () MODIFIES SQL DATA SELECT 1 +-- case +CREATE PROCEDURE p () SQL SECURITY DEFINER SELECT 1 +-- case +CREATE PROCEDURE p () SQL SECURITY INVOKER SELECT 1 +-- case +CREATE DEFINER = u@h PROCEDURE p (IN a INT, OUT b VARCHAR(10), INOUT c BIGINT) COMMENT 'c' LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER SELECT 1 +-- case +CREATE FUNCTION js_add(a INT, b INT) RETURNS INT LANGUAGE JAVASCRIPT DETERMINISTIC NO SQL AS $$ + return a + b; +$$ +-- case +CREATE PROCEDURE js_log(IN msg VARCHAR(255)) LANGUAGE JAVASCRIPT AS $$ + console.log(msg); +$$ +-- case +CREATE FUNCTION js_q(s VARCHAR(64)) RETURNS VARCHAR(128) LANGUAGE JAVASCRIPT DETERMINISTIC NO SQL AS $body$ + return "got: " + s; +$body$ +-- case +CREATE FUNCTION js_str(a INT) RETURNS INT LANGUAGE JAVASCRIPT DETERMINISTIC NO SQL AS 'return a' +-- case +CREATE LIBRARY lib_demo LANGUAGE JAVASCRIPT AS $$ + export function inc(n) { return n + 1; } +$$ +-- case +CREATE LIBRARY IF NOT EXISTS test.lib_demo LANGUAGE JAVASCRIPT AS $$ + export const PI = 3.14159; +$$ +-- case +CREATE FUNCTION js_inc(a INT) RETURNS INT LANGUAGE JAVASCRIPT DETERMINISTIC NO SQL USING (lib_demo) AS $$ + return lib_demo.inc(a); +$$ +-- case +CREATE PROCEDURE p_demo() LANGUAGE JAVASCRIPT USING (test.lib_demo AS d, other_lib) AS $$ + d.inc(1); +$$ diff --git a/parser/testdata/parser/mysql_unsupported_routines/output.sql b/parser/testdata/parser/mysql_unsupported_routines/output.sql new file mode 100644 index 0000000..a994d56 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_routines/output.sql @@ -0,0 +1,49 @@ +-- error: line 1 column 29 near "COMMENT 'c' SELECT 1" +-- case +-- error: line 1 column 30 near "LANGUAGE SQL SELECT 1" +-- case +-- error: line 1 column 25 near "NOT DETERMINISTIC SELECT 1" +-- case +-- error: line 1 column 30 near "CONTAINS SQL SELECT 1" +-- case +-- error: line 1 column 24 near "NO SQL SELECT 1" +-- case +-- error: line 1 column 27 near "READS SQL DATA SELECT 1" +-- case +-- error: line 1 column 30 near "MODIFIES SQL DATA SELECT 1" +-- case +-- error: line 1 column 25 near "SQL SECURITY DEFINER SELECT 1" +-- case +-- error: line 1 column 25 near "SQL SECURITY INVOKER SELECT 1" +-- case +-- error: line 1 column 86 near "COMMENT 'c' LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER SELECT 1" +-- case +-- error: line 1 column 92 near "AS $$ + return a + b; +$$" +-- case +-- error: line 1 column 53 near "LANGUAGE JAVASCRIPT AS $$ + console.log(msg); +$$" +-- case +-- error: line 1 column 100 near "AS $body$ + return "got: " + s; +$body$" +-- case +-- error: line 1 column 85 near "AS 'return a'" +-- case +-- error: line 1 column 49 near "$$ + export function inc(n) { return n + 1; } +$$" +-- case +-- error: line 1 column 68 near "$$ + export const PI = 3.14159; +$$" +-- case +-- error: line 1 column 88 near "USING (lib_demo) AS $$ + return lib_demo.inc(a); +$$" +-- case +-- error: line 1 column 34 near "LANGUAGE JAVASCRIPT USING (test.lib_demo AS d, other_lib) AS $$ + d.inc(1); +$$" diff --git a/parser/testdata/parser/mysql_unsupported_show/input.sql b/parser/testdata/parser/mysql_unsupported_show/input.sql new file mode 100644 index 0000000..89ebc3d --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_show/input.sql @@ -0,0 +1,13 @@ +SHOW STORAGE ENGINES +-- case +SHOW ERRORS LIMIT 5 +-- case +SHOW ERRORS LIMIT 5, 10 +-- case +SHOW WARNINGS LIMIT 1 +-- case +SHOW WARNINGS LIMIT 5, 10 +-- case +SHOW EXTENDED INDEX FROM t +-- case +SHOW REPLICA STATUS FOR CHANNEL 'ch' diff --git a/parser/testdata/parser/mysql_unsupported_show/output.sql b/parser/testdata/parser/mysql_unsupported_show/output.sql new file mode 100644 index 0000000..696fdac --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_show/output.sql @@ -0,0 +1,13 @@ +-- error: line 1 column 12 near "STORAGE ENGINES" +-- case +-- error: line 1 column 17 near "LIMIT 5" +-- case +-- error: line 1 column 17 near "LIMIT 5, 10" +-- case +-- error: line 1 column 19 near "LIMIT 1" +-- case +-- error: line 1 column 19 near "LIMIT 5, 10" +-- case +-- error: line 1 column 19 near "INDEX FROM t" +-- case +-- error: line 1 column 23 near "FOR CHANNEL 'ch'" diff --git a/parser/testdata/parser/mysql_unsupported_txn/input.sql b/parser/testdata/parser/mysql_unsupported_txn/input.sql new file mode 100644 index 0000000..37ff4f7 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_txn/input.sql @@ -0,0 +1,15 @@ +START TRANSACTION WITH CONSISTENT SNAPSHOT, READ ONLY +-- case +BEGIN WORK +-- case +COMMIT WORK +-- case +ROLLBACK WORK AND NO CHAIN RELEASE +-- case +ROLLBACK WORK TO s1 +-- case +LOCK TABLES t1 AS a1 WRITE +-- case +LOCK TABLES t1 a1 READ +-- case +LOCK TABLES t2 LOW_PRIORITY WRITE diff --git a/parser/testdata/parser/mysql_unsupported_txn/output.sql b/parser/testdata/parser/mysql_unsupported_txn/output.sql new file mode 100644 index 0000000..e00ab06 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_txn/output.sql @@ -0,0 +1,15 @@ +-- error: line 1 column 43 near ", READ ONLY" +-- case +-- error: line 1 column 10 near "WORK" +-- case +-- error: line 1 column 11 near "WORK" +-- case +-- error: line 1 column 13 near "WORK AND NO CHAIN RELEASE" +-- case +-- error: line 1 column 13 near "WORK TO s1" +-- case +-- error: line 1 column 17 near "AS a1 WRITE" +-- case +-- error: line 1 column 17 near "a1 READ" +-- case +-- error: line 1 column 27 near "LOW_PRIORITY WRITE" diff --git a/parser/testdata/parser/mysql_unsupported_types/input.sql b/parser/testdata/parser/mysql_unsupported_types/input.sql new file mode 100644 index 0000000..359e0a3 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_types/input.sql @@ -0,0 +1,23 @@ +CREATE TABLE t (a INT INVISIBLE) +-- case +CREATE TABLE t (a INT VISIBLE) +-- case +CREATE TABLE t (a INT NOT NULL DEFAULT 5 INVISIBLE) +-- case +CREATE TABLE `gipk_t` (`my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */, `col1` int DEFAULT NULL, PRIMARY KEY (`my_row_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +-- case +ALTER TABLE t ADD COLUMN a INT INVISIBLE +-- case +ALTER TABLE t ALTER COLUMN a SET VISIBLE +-- case +ALTER TABLE t ALTER COLUMN a SET INVISIBLE +-- case +ALTER TABLE t MODIFY COLUMN a INT VISIBLE +-- case +CREATE TABLE t (a INT ENGINE_ATTRIBUTE = '{"k": 1}' SECONDARY_ENGINE_ATTRIBUTE = '{"k": 2}') +-- case +CREATE TABLE t (a INT ENGINE_ATTRIBUTE '{"k": 1}') +-- case +CREATE TABLE t (a INT DEFAULT (1 + 1)) +-- case +CREATE TABLE t (a DATE DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR)) diff --git a/parser/testdata/parser/mysql_unsupported_types/output.sql b/parser/testdata/parser/mysql_unsupported_types/output.sql new file mode 100644 index 0000000..1f3696d --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_types/output.sql @@ -0,0 +1,23 @@ +-- error: line 1 column 31 near "INVISIBLE)" +-- case +-- error: line 1 column 29 near "VISIBLE)" +-- case +-- error: line 1 column 50 near "INVISIBLE)" +-- case +-- error: line 1 column 93 near "INVISIBLE */, `col1` int DEFAULT NULL, PRIMARY KEY (`my_row_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci" +-- case +-- error: line 1 column 40 near "INVISIBLE" +-- case +-- error: line 1 column 40 near "VISIBLE" +-- case +-- error: line 1 column 42 near "INVISIBLE" +-- case +-- error: line 1 column 41 near "VISIBLE" +-- case +-- error: line 1 column 38 near "ENGINE_ATTRIBUTE = '{"k": 1}' SECONDARY_ENGINE_ATTRIBUTE = '{"k": 2}')" +-- case +-- error: line 1 column 38 near "ENGINE_ATTRIBUTE '{"k": 1}')" +-- case +-- error: line 1 column 34 near "+ 1))" +-- case +-- error: line 1 column 46 near "+ INTERVAL 1 YEAR))" diff --git a/parser/testdata/parser/mysql_unsupported_utility/input.sql b/parser/testdata/parser/mysql_unsupported_utility/input.sql new file mode 100644 index 0000000..02acf56 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_utility/input.sql @@ -0,0 +1,9 @@ +EXPLAIN FORMAT = TREE SELECT 1 +-- case +EXPLAIN ANALYZE FORMAT = TREE SELECT 1 +-- case +EXPLAIN FORMAT = JSON INTO @plan SELECT 1 +-- case +EXPLAIN FORMAT = JSON INTO @plan SELECT t.id, COUNT(*) FROM information_schema.tables t GROUP BY t.id +-- case +EXPLAIN t 'a%' diff --git a/parser/testdata/parser/mysql_unsupported_utility/output.sql b/parser/testdata/parser/mysql_unsupported_utility/output.sql new file mode 100644 index 0000000..190a8d5 --- /dev/null +++ b/parser/testdata/parser/mysql_unsupported_utility/output.sql @@ -0,0 +1,9 @@ +-- error: line 1 column 21 near "TREE SELECT 1" +-- case +-- error: line 1 column 29 near "TREE SELECT 1" +-- case +-- error: line 1 column 26 near "INTO @plan SELECT 1" +-- case +-- error: line 1 column 26 near "INTO @plan SELECT t.id, COUNT(*) FROM information_schema.tables t GROUP BY t.id" +-- case +-- error: line 1 column 14 near "'a%'"