From be0fc54535818132a7e0061bfcc71c645744be1f Mon Sep 17 00:00:00 2001 From: zyc Date: Sun, 25 Apr 2021 17:41:39 +0800 Subject: [PATCH 1/2] fix > issue #4253 --- .../druid/sql/parser/SQLExprParser.java | 6 +- .../com/alibaba/druid/bvt/bug/Issue4253.java | 35 +++++ src/test/resources/bvt/parser/oracle-62.txt | 127 ++++++++++++++++++ 3 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java create mode 100644 src/test/resources/bvt/parser/oracle-62.txt 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 974f839fc8..31155a2bda 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1335,7 +1335,7 @@ public class SQLExprParser extends SQLParser { expr = dotRest(expr); return primaryRest(expr); } else if (lexer.identifierEquals(FnvHash.Constants.SETS) // - && expr.getClass() == SQLIdentifierExpr.class // + && expr.getClass() == SQLIdentifierExpr.class // && "GROUPING".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) { SQLGroupingSetExpr groupingSets = new SQLGroupingSetExpr(); lexer.nextToken(); @@ -1950,6 +1950,10 @@ public class SQLExprParser extends SQLParser { } else { switch (lexer.token) { // case MODEL: + case MODE: + case ERRORS: + case NOWAIT: + case COMMIT: case PCTFREE: case INITRANS: case MAXTRANS: diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java new file mode 100644 index 0000000000..75b9341861 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java @@ -0,0 +1,35 @@ +package com.alibaba.druid.bvt.bug; +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.util.Utils; +import junit.framework.TestCase; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; + +/** + * Created by wenshao on 03/02/2017. + */ +public class Issue4253 extends TestCase { + private final DbType dbType = JdbcConstants.ORACLE; + + public void test_for_issue() throws Exception { + InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-62.txt"); + Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8); + String input = Utils.read(reader); + JdbcUtils.close(reader); + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(input, dbType); + Exception error = null; + try { + parser.parseStatement(true); + } catch (Exception ex) { + error = ex; + } + assertNull(error); + } +} diff --git a/src/test/resources/bvt/parser/oracle-62.txt b/src/test/resources/bvt/parser/oracle-62.txt new file mode 100644 index 0000000000..f09ebeb02e --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-62.txt @@ -0,0 +1,127 @@ +CREATE TABLE CLOUDCANAL.BB ( + FOUND NUMBER(10, 0), + FULL NUMBER(10, 0), + GENERAL NUMBER(10, 0), + GEOMCOLLECTION NUMBER(10, 0), + GEOMETRY NUMBER(10, 0), + GEOMETRYCOLLECTION NUMBER(10, 0), + GET_FORMAT NUMBER(10, 0), + GET_MASTER_PUBLIC_KEY NUMBER(10, 0), + GET_SOURCE_PUBLIC_KEY NUMBER(10, 0), + GLOBAL NUMBER(10, 0), + GRANTS NUMBER(10, 0), + GROUP_REPLICATION NUMBER(10, 0), + HANDLER NUMBER(10, 0), + HASH NUMBER(10, 0), + HELP NUMBER(10, 0), + HISTOGRAM NUMBER(10, 0), + HISTORY NUMBER(10, 0), + HOST NUMBER(10, 0), + HOSTS NUMBER(10, 0), + HOUR NUMBER(10, 0), + IDENTIFIED NUMBER(10, 0), + IGNORE_SERVER_IDS NUMBER(10, 0), + IMPORT NUMBER(10, 0), + INACTIVE NUMBER(10, 0), + INDEXES NUMBER(10, 0), + INITIAL_SIZE NUMBER(10, 0), + INSERT_METHOD NUMBER(10, 0), + INSTALL NUMBER(10, 0), + INSTANCE NUMBER(10, 0), + INVISIBLE NUMBER(10, 0), + INVOKER NUMBER(10, 0), + IO NUMBER(10, 0), + IO_THREAD NUMBER(10, 0), + IPC NUMBER(10, 0), + ISOLATION NUMBER(10, 0), + ISSUER NUMBER(10, 0), + JSON NUMBER(10, 0), + JSON_VALUE NUMBER(10, 0), + KEY_BLOCK_SIZE NUMBER(10, 0), + LANGUAGE NUMBER(10, 0), + LAST NUMBER(10, 0), + LEAVES NUMBER(10, 0), + LESS NUMBER(10, 0), + LEVEL NUMBER(10, 0), + LINESTRING NUMBER(10, 0), + LIST NUMBER(10, 0), + LOCAL NUMBER(10, 0), + LOCKED NUMBER(10, 0), + LOCKS NUMBER(10, 0), + LOGFILE NUMBER(10, 0), + LOGS NUMBER(10, 0), + MASTER NUMBER(10, 0), + MASTER_AUTO_POSITION NUMBER(10, 0), + MASTER_COMPRESSION_ALGORITHMS NUMBER(10, 0), + MASTER_CONNECT_RETRY NUMBER(10, 0), + MASTER_DELAY NUMBER(10, 0), + MASTER_HEARTBEAT_PERIOD NUMBER(10, 0), + MASTER_HOST NUMBER(10, 0), + MASTER_LOG_FILE NUMBER(10, 0), + MASTER_LOG_POS NUMBER(10, 0), + MASTER_PASSWORD NUMBER(10, 0), + MASTER_PORT NUMBER(10, 0), + MASTER_PUBLIC_KEY_PATH NUMBER(10, 0), + MASTER_RETRY_COUNT NUMBER(10, 0), + MASTER_SSL NUMBER(10, 0), + MASTER_SSL_CA NUMBER(10, 0), + MASTER_SSL_CAPATH NUMBER(10, 0), + MASTER_SSL_CERT NUMBER(10, 0), + MASTER_SSL_CIPHER NUMBER(10, 0), + MASTER_SSL_CRL NUMBER(10, 0), + MASTER_SSL_CRLPATH NUMBER(10, 0), + MASTER_SSL_KEY NUMBER(10, 0), + MASTER_TLS_CIPHERSUITES NUMBER(10, 0), + MASTER_TLS_VERSION NUMBER(10, 0), + MASTER_USER NUMBER(10, 0), + MASTER_ZSTD_COMPRESSION_LEVEL NUMBER(10, 0), + MAX_CONNECTIONS_PER_HOUR NUMBER(10, 0), + MAX_QUERIES_PER_HOUR NUMBER(10, 0), + MAX_ROWS NUMBER(10, 0), + MAX_SIZE NUMBER(10, 0), + MAX_UPDATES_PER_HOUR NUMBER(10, 0), + MAX_USER_CONNECTIONS NUMBER(10, 0), + MEDIUM NUMBER(10, 0), + MEMBER NUMBER(10, 0), + MEMORY NUMBER(10, 0), + MERGE NUMBER(10, 0), + MESSAGE_TEXT NUMBER(10, 0), + MICROSECOND NUMBER(10, 0), + MIGRATE NUMBER(10, 0), + MINUTE NUMBER(10, 0), + MIN_ROWS NUMBER(10, 0), + MODE NUMBER(10, 0), + MODIFY NUMBER(10, 0), + MONTH NUMBER(10, 0), + MULTILINESTRING NUMBER(10, 0), + MULTIPOINT NUMBER(10, 0), + MULTIPOLYGON NUMBER(10, 0), + MUTEX NUMBER(10, 0), + MYSQL_ERRNO NUMBER(10, 0), + NAME NUMBER(10, 0), + NAMES NUMBER(10, 0), + NATIONAL NUMBER(10, 0), + NCHAR NUMBER(10, 0), + NDB NUMBER(10, 0), + NDBCLUSTER NUMBER(10, 0), + NESTED NUMBER(10, 0), + NETWORK_NAMESPACE NUMBER(10, 0), + NEVER NUMBER(10, 0), + NEW NUMBER(10, 0), + NEXT NUMBER(10, 0), + NO NUMBER(10, 0), + NODEGROUP NUMBER(10, 0), + NONE NUMBER(10, 0), + NOWAIT NUMBER(10, 0), + NO_WAIT NUMBER(10, 0), + NULLS NUMBER(10, 0), + NUMBER NUMBER(10, 0), + NVARCHAR NUMBER(10, 0) +) +PCTFREE 10 +PCTUSED 40 +INITRANS 1 +MAXTRANS 255 +NOCOMPRESS +LOGGING +TABLESPACE USERS \ No newline at end of file From f86aa0b65d9aff551bee6d903af73efec5bce0c0 Mon Sep 17 00:00:00 2001 From: zyc Date: Sun, 25 Apr 2021 18:03:10 +0800 Subject: [PATCH 2/2] fix > issue #4253 , oracle-62.txt rename to oracle-63.txt --- src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java | 2 +- src/test/resources/bvt/parser/{oracle-62.txt => oracle-63.txt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/test/resources/bvt/parser/{oracle-62.txt => oracle-63.txt} (100%) diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java index 75b9341861..d6738ae8a8 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue4253.java @@ -19,7 +19,7 @@ public class Issue4253 extends TestCase { private final DbType dbType = JdbcConstants.ORACLE; public void test_for_issue() throws Exception { - InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-62.txt"); + InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-63.txt"); Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8); String input = Utils.read(reader); JdbcUtils.close(reader); diff --git a/src/test/resources/bvt/parser/oracle-62.txt b/src/test/resources/bvt/parser/oracle-63.txt similarity index 100% rename from src/test/resources/bvt/parser/oracle-62.txt rename to src/test/resources/bvt/parser/oracle-63.txt