diff --git a/test/parser/mysql/syntax/create.test.ts b/test/parser/mysql/syntax/create.test.ts new file mode 100644 index 00000000..714d6838 --- /dev/null +++ b/test/parser/mysql/syntax/create.test.ts @@ -0,0 +1,32 @@ +import MySQL from '../../../../src/parser/mysql'; +import { readSQL } from '../../../helper'; + +const parser = new MySQL(); + +const features = { + // createDatabase: readSQL(__dirname, 'createDatabase.sql'), + // createEvent: readSQL(__dirname, 'createEvent.sql'), + // createFunction: readSQL(__dirname, 'createFunction.sql'), + // createIndex: readSQL(__dirname, 'createIndex.sql'), + // createLogFileGroup: readSQL(__dirname, 'createLogFileGroup.sql'), + // createProcedure: readSQL(__dirname, 'createProcedure.sql'), + // createServer: readSQL(__dirname, 'createServer.sql'), + // createTable: readSQL(__dirname, 'createTable.sql'), + // createTableSpace: readSQL(__dirname, 'createTableSpace.sql'), + // createTrigger: readSQL(__dirname, 'createTrigger.sql'), + createView: readSQL(__dirname, 'createView.sql'), +}; + +describe('MySQL Create Syntax Tests', () => { + Object.keys(features).forEach((key) => { + features[key].forEach((sql) => { + it(sql, () => { + const result = parser.validate(sql); + if (result.length) { + console.log(result); + } + expect(result.length).toBe(0); + }); + }); + }); +}); diff --git a/test/parser/mysql/syntax/fixtures/createDatabase.sql b/test/parser/mysql/syntax/fixtures/createDatabase.sql new file mode 100644 index 00000000..3c840fe6 --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createDatabase.sql @@ -0,0 +1,34 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-database.html + +/* CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name + [create_option] ... + +create_option: [DEFAULT] { + CHARACTER SET [=] charset_name + | COLLATE [=] collation_name + | ENCRYPTION [=] {'Y' | 'N'} +} */ + + +-- https://dev.mysql.com/doc/refman/5.7/en/create-database.html + +/* CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name + [create_option] ... + +create_option: [DEFAULT] { + CHARACTER SET [=] charset_name + | COLLATE [=] collation_name +} */ + + +CREATE DATABASE IF NOT EXISTS db_name; +CREATE DATABASE db_name CHARACTER SET utf8mb4; +CREATE DATABASE db_name COLLATE utf8mb4_unicode_ci; +CREATE DATABASE db_name ENCRYPTION = 'Y'; +CREATE DATABASE db_name DEFAULT ENCRYPTION 'N'; + +CREATE SCHEMA IF NOT EXISTS db_name DEFAULT ENCRYPTION 'Y'; +CREATE SCHEMA db_name DEFAULT CHARACTER SET utf8mb4; +CREATE SCHEMA db_name DEFAULT COLLATE utf8mb4_unicode_ci; +CREATE SCHEMA db_name DEFAULT ENCRYPTION = 'Y'; +CREATE SCHEMA db_name DEFAULT ENCRYPTION 'N'; diff --git a/test/parser/mysql/syntax/fixtures/createEvent.sql b/test/parser/mysql/syntax/fixtures/createEvent.sql new file mode 100644 index 00000000..edeb0abe --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createEvent.sql @@ -0,0 +1,41 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-event.html + +/* CREATE + [DEFINER = user] + EVENT + [IF NOT EXISTS] + event_name + ON SCHEDULE schedule + [ON COMPLETION [NOT] PRESERVE] + [ENABLE | DISABLE | DISABLE ON SLAVE] + [COMMENT 'string'] + DO event_body; + +schedule: { + AT timestamp [+ INTERVAL interval] ... + | EVERY interval + [STARTS timestamp [+ INTERVAL interval] ...] + [ENDS timestamp [+ INTERVAL interval] ...] +} + +interval: + quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | + WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | + DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} */ + + +CREATE EVENT IF NOT EXISTS my_event ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO UPDATE my_schema.my_table SET mycol = mycol + 1; + +CREATE EVENT e_totals ON SCHEDULE AT '2006-02-10 23:59:00' DO INSERT INTO test.totals VALUES (NOW()); + +CREATE EVENT e_hourly ON SCHEDULE EVERY 1 HOUR COMMENT 'Clears out sessions table each hour.' DO DELETE FROM site_activity.sessions; + +CREATE EVENT e_daily + ON SCHEDULE + EVERY 1 DAY + COMMENT 'Saves total number of sessions then clears the table each day' + DO INSERT INTO site_activity.totals (time, total) + SELECT CURRENT_TIMESTAMP, COUNT(*) + FROM site_activity.sessions; + +CREATE EVENT e_call_my ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY DO CALL myproc(5, 27); diff --git a/test/parser/mysql/syntax/fixtures/createFunction.sql b/test/parser/mysql/syntax/fixtures/createFunction.sql new file mode 100644 index 00000000..4e7de51c --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createFunction.sql @@ -0,0 +1,16 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-function-loadable.html +-- https://dev.mysql.com/doc/refman/5.7/en/create-function-loadable.html + +/* CREATE [AGGREGATE] FUNCTION [IF NOT EXISTS] function_name + RETURNS {STRING|INTEGER|REAL|DECIMAL} + SONAME shared_library_name */ + + +CREATE AGGREGATE FUNCTION IF NOT EXISTS GetSum(a INT, b INT) RETURNS INTEGER RETURN a + b; + +CREATE FUNCTION GetSum(a INT, b INT) RETURNS INTEGER RETURN a + b; +CREATE FUNCTION GetSum(a INT, b INT) RETURNS VARCHAR RETURN a + b; +CREATE FUNCTION GetSum(a INT, b INT) RETURNS REAL RETURN a + b; +CREATE FUNCTION GetSum(a INT, b INT) RETURNS DECIMAL RETURN a + b; + +CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!'); diff --git a/test/parser/mysql/syntax/fixtures/createIndex.sql b/test/parser/mysql/syntax/fixtures/createIndex.sql new file mode 100644 index 00000000..bffd650b --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createIndex.sql @@ -0,0 +1,43 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-index.html + +/* CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name + [index_type] + ON tbl_name (key_part,...) + [index_option] + [algorithm_option | lock_option] ... + +key_part: {col_name [(length)] | (expr)} [ASC | DESC] + +index_option: { + KEY_BLOCK_SIZE [=] value + | index_type + | WITH PARSER parser_name + | COMMENT 'string' + | {VISIBLE | INVISIBLE} + | ENGINE_ATTRIBUTE [=] 'string' + | SECONDARY_ENGINE_ATTRIBUTE [=] 'string' +} + +index_type: + USING {BTREE | HASH} + +algorithm_option: + ALGORITHM [=] {DEFAULT | INPLACE | COPY} + +lock_option: + LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE} + */ + + +CREATE UNIQUE INDEX index_name ON table_name (name(10)); +CREATE FULLTEXT INDEX index_name ON table_name (name(10)); +CREATE SPATIAL INDEX index_name ON table_name (name(10)); + +CREATE INDEX part_of_name ON customer (name(10)); + +CREATE INDEX idx1 ON t1 ((col1 + col2)); +CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1); + +CREATE INDEX id_index ON lookup (id) USING BTREE; +CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40'; +CREATE INDEX i1 ON t1 (c1) ENGINE_ATTRIBUTE='{"key":"value"}'; diff --git a/test/parser/mysql/syntax/fixtures/createLogFileGroup.sql b/test/parser/mysql/syntax/fixtures/createLogFileGroup.sql new file mode 100644 index 00000000..164f0a6a --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createLogFileGroup.sql @@ -0,0 +1,30 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-logfile-group.html + +/* CREATE LOGFILE GROUP logfile_group + ADD UNDOFILE 'undo_file' + [INITIAL_SIZE [=] initial_size] + [UNDO_BUFFER_SIZE [=] undo_buffer_size] + [REDO_BUFFER_SIZE [=] redo_buffer_size] + [NODEGROUP [=] nodegroup_id] + [WAIT] + [COMMENT [=] 'string'] + ENGINE [=] engine_name */ + + +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' INITIAL_SIZE = 10M ENGINE = NDB; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' INITIAL_SIZE 10M ENGINE = NDB; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' ENGINE = NDB; + +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' UNDO_BUFFER_SIZE = 10M ENGINE = NDB; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' UNDO_BUFFER_SIZE 10M ENGINE = NDB; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' ENGINE = NDB; + +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' REDO_BUFFER_SIZE = 10M ENGINE = NDB; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' REDO_BUFFER_SIZE 10M ENGINE = NDB; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' ENGINE = NDB; + +CREATE LOGFILE GROUP my_logfile_group ADD UNDOFILE 'undo_1.log' INITIAL_SIZE = 1G UNDO_BUFFER_SIZE = 16M ENGINE INNODB; + +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' INITIAL_SIZE = 10M UNDO_BUFFER_SIZE = 10M REDO_BUFFER_SIZE = 10M NODEGROUP = nodegroup_id WAIT COMMENT = 'logfile' ENGINE = NDB; + +CREATE LOGFILE GROUP myg1 ADD UNDOFILE 'myundo-1.dat' ENGINE=NDB; diff --git a/test/parser/mysql/syntax/fixtures/createProcedure.sql b/test/parser/mysql/syntax/fixtures/createProcedure.sql new file mode 100644 index 00000000..86bb9e16 --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createProcedure.sql @@ -0,0 +1,22 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html + +/* CREATE + [DEFINER = user] + PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]]) + [characteristic ...] routine_body + + proc_parameter: + [ IN | OUT | INOUT ] param_name type + + characteristic: { + COMMENT 'string' + | LANGUAGE SQL + | [NOT] DETERMINISTIC + | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } + | SQL SECURITY { DEFINER | INVOKER } + } */ + + +CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count() SQL SECURITY INVOKER SELECT 'Number of accounts:', COUNT(*) FROM mysql.user; + +CREATE PROCEDURE AddTwoNumbers(IN a INT, IN b INT) SELECT a + b AS Sum; diff --git a/test/parser/mysql/syntax/fixtures/createServer.sql b/test/parser/mysql/syntax/fixtures/createServer.sql new file mode 100644 index 00000000..09cce5d4 --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createServer.sql @@ -0,0 +1,17 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-server.html + +/* CREATE SERVER server_name + FOREIGN DATA WRAPPER wrapper_name + OPTIONS (option [, option] ...) + +option: { + HOST character-literal + | DATABASE character-literal + | USER character-literal + | PASSWORD character-literal + | SOCKET character-literal + | OWNER character-literal + | PORT numeric-literal +} */ + +CREATE SERVER server_name FOREIGN DATA WRAPPER mysql OPTIONS (USER 'Remote', HOST '198.51.100.106', DATABASE 'test'); diff --git a/test/parser/mysql/syntax/fixtures/createTable.sql b/test/parser/mysql/syntax/fixtures/createTable.sql new file mode 100644 index 00000000..ae2c2f9f --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createTable.sql @@ -0,0 +1,111 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-table.html + + +CREATE TEMPORARY TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0; + +CREATE TABLE new_tbl LIKE orig_tbl; +CREATE TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0; +CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl; + +CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (a), KEY(b)) ENGINE=InnoDB SELECT b,c FROM test2; + +CREATE TABLE bar (m INT) SELECT n FROM foo; + +CREATE TABLE artists_and_works SELECT artist.name, COUNT(work.artist_id) AS number_of_works FROM artist LEFT JOIN work ON artist.id = work.artist_id GROUP BY artist.id; + +CREATE TABLE new_tbl AS SELECT * FROM orig_tbl; +CREATE TABLE t (c CHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin); +CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); +CREATE TABLE t1 (c1 INT) ENGINE_ATTRIBUTE='{"key":"value"}'; +CREATE TABLE my_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; +CREATE TABLE t1 (c1 INT STORAGE DISK, c2 INT STORAGE MEMORY) TABLESPACE ts_1 ENGINE NDB; +CREATE TABLE t1 (c1 INT STORAGE MEMORY, c2 INT STORAGE MEMORY) TABLESPACE ts_1 ENGINE NDB; + +CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY; +CREATE TABLE t1 (c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(100), c3 VARCHAR(100)) ENGINE=NDB COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE"; + +CREATE TABLE t1 (col1 INT, col2 CHAR(5)) PARTITION BY HASH(col1); +CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME) PARTITION BY HASH (YEAR(col3)); + +CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3) PARTITIONS 4; +CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY(col3) PARTITIONS 5; +CREATE TABLE t1 (year_col INT, some_data INT) PARTITION BY RANGE (year_col) ( + PARTITION p0 VALUES LESS THAN (1991), + PARTITION p1 VALUES LESS THAN (1995), + PARTITION p2 VALUES LESS THAN (1999), + PARTITION p3 VALUES LESS THAN (2002), + PARTITION p4 VALUES LESS THAN (2006), + PARTITION p5 VALUES LESS THAN MAXVALUE +); +CREATE TABLE rc (a INT NOT NULL, b INT NOT NULL) PARTITION BY RANGE COLUMNS(a,b) ( + PARTITION p0 VALUES LESS THAN (10,5), + PARTITION p1 VALUES LESS THAN (20,10), + PARTITION p2 VALUES LESS THAN (50,MAXVALUE), + PARTITION p3 VALUES LESS THAN (65,MAXVALUE), + PARTITION p4 VALUES LESS THAN (MAXVALUE,MAXVALUE) +); +CREATE TABLE client_firms (id INT, name VARCHAR(35)) PARTITION BY LIST (id) ( + PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21), + PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22), + PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23), + PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24) +); +CREATE TABLE lc (a INT NULL, b INT NULL) PARTITION BY LIST COLUMNS(a,b) ( + PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ), + PARTITION p1 VALUES IN( (0,1), (0,2), (0,3), (1,1), (1,2) ), + PARTITION p2 VALUES IN( (1,0), (2,0), (2,1), (3,0), (3,1) ), + PARTITION p3 VALUES IN( (1,3), (2,2), (2,3), (3,2), (3,3) ) +); +CREATE TABLE th (id INT, name VARCHAR(30), adate DATE) PARTITION BY LIST(YEAR(adate)) ( + PARTITION p1999 VALUES IN (1995, 1999, 2003) + DATA DIRECTORY = '/var/appdata/95/data' + INDEX DIRECTORY = '/var/appdata/95/idx', + PARTITION p2000 VALUES IN (1996, 2000, 2004) + DATA DIRECTORY = '/var/appdata/96/data' + INDEX DIRECTORY = '/var/appdata/96/idx', + PARTITION p2001 VALUES IN (1997, 2001, 2005) + DATA DIRECTORY = '/var/appdata/97/data' + INDEX DIRECTORY = '/var/appdata/97/idx', + PARTITION p2002 VALUES IN (1998, 2002, 2006) + DATA DIRECTORY = '/var/appdata/98/data' + INDEX DIRECTORY = '/var/appdata/98/idx' +); +CREATE TABLE t1 (s1 INT, s2 INT AS (EXP(s1)) STORED) PARTITION BY LIST (s2) (PARTITION p1 VALUES IN (1)); + +CREATE TABLE tv1 (col1 INT, col2 INT, col3 INT) VALUES (1, 3, 5), (2, 4, 6); +CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar; + +CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; +CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB; + +CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; +CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; +CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), INDEX (customer_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB; + +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 INT CHECK (c3 < 100), CONSTRAINT c1_nonzero CHECK (c1 <> 0), CHECK (c1 > c3)); +CREATE TABLE t2 (c1 VARCHAR(10) CHARACTER SET binary, c2 TEXT CHARACTER SET binary, c3 ENUM('a','b','c') CHARACTER SET binary); +CREATE TABLE t3 (c1 VARBINARY(10), c2 BLOB, c3 ENUM('a','b','c') CHARACTER SET binary); + +CREATE TABLE triangle (sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))); +CREATE VIEW v1 AS SELECT *, CONCAT(first_name,' ',last_name) AS full_name FROM t1; +CREATE TABLE t1 (first_name VARCHAR(10), last_name VARCHAR(10), full_name VARCHAR(255) AS (CONCAT(first_name,' ',last_name))); + +CREATE TABLE t1 (c JSON, g INT GENERATED ALWAYS AS (c->"$.id"), INDEX i (g)); +CREATE TABLE t2 (a BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, c JSON DEFAULT NULL, g INT GENERATED ALWAYS AS (c->"$.id") STORED, INDEX i (g)) ENGINE=NDB; + +CREATE TABLE t1 (i INT, j DATE INVISIBLE) ENGINE = InnoDB; +CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE); +CREATE TABLE t2 AS SELECT col1, col2 FROM t1; +CREATE TABLE t2 (col2 INT INVISIBLE) AS SELECT col1, col2 FROM t1; + +CREATE TABLE auto_0 (c1 VARCHAR(50), c2 INT); +CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b1 BLOB, b2 BLOB COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=8000') ENGINE NDB; +CREATE TABLE test.t2 (p INT PRIMARY KEY, c1 BLOB, c2 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE') ENGINE NDB; +CREATE TABLE test.t3 (p INT NOT NULL PRIMARY KEY, c1 JSON, c2 JSON COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=5000,MAX_BLOB_PART_SIZE') ENGINE NDB; +CREATE TABLE t1 (c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(100), c3 VARCHAR(100)) ENGINE=NDB + +CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=REDUNDANT; +CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT; +CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC; + +CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; diff --git a/test/parser/mysql/syntax/fixtures/createTableSpace.sql b/test/parser/mysql/syntax/fixtures/createTableSpace.sql new file mode 100644 index 00000000..4ad8f1de --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createTableSpace.sql @@ -0,0 +1,38 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-tablespace.html + +/* CREATE [UNDO] TABLESPACE tablespace_name + + InnoDB and NDB: + [ADD DATAFILE 'file_name'] + [AUTOEXTEND_SIZE [=] value] + + InnoDB only: + [FILE_BLOCK_SIZE = value] + [ENCRYPTION [=] {'Y' | 'N'}] + + NDB only: + USE LOGFILE GROUP logfile_group + [EXTENT_SIZE [=] extent_size] + [INITIAL_SIZE [=] initial_size] + [MAX_SIZE [=] max_size] + [NODEGROUP [=] nodegroup_id] + [WAIT] + [COMMENT [=] 'string'] + + InnoDB and NDB: + [ENGINE [=] engine_name] + + Reserved for future use: + [ENGINE_ATTRIBUTE [=] 'string'] */ + + +CREATE TABLESPACE ts1 ADD DATAFILE 'any_directory/../ts1.ibd' AUTOEXTEND_SIZE = 100M; +CREATE TABLESPACE ts1 ENGINE_ATTRIBUTE='{"key":"value"}'; +CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENGINE=INNODB; +CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB; +CREATE TABLESPACE `ts3` ENGINE=INNODB; + +CREATE UNDO TABLESPACE 'undo_003' ADD DATAFILE 'undo_003.ibu'; + + + diff --git a/test/parser/mysql/syntax/fixtures/createTrigger.sql b/test/parser/mysql/syntax/fixtures/createTrigger.sql new file mode 100644 index 00000000..139745cd --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createTrigger.sql @@ -0,0 +1,22 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-trigger.html + +/* CREATE + [DEFINER = user] + TRIGGER [IF NOT EXISTS] trigger_name + { BEFORE | AFTER } + { INSERT | UPDATE | DELETE } + ON tbl_name FOR EACH ROW + [{ FOLLOWS | PRECEDES } other_trigger_name] + trigger_body +*/ + + +CREATE TRIGGER IF NOT EXISTS my_trigger BEFORE INSERT ON your_table FOR EACH ROW SET NEW.column_name = some_value; +CREATE TRIGGER my_trigger BEFORE INSERT ON your_table FOR EACH ROW SET NEW.column_name = some_value; + +CREATE TRIGGER my_trigger AFTER INSERT ON your_table FOR EACH ROW SET NEW.column_name = some_value; +CREATE TRIGGER my_trigger AFTER UPDATE ON your_table FOR EACH ROW SET NEW.column_name = some_value; +CREATE TRIGGER my_trigger AFTER DELETE ON your_table FOR EACH ROW SET NEW.column_name = some_value; + +CREATE TRIGGER my_trigger AFTER INSERT ON your_table FOR EACH ROW FOLLOWS other_trigger_name SET NEW.column_name = some_value; +CREATE TRIGGER my_trigger AFTER INSERT ON your_table FOR EACH ROW PRECEDES other_trigger_name SET NEW.column_name = some_value; diff --git a/test/parser/mysql/syntax/fixtures/createView.sql b/test/parser/mysql/syntax/fixtures/createView.sql new file mode 100644 index 00000000..de05d232 --- /dev/null +++ b/test/parser/mysql/syntax/fixtures/createView.sql @@ -0,0 +1,18 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/create-view.html + +/* CREATE + [OR REPLACE] + [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] + [DEFINER = user] + [SQL SECURITY { DEFINER | INVOKER }] + VIEW view_name [(column_list)] + AS select_statement + [WITH [CASCADED | LOCAL] CHECK OPTION] */ + + +CREATE VIEW test.v AS SELECT * FROM t; +CREATE VIEW v_today (today) AS SELECT CURRENT_DATE; +CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; +CREATE VIEW v (mycol) AS SELECT 'abc'; + +CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);