From 869c45695bbb3f35d0e37fe65a987a7d5df28474 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 20 May 2017 22:33:03 +0800 Subject: [PATCH] improved oracle sql parser. --- .../oracle/parser/OracleExprParser.java | 7 ++-- .../dialect/oracle/parser/OracleLexer.java | 1 - .../druid/sql/parser/SQLExprParser.java | 2 - .../alibaba/druid/sql/parser/SQLParser.java | 1 - .../com/alibaba/druid/sql/parser/Token.java | 1 - .../create/OracleCreateTableTest18.java | 33 +++++++++------ .../create/OracleCreateTableTest19.java | 38 ++++++++++-------- .../create/OracleCreateTableTest20.java | 40 +++++++++++-------- .../create/OracleCreateTableTest22.java | 24 ++++++----- .../create/OracleCreateTableTest27.java | 23 ++++++----- 10 files changed, 94 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 898ed1f205..9c16df41bf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -459,7 +459,6 @@ public class OracleExprParser extends SQLExprParser { case PCTINCREASE: case FLASH_CACHE: case CELL_FLASH_CACHE: - case KEEP: case NONE: case LOB: case STORE: @@ -765,7 +764,7 @@ public class OracleExprParser extends SQLExprParser { accept(Token.RPAREN); } - if (lexer.token() == Token.KEEP) { + if (identifierEquals("KEEP")) { lexer.nextToken(); SQLKeep keep = new SQLKeep(); @@ -1317,7 +1316,7 @@ public class OracleExprParser extends SQLExprParser { } else if (lexer.token() == Token.FLASH_CACHE) { lexer.nextToken(); FlashCacheType flashCacheType; - if (lexer.token() == Token.KEEP) { + if (identifierEquals("KEEP")) { flashCacheType = FlashCacheType.KEEP; lexer.nextToken(); } else if (lexer.token() == Token.NONE) { @@ -1332,7 +1331,7 @@ public class OracleExprParser extends SQLExprParser { } else if (lexer.token() == Token.CELL_FLASH_CACHE) { lexer.nextToken(); FlashCacheType flashCacheType; - if (lexer.token() == Token.KEEP) { + if (identifierEquals("KEEP")) { flashCacheType = FlashCacheType.KEEP; lexer.nextToken(); } else if (lexer.token() == Token.NONE) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index ede9e97477..178a4d2deb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -96,7 +96,6 @@ public class OracleLexer extends Lexer { map.put("PCTINCREASE", Token.PCTINCREASE); map.put("FLASH_CACHE", Token.FLASH_CACHE); map.put("CELL_FLASH_CACHE", Token.CELL_FLASH_CACHE); - map.put("KEEP", Token.KEEP); map.put("NONE", Token.NONE); map.put("LOB", Token.LOB); map.put("STORE", Token.STORE); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 8d4475b1fd..cf8e9f20ef 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -325,7 +325,6 @@ public class SQLExprParser extends SQLParser { case PCTINCREASE: case FLASH_CACHE: case CELL_FLASH_CACHE: - case KEEP: case NONE: case LOB: case STORE: @@ -999,7 +998,6 @@ public class SQLExprParser extends SQLParser { case PCTINCREASE: case FLASH_CACHE: case CELL_FLASH_CACHE: - case KEEP: case NONE: case LOB: case STORE: diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java index 14166d42cc..c49436e228 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -173,7 +173,6 @@ public class SQLParser { case PCTINCREASE: case FLASH_CACHE: case CELL_FLASH_CACHE: - case KEEP: case NONE: case LOB: case STORE: diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 4cabeddadf..4ad5ff2236 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -220,7 +220,6 @@ public enum Token { PCTINCREASE("PCTINCREASE"), FLASH_CACHE("FLASH_CACHE"), CELL_FLASH_CACHE("CELL_FLASH_CACHE"), - KEEP("KEEP"), NONE("NONE"), LOB("LOB"), STORE("STORE"), diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java index f719dc1b0d..43e73177f7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java @@ -52,18 +52,27 @@ public class OracleCreateTableTest18 extends OracleTest { Assert.assertEquals(1, statementList.size()); - Assert.assertEquals("CREATE TABLE dept_20 (\n" + - "\temployee_id NUMBER(4),\n" + - "\tlast_name VARCHAR2(10),\n" + - "\tjob_id VARCHAR2(9),\n" + - "\tmanager_id NUMBER(4),\n" + - "\thire_date DATE,\n" + - "\tsalary NUMBER(7, 2),\n" + - "\tcommission_pct NUMBER(7, 2),\n" + - "\tdepartment_id,\n" + - "\tCONSTRAINT fk_deptno FOREIGN KEY (department_id)\n" + - "\t\tREFERENCES departments (department_id)\n" + - ")", // + Assert.assertEquals("CREATE TABLE \"SONAR\".\"AUTHORS\" (\n" + + "\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE,\n" + + "\t\"PERSON_ID\" NUMBER(38, 0) NOT NULL ENABLE,\n" + + "\t\"LOGIN\" VARCHAR2(100 BYTE),\n" + + "\t\"CREATED_AT\" TIMESTAMP(6),\n" + + "\t\"UPDATED_AT\" TIMESTAMP(6),\n" + + "\tPRIMARY KEY (\"ID\")\n" + + "\t\tUSING INDEX\n" + + "\t\tPCTFREE 10\n" + + "\t\tINITRANS 2\n" + + "\t\tMAXTRANS 255\n" + + "\t\tCOMPUTE STATISTICS\n" + + "\t\tTABLESPACE \"USERS\"\n" + + "\t\tENABLE\n" + + ")\n" + + "PCTFREE 10\n" + + "INITRANS 1\n" + + "MAXTRANS 255\n" + + "NOCOMPRESS\n" + + "LOGGING\n" + + "TABLESPACE \"USERS\"", // SQLUtils.toSQLString(statement, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java index d776a2ffd0..a33a96580e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java @@ -57,22 +57,28 @@ public class OracleCreateTableTest19 extends OracleTest { Assert.assertEquals(1, statementList.size()); - Assert.assertEquals("CREATE TABLE \"SONAR\".\"ACTIVE_DASHBOARDS\" (" // - + "\n\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE," // - + "\n\t\"DASHBOARD_ID\" NUMBER(38, 0) NOT NULL ENABLE," // - + "\n\t\"USER_ID\" NUMBER(38, 0)," // - + "\n\t\"ORDER_INDEX\" NUMBER(38, 0)," // - + "\n\tPRIMARY KEY (\"ID\")" // - + "\n\tUSING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS TABLESPACE \"USERS\" ENABLE" - + "\n\tSTORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)" // - + "\n)" // - + "\nPCTFREE 10" // - + "\nINITRANS 1" // - + "\nMAXTRANS 255" // - + "\nNOCOMPRESS" // - + "\nLOGGING" // - + "\nTABLESPACE \"USERS\"" // - + "\nSTORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)", // + Assert.assertEquals("CREATE TABLE \"SONAR\".\"ACTIVE_DASHBOARDS\" (\n" + + "\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE,\n" + + "\t\"DASHBOARD_ID\" NUMBER(38, 0) NOT NULL ENABLE,\n" + + "\t\"USER_ID\" NUMBER(38, 0),\n" + + "\t\"ORDER_INDEX\" NUMBER(38, 0),\n" + + "\tPRIMARY KEY (\"ID\")\n" + + "\t\tUSING INDEX\n" + + "\t\tPCTFREE 10\n" + + "\t\tINITRANS 2\n" + + "\t\tMAXTRANS 255\n" + + "\t\tCOMPUTE STATISTICS\n" + + "\t\tTABLESPACE \"USERS\"\n" + + "\t\tENABLE\n" + + "\t\tSTORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + + ")\n" + + "PCTFREE 10\n" + + "INITRANS 1\n" + + "MAXTRANS 255\n" + + "NOCOMPRESS\n" + + "LOGGING\n" + + "TABLESPACE \"USERS\"\n" + + "STORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)", // SQLUtils.toSQLString(statement, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java index 03224dd001..04506e794f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java @@ -56,23 +56,29 @@ public class OracleCreateTableTest20 extends OracleTest { Assert.assertEquals(1, statementList.size()); - Assert.assertEquals("CREATE TABLE \"SONAR\".\"ACTIVE_RULE_NOTES\" (" // - + "\n\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE,"// - + "\n\t\"CREATED_AT\" TIMESTAMP(6),"// - + "\n\t\"UPDATED_AT\" TIMESTAMP(6),"// - + "\n\t\"ACTIVE_RULE_ID\" NUMBER(38, 0),"// - + "\n\t\"USER_LOGIN\" VARCHAR2(40 BYTE),"// - + "\n\t\"DATA\" BLOB,"// - + "\n\tPRIMARY KEY (\"ID\")"// - + "\n\tUSING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS TABLESPACE \"USERS\" ENABLE"// - + "\n)"// - + "\nPCTFREE 10"// - + "\nINITRANS 1"// - + "\nMAXTRANS 255"// - + "\nNOCOMPRESS"// - + "\nLOGGING"// - + "\nTABLESPACE \"USERS\""// - + "\nLOB (\"DATA\") STORE AS SECUREFILE (TABLESPACE \"USERS\" ENABLE STORAGE IN ROW CHUNK 8192 NOCACHE LOGGING NOCOMPRESS KEEP_DUPLICATES)",// + Assert.assertEquals("CREATE TABLE \"SONAR\".\"ACTIVE_RULE_NOTES\" (\n" + + "\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE,\n" + + "\t\"CREATED_AT\" TIMESTAMP(6),\n" + + "\t\"UPDATED_AT\" TIMESTAMP(6),\n" + + "\t\"ACTIVE_RULE_ID\" NUMBER(38, 0),\n" + + "\t\"USER_LOGIN\" VARCHAR2(40 BYTE),\n" + + "\t\"DATA\" BLOB,\n" + + "\tPRIMARY KEY (\"ID\")\n" + + "\t\tUSING INDEX\n" + + "\t\tPCTFREE 10\n" + + "\t\tINITRANS 2\n" + + "\t\tMAXTRANS 255\n" + + "\t\tCOMPUTE STATISTICS\n" + + "\t\tTABLESPACE \"USERS\"\n" + + "\t\tENABLE\n" + + ")\n" + + "PCTFREE 10\n" + + "INITRANS 1\n" + + "MAXTRANS 255\n" + + "NOCOMPRESS\n" + + "LOGGING\n" + + "TABLESPACE \"USERS\"\n" + + "LOB (\"DATA\") STORE AS SECUREFILE (TABLESPACE \"USERS\" ENABLE STORAGE IN ROW CHUNK 8192 NOCACHE LOGGING NOCOMPRESS KEEP_DUPLICATES)",// SQLUtils.toSQLString(statement, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest22.java index fa966de399..491322e865 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest22.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest22.java @@ -50,17 +50,19 @@ public class OracleCreateTableTest22 extends OracleTest { Assert.assertEquals(1, statementList.size()); - Assert.assertEquals("CREATE TABLE promotions_var2 (" - + "\n\tpromo_id NUMBER(6)," - + "\n\tpromo_name VARCHAR2(20)," - + "\n\tpromo_category VARCHAR2(15)," - + "\n\tpromo_cost NUMBER(10, 2)," - + "\n\tpromo_begin_date DATE," - + "\n\tpromo_end_date DATE," - + "\n\tCONSTRAINT promo_id_u UNIQUE (promo_id)" - + "\n\tUSING INDEX PCTFREE 20 TABLESPACE stocks" - + "\n\tSTORAGE (INITIAL 8M)" - + "\n)",// + Assert.assertEquals("CREATE TABLE promotions_var2 (\n" + + "\tpromo_id NUMBER(6),\n" + + "\tpromo_name VARCHAR2(20),\n" + + "\tpromo_category VARCHAR2(15),\n" + + "\tpromo_cost NUMBER(10, 2),\n" + + "\tpromo_begin_date DATE,\n" + + "\tpromo_end_date DATE,\n" + + "\tCONSTRAINT promo_id_u UNIQUE (promo_id)\n" + + "\t\tUSING INDEX\n" + + "\t\tPCTFREE 20\n" + + "\t\tTABLESPACE stocks\n" + + "\t\tSTORAGE (INITIAL 8M)\n" + + ")",// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest27.java index b08d0bf0be..35f0c4cde2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest27.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest27.java @@ -51,17 +51,18 @@ public class OracleCreateTableTest27 extends OracleTest { Assert.assertEquals(1, statementList.size()); - Assert.assertEquals("CREATE TABLE dept_20 (" // - + "\n\temployee_id NUMBER(4),"// - + "\n\tlast_name VARCHAR2(10),"// - + "\n\tjob_id VARCHAR2(9),"// - + "\n\tmanager_id NUMBER(4),"// - + "\n\thire_date DATE,"// - + "\n\tsalary NUMBER(7, 2),"// - + "\n\tcommission_pct NUMBER(7, 2),"// - + "\n\tdepartment_id,"// - + "\n\tCONSTRAINT fk_deptno FOREIGN KEY (department_id) REFERENCES departments (department_id)"// - + "\n)",// + Assert.assertEquals("CREATE TABLE dept_20 (\n" + + "\temployee_id NUMBER(4),\n" + + "\tlast_name VARCHAR2(10),\n" + + "\tjob_id VARCHAR2(9),\n" + + "\tmanager_id NUMBER(4),\n" + + "\thire_date DATE,\n" + + "\tsalary NUMBER(7, 2),\n" + + "\tcommission_pct NUMBER(7, 2),\n" + + "\tdepartment_id,\n" + + "\tCONSTRAINT fk_deptno FOREIGN KEY (department_id)\n" + + "\t\tREFERENCES departments (department_id)\n" + + ")",// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();