From 88d1b62f0038a9a50e057c807c811537b365f1c3 Mon Sep 17 00:00:00 2001 From: Andreas Reichel Date: Tue, 16 May 2023 02:59:15 +0700 Subject: [PATCH] fix: issue #1791 - Allow `START` keyword as table `CreateParameter` --- build.gradle | 42 +-- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 + .../statement/create/CreateTableTest.java | 318 ++++++++++-------- 3 files changed, 202 insertions(+), 160 deletions(-) diff --git a/build.gradle b/build.gradle index e0d2882b2..519736724 100644 --- a/build.gradle +++ b/build.gradle @@ -21,15 +21,14 @@ plugins { } def getVersion = { boolean considerSnapshot -> - def major = 0 - def minor = 0 - def patch = 0 - def build = 0 - def commit = "" - def snapshot ="" + Integer major = 0 + Integer minor = 0 + Integer patch = null + Integer build = null + def commit = null + def snapshot = "" new ByteArrayOutputStream().withStream { os -> - exec { - workingDir "$projectDir" + def result = exec { args = [ "--no-pager" , "describe" @@ -41,24 +40,25 @@ def getVersion = { boolean considerSnapshot -> standardOutput = os } def versionStr = os.toString().trim() - def matcher = versionStr =~ /jsqlparser-(\d*)\.(\d*)(-(\d*)-([a-zA-Z\d]*))?/ - matcher.find() - - major = matcher[0][1] - minor = matcher[0][2] - if (matcher[0].size > 2) { - build = matcher[0][4] - commit = matcher[0][5] + def pattern = /(?\d*)\.(?\d*)(\.(?\d*))?(-(?\d*)-(?[a-zA-Z\d]*))?/ + def matcher = versionStr =~ pattern + if (matcher.find()) { + major = matcher.group('major') as Integer + minor = matcher.group('minor') as Integer + patch = matcher.group('patch') as Integer + build = matcher.group('build') as Integer + commit = matcher.group('commit') } - if (considerSnapshot && ( versionStr.endsWith('SNAPSHOT') || build>0) ) { + if (considerSnapshot && ( versionStr.endsWith('SNAPSHOT') || build!=null) ) { minor++ - patch = 0 - snapshot = "-SNAPSHOT" + if (patch!=null) patch = 0 + snapshot = "-SNAPSHOT" } - println("Derived Version: $versionStr --> ${major}.${minor}.${patch}${snapshot}") } - return "${major}.${minor}${snapshot}" + return patch!=null + ? "${major}.${minor}.${patch}${snapshot}" + : "${major}.${minor}${snapshot}"; } version = getVersion(true) group = 'com.github.jsqlparser' diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 2ff936e48..e6fb48c37 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -5446,6 +5446,8 @@ List CreateParameter(): | tk= { param.add(tk.image); } | + tk= { param.add(tk.image); } + | (tk= tk2=) { param.add(tk.image); param.add(tk2.image);} | ( exp=ArrayConstructor(true)) { param.add(exp.toString()); } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java index 5ee5f9dbe..368173f43 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java @@ -9,14 +9,6 @@ */ package net.sf.jsqlparser.statement.create; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.operators.relational.GreaterThan; @@ -31,14 +23,24 @@ import net.sf.jsqlparser.statement.create.table.Index; import net.sf.jsqlparser.statement.create.table.RowMovementMode; import net.sf.jsqlparser.test.TestException; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; + import static net.sf.jsqlparser.test.TestUtils.assertDeparse; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; -import org.assertj.core.api.Assertions; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; public class CreateTableTest { @@ -71,16 +73,16 @@ public void testCreateTableAsSelect() @Test public void testCreateTableAsSelect2() throws JSQLParserException { - String statement - = "CREATE TABLE newtable AS WITH a AS (SELECT col1, col3 FROM testtable) SELECT col1, col2, col3 FROM b INNER JOIN a ON b.col1 = a.col1"; + String statement = + "CREATE TABLE newtable AS WITH a AS (SELECT col1, col3 FROM testtable) SELECT col1, col2, col3 FROM b INNER JOIN a ON b.col1 = a.col1"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testCreateTable() throws JSQLParserException { - String statement - = "CREATE TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " - + "PRIMARY KEY (mycol2, mycol)) type = myisam"; + String statement = + "CREATE TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " + + "PRIMARY KEY (mycol2, mycol)) type = myisam"; CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(statement)); assertEquals(2, createTable.getColumnDefinitions().size()); assertFalse(createTable.isUnlogged()); @@ -93,9 +95,9 @@ public void testCreateTable() throws JSQLParserException { @Test public void testCreateTableUnlogged() throws JSQLParserException { - String statement - = "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " - + "PRIMARY KEY (mycol2, mycol)) type = myisam"; + String statement = + "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " + + "PRIMARY KEY (mycol2, mycol)) type = myisam"; CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(statement)); assertEquals(2, createTable.getColumnDefinitions().size()); assertTrue(createTable.isUnlogged()); @@ -108,43 +110,43 @@ public void testCreateTableUnlogged() throws JSQLParserException { @Test public void testCreateTableUnlogged2() throws JSQLParserException { - String statement - = "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, PRIMARY KEY (mycol2, mycol))"; + String statement = + "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, PRIMARY KEY (mycol2, mycol))"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testCreateTableForeignKey() throws JSQLParserException { - String statement - = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES ra_user(id))"; + String statement = + "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES ra_user(id))"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testCreateTableForeignKey2() throws JSQLParserException { - String statement - = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), CONSTRAINT fkIdx FOREIGN KEY (user_id) REFERENCES ra_user(id))"; + String statement = + "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), CONSTRAINT fkIdx FOREIGN KEY (user_id) REFERENCES ra_user(id))"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testCreateTableForeignKey3() throws JSQLParserException { - String statement - = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED REFERENCES ra_user(id), PRIMARY KEY (id))"; + String statement = + "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED REFERENCES ra_user(id), PRIMARY KEY (id))"; assertSqlCanBeParsedAndDeparsed(statement, true); } @Test public void testCreateTableForeignKey4() throws JSQLParserException { - String statement - = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED FOREIGN KEY REFERENCES ra_user(id), PRIMARY KEY (id))"; + String statement = + "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED FOREIGN KEY REFERENCES ra_user(id), PRIMARY KEY (id))"; assertSqlCanBeParsedAndDeparsed(statement, true); } @Test public void testCreateTablePrimaryKey() throws JSQLParserException { - String statement - = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, CONSTRAINT pk_name PRIMARY KEY (id))"; + String statement = + "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, CONSTRAINT pk_name PRIMARY KEY (id))"; assertSqlCanBeParsedAndDeparsed(statement); } @@ -162,20 +164,19 @@ public void testCreateTableParams2() throws JSQLParserException { @Test public void testCreateTableUniqueConstraint() throws JSQLParserException { - String sqlStr - = "CREATE TABLE Activities (_id INTEGER PRIMARY KEY AUTOINCREMENT,uuid VARCHAR(255),user_id INTEGER,sound_id INTEGER,sound_type INTEGER,comment_id INTEGER,type String,tags VARCHAR(255),created_at INTEGER,content_id INTEGER,sharing_note_text VARCHAR(255),sharing_note_created_at INTEGER,UNIQUE (created_at, type, content_id, sound_id, user_id))"; + String sqlStr = + "CREATE TABLE Activities (_id INTEGER PRIMARY KEY AUTOINCREMENT,uuid VARCHAR(255),user_id INTEGER,sound_id INTEGER,sound_type INTEGER,comment_id INTEGER,type String,tags VARCHAR(255),created_at INTEGER,content_id INTEGER,sharing_note_text VARCHAR(255),sharing_note_created_at INTEGER,UNIQUE (created_at, type, content_id, sound_id, user_id))"; assertSqlCanBeParsedAndDeparsed(sqlStr, true); - CreateTable createTable - = (CreateTable) CCJSqlParserUtil.parseStatements(sqlStr).getStatements().get(0); + CreateTable createTable = + (CreateTable) CCJSqlParserUtil.parseStatements(sqlStr).getStatements().get(0); } @Test public void testCreateTableUniqueConstraintAfterPrimaryKey() throws JSQLParserException { - String sqlStr - = "-- UniqueConstraintAfterPrimaryKey\n" + String sqlStr = "-- UniqueConstraintAfterPrimaryKey\n" + "CREATE TABLE employees (\n" + " employee_number int NOT NULL\n" + " , employee_name char (50) NOT NULL\n" @@ -189,8 +190,8 @@ public void testCreateTableUniqueConstraintAfterPrimaryKey() throws JSQLParserEx assertSqlCanBeParsedAndDeparsed(sqlStr, true); - CreateTable createTable - = (CreateTable) CCJSqlParserUtil.parseStatements(sqlStr).getStatements().get(0); + CreateTable createTable = + (CreateTable) CCJSqlParserUtil.parseStatements(sqlStr).getStatements().get(0); assertEquals("PRIMARY KEY", createTable.getIndexes().get(0).getType()); assertEquals("UNIQUE", createTable.getIndexes().get(1).getType()); @@ -356,7 +357,8 @@ public void testCreateTableIssue270_1() throws JSQLParserException { @Test public void testCreateTempTableIssue293() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE GLOBAL TEMPORARY TABLE T1 (PROCESSID VARCHAR (32))"); + assertSqlCanBeParsedAndDeparsed( + "CREATE GLOBAL TEMPORARY TABLE T1 (PROCESSID VARCHAR (32))"); } @Test @@ -384,12 +386,14 @@ public void testColumnCheck() throws JSQLParserException { @Test public void testTableReferenceWithSchema() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (col1 INTEGER REFERENCES schema1.table1)"); + assertSqlCanBeParsedAndDeparsed( + "CREATE TABLE table1 (col1 INTEGER REFERENCES schema1.table1)"); } @Test public void testNamedColumnConstraint() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer CONSTRAINT no_null NOT NULL)"); + assertSqlCanBeParsedAndDeparsed( + "CREATE TABLE foo (col1 integer CONSTRAINT no_null NOT NULL)"); } @Test @@ -410,7 +414,8 @@ public void testExcludeWhereConstraint() throws JSQLParserException { new GreaterThan() .withLeftExpression(new Column("col1")) .withRightExpression(new LongValue(100)))) - .addColumnDefinitions(new ColumnDefinition("col1", new ColDataType("integer"))), + .addColumnDefinitions( + new ColumnDefinition("col1", new ColDataType("integer"))), statement); } @@ -423,7 +428,8 @@ public void testTimestampWithoutTimezone() throws JSQLParserException { .withTable(new Table(Arrays.asList("abc", "tabc"))) .addColumnDefinitions( new ColumnDefinition( - "transaction_date", new ColDataType("TIMESTAMP WITHOUT TIME ZONE"))), + "transaction_date", + new ColDataType("TIMESTAMP WITHOUT TIME ZONE"))), statement); } @@ -449,16 +455,17 @@ public void testCreateUnionIssue() throws JSQLParserException { public void testTimestampWithTimezone() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "CREATE TABLE country_region (" - + "regionid BIGINT NOT NULL CONSTRAINT pk_auth_region PRIMARY KEY, " - + "region_name VARCHAR (100) NOT NULL, " - + "creation_date TIMESTAMP (0) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0) NOT NULL, " - + "last_change_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0), " - + "CONSTRAINT region_name_unique UNIQUE (region_name))"); + + "regionid BIGINT NOT NULL CONSTRAINT pk_auth_region PRIMARY KEY, " + + "region_name VARCHAR (100) NOT NULL, " + + "creation_date TIMESTAMP (0) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0) NOT NULL, " + + "last_change_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0), " + + "CONSTRAINT region_name_unique UNIQUE (region_name))"); } @Test public void testCreateTableAsSelect3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE public.sales1 AS (SELECT * FROM public.sales)"); + assertSqlCanBeParsedAndDeparsed( + "CREATE TABLE public.sales1 AS (SELECT * FROM public.sales)"); } @Test @@ -506,10 +513,9 @@ public void testIssue770Using() throws JSQLParserException { @Test public void testRUBiSCreateList() throws Exception { - BufferedReader in - = new BufferedReader( - new InputStreamReader( - CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt"))); + BufferedReader in = new BufferedReader( + new InputStreamReader( + CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt"))); try { int numSt = 1; @@ -541,7 +547,8 @@ public void testRUBiSCreateList() throws Exception { String tableName = getLine(in); String cols = getLine(in); try { - CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(query)); + CreateTable createTable = + (CreateTable) parserManager.parse(new StringReader(query)); String[] colsList = null; if ("null".equals(cols)) { colsList = new String[0]; @@ -557,7 +564,8 @@ public void testRUBiSCreateList() throws Exception { } List colsFound = new ArrayList<>(); if (createTable.getColumnDefinitions() != null) { - for (ColumnDefinition columnDefinition : createTable.getColumnDefinitions()) { + for (ColumnDefinition columnDefinition : createTable + .getColumnDefinitions()) { String colName = columnDefinition.getColumnName(); boolean unique = false; if (createTable.getIndexes() != null) { @@ -572,8 +580,9 @@ public void testRUBiSCreateList() throws Exception { if (!unique) { if (columnDefinition.getColumnSpecs() != null) { - for (Iterator iterator = columnDefinition.getColumnSpecs().iterator(); - iterator.hasNext();) { + for (Iterator iterator = + columnDefinition.getColumnSpecs().iterator(); iterator + .hasNext();) { String par = iterator.next(); if (par.equals("UNIQUE")) { unique = true; @@ -616,7 +625,8 @@ private String getLine(BufferedReader in) throws Exception { if (line != null) { if (line.length() != 0 && (line.length() < 2 - || line.length() >= 2 && !(line.charAt(0) == '/' && line.charAt(1) == '/'))) { + || line.length() >= 2 + && !(line.charAt(0) == '/' && line.charAt(1) == '/'))) { break; } } else { @@ -649,36 +659,36 @@ public void testCreateTableIssue798() throws JSQLParserException { public void testCreateTableIssue798_2() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "CREATE TABLE parent (\n" - + "PARENT_ID int(11) NOT NULL AUTO_INCREMENT,\n" - + "PCN varchar(100) NOT NULL,\n" - + "IS_DELETED char(1) NOT NULL,\n" - + "STRUCTURE_ID int(11) NOT NULL,\n" - + "DIRTY_STATUS char(1) NOT NULL,\n" - + "BIOLOGICAL char(1) NOT NULL,\n" - + "STRUCTURE_TYPE int(11) NOT NULL,\n" - + "CST_ORIGINAL varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,\n" - + "MWT decimal(14,6) DEFAULT NULL,\n" - + "RESTRICTED int(11) NOT NULL,\n" - + "INIT_DATE datetime DEFAULT NULL,\n" - + "MOD_DATE datetime DEFAULT NULL,\n" - + "CREATED_BY varchar(255) NOT NULL,\n" - + "MODIFIED_BY varchar(255) NOT NULL,\n" - + "CHEMIST_ID varchar(255) NOT NULL,\n" - + "UNKNOWN_ID int(11) DEFAULT NULL,\n" - + "STEREOCHEMISTRY varchar(256) DEFAULT NULL,\n" - + "GEOMETRIC_ISOMERISM varchar(256) DEFAULT NULL,\n" - + "PRIMARY KEY (PARENT_ID),\n" - + "UNIQUE KEY PARENT_PCN_IDX (PCN),\n" - + "KEY PARENT_SID_IDX (STRUCTURE_ID),\n" - + "KEY PARENT_DIRTY_IDX (DIRTY_STATUS)\n" - + ") ENGINE=InnoDB AUTO_INCREMENT=2663 DEFAULT CHARSET=utf8", + + "PARENT_ID int(11) NOT NULL AUTO_INCREMENT,\n" + + "PCN varchar(100) NOT NULL,\n" + + "IS_DELETED char(1) NOT NULL,\n" + + "STRUCTURE_ID int(11) NOT NULL,\n" + + "DIRTY_STATUS char(1) NOT NULL,\n" + + "BIOLOGICAL char(1) NOT NULL,\n" + + "STRUCTURE_TYPE int(11) NOT NULL,\n" + + "CST_ORIGINAL varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,\n" + + "MWT decimal(14,6) DEFAULT NULL,\n" + + "RESTRICTED int(11) NOT NULL,\n" + + "INIT_DATE datetime DEFAULT NULL,\n" + + "MOD_DATE datetime DEFAULT NULL,\n" + + "CREATED_BY varchar(255) NOT NULL,\n" + + "MODIFIED_BY varchar(255) NOT NULL,\n" + + "CHEMIST_ID varchar(255) NOT NULL,\n" + + "UNKNOWN_ID int(11) DEFAULT NULL,\n" + + "STEREOCHEMISTRY varchar(256) DEFAULT NULL,\n" + + "GEOMETRIC_ISOMERISM varchar(256) DEFAULT NULL,\n" + + "PRIMARY KEY (PARENT_ID),\n" + + "UNIQUE KEY PARENT_PCN_IDX (PCN),\n" + + "KEY PARENT_SID_IDX (STRUCTURE_ID),\n" + + "KEY PARENT_DIRTY_IDX (DIRTY_STATUS)\n" + + ") ENGINE=InnoDB AUTO_INCREMENT=2663 DEFAULT CHARSET=utf8", true); } @Test public void testCreateTableIssue113() throws JSQLParserException { - String statement - = "CREATE TABLE foo (reason character varying (255) DEFAULT 'Test' :: character varying NOT NULL)"; + String statement = + "CREATE TABLE foo (reason character varying (255) DEFAULT 'Test' :: character varying NOT NULL)"; assertSqlCanBeParsedAndDeparsed(statement); assertDeparse( new CreateTable() @@ -690,8 +700,11 @@ public void testCreateTableIssue113() throws JSQLParserException { .withColDataType( new ColDataType() .withDataType("character varying") - .addArgumentsStringList(Arrays.asList("255"))) - .addColumnSpecs("DEFAULT 'Test' :: character varying", "NOT NULL"))), + .addArgumentsStringList( + Arrays.asList("255"))) + .addColumnSpecs( + "DEFAULT 'Test' :: character varying", + "NOT NULL"))), statement); } @@ -702,21 +715,21 @@ public void testCreateTableIssue830() throws JSQLParserException { @Test public void testCreateTableIssue830_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE testyesr (id int, yy year, mm month, dd day)"); + assertSqlCanBeParsedAndDeparsed( + "CREATE TABLE testyesr (id int, yy year, mm month, dd day)"); } @Test public void testSettingCharacterSetIssue829() throws JSQLParserException { - String sql - = "CREATE TABLE test (id int (11) NOT NULL, name varchar (64) CHARACTER SET GBK NOT NULL, age int (11) NOT NULL, score decimal (8, 2) DEFAULT NULL, description varchar (64) DEFAULT NULL, creationDate datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4"; + String sql = + "CREATE TABLE test (id int (11) NOT NULL, name varchar (64) CHARACTER SET GBK NOT NULL, age int (11) NOT NULL, score decimal (8, 2) DEFAULT NULL, description varchar (64) DEFAULT NULL, creationDate datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4"; assertSqlCanBeParsedAndDeparsed(sql); CreateTable stmt = (CreateTable) CCJSqlParserUtil.parse(sql); - ColumnDefinition colName - = stmt.getColumnDefinitions().stream() - .filter(col -> col.getColumnName().equals("name")) - .findFirst() - .orElse(null); + ColumnDefinition colName = stmt.getColumnDefinitions().stream() + .filter(col -> col.getColumnName().equals("name")) + .findFirst() + .orElse(null); assertNotNull(colName); @@ -745,7 +758,8 @@ public void testCreateTableIssue921() throws JSQLParserException { .addColumnDefinitions( new ColumnDefinition( "c1", - new ColDataType().withDataType("binary").addArgumentsStringList("10"), + new ColDataType().withDataType("binary") + .addArgumentsStringList("10"), null)), statement); } @@ -754,17 +768,17 @@ public void testCreateTableIssue921() throws JSQLParserException { public void testCreateTableWithComments() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "CREATE TABLE IF NOT EXISTS `eai_applications`(\n" - + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'comment',\n" - + " `name` varchar(64) NOT NULL COMMENT 'comment',\n" - + " `logo` varchar(128) DEFAULT NULL COMMENT 'comment',\n" - + " `description` varchar(128) DEFAULT NULL COMMENT 'comment',\n" - + " `type` int(11) NOT NULL COMMENT 'comment',\n" - + " `status` tinyint(2) NOT NULL COMMENT 'comment',\n" - + " `creator_id` bigint(20) NOT NULL COMMENT 'comment',\n" - + " `created_at` datetime NOT NULL COMMENT 'comment',\n" - + " `updated_at` datetime NOT NULL COMMENT 'comment',\n" - + " PRIMARY KEY (`id`)\n" - + ") COMMENT='comment'", + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'comment',\n" + + " `name` varchar(64) NOT NULL COMMENT 'comment',\n" + + " `logo` varchar(128) DEFAULT NULL COMMENT 'comment',\n" + + " `description` varchar(128) DEFAULT NULL COMMENT 'comment',\n" + + " `type` int(11) NOT NULL COMMENT 'comment',\n" + + " `status` tinyint(2) NOT NULL COMMENT 'comment',\n" + + " `creator_id` bigint(20) NOT NULL COMMENT 'comment',\n" + + " `created_at` datetime NOT NULL COMMENT 'comment',\n" + + " `updated_at` datetime NOT NULL COMMENT 'comment',\n" + + " PRIMARY KEY (`id`)\n" + + ") COMMENT='comment'", true); } @@ -772,10 +786,10 @@ public void testCreateTableWithComments() throws JSQLParserException { public void testCreateTableWithCommentIssue922() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "CREATE TABLE index_with_comment_test (\n" - + "id int(11) NOT NULL,\n" - + "name varchar(60) DEFAULT NULL,\n" - + "KEY name_ind (name) COMMENT 'comment for the name index'\n" - + ") ENGINE=InnoDB DEFAULT CHARSET=utf8", + + "id int(11) NOT NULL,\n" + + "name varchar(60) DEFAULT NULL,\n" + + "KEY name_ind (name) COMMENT 'comment for the name index'\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8", true); } @@ -785,7 +799,8 @@ public void testEnableRowMovementOption() throws JSQLParserException { CreateTable createTable = (CreateTable) CCJSqlParserUtil.parse(sql); Assertions.assertThat(createTable.getRowMovement()).isNotNull(); - Assertions.assertThat(createTable.getRowMovement().getMode()).isEqualTo(RowMovementMode.ENABLE); + Assertions.assertThat(createTable.getRowMovement().getMode()) + .isEqualTo(RowMovementMode.ENABLE); assertSqlCanBeParsedAndDeparsed(sql); } @@ -804,7 +819,8 @@ public void testDisableRowMovementOption() throws JSQLParserException { @Test public void tableMovementWithAS() throws JSQLParserException { - String sql = "CREATE TABLE test (startdate DATE) DISABLE ROW MOVEMENT AS SELECT 1 FROM dual"; + String sql = + "CREATE TABLE test (startdate DATE) DISABLE ROW MOVEMENT AS SELECT 1 FROM dual"; assertSqlCanBeParsedAndDeparsed(sql); } @@ -859,7 +875,8 @@ public void testCreateUnionIssue1309() throws JSQLParserException { @Test public void testCreateTableBinaryIssue1518() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `s` (`a` enum ('a', 'b', 'c') CHARACTER SET binary COLLATE binary)"); + assertSqlCanBeParsedAndDeparsed( + "CREATE TABLE `s` (`a` enum ('a', 'b', 'c') CHARACTER SET binary COLLATE binary)"); } @Test @@ -889,7 +906,8 @@ public void testCreateTableIssue1488() throws JSQLParserException { + "INDEX ucr_index_sim_id(sim_id) USING BTREE,\n" + "INDEX ucr_index_status(status) USING BTREE,\n" + "INDEX ucr_index_talk_time(talk_time) USING BTREE\n" - + ") ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic", true); + + ") ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic", + true); } @Test @@ -910,33 +928,55 @@ public void testCreateTableBinaryIssue1596() throws JSQLParserException { public void testCreateTableSpanner() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "CREATE TABLE COMMAND (\n" + - " DATASET_ID INT64 NOT NULL,\n" + - " COMMAND_ID STRING(MAX) NOT NULL,\n" + - " VAL_BOOL BOOL,\n" + - " VAL_BYTES BYTES(1024),\n" + - " VAL_DATE DATE,\n" + - " VAL_TIMESTAMP TIMESTAMP,\n" + - " VAL_COMMIT_TIMESTAMP TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp = true),\n" + - " VAL_FLOAT64 FLOAT64,\n" + - " VAL_JSON JSON(2048),\n" + - " VAL_NUMERIC NUMERIC,\n" + - " VAL_STRING STRING(MAX),\n" + - " VAL_TIMESTAMP TIMESTAMP,\n" + - " ARR_BOOL ARRAY,\n" + - " ARR_BYTES ARRAY,\n" + - " ARR_DATE ARRAY,\n" + - " ARR_TIMESTAMP ARRAY,\n" + - " ARR_FLOAT64 ARRAY,\n" + - " ARR_JSON ARRAY,\n" + - " ARR_NUMERIC ARRAY,\n" + - " ARR_STRING ARRAY,\n" + - " ARR_TIMESTAMP ARRAY,\n" + - " PAYLOAD STRING(MAX),\n" + - " AUTHOR STRING(MAX) NOT NULL,\n" + - " SEARCH STRING(MAX) AS (UPPER(AUTHOR)) STORED\n" + - " ) PRIMARY KEY ( DATASET_ID, COMMAND_ID )\n" + - ", INTERLEAVE IN PARENT DATASET ON DELETE CASCADE", true); + " DATASET_ID INT64 NOT NULL,\n" + + " COMMAND_ID STRING(MAX) NOT NULL,\n" + + " VAL_BOOL BOOL,\n" + + " VAL_BYTES BYTES(1024),\n" + + " VAL_DATE DATE,\n" + + " VAL_TIMESTAMP TIMESTAMP,\n" + + " VAL_COMMIT_TIMESTAMP TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp = true),\n" + + + " VAL_FLOAT64 FLOAT64,\n" + + " VAL_JSON JSON(2048),\n" + + " VAL_NUMERIC NUMERIC,\n" + + " VAL_STRING STRING(MAX),\n" + + " VAL_TIMESTAMP TIMESTAMP,\n" + + " ARR_BOOL ARRAY,\n" + + " ARR_BYTES ARRAY,\n" + + " ARR_DATE ARRAY,\n" + + " ARR_TIMESTAMP ARRAY,\n" + + " ARR_FLOAT64 ARRAY,\n" + + " ARR_JSON ARRAY,\n" + + " ARR_NUMERIC ARRAY,\n" + + " ARR_STRING ARRAY,\n" + + " ARR_TIMESTAMP ARRAY,\n" + + " PAYLOAD STRING(MAX),\n" + + " AUTHOR STRING(MAX) NOT NULL,\n" + + " SEARCH STRING(MAX) AS (UPPER(AUTHOR)) STORED\n" + + " ) PRIMARY KEY ( DATASET_ID, COMMAND_ID )\n" + + ", INTERLEAVE IN PARENT DATASET ON DELETE CASCADE", + true); } + @Test + void testCreateTableWithStartWithNumber() throws JSQLParserException { + String sqlStr = + "CREATE TABLE locations\n" + + " (\n" + + " location_id NUMBER GENERATED BY DEFAULT AS IDENTITY START WITH 24 \n" + + " PRIMARY KEY ,\n" + + " address VARCHAR2( 255 ) NOT NULL,\n" + + " postal_code VARCHAR2( 20 ) ,\n" + + " city VARCHAR2( 50 ) ,\n" + + " state VARCHAR2( 50 ) ,\n" + + " country_id CHAR( 2 ) , -- fk\n" + + " CONSTRAINT fk_locations_countries \n" + + " FOREIGN KEY( country_id )\n" + + " REFERENCES countries( country_id ) \n" + + " ON DELETE CASCADE\n" + + " )"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + }