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 3138bdffb7..2e89932a20 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1340,7 +1340,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(); @@ -1961,6 +1961,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..d6738ae8a8 --- /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-63.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-63.txt b/src/test/resources/bvt/parser/oracle-63.txt new file mode 100644 index 0000000000..f09ebeb02e --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-63.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