improve oracle sql parser

This commit is contained in:
wenshao
2013-08-03 12:01:25 +08:00
parent 91fc668553
commit 1974aa2cce
21 changed files with 466 additions and 71 deletions
@@ -333,7 +333,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
continue;
}
if (identifierEquals("TABLESPACE")) {
if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
TableSpaceOption option = new TableSpaceOption();
@@ -2348,7 +2348,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
}
stmt.getItems().add(item);
} else if (identifierEquals("DISABLE")) {
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
@@ -2361,7 +2361,7 @@ public class MySqlStatementParser extends SQLStatementParser {
SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys();
stmt.getItems().add(item);
}
} else if (identifierEquals("ENABLE")) {
} else if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
lexer.nextToken();
@@ -2390,12 +2390,12 @@ public class MySqlStatementParser extends SQLStatementParser {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
} else if (identifierEquals("DISCARD")) {
lexer.nextToken();
acceptIdentifier("TABLESPACE");
accept(Token.TABLESPACE);
MySqlAlterTableDiscardTablespace item = new MySqlAlterTableDiscardTablespace();
stmt.getItems().add(item);
} else if (identifierEquals("IMPORT")) {
lexer.nextToken();
acceptIdentifier("TABLESPACE");
accept(Token.TABLESPACE);
MySqlAlterTableImportTablespace item = new MySqlAlterTableImportTablespace();
stmt.getItems().add(item);
} else if (identifierEquals("FORCE")) {
@@ -26,36 +26,46 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleCreateTableStatement extends SQLCreateTableStatement implements OracleDDLStatement {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private SQLName tablespace;
private SQLName tablespace;
private SQLSelect select;
private SQLSelect select;
private boolean inMemoryMetadata;
private boolean inMemoryMetadata;
private boolean cursorSpecificSegment;
private boolean cursorSpecificSegment;
// NOPARALLEL
private Boolean parallel;
private Boolean parallel;
private OracleStorageClause storage;
private OracleStorageClause storage;
private boolean organizationIndex = false;
private boolean organizationIndex = false;
private SQLExpr ptcfree;
private SQLExpr pctused;
private SQLExpr initrans;
private SQLExpr maxtrans;
private SQLExpr ptcfree;
private SQLExpr pctused;
private SQLExpr initrans;
private SQLExpr maxtrans;
private Boolean logging;
private Boolean compress;
private boolean onCommit;
private boolean preserveRows;
private Boolean logging;
private Boolean compress;
private boolean onCommit;
private boolean preserveRows;
private Boolean cache;
private Boolean cache;
private SQLPartitioningClause partitioning;
private SQLPartitioningClause partitioning;
private DeferredSegmentCreation deferredSegmentCreation;
public DeferredSegmentCreation getDeferredSegmentCreation() {
return deferredSegmentCreation;
}
public void setDeferredSegmentCreation(DeferredSegmentCreation deferredSegmentCreation) {
this.deferredSegmentCreation = deferredSegmentCreation;
}
public SQLPartitioningClause getPartitioning() {
return partitioning;
@@ -209,4 +219,7 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen
visitor.endVisit(this);
}
public static enum DeferredSegmentCreation {
IMMEDIATE, DEFERRED
}
}
@@ -27,19 +27,19 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey, SQLTableElement {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private SQLName name;
private List<SQLExpr> columns = new ArrayList<SQLExpr>();
private SQLName name;
private List<SQLExpr> columns = new ArrayList<SQLExpr>();
private SQLExpr usingIndex;
private OracleUsingIndexClause using;
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, name);
acceptChild(visitor, columns);
acceptChild(visitor, usingIndex);
acceptChild(visitor, using);
}
visitor.endVisit(this);
}
@@ -60,12 +60,12 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryK
this.columns = columns;
}
public SQLExpr getUsingIndex() {
return usingIndex;
public OracleUsingIndexClause getUsing() {
return using;
}
public void setUsingIndex(SQLExpr usingIndex) {
this.usingIndex = usingIndex;
public void setUsing(OracleUsingIndexClause using) {
this.using = using;
}
}
@@ -0,0 +1,115 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
@SuppressWarnings("serial")
public class OracleUsingIndexClause extends OracleSQLObjectImpl {
private SQLName index;
private SQLName tablespace;
private SQLExpr ptcfree;
private SQLExpr pctused;
private SQLExpr initrans;
private SQLExpr maxtrans;
private Boolean enable = null;
private boolean computeStatistics = false;
public OracleUsingIndexClause(){
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, index);
acceptChild(visitor, tablespace);
}
visitor.endVisit(this);
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
public boolean isComputeStatistics() {
return computeStatistics;
}
public void setComputeStatistics(boolean computeStatistics) {
this.computeStatistics = computeStatistics;
}
public SQLName getIndex() {
return index;
}
public void setIndex(SQLName index) {
this.index = index;
}
public SQLName getTablespace() {
return tablespace;
}
public void setTablespace(SQLName tablespace) {
this.tablespace = tablespace;
}
public SQLExpr getPtcfree() {
return ptcfree;
}
public void setPtcfree(SQLExpr ptcfree) {
this.ptcfree = ptcfree;
}
public SQLExpr getPctused() {
return pctused;
}
public void setPctused(SQLExpr pctused) {
this.pctused = pctused;
}
public SQLExpr getInitrans() {
return initrans;
}
public void setInitrans(SQLExpr initrans) {
this.initrans = initrans;
}
public SQLExpr getMaxtrans() {
return maxtrans;
}
public void setMaxtrans(SQLExpr maxtrans) {
this.maxtrans = maxtrans;
}
}
@@ -21,6 +21,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeCla
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement.DeferredSegmentCreation;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
@@ -45,7 +46,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser {
OracleCreateTableStatement stmt = (OracleCreateTableStatement) super.parseCrateTable(acceptCreate);
for (;;) {
if (identifierEquals("TABLESPACE")) {
if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
stmt.setTablespace(this.exprParser.name());
continue;
@@ -126,7 +127,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser {
accept(Token.INDEX);
stmt.setOrganizationIndex(true);
continue;
} else if (identifierEquals("PCTFREE")) {
} else if (lexer.token() == Token.PCTFREE) {
lexer.nextToken();
stmt.setPtcfree(this.exprParser.expr());
continue;
@@ -134,14 +135,24 @@ public class OracleCreateTableParser extends SQLCreateTableParser {
lexer.nextToken();
stmt.setPctused(this.exprParser.expr());
continue;
} else if (identifierEquals("INITRANS")) {
} else if (lexer.token() == Token.INITRANS) {
lexer.nextToken();
stmt.setInitrans(this.exprParser.expr());
continue;
} else if (identifierEquals("MAXTRANS")) {
} else if (lexer.token() == Token.MAXTRANS) {
lexer.nextToken();
stmt.setMaxtrans(this.exprParser.expr());
continue;
} else if (lexer.token() == Token.SEGMENT) {
lexer.nextToken();
accept(Token.CREATION);
if (lexer.token() == Token.IMMEDIATE) {
stmt.setDeferredSegmentCreation(DeferredSegmentCreation.IMMEDIATE);
} else {
accept(Token.DEFERRED);
stmt.setDeferredSegmentCreation(DeferredSegmentCreation.DEFERRED);
}
continue;
} else if (identifierEquals("PARTITION")) {
lexer.nextToken();
accept(Token.BY);
@@ -64,6 +64,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
@@ -73,6 +74,11 @@ public class OracleExprParser extends SQLExprParser {
public boolean allowStringAdditive = false;
/**
@@ -417,6 +423,13 @@ public class OracleExprParser extends SQLExprParser {
sqlExpr = cursorExpr;
return primaryRest(sqlExpr);
case MODEL:
case PCTFREE:
case INITRANS:
case MAXTRANS:
case SEGMENT:
case CREATION:
case IMMEDIATE:
case DEFERRED:
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextToken();
return primaryRest(sqlExpr);
@@ -948,7 +961,47 @@ public class OracleExprParser extends SQLExprParser {
if (lexer.token() == Token.USING) {
lexer.nextToken();
accept(Token.INDEX);
primaryKey.setUsingIndex(expr());
OracleUsingIndexClause using = new OracleUsingIndexClause();
for (;;) {
if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
using.setTablespace(this.name());
continue;
} else if (lexer.token() == Token.PCTFREE) {
lexer.nextToken();
using.setPtcfree(this.expr());
continue;
} else if (lexer.token() == Token.INITRANS) {
lexer.nextToken();
using.setInitrans(this.expr());
continue;
} else if (lexer.token() == Token.MAXTRANS) {
lexer.nextToken();
using.setMaxtrans(this.expr());
continue;
} else if (lexer.token() == Token.COMPUTE) {
lexer.nextToken();
acceptIdentifier("STATISTICS");
using.setComputeStatistics(true);
continue;
} else if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
using.setEnable(true);
continue;
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
using.setEnable(false);
continue;
} else if (lexer.token() == Token.IDENTIFIER) {
using.setTablespace(this.name());
break;
} else {
break;
}
}
primaryKey.setUsing(using);
}
return primaryKey;
}
@@ -956,7 +1009,7 @@ public class OracleExprParser extends SQLExprParser {
public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) {
column = super.parseColumnRest(column);
if (identifierEquals("ENABLE")) {
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
column.setEnable(Boolean.TRUE);
}
@@ -33,7 +33,7 @@ public class OracleLexer extends Lexer {
static {
Map<String, Token> map = new HashMap<String, Token>();
map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords());
map.put("BEGIN", Token.BEGIN);
@@ -78,9 +78,17 @@ public class OracleLexer extends Lexer {
map.put("WAIT", Token.WAIT);
map.put("WITH", Token.WITH);
map.put("IDENTIFIED", Token.IDENTIFIED);
map.put("PCTFREE", Token.PCTFREE);
map.put("INITRANS", Token.INITRANS);
map.put("MAXTRANS", Token.MAXTRANS);
map.put("SEGMENT", Token.SEGMENT);
map.put("CREATION", Token.CREATION);
map.put("IMMEDIATE", Token.IMMEDIATE);
map.put("DEFERRED", Token.DEFERRED);
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
}
@@ -120,7 +128,7 @@ public class OracleLexer extends Lexer {
bufPos++;
mybatisFlag = true;
}
for (;;) {
ch = charAt(++pos);
@@ -131,7 +139,7 @@ public class OracleLexer extends Lexer {
bufPos++;
continue;
}
if (quoteFlag) {
if (ch != '"') {
throw new ParserException("syntax error");
@@ -378,7 +378,7 @@ public class OracleStatementParser extends SQLStatementParser {
lexer.nextToken();
stmt.setWait(Boolean.FALSE);
continue;
} else if (identifierEquals("IMMEDIATE")) {
} else if (lexer.token() == Token.IMMEDIATE) {
lexer.nextToken();
stmt.setImmediate(Boolean.TRUE);
continue;
@@ -711,11 +711,11 @@ public class OracleStatementParser extends SQLStatementParser {
stmt.setName(this.exprParser.name());
for (;;) {
if (identifierEquals("ENABLE")) {
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
stmt.setEnable(Boolean.TRUE);
continue;
} else if (identifierEquals("DISABLE")) {
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
stmt.setEnable(Boolean.FALSE);
continue;
@@ -734,11 +734,11 @@ public class OracleStatementParser extends SQLStatementParser {
stmt.setName(this.exprParser.name());
for (;;) {
if (identifierEquals("ENABLE")) {
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
stmt.setEnable(Boolean.TRUE);
continue;
} else if (identifierEquals("DISABLE")) {
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
stmt.setEnable(Boolean.FALSE);
continue;
@@ -757,11 +757,11 @@ public class OracleStatementParser extends SQLStatementParser {
stmt.setName(this.exprParser.name());
for (;;) {
if (identifierEquals("ENABLE")) {
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
stmt.setEnable(Boolean.TRUE);
continue;
} else if (identifierEquals("DISABLE")) {
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
stmt.setEnable(Boolean.FALSE);
continue;
@@ -774,7 +774,7 @@ public class OracleStatementParser extends SQLStatementParser {
}
return stmt;
} else if (identifierEquals("TABLESPACE")) {
} else if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
OracleAlterTablespaceStatement stmt = new OracleAlterTablespaceStatement();
@@ -875,7 +875,7 @@ public class OracleStatementParser extends SQLStatementParser {
} else if (identifierEquals("MOVE")) {
lexer.nextToken();
if (identifierEquals("TABLESPACE")) {
if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
OracleAlterTableMoveTablespace item = new OracleAlterTableMoveTablespace();
@@ -929,7 +929,7 @@ public class OracleStatementParser extends SQLStatementParser {
} else if (lexer.token() == Token.DROP) {
parseAlterDrop(stmt);
continue;
} else if (identifierEquals("DISABLE")) {
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
lexer.nextToken();
@@ -939,7 +939,7 @@ public class OracleStatementParser extends SQLStatementParser {
} else {
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
} else if (identifierEquals("ENABLE")) {
} else if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
lexer.nextToken();
@@ -1065,7 +1065,7 @@ public class OracleStatementParser extends SQLStatementParser {
spec.setPartition(this.exprParser.name());
for (;;) {
if (identifierEquals("TABLESPACE")) {
if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
SQLName tablespace = this.exprParser.name();
spec.getSegmentAttributeItems().add(new TableSpaceItem(tablespace));
@@ -1651,7 +1651,7 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.RPAREN);
for (;;) {
if (identifierEquals("TABLESPACE")) {
if (lexer.token() == Token.TABLESPACE) {
lexer.nextToken();
stmt.setTablespace(this.exprParser.name());
continue;
@@ -118,6 +118,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface OracleASTVisitor extends SQLASTVisitor {
@@ -601,4 +602,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
boolean visit(OracleDropSequenceStatement x);
void endVisit(OracleDropSequenceStatement x);
boolean visit(OracleUsingIndexClause x);
void endVisit(OracleUsingIndexClause x);
}
@@ -130,6 +130,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause;
import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter;
public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements OracleASTVisitor {
@@ -1365,4 +1366,14 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(OracleUsingIndexClause x) {
return true;
}
@Override
public void endVisit(OracleUsingIndexClause x) {
}
}
@@ -159,6 +159,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleASTVisitor {
@@ -2319,9 +2320,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print("PRIMARY KEY (");
printAndAccept(x.getColumns(), ", ");
print(")");
if (x.getUsingIndex() != null) {
print(" USING INDEX ");
x.getUsingIndex().accept(this);
if (x.getUsing() != null) {
print(" ");
x.getUsing().accept(this);
}
return false;
}
@@ -2340,12 +2341,22 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
if (x.isOrganizationIndex()) {
print(" ORGANIZATION INDEX");
}
if (x.getTablespace() != null) {
print(" TABLESPACE ");
x.getTablespace().accept(this);
if (x.getPtcfree() != null) {
print(" PCTFREE ");
x.getPtcfree().accept(this);
}
if (x.getInitrans() != null) {
print(" INITRANS ");
x.getInitrans().accept(this);
}
if (x.getMaxtrans() != null) {
print(" MAXTRANS ");
x.getMaxtrans().accept(this);
}
if (x.isInMemoryMetadata()) {
print(" IN_MEMORY_METADATA");
}
@@ -2377,6 +2388,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
} else if (x.getLogging() == Boolean.FALSE) {
print(" NOLOGGING");
}
if (x.getTablespace() != null) {
print(" TABLESPACE ");
x.getTablespace().accept(this);
}
if (x.getStorage() != null) {
print(" ");
@@ -3097,4 +3113,52 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public void endVisit(OracleDropSequenceStatement x) {
}
@Override
public boolean visit(OracleUsingIndexClause x) {
print("USING INDEX");
if (x.getIndex() != null) {
print(' ');
x.getIndex().accept(this);
} else {
if (x.getPtcfree() != null) {
print(" PCTFREE ");
x.getPtcfree().accept(this);
}
if (x.getInitrans() != null) {
print(" INITRANS ");
x.getInitrans().accept(this);
}
if (x.getMaxtrans() != null) {
print(" MAXTRANS ");
x.getMaxtrans().accept(this);
}
if (x.isComputeStatistics()) {
print(" COMPUTE STATISTICS");
}
if (x.getTablespace() != null) {
print(" TABLESPACE ");
x.getTablespace().accept(this);
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print(" ENABLE");
} else {
print(" DISABLE");
}
}
}
return false;
}
@Override
public void endVisit(OracleUsingIndexClause x) {
}
}
@@ -152,6 +152,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
@@ -1784,4 +1785,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
public void endVisit(OracleDropSequenceStatement x) {
}
@Override
public boolean visit(OracleUsingIndexClause x) {
return false;
}
@Override
public void endVisit(OracleUsingIndexClause x) {
}
}
@@ -35,6 +35,9 @@ public class Keywords {
map.put("AND", Token.AND);
map.put("ANY", Token.ANY);
map.put("AS", Token.AS);
map.put("ENABLE", Token.ENABLE);
map.put("DISABLE", Token. DISABLE);
map.put("ASC", Token.ASC);
map.put("BETWEEN", Token.BETWEEN);
@@ -48,6 +51,7 @@ public class Keywords {
map.put("DATABASE", Token.DATABASE);
map.put("DEFAULT", Token.DEFAULT);
map.put("COLUMN", Token.COLUMN);
map.put("TABLESPACE", Token.TABLESPACE);
map.put("DELETE", Token.DELETE);
map.put("DESC", Token.DESC);
@@ -119,7 +123,8 @@ public class Keywords {
map.put("REPLACE", Token.REPLACE);
map.put("COMMENT", Token.COMMENT);
map.put("COMPUTE", Token.COMPUTE);
DEFAULT_KEYWORDS = new Keywords(map);
}
@@ -77,6 +77,8 @@ public class SQLCreateTableParser extends SQLDDLParser {
} else if (lexer.token == Token.UNIQUE) {
SQLUnique unique = exprParser.parseUnique();
createTable.getTableElementList().add(unique);
} else if (lexer.token() == Token.TABLESPACE) {
throw new ParserException("TODO " + lexer.token());
} else {
throw new ParserException("TODO " + lexer.token());
}
@@ -233,6 +233,9 @@ public class SQLExprParser extends SQLParser {
case IF:
case END:
case COMMENT:
case COMPUTE:
case ENABLE:
case DISABLE:
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextToken();
break;
@@ -324,7 +324,7 @@ public class SQLStatementParser extends SQLParser {
} else {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
} else if (identifierEquals("DISABLE")) {
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
@@ -337,7 +337,7 @@ public class SQLStatementParser extends SQLParser {
SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys();
stmt.getItems().add(item);
}
} else if (identifierEquals("ENABLE")) {
} else if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
lexer.nextToken();
@@ -35,6 +35,7 @@ public enum Token {
ALTER("ALTER"),
DROP("DROP"),
TABLE("TABLE"),
TABLESPACE("TABLESPACE"),
UPDATE("UPDATE"),
SET("SET"),
SELECT("SELECT"),
@@ -167,6 +168,18 @@ public enum Token {
SAVEPOINT("SAVEPOINT"),
CROSS("CROSS"),
PCTFREE("PCTFREE"),
INITRANS("INITRANS"),
MAXTRANS("MAXTRANS"),
ENABLE("ENABLE"),
DISABLE("DISABLE"),
SEGMENT("SEGMENT"),
CREATION("CREATION"),
IMMEDIATE("IMMEDIATE"),
DEFERRED("DEFERRED"),
COMPUTE("COMPUTE"),
// transact-sql
TOP("TOP"),