From 121efd9394c2d1bb77113bb287c825893a51e411 Mon Sep 17 00:00:00 2001 From: luofei Date: Wed, 6 Jul 2022 20:40:28 +0800 Subject: [PATCH 1/2] Support table option character set and index options Signed-off-by: luofei --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 8 +++- .../parser/CCJSqlParserUtilTest.java | 45 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 839b946c6..ad32b0331 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4988,8 +4988,10 @@ CreateTable CreateTable(): sk3=RelObjectName() /* colNames=ColumnsNamesList() */ colNames = ColumnNamesWithParamsList() + { idxSpec.clear(); } + ( parameter=CreateParameter() { idxSpec.addAll(parameter); } )* { - index = new Index().withType(tk.image).withName(sk3).withColumns(colNames); + index = new Index().withType(tk.image).withName(sk3).withColumns(colNames).withIndexSpec(idxSpec); indexes.add(index); } ) @@ -5005,6 +5007,7 @@ CreateTable CreateTable(): ) /* colNames=ColumnsNamesList() */ colNames = ColumnNamesWithParamsList() + { idxSpec.clear(); } ( parameter=CreateParameter() { idxSpec.addAll(parameter); } )* { index.withColumns(colNames).withIndexSpec(idxSpec); @@ -5021,6 +5024,7 @@ CreateTable CreateTable(): sk3=RelObjectName() /* colNames=ColumnsNamesList() */ colNames = ColumnNamesWithParamsList() + { idxSpec.clear(); } ( parameter=CreateParameter() { idxSpec.addAll(parameter); } )* { index = new Index() @@ -5338,6 +5342,8 @@ List CreateParameter(): | tk= { param.add(tk.image); } | + (tk= tk2=) { param.add(tk.image); param.add(tk2.image);} + | ( exp=ArrayConstructor(true)) { param.add(exp.toString()); } | tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); } diff --git a/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java b/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java index 6cdf422f2..69e0e0d0c 100644 --- a/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java +++ b/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java @@ -270,4 +270,49 @@ public void testCondExpressionIssue1482_2() throws JSQLParserException { Expression expr = CCJSqlParserUtil.parseCondExpression("test_table_enum.f1_enum IN ('TEST2'::test.\"test_enum\")", false); assertEquals("test_table_enum.f1_enum IN ('TEST2'::test.\"test_enum\")", expr.toString()); } + + @Test + public void testParseStatementIssue1488() throws JSQLParserException { + Statements result = CCJSqlParserUtil.parseStatements("CREATE TABLE u_call_record (\n" + + "card_user_id int(11) NOT NULL,\n" + + "device_id int(11) NOT NULL,\n" + + "call_start_at int(11) NOT NULL DEFAULT CURRENT_TIMESTAMP(11),\n" + + "card_user_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "sim_id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "called_number varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "called_nickname varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "talk_time smallint(8) NULL DEFAULT NULL,\n" + + "area_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "area_service_id int(11) NULL DEFAULT NULL,\n" + + "operator_id int(4) NULL DEFAULT NULL,\n" + + "status tinyint(4) NULL DEFAULT NULL,\n" + + "create_at timestamp NULL DEFAULT NULL,\n" + + "place_user varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "PRIMARY KEY (card_user_id, device_id, call_start_at) USING BTREE,\n" + + "INDEX ucr_index_area_name(area_name) USING BTREE,\n" + + "INDEX ucr_index_area_service_id(area_service_id) USING BTREE,\n" + + "INDEX ucr_index_called_number(called_number) USING BTREE,\n" + + "INDEX ucr_index_create_at(create_at) USING BTREE,\n" + + "INDEX ucr_index_operator_id(operator_id) USING BTREE,\n" + + "INDEX ucr_index_place_user(place_user) USING BTREE,\n" + + "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;"); + + assertEquals("CREATE TABLE u_call_record (card_user_id int (11) NOT NULL, device_id int (11) NOT NULL, " + + "call_start_at int (11) NOT NULL DEFAULT CURRENT_TIMESTAMP (11), card_user_name varchar (32) CHARACTER SET " + + "utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, sim_id varchar (32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" + + " NULL DEFAULT NULL, called_number varchar (12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT " + + "NULL, called_nickname varchar (32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, talk_time " + + "smallint (8) NULL DEFAULT NULL, area_name varchar (32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL " + + "DEFAULT NULL, area_service_id int (11) NULL DEFAULT NULL, operator_id int (4) NULL DEFAULT NULL, status tinyint (4) " + + "NULL DEFAULT NULL, create_at timestamp NULL DEFAULT NULL, place_user varchar (16) CHARACTER SET utf8mb4 COLLATE " + + "utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (card_user_id, device_id, call_start_at) USING BTREE, INDEX " + + "ucr_index_area_name (area_name) USING BTREE, INDEX ucr_index_area_service_id (area_service_id) USING BTREE, " + + "INDEX ucr_index_called_number (called_number) USING BTREE, INDEX ucr_index_create_at (create_at) USING BTREE, " + + "INDEX ucr_index_operator_id (operator_id) USING BTREE, INDEX ucr_index_place_user (place_user) USING BTREE, " + + "INDEX ucr_index_sim_id (sim_id) USING BTREE, INDEX ucr_index_status (status) USING BTREE, INDEX ucr_index_talk_time " + + "(talk_time) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n", result.toString()); + } } From c312b7125519741f3d5b422e30e0d27722ec0166 Mon Sep 17 00:00:00 2001 From: luofei Date: Fri, 8 Jul 2022 09:07:44 +0800 Subject: [PATCH 2/2] move test Signed-off-by: luofei --- .../parser/CCJSqlParserUtilTest.java | 45 ------------------- .../statement/create/CreateTableTest.java | 30 +++++++++++++ 2 files changed, 30 insertions(+), 45 deletions(-) diff --git a/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java b/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java index 69e0e0d0c..6cdf422f2 100644 --- a/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java +++ b/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java @@ -270,49 +270,4 @@ public void testCondExpressionIssue1482_2() throws JSQLParserException { Expression expr = CCJSqlParserUtil.parseCondExpression("test_table_enum.f1_enum IN ('TEST2'::test.\"test_enum\")", false); assertEquals("test_table_enum.f1_enum IN ('TEST2'::test.\"test_enum\")", expr.toString()); } - - @Test - public void testParseStatementIssue1488() throws JSQLParserException { - Statements result = CCJSqlParserUtil.parseStatements("CREATE TABLE u_call_record (\n" + - "card_user_id int(11) NOT NULL,\n" + - "device_id int(11) NOT NULL,\n" + - "call_start_at int(11) NOT NULL DEFAULT CURRENT_TIMESTAMP(11),\n" + - "card_user_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + - "sim_id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + - "called_number varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + - "called_nickname varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + - "talk_time smallint(8) NULL DEFAULT NULL,\n" + - "area_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + - "area_service_id int(11) NULL DEFAULT NULL,\n" + - "operator_id int(4) NULL DEFAULT NULL,\n" + - "status tinyint(4) NULL DEFAULT NULL,\n" + - "create_at timestamp NULL DEFAULT NULL,\n" + - "place_user varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + - "PRIMARY KEY (card_user_id, device_id, call_start_at) USING BTREE,\n" + - "INDEX ucr_index_area_name(area_name) USING BTREE,\n" + - "INDEX ucr_index_area_service_id(area_service_id) USING BTREE,\n" + - "INDEX ucr_index_called_number(called_number) USING BTREE,\n" + - "INDEX ucr_index_create_at(create_at) USING BTREE,\n" + - "INDEX ucr_index_operator_id(operator_id) USING BTREE,\n" + - "INDEX ucr_index_place_user(place_user) USING BTREE,\n" + - "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;"); - - assertEquals("CREATE TABLE u_call_record (card_user_id int (11) NOT NULL, device_id int (11) NOT NULL, " + - "call_start_at int (11) NOT NULL DEFAULT CURRENT_TIMESTAMP (11), card_user_name varchar (32) CHARACTER SET " + - "utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, sim_id varchar (32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" + - " NULL DEFAULT NULL, called_number varchar (12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT " + - "NULL, called_nickname varchar (32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, talk_time " + - "smallint (8) NULL DEFAULT NULL, area_name varchar (32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL " + - "DEFAULT NULL, area_service_id int (11) NULL DEFAULT NULL, operator_id int (4) NULL DEFAULT NULL, status tinyint (4) " + - "NULL DEFAULT NULL, create_at timestamp NULL DEFAULT NULL, place_user varchar (16) CHARACTER SET utf8mb4 COLLATE " + - "utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (card_user_id, device_id, call_start_at) USING BTREE, INDEX " + - "ucr_index_area_name (area_name) USING BTREE, INDEX ucr_index_area_service_id (area_service_id) USING BTREE, " + - "INDEX ucr_index_called_number (called_number) USING BTREE, INDEX ucr_index_create_at (create_at) USING BTREE, " + - "INDEX ucr_index_operator_id (operator_id) USING BTREE, INDEX ucr_index_place_user (place_user) USING BTREE, " + - "INDEX ucr_index_sim_id (sim_id) USING BTREE, INDEX ucr_index_status (status) USING BTREE, INDEX ucr_index_talk_time " + - "(talk_time) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n", result.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 339792028..fa3ea6771 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java @@ -861,4 +861,34 @@ public void testCreateUnionIssue1309() throws JSQLParserException { public void testCreateTableBinaryIssue1518() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE TABLE `s` (`a` enum ('a', 'b', 'c') CHARACTER SET binary COLLATE binary)"); } + + @Test + public void testCreateTableIssue1488() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE u_call_record (\n" + + "card_user_id int(11) NOT NULL,\n" + + "device_id int(11) NOT NULL,\n" + + "call_start_at int(11) NOT NULL DEFAULT CURRENT_TIMESTAMP(11),\n" + + "card_user_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "sim_id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "called_number varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "called_nickname varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "talk_time smallint(8) NULL DEFAULT NULL,\n" + + "area_name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "area_service_id int(11) NULL DEFAULT NULL,\n" + + "operator_id int(4) NULL DEFAULT NULL,\n" + + "status tinyint(4) NULL DEFAULT NULL,\n" + + "create_at timestamp NULL DEFAULT NULL,\n" + + "place_user varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n" + + "PRIMARY KEY (card_user_id, device_id, call_start_at) USING BTREE,\n" + + "INDEX ucr_index_area_name(area_name) USING BTREE,\n" + + "INDEX ucr_index_area_service_id(area_service_id) USING BTREE,\n" + + "INDEX ucr_index_called_number(called_number) USING BTREE,\n" + + "INDEX ucr_index_create_at(create_at) USING BTREE,\n" + + "INDEX ucr_index_operator_id(operator_id) USING BTREE,\n" + + "INDEX ucr_index_place_user(place_user) USING BTREE,\n" + + "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); + } }