From 5d770978a39c538d3398c5e437c844ca6c10ef13 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 3 Aug 2013 17:09:50 +0800 Subject: [PATCH] improve oracle sql parser --- .../ast/clause/OracleStorageClause.java | 296 +- .../oracle/ast/stmt/OracleConstraint.java | 81 +- .../ast/stmt/OracleConstraintState.java | 49 - .../oracle/ast/stmt/OraclePrimaryKey.java | 148 +- .../dialect/oracle/ast/stmt/OracleUnique.java | 53 + .../oracle/parser/OracleExprParser.java | 2471 +++--- .../dialect/oracle/parser/OracleLexer.java | 712 +- .../oracle/parser/OracleStatementParser.java | 3575 ++++----- .../oracle/visitor/OracleASTVisitor.java | 1228 +-- .../visitor/OracleASTVisitorAdapter.java | 2779 ++++--- .../oracle/visitor/OracleOutputVisitor.java | 6653 +++++++++-------- .../visitor/OracleSchemaStatVisitor.java | 3618 ++++----- .../alibaba/druid/sql/parser/SQLParser.java | 348 +- .../com/alibaba/druid/sql/parser/Token.java | 550 +- .../sql/oracle/OracleAlterTableTest19.java | 72 + .../sql/oracle/OracleCreateTableTest19.java | 2 +- .../sql/oracle/OracleCreateTableTest21.java | 67 + .../visitor/OracleASTVisitorAdapterTest.java | 2 - 18 files changed, 11464 insertions(+), 11240 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraintState.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest19.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java index 4deaa6dd67..8aa09e0304 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java @@ -1,143 +1,153 @@ -/* - * 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.clause; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; - -public class OracleStorageClause extends OracleSQLObjectImpl { - - private SQLExpr initial; - private SQLExpr next; - private SQLExpr minExtents; - private SQLExpr maxExtents; - private SQLExpr pctIncrease; - private SQLExpr freeLists; - private SQLExpr freeListGroups; - private SQLExpr bufferPool; - private SQLExpr objno; - private FlashCacheType flashCache; - private FlashCacheType cellFlashCache; - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, initial); - acceptChild(visitor, next); - acceptChild(visitor, minExtents); - acceptChild(visitor, maxExtents); - acceptChild(visitor, pctIncrease); - acceptChild(visitor, freeLists); - acceptChild(visitor, freeListGroups); - acceptChild(visitor, bufferPool); - acceptChild(visitor, objno); - } - visitor.endVisit(this); - } - - public FlashCacheType getFlashCache() { - return flashCache; - } - - public void setFlashCache(FlashCacheType flashCache) { - this.flashCache = flashCache; - } - - public FlashCacheType getCellFlashCache() { - return cellFlashCache; - } - - public void setCellFlashCache(FlashCacheType cellFlashCache) { - this.cellFlashCache = cellFlashCache; - } - - public SQLExpr getPctIncrease() { - return pctIncrease; - } - - public void setPctIncrease(SQLExpr pctIncrease) { - this.pctIncrease = pctIncrease; - } - - public SQLExpr getNext() { - return next; - } - - public void setNext(SQLExpr next) { - this.next = next; - } - - public SQLExpr getMinExtents() { - return minExtents; - } - - public void setMinExtents(SQLExpr minExtents) { - this.minExtents = minExtents; - } - - public SQLExpr getMaxExtents() { - return maxExtents; - } - - public void setMaxExtents(SQLExpr maxExtents) { - this.maxExtents = maxExtents; - } - - public SQLExpr getObjno() { - return objno; - } - - public void setObjno(SQLExpr objno) { - this.objno = objno; - } - - public SQLExpr getInitial() { - return initial; - } - - public void setInitial(SQLExpr initial) { - this.initial = initial; - } - - public SQLExpr getFreeLists() { - return freeLists; - } - - public void setFreeLists(SQLExpr freeLists) { - this.freeLists = freeLists; - } - - public SQLExpr getFreeListGroups() { - return freeListGroups; - } - - public void setFreeListGroups(SQLExpr freeListGroups) { - this.freeListGroups = freeListGroups; - } - - public SQLExpr getBufferPool() { - return bufferPool; - } - - public void setBufferPool(SQLExpr bufferPool) { - this.bufferPool = bufferPool; - } - - public static enum FlashCacheType { - KEEP, NONE, DEFAULT - } -} +/* + * 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.clause; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleStorageClause extends OracleSQLObjectImpl { + + private SQLExpr initial; + private SQLExpr next; + private SQLExpr minExtents; + private SQLExpr maxExtents; + private SQLExpr maxSize; + private SQLExpr pctIncrease; + private SQLExpr freeLists; + private SQLExpr freeListGroups; + private SQLExpr bufferPool; + private SQLExpr objno; + private FlashCacheType flashCache; + private FlashCacheType cellFlashCache; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, initial); + acceptChild(visitor, next); + acceptChild(visitor, minExtents); + acceptChild(visitor, maxExtents); + acceptChild(visitor, maxSize); + acceptChild(visitor, pctIncrease); + acceptChild(visitor, freeLists); + acceptChild(visitor, freeListGroups); + acceptChild(visitor, bufferPool); + acceptChild(visitor, objno); + } + visitor.endVisit(this); + } + + public SQLExpr getMaxSize() { + return maxSize; + } + + public void setMaxSize(SQLExpr maxSize) { + this.maxSize = maxSize; + } + + public FlashCacheType getFlashCache() { + return flashCache; + } + + public void setFlashCache(FlashCacheType flashCache) { + this.flashCache = flashCache; + } + + public FlashCacheType getCellFlashCache() { + return cellFlashCache; + } + + public void setCellFlashCache(FlashCacheType cellFlashCache) { + this.cellFlashCache = cellFlashCache; + } + + public SQLExpr getPctIncrease() { + return pctIncrease; + } + + public void setPctIncrease(SQLExpr pctIncrease) { + this.pctIncrease = pctIncrease; + } + + public SQLExpr getNext() { + return next; + } + + public void setNext(SQLExpr next) { + this.next = next; + } + + public SQLExpr getMinExtents() { + return minExtents; + } + + public void setMinExtents(SQLExpr minExtents) { + this.minExtents = minExtents; + } + + public SQLExpr getMaxExtents() { + return maxExtents; + } + + public void setMaxExtents(SQLExpr maxExtents) { + this.maxExtents = maxExtents; + } + + public SQLExpr getObjno() { + return objno; + } + + public void setObjno(SQLExpr objno) { + this.objno = objno; + } + + public SQLExpr getInitial() { + return initial; + } + + public void setInitial(SQLExpr initial) { + this.initial = initial; + } + + public SQLExpr getFreeLists() { + return freeLists; + } + + public void setFreeLists(SQLExpr freeLists) { + this.freeLists = freeLists; + } + + public SQLExpr getFreeListGroups() { + return freeListGroups; + } + + public void setFreeListGroups(SQLExpr freeListGroups) { + this.freeListGroups = freeListGroups; + } + + public SQLExpr getBufferPool() { + return bufferPool; + } + + public void setBufferPool(SQLExpr bufferPool) { + this.bufferPool = bufferPool; + } + + public static enum FlashCacheType { + KEEP, NONE, DEFAULT + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java index 20d3322f56..c10908a054 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java @@ -1,54 +1,27 @@ -/* - * 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.SQLName; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; - -public abstract class OracleConstraint extends OracleSQLObjectImpl { - - protected OracleConstraintState state; - protected SQLName name; - - public OracleConstraint(){ - - } - - public SQLName getName() { - return this.name; - } - - public void setName(String name) { - if (name == null) { - this.name = null; - } else { - this.name = new SQLIdentifierExpr(name); - } - } - - public void setName(SQLName name) { - this.name = name; - } - - public OracleConstraintState getState() { - return this.state; - } - - public void setState(OracleConstraintState state) { - this.state = state; - } -} +/* + * 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.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; + +public interface OracleConstraint extends OracleSQLObject, SQLConstaint { + + SQLName getExceptionsInto(); + + void setExceptionsInto(SQLName exceptionsInto); +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraintState.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraintState.java deleted file mode 100644 index fde83eba08..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraintState.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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 java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLObjectImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class OracleConstraintState extends SQLObjectImpl { - - private final List states = new ArrayList(); - - public OracleConstraintState(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.states); - } - visitor.endVisit(this); - } - - public List getStates() { - return this.states; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java index fde510eb62..a8478c3e66 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java @@ -1,69 +1,79 @@ -/* - * 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 java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLTableElement; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; - -public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey, SQLTableElement { - - private SQLName name; - private List columns = new ArrayList(); - - private OracleUsingIndexClause using; - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, name); - acceptChild(visitor, columns); - acceptChild(visitor, using); - } - visitor.endVisit(this); - } - - public SQLName getName() { - return name; - } - - public void setName(SQLName name) { - this.name = name; - } - - public List getColumns() { - return columns; - } - - public void setColumns(List columns) { - this.columns = columns; - } - - public OracleUsingIndexClause getUsing() { - return using; - } - - public void setUsing(OracleUsingIndexClause using) { - this.using = using; - } - -} +/* + * 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 java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLTableElement; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConstraint, SQLPrimaryKey, SQLTableElement { + + private SQLName name; + private List columns = new ArrayList(); + + private OracleUsingIndexClause using; + private SQLName exceptionsInto; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, columns); + acceptChild(visitor, using); + acceptChild(visitor, exceptionsInto); + } + visitor.endVisit(this); + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public OracleUsingIndexClause getUsing() { + return using; + } + + public void setUsing(OracleUsingIndexClause using) { + this.using = using; + } + + public SQLName getExceptionsInto() { + return exceptionsInto; + } + + public void setExceptionsInto(SQLName exceptionsInto) { + this.exceptionsInto = exceptionsInto; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java new file mode 100644 index 0000000000..14fcfa932f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java @@ -0,0 +1,53 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLUnique; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class OracleUnique extends SQLUnique implements OracleConstraint, OracleSQLObject { + + private OracleUsingIndexClause using; + private SQLName exceptionsInto; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof OracleASTVisitor) { + accept0((OracleASTVisitor) visitor); + return; + } + + super.accept(visitor); + } + + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + acceptChild(visitor, this.getColumns()); + acceptChild(visitor, using); + acceptChild(visitor, exceptionsInto); + } + visitor.endVisit(this); + } + + public SQLName getExceptionsInto() { + return exceptionsInto; + } + + public void setExceptionsInto(SQLName exceptionsInto) { + this.exceptionsInto = exceptionsInto; + } + + public OracleUsingIndexClause getUsing() { + return using; + } + + public void setUsing(OracleUsingIndexClause using) { + if (using != null) { + using.setParent(this); + } + this.using = using; + } + +} 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 59bef6be5a..a9956a4870 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 @@ -1,1221 +1,1250 @@ -/* - * 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.parser; - -import java.math.BigInteger; - -import com.alibaba.druid.sql.ast.SQLDataType; -import com.alibaba.druid.sql.ast.SQLDataTypeImpl; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLOrderingSpecification; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause.FlashCacheType; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateTimeUnit; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -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; -import com.alibaba.druid.sql.parser.Token; - -public class OracleExprParser extends SQLExprParser { - - - - - - - - - - public boolean allowStringAdditive = false; - - /** - * @formatter:off - */ - private static final String[] AGGREGATE_FUNCTIONS = { - "AVG", // - "CORR", // - "COVAR_POP", // - "COVAR_SAMP", // - "COUNT", // - "CUME_DIST", // - "DENSE_RANK", // - "FIRST", // - "FIRST_VALUE", // - "LAG", // - "LAST", // - "LAST_VALUE", // - "LEAD", // - "MAX", // - "MIN", // - "NTILE", // - "PERCENT_RANK", // - "PERCENTILE_CONT", // - "PERCENTILE_DISC", // - "RANK", // - "RATIO_TO_REPORT", // - "REGR_SLOPE", // - "REGR_INTERCEPT", // - "REGR_COUNT", // - "REGR_R2", // - "REGR_AVGX", // - "REGR_AVGY", // - "REGR_SXX", // - "REGR_SYY", // - "REGR_SXY", // - "ROW_NUMBER", // - "STDDEV", // - "STDDEV_POP", // - "STDDEV_SAMP", // - "SUM", // - "VAR_POP", // - "VAR_SAMP", // - "VARIANCE", // - "WM_CONCAT" - }; - - public OracleExprParser(Lexer lexer){ - super(lexer); - this.aggregateFunctions = AGGREGATE_FUNCTIONS; - } - - public OracleExprParser(String text){ - this(new OracleLexer(text)); - this.lexer.nextToken(); - } - - protected boolean isCharType(String dataTypeName) { - return "varchar2".equalsIgnoreCase(dataTypeName) // - || "nvarchar2".equalsIgnoreCase(dataTypeName) // - || "char".equalsIgnoreCase(dataTypeName) // - || "varchar".equalsIgnoreCase(dataTypeName) // - || "nchar".equalsIgnoreCase(dataTypeName) // - || "nvarchar".equalsIgnoreCase(dataTypeName) // - // - ; - } - - public SQLDataType parseDataType() { - - if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) { - return null; - } - - if (lexer.token() == Token.INTERVAL) { - lexer.nextToken(); - if (identifierEquals("YEAR")) { - lexer.nextToken(); - OracleDataTypeIntervalYear interval = new OracleDataTypeIntervalYear(); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - interval.getArguments().add(this.expr()); - accept(Token.RPAREN); - } - - accept(Token.TO); - acceptIdentifier("MONTH"); - - return interval; - } else { - acceptIdentifier("DAY"); - OracleDataTypeIntervalDay interval = new OracleDataTypeIntervalDay(); - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - interval.getArguments().add(this.expr()); - accept(Token.RPAREN); - } - - accept(Token.TO); - acceptIdentifier("SECOND"); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - interval.getFractionalSeconds().add(this.expr()); - accept(Token.RPAREN); - } - - return interval; - } - } - - SQLName typeExpr = name(); - String typeName = typeExpr.toString(); - - if ("TIMESTAMP".equalsIgnoreCase(typeName)) { - OracleDataTypeTimestamp timestamp = new OracleDataTypeTimestamp(); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - timestamp.getArguments().add(this.expr()); - accept(Token.RPAREN); - } - - if (lexer.token() == Token.WITH) { - lexer.nextToken(); - - if (identifierEquals("LOCAL")) { - lexer.nextToken(); - timestamp.setWithLocalTimeZone(true); - } else { - timestamp.setWithTimeZone(true); - } - - acceptIdentifier("TIME"); - acceptIdentifier("ZONE"); - } - - return timestamp; - } - - if (isCharType(typeName)) { - SQLCharactorDataType charType = new SQLCharactorDataType(typeName); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - - charType.getArguments().add(this.expr()); - - if (identifierEquals("CHAR")) { - lexer.nextToken(); - charType.setCharType(SQLCharactorDataType.CHAR_TYPE_CHAR); - } else if (identifierEquals("BYTE")) { - lexer.nextToken(); - charType.setCharType(SQLCharactorDataType.CHAR_TYPE_BYTE); - } - - accept(Token.RPAREN); - } - - return parseCharTypeRest(charType); - } - - if (lexer.token() == Token.PERCENT) { - lexer.nextToken(); - if (identifierEquals("TYPE")) { - lexer.nextToken(); - typeName += "%TYPE"; - } else if (identifierEquals("ROWTYPE")) { - lexer.nextToken(); - typeName += "%ROWTYPE"; - } else { - throw new ParserException("syntax error : " + lexer.token() + " " + lexer.stringVal()); - } - } - - SQLDataType dataType = new SQLDataTypeImpl(typeName); - return parseDataTypeRest(dataType); - } - - public SQLExpr primary() { - final Token tok = lexer.token(); - - SQLExpr sqlExpr = null; - switch (tok) { - case SYSDATE: - lexer.nextToken(); - OracleSysdateExpr sysdate = new OracleSysdateExpr(); - if (lexer.token() == Token.MONKEYS_AT) { - lexer.nextToken(); - accept(Token.BANG); - sysdate.setOption("!"); - } - sqlExpr = sysdate; - return primaryRest(sqlExpr); - case PRIOR: - lexer.nextToken(); - sqlExpr = expr(); - sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Prior, sqlExpr); - return primaryRest(sqlExpr); - case COLON: - lexer.nextToken(); - if (lexer.token() == Token.LITERAL_INT) { - String name = ":" + lexer.numberString(); - lexer.nextToken(); - return new SQLVariantRefExpr(name); - } else if (lexer.token() == Token.IDENTIFIER) { - String name = lexer.stringVal(); - if (name.charAt(0) == 'B' || name.charAt(0) == 'b') { - lexer.nextToken(); - return new SQLVariantRefExpr(":" + name); - } - throw new ParserException("syntax error : " + lexer.token() + " " + lexer.stringVal()); - } else { - throw new ParserException("syntax error : " + lexer.token()); - } - case LITERAL_ALIAS: - String alias = '"' + lexer.stringVal() + '"'; - lexer.nextToken(); - return primaryRest(new SQLIdentifierExpr(alias)); - case EXTRACT: - lexer.nextToken(); - OracleExtractExpr extract = new OracleExtractExpr(); - - accept(Token.LPAREN); - - extract.setUnit(OracleDateTimeUnit.valueOf(lexer.stringVal().toUpperCase())); - lexer.nextToken(); - - accept(Token.FROM); - - extract.setFrom(expr()); - - accept(Token.RPAREN); - - return primaryRest(extract); - case BINARY_FLOAT: - OracleBinaryFloatExpr floatExpr = new OracleBinaryFloatExpr(); - floatExpr.setValue(Float.parseFloat(lexer.numberString())); - lexer.nextToken(); - return primaryRest(floatExpr); - case BINARY_DOUBLE: - OracleBinaryDoubleExpr doubleExpr = new OracleBinaryDoubleExpr(); - doubleExpr.setValue(Double.parseDouble(lexer.numberString())); - - lexer.nextToken(); - return primaryRest(doubleExpr); - case TABLE: - lexer.nextToken(); - return primaryRest(new SQLIdentifierExpr("TABLE")); - case PLUS: - lexer.nextToken(); - switch (lexer.token()) { - case LITERAL_INT: - sqlExpr = new SQLIntegerExpr(lexer.integerValue()); - lexer.nextToken(); - break; - case LITERAL_FLOAT: - sqlExpr = new SQLNumberExpr(lexer.decimalValue()); - lexer.nextToken(); - break; - case BINARY_FLOAT: - sqlExpr = new OracleBinaryFloatExpr(Float.parseFloat(lexer.numberString())); - lexer.nextToken(); - break; - case BINARY_DOUBLE: - sqlExpr = new OracleBinaryDoubleExpr(Double.parseDouble(lexer.numberString())); - lexer.nextToken(); - break; - case LPAREN: - lexer.nextToken(); - sqlExpr = expr(); - accept(Token.RPAREN); - sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Plus, sqlExpr); - break; - default: - throw new ParserException("TODO"); - } - return primaryRest(sqlExpr); - case SUB: - lexer.nextToken(); - switch (lexer.token()) { - case LITERAL_INT: - Number integerValue = lexer.integerValue(); - if (integerValue instanceof Integer) { - int intVal = ((Integer) integerValue).intValue(); - if (intVal == Integer.MIN_VALUE) { - integerValue = Long.valueOf(((long) intVal) * -1); - } else { - integerValue = Integer.valueOf(intVal * -1); - } - } else if (integerValue instanceof Long) { - long longVal = ((Long) integerValue).longValue(); - if (longVal == 2147483648L) { - integerValue = Integer.valueOf((int) (((long) longVal) * -1)); - } else { - integerValue = Long.valueOf(longVal * -1); - } - } else { - integerValue = ((BigInteger) integerValue).negate(); - } - sqlExpr = new SQLIntegerExpr(integerValue); - lexer.nextToken(); - break; - case LITERAL_FLOAT: - sqlExpr = new SQLNumberExpr(lexer.decimalValue().negate()); - lexer.nextToken(); - break; - case BINARY_FLOAT: - sqlExpr = new OracleBinaryFloatExpr(Float.parseFloat(lexer.numberString()) * -1); - lexer.nextToken(); - break; - case BINARY_DOUBLE: - sqlExpr = new OracleBinaryDoubleExpr(Double.parseDouble(lexer.numberString()) * -1); - lexer.nextToken(); - break; - case VARIANT: - case IDENTIFIER: - sqlExpr = expr(); - sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); - break; - case LPAREN: - lexer.nextToken(); - sqlExpr = expr(); - accept(Token.RPAREN); - sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); - break; - default: - throw new ParserException("TODO " + lexer.token()); - } - return primaryRest(sqlExpr); - - case CURSOR: - lexer.nextToken(); - accept(Token.LPAREN); - - OracleSelect select = createSelectParser().select(); - OracleCursorExpr cursorExpr = new OracleCursorExpr(select); - - accept(Token.RPAREN); - - sqlExpr = cursorExpr; - return primaryRest(sqlExpr); - case MODEL: - case PCTFREE: - case INITRANS: - case MAXTRANS: - case SEGMENT: - case CREATION: - case IMMEDIATE: - case DEFERRED: - case STORAGE: - case NEXT: - case MINEXTENTS: - case MAXEXTENTS: - case PCTINCREASE: - case FLASH_CACHE: - case CELL_FLASH_CACHE: - case KEEP: - case NONE: - case LOB: - case STORE: - case ROW: - case CHUNK: - case CACHE: - case NOCACHE: - case LOGGING: - case NOCOMPRESS: - case KEEP_DUPLICATES: - sqlExpr = new SQLIdentifierExpr(lexer.stringVal()); - lexer.nextToken(); - return primaryRest(sqlExpr); - default: - return super.primary(); - } - } - - @Override - protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) { - if (acceptLPAREN) { - accept(Token.LPAREN); - if (lexer.token() == Token.PLUS) { - lexer.nextToken(); - accept(Token.RPAREN); - return new OracleOuterExpr(expr); - } - } - return super.methodRest(expr, false); - } - - public SQLExpr primaryRest(SQLExpr expr) { - if (expr.getClass() == SQLIdentifierExpr.class) { - String ident = ((SQLIdentifierExpr)expr).getName(); - - if ("DATE".equalsIgnoreCase(ident)) { - OracleDateExpr timestamp = new OracleDateExpr(); - - String literal = lexer.stringVal(); - timestamp.setLiteral(literal); - accept(Token.LITERAL_CHARS); - - return primaryRest(timestamp); - } - if ("TIMESTAMP".equalsIgnoreCase(ident)) { - if (lexer.token() != Token.LITERAL_ALIAS && lexer.token() != Token.LITERAL_CHARS) { - return new SQLIdentifierExpr("TIMESTAMP"); - } - - OracleTimestampExpr timestamp = new OracleTimestampExpr(); - - String literal = lexer.stringVal(); - timestamp.setLiteral(literal); - accept(Token.LITERAL_CHARS); - - if (identifierEquals("AT")) { - lexer.nextToken(); - acceptIdentifier("TIME"); - acceptIdentifier("ZONE"); - - String timezone = lexer.stringVal(); - timestamp.setTimeZone(timezone); - accept(Token.LITERAL_CHARS); - } - - - return primaryRest(timestamp); - } - } - if (lexer.token() == Token.IDENTIFIER && expr instanceof SQLNumericLiteralExpr) { - String ident = lexer.stringVal(); - - if (ident.length() == 1) { - char unit = ident.charAt(0); - switch (unit) { - case 'K': - case 'M': - case 'G': - case 'T': - case 'P': - case 'E': - case 'k': - case 'm': - case 'g': - case 't': - case 'p': - case 'e': - expr = new OracleSizeExpr(expr, OracleSizeExpr.Unit.valueOf(ident.toUpperCase())); - lexer.nextToken(); - break; - default: - break; - } - } - } - - if (lexer.token() == Token.DOTDOT) { - lexer.nextToken(); - SQLExpr upBound = expr(); - - return new OracleRangeExpr(expr, upBound); - } - - if (lexer.token() == Token.MONKEYS_AT) { - lexer.nextToken(); - - OracleDbLinkExpr dblink = new OracleDbLinkExpr(); - dblink.setExpr(expr); - - if (lexer.token() == Token.BANG) { - dblink.setDbLink("!"); - lexer.nextToken(); - } else { - String link = lexer.stringVal(); - accept(Token.IDENTIFIER); - dblink.setDbLink(link); - } - - expr = dblink; - } - - if (identifierEquals("DAY") || identifierEquals("YEAR")) { - lexer.mark(); - - String name = lexer.stringVal(); - lexer.nextToken(); - - if (lexer.token() == Token.COMMA) { - lexer.reset(); - return expr; - } - - OracleIntervalExpr interval = new OracleIntervalExpr(); - interval.setValue(expr); - OracleIntervalType type = OracleIntervalType.valueOf(name); - interval.setType(type); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { - throw new ParserException("syntax error"); - } - interval.setPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); - accept(Token.RPAREN); - } - - accept(Token.TO); - if (identifierEquals("SECOND")) { - lexer.nextToken(); - interval.setToType(OracleIntervalType.SECOND); - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { - throw new ParserException("syntax error"); - } - interval.setFactionalSecondsPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); - accept(Token.RPAREN); - } - } else { - interval.setToType(OracleIntervalType.MONTH); - lexer.nextToken(); - } - - expr = interval; - } - - if (identifierEquals("AT")) { - char markChar = lexer.current(); - int markBp = lexer.bp(); - lexer.nextToken(); - if (identifierEquals("LOCAL")) { - lexer.nextToken(); - expr = new OracleDatetimeExpr(expr, new SQLIdentifierExpr("LOCAL")); - } else { - if (identifierEquals("TIME")) { - lexer.nextToken(); - } else { - lexer.reset(markBp, markChar, Token.IDENTIFIER); - return expr; - } - acceptIdentifier("ZONE"); - - SQLExpr timeZone = primary(); - expr = new OracleDatetimeExpr(expr, timeZone); - } - } - - SQLExpr restExpr = super.primaryRest(expr); - - if (restExpr != expr && restExpr instanceof SQLMethodInvokeExpr) { - SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) restExpr; - if (methodInvoke.getParameters().size() == 1) { - SQLExpr paramExpr = methodInvoke.getParameters().get(0); - if (paramExpr instanceof SQLIdentifierExpr && "+".equals(((SQLIdentifierExpr) paramExpr).getName())) { - OracleOuterExpr outerExpr = new OracleOuterExpr(); - if (methodInvoke.getOwner() == null) { - outerExpr.setExpr(new SQLIdentifierExpr(methodInvoke.getMethodName())); - } else { - outerExpr.setExpr(new SQLPropertyExpr(methodInvoke.getOwner(), methodInvoke.getMethodName())); - } - return outerExpr; - } - } - } - - return restExpr; - } - - protected SQLExpr dotRest(SQLExpr expr) { - if (lexer.token() == Token.LITERAL_ALIAS) { - String name = '"' + lexer.stringVal() + '"'; - lexer.nextToken(); - expr = new SQLPropertyExpr(expr, name); - - if (lexer.token() == Token.DOT) { - lexer.nextToken(); - expr = dotRest(expr); - } - - return expr; - } - - return super.dotRest(expr); - } - - @Override - public OracleOrderBy parseOrderBy() { - if (lexer.token() == (Token.ORDER)) { - OracleOrderBy orderBy = new OracleOrderBy(); - - lexer.nextToken(); - - if (identifierEquals("SIBLINGS")) { - lexer.nextToken(); - orderBy.setSibings(true); - } - - accept(Token.BY); - - orderBy.getItems().add(parseSelectOrderByItem()); - - while (lexer.token() == (Token.COMMA)) { - lexer.nextToken(); - orderBy.getItems().add(parseSelectOrderByItem()); - } - - return orderBy; - } - - return null; - } - - protected OracleAggregateExpr parseAggregateExpr(String methodName) { - methodName = methodName.toUpperCase(); - - OracleAggregateExpr aggregateExpr; - if (lexer.token() == Token.UNIQUE) { - aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.UNIQUE); - lexer.nextToken(); - } else if (lexer.token() == (Token.ALL)) { - aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.ALL); - lexer.nextToken(); - } else if (lexer.token() == (Token.DISTINCT)) { - aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT); - lexer.nextToken(); - } else { - aggregateExpr = new OracleAggregateExpr(methodName); - } - exprList(aggregateExpr.getArguments()); - - if (lexer.stringVal().equalsIgnoreCase("IGNORE")) { - lexer.nextToken(); - identifierEquals("NULLS"); - aggregateExpr.setIgnoreNulls(true); - } - - accept(Token.RPAREN); - - if (lexer.token() == Token.OVER) { - OracleAnalytic over = new OracleAnalytic(); - - lexer.nextToken(); - accept(Token.LPAREN); - - if (identifierEquals("PARTITION")) { - lexer.nextToken(); - accept(Token.BY); - - if (lexer.token() == (Token.LPAREN)) { - lexer.nextToken(); - exprList(over.getPartitionBy()); - accept(Token.RPAREN); - } else { - exprList(over.getPartitionBy()); - } - } - - over.setOrderBy(parseOrderBy()); - if (over.getOrderBy() != null) { - OracleAnalyticWindowing windowing = null; - if (lexer.stringVal().equalsIgnoreCase("ROWS")) { - lexer.nextToken(); - windowing = new OracleAnalyticWindowing(); - windowing.setType(OracleAnalyticWindowing.Type.ROWS); - } else if (lexer.stringVal().equalsIgnoreCase("RANGE")) { - lexer.nextToken(); - windowing = new OracleAnalyticWindowing(); - windowing.setType(OracleAnalyticWindowing.Type.RANGE); - } - - if (windowing != null) { - if (lexer.stringVal().equalsIgnoreCase("CURRENT")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("ROW")) { - lexer.nextToken(); - windowing.setExpr(new SQLIdentifierExpr("CURRENT ROW")); - over.setWindowing(windowing); - } - throw new ParserException("syntax error"); - } - if (lexer.stringVal().equalsIgnoreCase("UNBOUNDED")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { - lexer.nextToken(); - windowing.setExpr(new SQLIdentifierExpr("UNBOUNDED PRECEDING")); - } else { - throw new ParserException("syntax error"); - } - } - - over.setWindowing(windowing); - } - } - - accept(Token.RPAREN); - - aggregateExpr.setOver(over); - } - return aggregateExpr; - } - - @SuppressWarnings("unused") - private OracleIntervalType parseIntervalType() { - String currentTokenUpperValue = lexer.stringVal(); - lexer.nextToken(); - - if (currentTokenUpperValue.equals("YEAR")) { - return OracleIntervalType.YEAR; - } - if (currentTokenUpperValue.equals("MONTH")) { - return OracleIntervalType.MONTH; - } - if (currentTokenUpperValue.equals("HOUR")) { - return OracleIntervalType.HOUR; - } - if (currentTokenUpperValue.equals("MINUTE")) { - return OracleIntervalType.MINUTE; - } - if (currentTokenUpperValue.equals("SECOND")) { - return OracleIntervalType.SECOND; - } - throw new ParserException("syntax error"); - } - - @Override - public OracleSelectParser createSelectParser() { - return new OracleSelectParser(this); - } - - @Override - public OracleOrderByItem parseSelectOrderByItem() { - OracleOrderByItem item = new OracleOrderByItem(); - - item.setExpr(expr()); - - if (lexer.token() == (Token.ASC)) { - lexer.nextToken(); - item.setType(SQLOrderingSpecification.ASC); - } else if (lexer.token() == (Token.DESC)) { - lexer.nextToken(); - item.setType(SQLOrderingSpecification.DESC); - } - - if (identifierEquals("NULLS")) { - lexer.nextToken(); - if (identifierEquals("FIRST")) { - lexer.nextToken(); - item.setNullsOrderType(OracleOrderByItem.NullsOrderType.NullsFirst); - } else if (identifierEquals("LAST")) { - lexer.nextToken(); - item.setNullsOrderType(OracleOrderByItem.NullsOrderType.NullsLast); - } else { - throw new ParserException("TODO " + lexer.token()); - } - } - - return item; - } - - protected SQLExpr parseInterval() { - accept(Token.INTERVAL); - - OracleIntervalExpr interval = new OracleIntervalExpr(); - if (lexer.token() != Token.LITERAL_CHARS) { - return new SQLIdentifierExpr("INTERVAL"); - } - interval.setValue(new SQLCharExpr(lexer.stringVal())); - lexer.nextToken(); - - - OracleIntervalType type = OracleIntervalType.valueOf(lexer.stringVal()); - interval.setType(type); - lexer.nextToken(); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { - throw new ParserException("syntax error"); - } - interval.setPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { - throw new ParserException("syntax error"); - } - interval.setFactionalSecondsPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); - } - accept(Token.RPAREN); - } - - if (lexer.token() == Token.TO) { - lexer.nextToken(); - if (identifierEquals("SECOND")) { - lexer.nextToken(); - interval.setToType(OracleIntervalType.SECOND); - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { - throw new ParserException("syntax error"); - } - interval.setToFactionalSecondsPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); - accept(Token.RPAREN); - } - } else { - interval.setToType(OracleIntervalType.MONTH); - lexer.nextToken(); - } - } - - return interval; - } - - public SQLExpr relationalRest(SQLExpr expr) { - if (lexer.token() == Token.IS) { - lexer.nextToken(); - - if (lexer.token() == Token.NOT) { - lexer.nextToken(); - SQLExpr rightExpr = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.IsNot, rightExpr); - } else if (identifierEquals("A")) { - lexer.nextToken(); - accept(Token.SET); - expr = new OracleIsSetExpr(expr); - } else { - SQLExpr rightExpr = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Is, rightExpr); - } - - return expr; - } - return super.relationalRest(expr); - } - - - public SQLName name() { - SQLName name = super.name(); - - if (lexer.token() == Token.MONKEYS_AT) { - lexer.nextToken(); - if (lexer.token() != Token.IDENTIFIER) { - throw new ParserException("syntax error, expect identifier, but " + lexer.token()); - } - OracleDbLinkExpr dbLink = new OracleDbLinkExpr(); - dbLink.setExpr(name); - dbLink.setDbLink(lexer.stringVal()); - lexer.nextToken(); - return dbLink; - } - - return name; - } - - public SQLExpr equalityRest(SQLExpr expr) { - SQLExpr rightExp; - if (lexer.token() == Token.EQ) { - lexer.nextToken(); - - if (lexer.token() == Token.GT) { - lexer.nextToken(); - rightExp = expr(); - String argumentName = ((SQLIdentifierExpr) expr).getName(); - return new OracleArgumentExpr(argumentName, rightExp); - } - - rightExp = shift(); - - rightExp = equalityRest(rightExp); - - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Equality, rightExp); - } else if (lexer.token() == Token.BANGEQ) { - lexer.nextToken(); - rightExp = shift(); - - rightExp = equalityRest(rightExp); - - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotEqual, rightExp); - } - - return expr; - } - - public OraclePrimaryKey parsePrimaryKey() { - lexer.nextToken(); - accept(Token.KEY); - - OraclePrimaryKey primaryKey = new OraclePrimaryKey(); - accept(Token.LPAREN); - exprList(primaryKey.getColumns()); - accept(Token.RPAREN); - - - if (lexer.token() == Token.USING) { - lexer.nextToken(); - accept(Token.INDEX); - - 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.STORAGE) { - OracleStorageClause storage = parseStorage(); - using.setStorage(storage); - continue; - } else if (lexer.token() == Token.IDENTIFIER) { - using.setTablespace(this.name()); - break; - } else { - break; - } - } - primaryKey.setUsing(using); - } - return primaryKey; - } - - public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { - column = super.parseColumnRest(column); - - if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - column.setEnable(Boolean.TRUE); - } - - return column; - } - - public SQLExpr exprRest(SQLExpr expr) { - expr = super.exprRest(expr); - - if (lexer.token() == Token.COLONEQ) { - lexer.nextToken(); - SQLExpr right = expr(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Assignment, right); - } - - return expr; - } - - public OracleLobStorageClause parseLobStorage() { - lexer.nextToken(); - - OracleLobStorageClause clause = new OracleLobStorageClause(); - - accept(Token.LPAREN); - this.names(clause.getItems()); - accept(Token.RPAREN); - - accept(Token.STORE); - accept(Token.AS); - - for (;;) { - if (identifierEquals("SECUREFILE")) { - lexer.nextToken(); - clause.setSecureFile(true); - continue; - } - - if (identifierEquals("BASICFILE")) { - lexer.nextToken(); - clause.setBasicFile(true); - continue; - } - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - - for (;;) { - if (lexer.token() == Token.TABLESPACE) { - lexer.nextToken(); - clause.setTableSpace(this.name()); - continue; - } - - if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - accept(Token.STORAGE); - accept(Token.IN); - accept(Token.ROW); - clause.setEnable(true); - continue; - } - - if (lexer.token() == Token.CHUNK) { - lexer.nextToken(); - clause.setChunk(this.primary()); - continue; - } - - if (lexer.token() == Token.NOCACHE) { - lexer.nextToken(); - clause.setCache(false); - if (lexer.token() == Token.LOGGING) { - lexer.nextToken(); - clause.setLogging(true); - } - continue; - } - - if (lexer.token() == Token.NOCOMPRESS) { - lexer.nextToken(); - clause.setCompress(false); - continue; - } - - if (lexer.token() == Token.KEEP_DUPLICATES) { - lexer.nextToken(); - clause.setKeepDuplicate(true); - continue; - } - - break; - } - - accept(Token.RPAREN); - } - - break; - } - return clause; - } - - public OracleStorageClause parseStorage() { - lexer.nextToken(); - accept(Token.LPAREN); - - OracleStorageClause storage = new OracleStorageClause(); - for (;;) { - if (identifierEquals("INITIAL")) { - lexer.nextToken(); - storage.setInitial(this.expr()); - continue; - } else if (lexer.token() == Token.NEXT) { - lexer.nextToken(); - storage.setNext(this.expr()); - continue; - } else if (lexer.token() == Token.MINEXTENTS) { - lexer.nextToken(); - storage.setMinExtents(this.expr()); - continue; - } else if (lexer.token() == Token.MAXEXTENTS) { - lexer.nextToken(); - storage.setMaxExtents(this.expr()); - continue; - } else if (lexer.token() == Token.PCTINCREASE) { - lexer.nextToken(); - storage.setPctIncrease(this.expr()); - continue; - } else if (identifierEquals("FREELISTS")) { - lexer.nextToken(); - storage.setFreeLists(this.expr()); - continue; - } else if (identifierEquals("FREELIST")) { - lexer.nextToken(); - acceptIdentifier("GROUPS"); - storage.setFreeListGroups(this.expr()); - continue; - } else if (identifierEquals("BUFFER_POOL")) { - lexer.nextToken(); - storage.setBufferPool(this.expr()); - continue; - } else if (identifierEquals("OBJNO")) { - lexer.nextToken(); - storage.setObjno(this.expr()); - continue; - } else if (lexer.token() == Token.FLASH_CACHE) { - lexer.nextToken(); - FlashCacheType flashCacheType; - if (lexer.token() == Token.KEEP) { - flashCacheType = FlashCacheType.KEEP; - lexer.nextToken(); - } else if (lexer.token() == Token.NONE) { - flashCacheType = FlashCacheType.NONE; - lexer.nextToken(); - } else { - accept(Token.DEFAULT); - flashCacheType = FlashCacheType.DEFAULT; - } - storage.setFlashCache(flashCacheType); - continue; - } else if (lexer.token() == Token.CELL_FLASH_CACHE) { - lexer.nextToken(); - FlashCacheType flashCacheType; - if (lexer.token() == Token.KEEP) { - flashCacheType = FlashCacheType.KEEP; - lexer.nextToken(); - } else if (lexer.token() == Token.NONE) { - flashCacheType = FlashCacheType.NONE; - lexer.nextToken(); - } else { - accept(Token.DEFAULT); - flashCacheType = FlashCacheType.DEFAULT; - } - storage.setCellFlashCache(flashCacheType); - continue; - } - - break; - } - accept(Token.RPAREN); - return storage; - } -} +/* + * 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.parser; + +import java.math.BigInteger; + +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLDataTypeImpl; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLOrderingSpecification; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; +import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; +import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLUnique; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause.FlashCacheType; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateTimeUnit; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +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.OracleUnique; +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; +import com.alibaba.druid.sql.parser.Token; + +public class OracleExprParser extends SQLExprParser { + + + + + + + + + + public boolean allowStringAdditive = false; + + /** + * @formatter:off + */ + private static final String[] AGGREGATE_FUNCTIONS = { + "AVG", // + "CORR", // + "COVAR_POP", // + "COVAR_SAMP", // + "COUNT", // + "CUME_DIST", // + "DENSE_RANK", // + "FIRST", // + "FIRST_VALUE", // + "LAG", // + "LAST", // + "LAST_VALUE", // + "LEAD", // + "MAX", // + "MIN", // + "NTILE", // + "PERCENT_RANK", // + "PERCENTILE_CONT", // + "PERCENTILE_DISC", // + "RANK", // + "RATIO_TO_REPORT", // + "REGR_SLOPE", // + "REGR_INTERCEPT", // + "REGR_COUNT", // + "REGR_R2", // + "REGR_AVGX", // + "REGR_AVGY", // + "REGR_SXX", // + "REGR_SYY", // + "REGR_SXY", // + "ROW_NUMBER", // + "STDDEV", // + "STDDEV_POP", // + "STDDEV_SAMP", // + "SUM", // + "VAR_POP", // + "VAR_SAMP", // + "VARIANCE", // + "WM_CONCAT" + }; + + public OracleExprParser(Lexer lexer){ + super(lexer); + this.aggregateFunctions = AGGREGATE_FUNCTIONS; + } + + public OracleExprParser(String text){ + this(new OracleLexer(text)); + this.lexer.nextToken(); + } + + protected boolean isCharType(String dataTypeName) { + return "varchar2".equalsIgnoreCase(dataTypeName) // + || "nvarchar2".equalsIgnoreCase(dataTypeName) // + || "char".equalsIgnoreCase(dataTypeName) // + || "varchar".equalsIgnoreCase(dataTypeName) // + || "nchar".equalsIgnoreCase(dataTypeName) // + || "nvarchar".equalsIgnoreCase(dataTypeName) // + // + ; + } + + public SQLDataType parseDataType() { + + if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) { + return null; + } + + if (lexer.token() == Token.INTERVAL) { + lexer.nextToken(); + if (identifierEquals("YEAR")) { + lexer.nextToken(); + OracleDataTypeIntervalYear interval = new OracleDataTypeIntervalYear(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + interval.getArguments().add(this.expr()); + accept(Token.RPAREN); + } + + accept(Token.TO); + acceptIdentifier("MONTH"); + + return interval; + } else { + acceptIdentifier("DAY"); + OracleDataTypeIntervalDay interval = new OracleDataTypeIntervalDay(); + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + interval.getArguments().add(this.expr()); + accept(Token.RPAREN); + } + + accept(Token.TO); + acceptIdentifier("SECOND"); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + interval.getFractionalSeconds().add(this.expr()); + accept(Token.RPAREN); + } + + return interval; + } + } + + SQLName typeExpr = name(); + String typeName = typeExpr.toString(); + + if ("TIMESTAMP".equalsIgnoreCase(typeName)) { + OracleDataTypeTimestamp timestamp = new OracleDataTypeTimestamp(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + timestamp.getArguments().add(this.expr()); + accept(Token.RPAREN); + } + + if (lexer.token() == Token.WITH) { + lexer.nextToken(); + + if (identifierEquals("LOCAL")) { + lexer.nextToken(); + timestamp.setWithLocalTimeZone(true); + } else { + timestamp.setWithTimeZone(true); + } + + acceptIdentifier("TIME"); + acceptIdentifier("ZONE"); + } + + return timestamp; + } + + if (isCharType(typeName)) { + SQLCharactorDataType charType = new SQLCharactorDataType(typeName); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + + charType.getArguments().add(this.expr()); + + if (identifierEquals("CHAR")) { + lexer.nextToken(); + charType.setCharType(SQLCharactorDataType.CHAR_TYPE_CHAR); + } else if (identifierEquals("BYTE")) { + lexer.nextToken(); + charType.setCharType(SQLCharactorDataType.CHAR_TYPE_BYTE); + } + + accept(Token.RPAREN); + } + + return parseCharTypeRest(charType); + } + + if (lexer.token() == Token.PERCENT) { + lexer.nextToken(); + if (identifierEquals("TYPE")) { + lexer.nextToken(); + typeName += "%TYPE"; + } else if (identifierEquals("ROWTYPE")) { + lexer.nextToken(); + typeName += "%ROWTYPE"; + } else { + throw new ParserException("syntax error : " + lexer.token() + " " + lexer.stringVal()); + } + } + + SQLDataType dataType = new SQLDataTypeImpl(typeName); + return parseDataTypeRest(dataType); + } + + public SQLExpr primary() { + final Token tok = lexer.token(); + + SQLExpr sqlExpr = null; + switch (tok) { + case SYSDATE: + lexer.nextToken(); + OracleSysdateExpr sysdate = new OracleSysdateExpr(); + if (lexer.token() == Token.MONKEYS_AT) { + lexer.nextToken(); + accept(Token.BANG); + sysdate.setOption("!"); + } + sqlExpr = sysdate; + return primaryRest(sqlExpr); + case PRIOR: + lexer.nextToken(); + sqlExpr = expr(); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Prior, sqlExpr); + return primaryRest(sqlExpr); + case COLON: + lexer.nextToken(); + if (lexer.token() == Token.LITERAL_INT) { + String name = ":" + lexer.numberString(); + lexer.nextToken(); + return new SQLVariantRefExpr(name); + } else if (lexer.token() == Token.IDENTIFIER) { + String name = lexer.stringVal(); + if (name.charAt(0) == 'B' || name.charAt(0) == 'b') { + lexer.nextToken(); + return new SQLVariantRefExpr(":" + name); + } + throw new ParserException("syntax error : " + lexer.token() + " " + lexer.stringVal()); + } else { + throw new ParserException("syntax error : " + lexer.token()); + } + case LITERAL_ALIAS: + String alias = '"' + lexer.stringVal() + '"'; + lexer.nextToken(); + return primaryRest(new SQLIdentifierExpr(alias)); + case EXTRACT: + lexer.nextToken(); + OracleExtractExpr extract = new OracleExtractExpr(); + + accept(Token.LPAREN); + + extract.setUnit(OracleDateTimeUnit.valueOf(lexer.stringVal().toUpperCase())); + lexer.nextToken(); + + accept(Token.FROM); + + extract.setFrom(expr()); + + accept(Token.RPAREN); + + return primaryRest(extract); + case BINARY_FLOAT: + OracleBinaryFloatExpr floatExpr = new OracleBinaryFloatExpr(); + floatExpr.setValue(Float.parseFloat(lexer.numberString())); + lexer.nextToken(); + return primaryRest(floatExpr); + case BINARY_DOUBLE: + OracleBinaryDoubleExpr doubleExpr = new OracleBinaryDoubleExpr(); + doubleExpr.setValue(Double.parseDouble(lexer.numberString())); + + lexer.nextToken(); + return primaryRest(doubleExpr); + case TABLE: + lexer.nextToken(); + return primaryRest(new SQLIdentifierExpr("TABLE")); + case PLUS: + lexer.nextToken(); + switch (lexer.token()) { + case LITERAL_INT: + sqlExpr = new SQLIntegerExpr(lexer.integerValue()); + lexer.nextToken(); + break; + case LITERAL_FLOAT: + sqlExpr = new SQLNumberExpr(lexer.decimalValue()); + lexer.nextToken(); + break; + case BINARY_FLOAT: + sqlExpr = new OracleBinaryFloatExpr(Float.parseFloat(lexer.numberString())); + lexer.nextToken(); + break; + case BINARY_DOUBLE: + sqlExpr = new OracleBinaryDoubleExpr(Double.parseDouble(lexer.numberString())); + lexer.nextToken(); + break; + case LPAREN: + lexer.nextToken(); + sqlExpr = expr(); + accept(Token.RPAREN); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Plus, sqlExpr); + break; + default: + throw new ParserException("TODO"); + } + return primaryRest(sqlExpr); + case SUB: + lexer.nextToken(); + switch (lexer.token()) { + case LITERAL_INT: + Number integerValue = lexer.integerValue(); + if (integerValue instanceof Integer) { + int intVal = ((Integer) integerValue).intValue(); + if (intVal == Integer.MIN_VALUE) { + integerValue = Long.valueOf(((long) intVal) * -1); + } else { + integerValue = Integer.valueOf(intVal * -1); + } + } else if (integerValue instanceof Long) { + long longVal = ((Long) integerValue).longValue(); + if (longVal == 2147483648L) { + integerValue = Integer.valueOf((int) (((long) longVal) * -1)); + } else { + integerValue = Long.valueOf(longVal * -1); + } + } else { + integerValue = ((BigInteger) integerValue).negate(); + } + sqlExpr = new SQLIntegerExpr(integerValue); + lexer.nextToken(); + break; + case LITERAL_FLOAT: + sqlExpr = new SQLNumberExpr(lexer.decimalValue().negate()); + lexer.nextToken(); + break; + case BINARY_FLOAT: + sqlExpr = new OracleBinaryFloatExpr(Float.parseFloat(lexer.numberString()) * -1); + lexer.nextToken(); + break; + case BINARY_DOUBLE: + sqlExpr = new OracleBinaryDoubleExpr(Double.parseDouble(lexer.numberString()) * -1); + lexer.nextToken(); + break; + case VARIANT: + case IDENTIFIER: + sqlExpr = expr(); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); + break; + case LPAREN: + lexer.nextToken(); + sqlExpr = expr(); + accept(Token.RPAREN); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); + break; + default: + throw new ParserException("TODO " + lexer.token()); + } + return primaryRest(sqlExpr); + + case CURSOR: + lexer.nextToken(); + accept(Token.LPAREN); + + OracleSelect select = createSelectParser().select(); + OracleCursorExpr cursorExpr = new OracleCursorExpr(select); + + accept(Token.RPAREN); + + sqlExpr = cursorExpr; + return primaryRest(sqlExpr); + case MODEL: + case PCTFREE: + case INITRANS: + case MAXTRANS: + case SEGMENT: + case CREATION: + case IMMEDIATE: + case DEFERRED: + case STORAGE: + case NEXT: + case MINEXTENTS: + case MAXEXTENTS: + case MAXSIZE: + case PCTINCREASE: + case FLASH_CACHE: + case CELL_FLASH_CACHE: + case KEEP: + case NONE: + case LOB: + case STORE: + case ROW: + case CHUNK: + case CACHE: + case NOCACHE: + case LOGGING: + case NOCOMPRESS: + case KEEP_DUPLICATES: + case EXCEPTIONS: + sqlExpr = new SQLIdentifierExpr(lexer.stringVal()); + lexer.nextToken(); + return primaryRest(sqlExpr); + default: + return super.primary(); + } + } + + @Override + protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) { + if (acceptLPAREN) { + accept(Token.LPAREN); + if (lexer.token() == Token.PLUS) { + lexer.nextToken(); + accept(Token.RPAREN); + return new OracleOuterExpr(expr); + } + } + return super.methodRest(expr, false); + } + + public SQLExpr primaryRest(SQLExpr expr) { + if (expr.getClass() == SQLIdentifierExpr.class) { + String ident = ((SQLIdentifierExpr)expr).getName(); + + if ("DATE".equalsIgnoreCase(ident)) { + OracleDateExpr timestamp = new OracleDateExpr(); + + String literal = lexer.stringVal(); + timestamp.setLiteral(literal); + accept(Token.LITERAL_CHARS); + + return primaryRest(timestamp); + } + if ("TIMESTAMP".equalsIgnoreCase(ident)) { + if (lexer.token() != Token.LITERAL_ALIAS && lexer.token() != Token.LITERAL_CHARS) { + return new SQLIdentifierExpr("TIMESTAMP"); + } + + OracleTimestampExpr timestamp = new OracleTimestampExpr(); + + String literal = lexer.stringVal(); + timestamp.setLiteral(literal); + accept(Token.LITERAL_CHARS); + + if (identifierEquals("AT")) { + lexer.nextToken(); + acceptIdentifier("TIME"); + acceptIdentifier("ZONE"); + + String timezone = lexer.stringVal(); + timestamp.setTimeZone(timezone); + accept(Token.LITERAL_CHARS); + } + + + return primaryRest(timestamp); + } + } + if (lexer.token() == Token.IDENTIFIER && expr instanceof SQLNumericLiteralExpr) { + String ident = lexer.stringVal(); + + if (ident.length() == 1) { + char unit = ident.charAt(0); + switch (unit) { + case 'K': + case 'M': + case 'G': + case 'T': + case 'P': + case 'E': + case 'k': + case 'm': + case 'g': + case 't': + case 'p': + case 'e': + expr = new OracleSizeExpr(expr, OracleSizeExpr.Unit.valueOf(ident.toUpperCase())); + lexer.nextToken(); + break; + default: + break; + } + } + } + + if (lexer.token() == Token.DOTDOT) { + lexer.nextToken(); + SQLExpr upBound = expr(); + + return new OracleRangeExpr(expr, upBound); + } + + if (lexer.token() == Token.MONKEYS_AT) { + lexer.nextToken(); + + OracleDbLinkExpr dblink = new OracleDbLinkExpr(); + dblink.setExpr(expr); + + if (lexer.token() == Token.BANG) { + dblink.setDbLink("!"); + lexer.nextToken(); + } else { + String link = lexer.stringVal(); + accept(Token.IDENTIFIER); + dblink.setDbLink(link); + } + + expr = dblink; + } + + if (identifierEquals("DAY") || identifierEquals("YEAR")) { + lexer.mark(); + + String name = lexer.stringVal(); + lexer.nextToken(); + + if (lexer.token() == Token.COMMA) { + lexer.reset(); + return expr; + } + + OracleIntervalExpr interval = new OracleIntervalExpr(); + interval.setValue(expr); + OracleIntervalType type = OracleIntervalType.valueOf(name); + interval.setType(type); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + if (lexer.token() != Token.LITERAL_INT) { + throw new ParserException("syntax error"); + } + interval.setPrecision(lexer.integerValue().intValue()); + lexer.nextToken(); + accept(Token.RPAREN); + } + + accept(Token.TO); + if (identifierEquals("SECOND")) { + lexer.nextToken(); + interval.setToType(OracleIntervalType.SECOND); + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + if (lexer.token() != Token.LITERAL_INT) { + throw new ParserException("syntax error"); + } + interval.setFactionalSecondsPrecision(lexer.integerValue().intValue()); + lexer.nextToken(); + accept(Token.RPAREN); + } + } else { + interval.setToType(OracleIntervalType.MONTH); + lexer.nextToken(); + } + + expr = interval; + } + + if (identifierEquals("AT")) { + char markChar = lexer.current(); + int markBp = lexer.bp(); + lexer.nextToken(); + if (identifierEquals("LOCAL")) { + lexer.nextToken(); + expr = new OracleDatetimeExpr(expr, new SQLIdentifierExpr("LOCAL")); + } else { + if (identifierEquals("TIME")) { + lexer.nextToken(); + } else { + lexer.reset(markBp, markChar, Token.IDENTIFIER); + return expr; + } + acceptIdentifier("ZONE"); + + SQLExpr timeZone = primary(); + expr = new OracleDatetimeExpr(expr, timeZone); + } + } + + SQLExpr restExpr = super.primaryRest(expr); + + if (restExpr != expr && restExpr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) restExpr; + if (methodInvoke.getParameters().size() == 1) { + SQLExpr paramExpr = methodInvoke.getParameters().get(0); + if (paramExpr instanceof SQLIdentifierExpr && "+".equals(((SQLIdentifierExpr) paramExpr).getName())) { + OracleOuterExpr outerExpr = new OracleOuterExpr(); + if (methodInvoke.getOwner() == null) { + outerExpr.setExpr(new SQLIdentifierExpr(methodInvoke.getMethodName())); + } else { + outerExpr.setExpr(new SQLPropertyExpr(methodInvoke.getOwner(), methodInvoke.getMethodName())); + } + return outerExpr; + } + } + } + + return restExpr; + } + + protected SQLExpr dotRest(SQLExpr expr) { + if (lexer.token() == Token.LITERAL_ALIAS) { + String name = '"' + lexer.stringVal() + '"'; + lexer.nextToken(); + expr = new SQLPropertyExpr(expr, name); + + if (lexer.token() == Token.DOT) { + lexer.nextToken(); + expr = dotRest(expr); + } + + return expr; + } + + return super.dotRest(expr); + } + + @Override + public OracleOrderBy parseOrderBy() { + if (lexer.token() == (Token.ORDER)) { + OracleOrderBy orderBy = new OracleOrderBy(); + + lexer.nextToken(); + + if (identifierEquals("SIBLINGS")) { + lexer.nextToken(); + orderBy.setSibings(true); + } + + accept(Token.BY); + + orderBy.getItems().add(parseSelectOrderByItem()); + + while (lexer.token() == (Token.COMMA)) { + lexer.nextToken(); + orderBy.getItems().add(parseSelectOrderByItem()); + } + + return orderBy; + } + + return null; + } + + protected OracleAggregateExpr parseAggregateExpr(String methodName) { + methodName = methodName.toUpperCase(); + + OracleAggregateExpr aggregateExpr; + if (lexer.token() == Token.UNIQUE) { + aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.UNIQUE); + lexer.nextToken(); + } else if (lexer.token() == (Token.ALL)) { + aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.ALL); + lexer.nextToken(); + } else if (lexer.token() == (Token.DISTINCT)) { + aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT); + lexer.nextToken(); + } else { + aggregateExpr = new OracleAggregateExpr(methodName); + } + exprList(aggregateExpr.getArguments()); + + if (lexer.stringVal().equalsIgnoreCase("IGNORE")) { + lexer.nextToken(); + identifierEquals("NULLS"); + aggregateExpr.setIgnoreNulls(true); + } + + accept(Token.RPAREN); + + if (lexer.token() == Token.OVER) { + OracleAnalytic over = new OracleAnalytic(); + + lexer.nextToken(); + accept(Token.LPAREN); + + if (identifierEquals("PARTITION")) { + lexer.nextToken(); + accept(Token.BY); + + if (lexer.token() == (Token.LPAREN)) { + lexer.nextToken(); + exprList(over.getPartitionBy()); + accept(Token.RPAREN); + } else { + exprList(over.getPartitionBy()); + } + } + + over.setOrderBy(parseOrderBy()); + if (over.getOrderBy() != null) { + OracleAnalyticWindowing windowing = null; + if (lexer.stringVal().equalsIgnoreCase("ROWS")) { + lexer.nextToken(); + windowing = new OracleAnalyticWindowing(); + windowing.setType(OracleAnalyticWindowing.Type.ROWS); + } else if (lexer.stringVal().equalsIgnoreCase("RANGE")) { + lexer.nextToken(); + windowing = new OracleAnalyticWindowing(); + windowing.setType(OracleAnalyticWindowing.Type.RANGE); + } + + if (windowing != null) { + if (lexer.stringVal().equalsIgnoreCase("CURRENT")) { + lexer.nextToken(); + if (lexer.stringVal().equalsIgnoreCase("ROW")) { + lexer.nextToken(); + windowing.setExpr(new SQLIdentifierExpr("CURRENT ROW")); + over.setWindowing(windowing); + } + throw new ParserException("syntax error"); + } + if (lexer.stringVal().equalsIgnoreCase("UNBOUNDED")) { + lexer.nextToken(); + if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { + lexer.nextToken(); + windowing.setExpr(new SQLIdentifierExpr("UNBOUNDED PRECEDING")); + } else { + throw new ParserException("syntax error"); + } + } + + over.setWindowing(windowing); + } + } + + accept(Token.RPAREN); + + aggregateExpr.setOver(over); + } + return aggregateExpr; + } + + @SuppressWarnings("unused") + private OracleIntervalType parseIntervalType() { + String currentTokenUpperValue = lexer.stringVal(); + lexer.nextToken(); + + if (currentTokenUpperValue.equals("YEAR")) { + return OracleIntervalType.YEAR; + } + if (currentTokenUpperValue.equals("MONTH")) { + return OracleIntervalType.MONTH; + } + if (currentTokenUpperValue.equals("HOUR")) { + return OracleIntervalType.HOUR; + } + if (currentTokenUpperValue.equals("MINUTE")) { + return OracleIntervalType.MINUTE; + } + if (currentTokenUpperValue.equals("SECOND")) { + return OracleIntervalType.SECOND; + } + throw new ParserException("syntax error"); + } + + @Override + public OracleSelectParser createSelectParser() { + return new OracleSelectParser(this); + } + + @Override + public OracleOrderByItem parseSelectOrderByItem() { + OracleOrderByItem item = new OracleOrderByItem(); + + item.setExpr(expr()); + + if (lexer.token() == (Token.ASC)) { + lexer.nextToken(); + item.setType(SQLOrderingSpecification.ASC); + } else if (lexer.token() == (Token.DESC)) { + lexer.nextToken(); + item.setType(SQLOrderingSpecification.DESC); + } + + if (identifierEquals("NULLS")) { + lexer.nextToken(); + if (identifierEquals("FIRST")) { + lexer.nextToken(); + item.setNullsOrderType(OracleOrderByItem.NullsOrderType.NullsFirst); + } else if (identifierEquals("LAST")) { + lexer.nextToken(); + item.setNullsOrderType(OracleOrderByItem.NullsOrderType.NullsLast); + } else { + throw new ParserException("TODO " + lexer.token()); + } + } + + return item; + } + + protected SQLExpr parseInterval() { + accept(Token.INTERVAL); + + OracleIntervalExpr interval = new OracleIntervalExpr(); + if (lexer.token() != Token.LITERAL_CHARS) { + return new SQLIdentifierExpr("INTERVAL"); + } + interval.setValue(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); + + + OracleIntervalType type = OracleIntervalType.valueOf(lexer.stringVal()); + interval.setType(type); + lexer.nextToken(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + if (lexer.token() != Token.LITERAL_INT) { + throw new ParserException("syntax error"); + } + interval.setPrecision(lexer.integerValue().intValue()); + lexer.nextToken(); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + if (lexer.token() != Token.LITERAL_INT) { + throw new ParserException("syntax error"); + } + interval.setFactionalSecondsPrecision(lexer.integerValue().intValue()); + lexer.nextToken(); + } + accept(Token.RPAREN); + } + + if (lexer.token() == Token.TO) { + lexer.nextToken(); + if (identifierEquals("SECOND")) { + lexer.nextToken(); + interval.setToType(OracleIntervalType.SECOND); + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + if (lexer.token() != Token.LITERAL_INT) { + throw new ParserException("syntax error"); + } + interval.setToFactionalSecondsPrecision(lexer.integerValue().intValue()); + lexer.nextToken(); + accept(Token.RPAREN); + } + } else { + interval.setToType(OracleIntervalType.MONTH); + lexer.nextToken(); + } + } + + return interval; + } + + public SQLExpr relationalRest(SQLExpr expr) { + if (lexer.token() == Token.IS) { + lexer.nextToken(); + + if (lexer.token() == Token.NOT) { + lexer.nextToken(); + SQLExpr rightExpr = primary(); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.IsNot, rightExpr); + } else if (identifierEquals("A")) { + lexer.nextToken(); + accept(Token.SET); + expr = new OracleIsSetExpr(expr); + } else { + SQLExpr rightExpr = primary(); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Is, rightExpr); + } + + return expr; + } + return super.relationalRest(expr); + } + + + public SQLName name() { + SQLName name = super.name(); + + if (lexer.token() == Token.MONKEYS_AT) { + lexer.nextToken(); + if (lexer.token() != Token.IDENTIFIER) { + throw new ParserException("syntax error, expect identifier, but " + lexer.token()); + } + OracleDbLinkExpr dbLink = new OracleDbLinkExpr(); + dbLink.setExpr(name); + dbLink.setDbLink(lexer.stringVal()); + lexer.nextToken(); + return dbLink; + } + + return name; + } + + public SQLExpr equalityRest(SQLExpr expr) { + SQLExpr rightExp; + if (lexer.token() == Token.EQ) { + lexer.nextToken(); + + if (lexer.token() == Token.GT) { + lexer.nextToken(); + rightExp = expr(); + String argumentName = ((SQLIdentifierExpr) expr).getName(); + return new OracleArgumentExpr(argumentName, rightExp); + } + + rightExp = shift(); + + rightExp = equalityRest(rightExp); + + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Equality, rightExp); + } else if (lexer.token() == Token.BANGEQ) { + lexer.nextToken(); + rightExp = shift(); + + rightExp = equalityRest(rightExp); + + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotEqual, rightExp); + } + + return expr; + } + + public OraclePrimaryKey parsePrimaryKey() { + lexer.nextToken(); + accept(Token.KEY); + + OraclePrimaryKey primaryKey = new OraclePrimaryKey(); + accept(Token.LPAREN); + exprList(primaryKey.getColumns()); + accept(Token.RPAREN); + + + if (lexer.token() == Token.USING) { + OracleUsingIndexClause using = parseUsingIndex(); + primaryKey.setUsing(using); + } + return primaryKey; + } + + private OracleUsingIndexClause parseUsingIndex() { + accept(Token.USING); + accept(Token.INDEX); + + 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.STORAGE) { + OracleStorageClause storage = parseStorage(); + using.setStorage(storage); + continue; + } else if (lexer.token() == Token.IDENTIFIER) { + using.setTablespace(this.name()); + break; + } else { + break; + } + } + return using; + } + + public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { + column = super.parseColumnRest(column); + + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + column.setEnable(Boolean.TRUE); + } + + return column; + } + + public SQLExpr exprRest(SQLExpr expr) { + expr = super.exprRest(expr); + + if (lexer.token() == Token.COLONEQ) { + lexer.nextToken(); + SQLExpr right = expr(); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Assignment, right); + } + + return expr; + } + + public OracleLobStorageClause parseLobStorage() { + lexer.nextToken(); + + OracleLobStorageClause clause = new OracleLobStorageClause(); + + accept(Token.LPAREN); + this.names(clause.getItems()); + accept(Token.RPAREN); + + accept(Token.STORE); + accept(Token.AS); + + for (;;) { + if (identifierEquals("SECUREFILE")) { + lexer.nextToken(); + clause.setSecureFile(true); + continue; + } + + if (identifierEquals("BASICFILE")) { + lexer.nextToken(); + clause.setBasicFile(true); + continue; + } + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + + for (;;) { + if (lexer.token() == Token.TABLESPACE) { + lexer.nextToken(); + clause.setTableSpace(this.name()); + continue; + } + + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + accept(Token.STORAGE); + accept(Token.IN); + accept(Token.ROW); + clause.setEnable(true); + continue; + } + + if (lexer.token() == Token.CHUNK) { + lexer.nextToken(); + clause.setChunk(this.primary()); + continue; + } + + if (lexer.token() == Token.NOCACHE) { + lexer.nextToken(); + clause.setCache(false); + if (lexer.token() == Token.LOGGING) { + lexer.nextToken(); + clause.setLogging(true); + } + continue; + } + + if (lexer.token() == Token.NOCOMPRESS) { + lexer.nextToken(); + clause.setCompress(false); + continue; + } + + if (lexer.token() == Token.KEEP_DUPLICATES) { + lexer.nextToken(); + clause.setKeepDuplicate(true); + continue; + } + + break; + } + + accept(Token.RPAREN); + } + + break; + } + return clause; + } + + public OracleStorageClause parseStorage() { + lexer.nextToken(); + accept(Token.LPAREN); + + OracleStorageClause storage = new OracleStorageClause(); + for (;;) { + if (identifierEquals("INITIAL")) { + lexer.nextToken(); + storage.setInitial(this.expr()); + continue; + } else if (lexer.token() == Token.NEXT) { + lexer.nextToken(); + storage.setNext(this.expr()); + continue; + } else if (lexer.token() == Token.MINEXTENTS) { + lexer.nextToken(); + storage.setMinExtents(this.expr()); + continue; + } else if (lexer.token() == Token.MAXEXTENTS) { + lexer.nextToken(); + storage.setMaxExtents(this.expr()); + continue; + } else if (lexer.token() == Token.MAXSIZE) { + lexer.nextToken(); + storage.setMaxSize(this.expr()); + continue; + } else if (lexer.token() == Token.PCTINCREASE) { + lexer.nextToken(); + storage.setPctIncrease(this.expr()); + continue; + } else if (identifierEquals("FREELISTS")) { + lexer.nextToken(); + storage.setFreeLists(this.expr()); + continue; + } else if (identifierEquals("FREELIST")) { + lexer.nextToken(); + acceptIdentifier("GROUPS"); + storage.setFreeListGroups(this.expr()); + continue; + } else if (identifierEquals("BUFFER_POOL")) { + lexer.nextToken(); + storage.setBufferPool(this.expr()); + continue; + } else if (identifierEquals("OBJNO")) { + lexer.nextToken(); + storage.setObjno(this.expr()); + continue; + } else if (lexer.token() == Token.FLASH_CACHE) { + lexer.nextToken(); + FlashCacheType flashCacheType; + if (lexer.token() == Token.KEEP) { + flashCacheType = FlashCacheType.KEEP; + lexer.nextToken(); + } else if (lexer.token() == Token.NONE) { + flashCacheType = FlashCacheType.NONE; + lexer.nextToken(); + } else { + accept(Token.DEFAULT); + flashCacheType = FlashCacheType.DEFAULT; + } + storage.setFlashCache(flashCacheType); + continue; + } else if (lexer.token() == Token.CELL_FLASH_CACHE) { + lexer.nextToken(); + FlashCacheType flashCacheType; + if (lexer.token() == Token.KEEP) { + flashCacheType = FlashCacheType.KEEP; + lexer.nextToken(); + } else if (lexer.token() == Token.NONE) { + flashCacheType = FlashCacheType.NONE; + lexer.nextToken(); + } else { + accept(Token.DEFAULT); + flashCacheType = FlashCacheType.DEFAULT; + } + storage.setCellFlashCache(flashCacheType); + continue; + } + + break; + } + accept(Token.RPAREN); + return storage; + } + + public SQLUnique parseUnique() { + accept(Token.UNIQUE); + + OracleUnique unique = new OracleUnique(); + accept(Token.LPAREN); + exprList(unique.getColumns(), unique); + accept(Token.RPAREN); + + if (lexer.token() == Token.USING) { + OracleUsingIndexClause using = parseUsingIndex(); + unique.setUsing(using); + } + + return unique; + } +} 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 513347ac9d..a74c2eddc9 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 @@ -1,355 +1,357 @@ -/* - * 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.parser; - -import static com.alibaba.druid.sql.parser.CharTypes.isIdentifierChar; -import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI; - -import java.util.HashMap; -import java.util.Map; - -import com.alibaba.druid.sql.parser.Keywords; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.NotAllowCommentException; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.Token; - -public class OracleLexer extends Lexer { - - public final static Keywords DEFAULT_ORACLE_KEYWORDS; - - static { - Map map = new HashMap(); - - map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords()); - - map.put("BEGIN", Token.BEGIN); - map.put("COMMENT", Token.COMMENT); - map.put("COMMIT", Token.COMMIT); - map.put("CONNECT", Token.CONNECT); - - map.put("CROSS", Token.CROSS); - map.put("CURSOR", Token.CURSOR); - map.put("DECLARE", Token.DECLARE); - map.put("ERRORS", Token.ERRORS); - map.put("EXCEPTION", Token.EXCEPTION); - - map.put("EXCLUSIVE", Token.EXCLUSIVE); - map.put("EXTRACT", Token.EXTRACT); - map.put("GOTO", Token.GOTO); - map.put("GRANT", Token.GRANT); - map.put("IF", Token.IF); - - map.put("LIMIT", Token.LIMIT); - map.put("LOOP", Token.LOOP); - map.put("MATCHED", Token.MATCHED); - map.put("MERGE", Token.MERGE); - - map.put("MODE", Token.MODE); - map.put("MODEL", Token.MODEL); - map.put("NOWAIT", Token.NOWAIT); - map.put("OF", Token.OF); - map.put("PRIOR", Token.PRIOR); - - map.put("PROCEDURE", Token.PROCEDURE); - map.put("REJECT", Token.REJECT); - map.put("RETURNING", Token.RETURNING); - map.put("SAVEPOINT", Token.SAVEPOINT); - map.put("SESSION", Token.SESSION); - - map.put("SHARE", Token.SHARE); - map.put("START", Token.START); - map.put("SYSDATE", Token.SYSDATE); - map.put("UNLIMITED", Token.UNLIMITED); - map.put("USING", Token.USING); - - 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); - map.put("STORAGE", Token.STORAGE); - map.put("NEXT", Token.NEXT); - map.put("MINEXTENTS", Token.MINEXTENTS); - map.put("MAXEXTENTS", Token.MAXEXTENTS); - 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); - map.put("ROW", Token.ROW); - map.put("CHUNK", Token.CHUNK); - map.put("CACHE", Token.CACHE); - map.put("NOCACHE", Token.NOCACHE); - map.put("LOGGING", Token.LOGGING); - map.put("NOCOMPRESS", Token.NOCOMPRESS); - map.put("KEEP_DUPLICATES", Token.KEEP_DUPLICATES); - - DEFAULT_ORACLE_KEYWORDS = new Keywords(map); - } - - public OracleLexer(char[] input, int inputLength, boolean skipComment){ - super(input, inputLength, skipComment); - super.keywods = DEFAULT_ORACLE_KEYWORDS; - } - - public OracleLexer(String input){ - super(input); - super.keywods = DEFAULT_ORACLE_KEYWORDS; - } - - public void scanVariable() { - if (ch == '@') { - scanChar(); - token = Token.MONKEYS_AT; - return; - } - - if (ch != ':' && ch != '#' && ch != '$') { - throw new ParserException("illegal variable"); - } - - mark = pos; - bufPos = 1; - char ch; - - boolean quoteFlag = false; - boolean mybatisFlag = false; - if (charAt(pos + 1) == '"') { - pos++; - bufPos++; - quoteFlag = true; - } else if (charAt(pos + 1) == '{') { - pos++; - bufPos++; - mybatisFlag = true; - } - - for (;;) { - ch = charAt(++pos); - - if (!isIdentifierChar(ch)) { - break; - } - - bufPos++; - continue; - } - - if (quoteFlag) { - if (ch != '"') { - throw new ParserException("syntax error"); - } - ++pos; - bufPos++; - } else if (mybatisFlag) { - if (ch != '}') { - throw new ParserException("syntax error"); - } - ++pos; - bufPos++; - } - - this.ch = charAt(pos); - - stringVal = addSymbol(); - Token tok = keywods.getKeyword(stringVal); - if (tok != null) { - token = tok; - } else { - token = Token.VARIANT; - } - } - - public void scanComment() { - if (ch != '/' && ch != '-') { - throw new IllegalStateException(); - } - - mark = pos; - bufPos = 0; - scanChar(); - - // /*+ */ - if (ch == '*') { - scanChar(); - bufPos++; - - while (ch == ' ') { - scanChar(); - bufPos++; - } - - boolean isHint = false; - int startHintSp = bufPos + 1; - if (ch == '+') { - isHint = true; - scanChar(); - bufPos++; - } - - for (;;) { - if (ch == '*' && charAt(pos + 1) == '/') { - bufPos += 2; - scanChar(); - scanChar(); - break; - } - - scanChar(); - bufPos++; - } - - if (isHint) { - stringVal = subString(mark + startHintSp, (bufPos - startHintSp) - 1); - token = Token.HINT; - } else { - stringVal = subString(mark, bufPos); - token = Token.MULTI_LINE_COMMENT; - } - - if (token != Token.HINT && !isAllowComment()) { - throw new NotAllowCommentException(); - } - - return; - } - - if (!isAllowComment()) { - throw new NotAllowCommentException(); - } - - if (ch == '/' || ch == '-') { - scanChar(); - bufPos++; - - for (;;) { - if (ch == '\r') { - if (charAt(pos + 1) == '\n') { - bufPos += 2; - scanChar(); - break; - } - bufPos++; - break; - } else if (ch == EOI) { - break; - } - - if (ch == '\n') { - scanChar(); - bufPos++; - break; - } - - scanChar(); - bufPos++; - } - - stringVal = subString(mark + 1, bufPos); - token = Token.LINE_COMMENT; - return; - } - } - - public void scanNumber() { - mark = pos; - - if (ch == '-') { - bufPos++; - ch = charAt(++pos); - } - - for (;;) { - if (ch >= '0' && ch <= '9') { - bufPos++; - } else { - break; - } - ch = charAt(++pos); - } - - boolean isDouble = false; - - if (ch == '.') { - if (charAt(pos + 1) == '.') { - token = Token.LITERAL_INT; - return; - } - bufPos++; - ch = charAt(++pos); - isDouble = true; - - for (;;) { - if (ch >= '0' && ch <= '9') { - bufPos++; - } else { - break; - } - ch = charAt(++pos); - } - } - - if (ch == 'e' || ch == 'E') { - bufPos++; - ch = charAt(++pos); - - if (ch == '+' || ch == '-') { - bufPos++; - ch = charAt(++pos); - } - - for (;;) { - if (ch >= '0' && ch <= '9') { - bufPos++; - } else { - break; - } - ch = charAt(++pos); - } - - isDouble = true; - } - - if (ch == 'f' || ch == 'F') { - token = Token.BINARY_FLOAT; - scanChar(); - return; - } - - if (ch == 'd' || ch == 'D') { - token = Token.BINARY_DOUBLE; - scanChar(); - return; - } - - if (isDouble) { - token = Token.LITERAL_FLOAT; - } else { - token = Token.LITERAL_INT; - } - } - -} +/* + * 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.parser; + +import static com.alibaba.druid.sql.parser.CharTypes.isIdentifierChar; +import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI; + +import java.util.HashMap; +import java.util.Map; + +import com.alibaba.druid.sql.parser.Keywords; +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.NotAllowCommentException; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.Token; + +public class OracleLexer extends Lexer { + + public final static Keywords DEFAULT_ORACLE_KEYWORDS; + + static { + Map map = new HashMap(); + + map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords()); + + map.put("BEGIN", Token.BEGIN); + map.put("COMMENT", Token.COMMENT); + map.put("COMMIT", Token.COMMIT); + map.put("CONNECT", Token.CONNECT); + + map.put("CROSS", Token.CROSS); + map.put("CURSOR", Token.CURSOR); + map.put("DECLARE", Token.DECLARE); + map.put("ERRORS", Token.ERRORS); + map.put("EXCEPTION", Token.EXCEPTION); + + map.put("EXCLUSIVE", Token.EXCLUSIVE); + map.put("EXTRACT", Token.EXTRACT); + map.put("GOTO", Token.GOTO); + map.put("GRANT", Token.GRANT); + map.put("IF", Token.IF); + + map.put("LIMIT", Token.LIMIT); + map.put("LOOP", Token.LOOP); + map.put("MATCHED", Token.MATCHED); + map.put("MERGE", Token.MERGE); + + map.put("MODE", Token.MODE); + map.put("MODEL", Token.MODEL); + map.put("NOWAIT", Token.NOWAIT); + map.put("OF", Token.OF); + map.put("PRIOR", Token.PRIOR); + + map.put("PROCEDURE", Token.PROCEDURE); + map.put("REJECT", Token.REJECT); + map.put("RETURNING", Token.RETURNING); + map.put("SAVEPOINT", Token.SAVEPOINT); + map.put("SESSION", Token.SESSION); + + map.put("SHARE", Token.SHARE); + map.put("START", Token.START); + map.put("SYSDATE", Token.SYSDATE); + map.put("UNLIMITED", Token.UNLIMITED); + map.put("USING", Token.USING); + + 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); + map.put("STORAGE", Token.STORAGE); + map.put("NEXT", Token.NEXT); + map.put("MINEXTENTS", Token.MINEXTENTS); + map.put("MAXEXTENTS", Token.MAXEXTENTS); + map.put("MAXSIZE", Token.MAXSIZE); + 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); + map.put("ROW", Token.ROW); + map.put("CHUNK", Token.CHUNK); + map.put("CACHE", Token.CACHE); + map.put("NOCACHE", Token.NOCACHE); + map.put("LOGGING", Token.LOGGING); + map.put("NOCOMPRESS", Token.NOCOMPRESS); + map.put("KEEP_DUPLICATES", Token.KEEP_DUPLICATES); + map.put("EXCEPTIONS", Token.EXCEPTIONS); + + DEFAULT_ORACLE_KEYWORDS = new Keywords(map); + } + + public OracleLexer(char[] input, int inputLength, boolean skipComment){ + super(input, inputLength, skipComment); + super.keywods = DEFAULT_ORACLE_KEYWORDS; + } + + public OracleLexer(String input){ + super(input); + super.keywods = DEFAULT_ORACLE_KEYWORDS; + } + + public void scanVariable() { + if (ch == '@') { + scanChar(); + token = Token.MONKEYS_AT; + return; + } + + if (ch != ':' && ch != '#' && ch != '$') { + throw new ParserException("illegal variable"); + } + + mark = pos; + bufPos = 1; + char ch; + + boolean quoteFlag = false; + boolean mybatisFlag = false; + if (charAt(pos + 1) == '"') { + pos++; + bufPos++; + quoteFlag = true; + } else if (charAt(pos + 1) == '{') { + pos++; + bufPos++; + mybatisFlag = true; + } + + for (;;) { + ch = charAt(++pos); + + if (!isIdentifierChar(ch)) { + break; + } + + bufPos++; + continue; + } + + if (quoteFlag) { + if (ch != '"') { + throw new ParserException("syntax error"); + } + ++pos; + bufPos++; + } else if (mybatisFlag) { + if (ch != '}') { + throw new ParserException("syntax error"); + } + ++pos; + bufPos++; + } + + this.ch = charAt(pos); + + stringVal = addSymbol(); + Token tok = keywods.getKeyword(stringVal); + if (tok != null) { + token = tok; + } else { + token = Token.VARIANT; + } + } + + public void scanComment() { + if (ch != '/' && ch != '-') { + throw new IllegalStateException(); + } + + mark = pos; + bufPos = 0; + scanChar(); + + // /*+ */ + if (ch == '*') { + scanChar(); + bufPos++; + + while (ch == ' ') { + scanChar(); + bufPos++; + } + + boolean isHint = false; + int startHintSp = bufPos + 1; + if (ch == '+') { + isHint = true; + scanChar(); + bufPos++; + } + + for (;;) { + if (ch == '*' && charAt(pos + 1) == '/') { + bufPos += 2; + scanChar(); + scanChar(); + break; + } + + scanChar(); + bufPos++; + } + + if (isHint) { + stringVal = subString(mark + startHintSp, (bufPos - startHintSp) - 1); + token = Token.HINT; + } else { + stringVal = subString(mark, bufPos); + token = Token.MULTI_LINE_COMMENT; + } + + if (token != Token.HINT && !isAllowComment()) { + throw new NotAllowCommentException(); + } + + return; + } + + if (!isAllowComment()) { + throw new NotAllowCommentException(); + } + + if (ch == '/' || ch == '-') { + scanChar(); + bufPos++; + + for (;;) { + if (ch == '\r') { + if (charAt(pos + 1) == '\n') { + bufPos += 2; + scanChar(); + break; + } + bufPos++; + break; + } else if (ch == EOI) { + break; + } + + if (ch == '\n') { + scanChar(); + bufPos++; + break; + } + + scanChar(); + bufPos++; + } + + stringVal = subString(mark + 1, bufPos); + token = Token.LINE_COMMENT; + return; + } + } + + public void scanNumber() { + mark = pos; + + if (ch == '-') { + bufPos++; + ch = charAt(++pos); + } + + for (;;) { + if (ch >= '0' && ch <= '9') { + bufPos++; + } else { + break; + } + ch = charAt(++pos); + } + + boolean isDouble = false; + + if (ch == '.') { + if (charAt(pos + 1) == '.') { + token = Token.LITERAL_INT; + return; + } + bufPos++; + ch = charAt(++pos); + isDouble = true; + + for (;;) { + if (ch >= '0' && ch <= '9') { + bufPos++; + } else { + break; + } + ch = charAt(++pos); + } + } + + if (ch == 'e' || ch == 'E') { + bufPos++; + ch = charAt(++pos); + + if (ch == '+' || ch == '-') { + bufPos++; + ch = charAt(++pos); + } + + for (;;) { + if (ch >= '0' && ch <= '9') { + bufPos++; + } else { + break; + } + ch = charAt(++pos); + } + + isDouble = true; + } + + if (ch == 'f' || ch == 'F') { + token = Token.BINARY_FLOAT; + scanChar(); + return; + } + + if (ch == 'd' || ch == 'D') { + token = Token.BINARY_DOUBLE; + scanChar(); + return; + } + + if (isDouble) { + token = Token.LITERAL_FLOAT; + } else { + token = Token.LITERAL_INT; + } + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index bf3b417bdb..9f3f2f772a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -1,1783 +1,1792 @@ -/* - * 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.parser; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLDataTypeImpl; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLHint; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLNullExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLConstaint; -import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLInsertInto; -import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; -import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; -import com.alibaba.druid.sql.ast.statement.SQLSetStatement; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; -import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLStatementParser; -import com.alibaba.druid.sql.parser.Token; - -public class OracleStatementParser extends SQLStatementParser { - - public OracleStatementParser(String sql){ - super(new OracleExprParser(sql)); - } - - public OracleStatementParser(Lexer lexer){ - super(new OracleExprParser(lexer)); - } - - @Override - public OracleExprParser getExprParser() { - return (OracleExprParser) exprParser; - } - - public void parseHints(List hints) { - this.getExprParser().parseHints(hints); - } - - public OracleCreateTableParser getSQLCreateTableParser() { - return new OracleCreateTableParser(lexer); - } - - protected void parseInsert0_hinits(SQLInsertInto insertStatement) { - if (insertStatement instanceof OracleInsertStatement) { - OracleInsertStatement stmt = (OracleInsertStatement) insertStatement; - this.getExprParser().parseHints(stmt.getHints()); - } else { - List hints = new ArrayList(1); - this.getExprParser().parseHints(hints); - } - } - - @Override - public void parseStatementList(List statementList) { - parseStatementList(statementList, -1); - } - - public void parseStatementList(List statementList, int max) { - for (;;) { - if (max != -1) { - if (statementList.size() >= max) { - return; - } - } - - if (lexer.token() == Token.EOF) { - return; - } - if (lexer.token() == Token.END) { - return; - } - if (lexer.token() == Token.ELSE) { - return; - } - - if (lexer.token() == (Token.SEMI)) { - lexer.nextToken(); - continue; - } - - if (lexer.token() == (Token.SELECT)) { - statementList.add(new SQLSelectStatement(new OracleSelectParser(this.exprParser).select())); - continue; - } - - if (lexer.token() == (Token.UPDATE)) { - statementList.add(parseUpdateStatement()); - continue; - } - - if (lexer.token() == (Token.CREATE)) { - statementList.add(parseCreate()); - continue; - } - - if (lexer.token() == Token.INSERT) { - statementList.add(parseInsert()); - continue; - } - - if (lexer.token() == (Token.DELETE)) { - statementList.add(parseDeleteStatement()); - continue; - } - - if (lexer.token() == (Token.SLASH)) { - lexer.nextToken(); - statementList.add(new OraclePLSQLCommitStatement()); - continue; - } - - if (lexer.token() == Token.ALTER) { - statementList.add(parserAlter()); - continue; - } - - if (lexer.token() == Token.WITH) { - statementList.add(new SQLSelectStatement(new OracleSelectParser(this.exprParser).select())); - continue; - } - - if (lexer.token() == Token.LBRACE || identifierEquals("CALL")) { - statementList.add(this.parseCall()); - continue; - } - - if (lexer.token() == Token.MERGE) { - statementList.add(this.parseMerge()); - continue; - } - - if (lexer.token() == Token.BEGIN) { - statementList.add(this.parseBlock()); - continue; - } - - if (lexer.token() == Token.DECLARE) { - statementList.add(this.parseBlock()); - continue; - } - - if (lexer.token() == Token.LOCK) { - statementList.add(this.parseLock()); - continue; - } - - if (lexer.token() == Token.TRUNCATE) { - statementList.add(this.parseTruncate()); - continue; - } - - if (lexer.token() == Token.VARIANT) { - SQLExpr variant = this.exprParser.primary(); - if (variant instanceof SQLBinaryOpExpr) { - SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) variant; - if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) { - SQLSetStatement stmt = new SQLSetStatement(binaryOpExpr.getLeft(), binaryOpExpr.getRight()); - statementList.add(stmt); - continue; - } - } - accept(Token.COLONEQ); - SQLExpr value = this.exprParser.expr(); - - SQLSetStatement stmt = new SQLSetStatement(variant, value); - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.EXCEPTION) { - statementList.add(this.parseException()); - continue; - } - - if (identifierEquals("EXIT")) { - lexer.nextToken(); - OracleExitStatement stmt = new OracleExitStatement(); - if (lexer.token() == Token.WHEN) { - lexer.nextToken(); - stmt.setWhen(this.exprParser.expr()); - } - statementList.add(stmt); - continue; - } - - if (identifierEquals("FETCH")) { - lexer.nextToken(); - OracleFetchStatement stmt = new OracleFetchStatement(); - stmt.setCursorName(this.exprParser.name()); - accept(Token.INTO); - for (;;) { - stmt.getInto().add(this.exprParser.name()); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - statementList.add(stmt); - continue; - } - - if (identifierEquals("ROLLBACK")) { - SQLRollbackStatement stmt = parseRollback(); - - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.IDENTIFIER) { - if (identifierEquals("EXPLAIN")) { - statementList.add(this.parseExplain()); - continue; - } - - SQLExpr expr = exprParser.expr(); - OracleExprStatement stmt = new OracleExprStatement(expr); - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.LPAREN) { - char ch = lexer.current(); - int bp = lexer.bp(); - lexer.nextToken(); - - if (lexer.token() == Token.SELECT) { - lexer.reset(bp, ch, Token.LPAREN); - statementList.add(this.parseSelect()); - continue; - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - if (lexer.token() == Token.SET) { - statementList.add(this.parseSet()); - continue; - } - - if (lexer.token() == Token.GRANT) { - statementList.add(this.parseGrant()); - continue; - } - if (lexer.token() == Token.COMMENT) { - statementList.add(this.parseComment()); - continue; - } - if (lexer.token() == Token.FOR) { - statementList.add(this.parseFor()); - continue; - } - if (lexer.token() == Token.LOOP) { - statementList.add(this.parseLoop()); - continue; - } - if (lexer.token() == Token.IF) { - statementList.add(this.parseIf()); - continue; - } - - if (lexer.token() == Token.GOTO) { - lexer.nextToken(); - SQLName label = this.exprParser.name(); - OracleGotoStatement stmt = new OracleGotoStatement(label); - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.COMMIT) { - lexer.nextToken(); - - if (identifierEquals("WORK")) { - lexer.nextToken(); - } - OracleCommitStatement stmt = new OracleCommitStatement(); - - if (identifierEquals("WRITE")) { - stmt.setWrite(true); - lexer.nextToken(); - - for (;;) { - if (lexer.token() == Token.WAIT) { - lexer.nextToken(); - stmt.setWait(Boolean.TRUE); - continue; - } else if (lexer.token() == Token.NOWAIT) { - lexer.nextToken(); - stmt.setWait(Boolean.FALSE); - continue; - } else if (lexer.token() == Token.IMMEDIATE) { - lexer.nextToken(); - stmt.setImmediate(Boolean.TRUE); - continue; - } else if (identifierEquals("BATCH")) { - lexer.nextToken(); - stmt.setImmediate(Boolean.FALSE); - continue; - } - - break; - } - } - - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.SAVEPOINT) { - lexer.nextToken(); - - OracleSavePointStatement stmt = new OracleSavePointStatement(); - - if (lexer.token() == Token.TO) { - lexer.nextToken(); - stmt.setTo(this.exprParser.name()); - } - - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.LTLT) { - lexer.nextToken(); - SQLName label = this.exprParser.name(); - OracleLabelStatement stmt = new OracleLabelStatement(label); - accept(Token.GTGT); - statementList.add(stmt); - continue; - } - - if (lexer.token() == Token.DROP) { - lexer.nextToken(); - - if (lexer.token() == Token.TABLE) { - SQLDropTableStatement stmt = parseDropTable(false); - statementList.add(stmt); - continue; - } - - boolean isPublic = false; - if (identifierEquals("PUBLIC")) { - lexer.nextToken(); - isPublic = true; - } - - if (lexer.token() == Token.DATABASE) { - lexer.nextToken(); - - if (identifierEquals("LINK")) { - lexer.nextToken(); - - OracleDropDatabaseLinkStatement stmt = new OracleDropDatabaseLinkStatement(); - if (isPublic) { - stmt.setPublic(isPublic); - } - - stmt.setName(this.exprParser.name()); - - statementList.add(stmt); - continue; - } - } - - if (lexer.token() == Token.INDEX) { - SQLStatement stmt = parseDropIndex(); - statementList.add(stmt); - continue; - } - - if (identifierEquals("SEQUENCE")) { - lexer.nextToken(); - - SQLName name = this.exprParser.name(); - - OracleDropSequenceStatement stmt = new OracleDropSequenceStatement(); - stmt.setName(name); - - statementList.add(stmt); - continue; - } - - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - if (lexer.token() == Token.NULL) { - lexer.nextToken(); - OracleExprStatement stmt = new OracleExprStatement(new SQLNullExpr()); - statementList.add(stmt); - continue; - } - - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - public SQLStatement parseIf() { - accept(Token.IF); - - OracleIfStatement stmt = new OracleIfStatement(); - - stmt.setCondition(this.exprParser.expr()); - - accept(Token.THEN); - - this.parseStatementList(stmt.getStatements()); - - while (lexer.token() == Token.ELSE) { - lexer.nextToken(); - - if (lexer.token() == Token.IF) { - lexer.nextToken(); - - OracleIfStatement.ElseIf elseIf = new OracleIfStatement.ElseIf(); - - elseIf.setCondition(this.exprParser.expr()); - - accept(Token.THEN); - this.parseStatementList(elseIf.getStatements()); - - stmt.getElseIfList().add(elseIf); - } else { - OracleIfStatement.Else elseItem = new OracleIfStatement.Else(); - this.parseStatementList(elseItem.getStatements()); - stmt.setElseItem(elseItem); - break; - } - } - - accept(Token.END); - accept(Token.IF); - - return stmt; - } - - public OracleForStatement parseFor() { - accept(Token.FOR); - - OracleForStatement stmt = new OracleForStatement(); - - stmt.setIndex(this.exprParser.name()); - accept(Token.IN); - stmt.setRange(this.exprParser.expr()); - accept(Token.LOOP); - - this.parseStatementList(stmt.getStatements()); - accept(Token.END); - accept(Token.LOOP); - return stmt; - } - - public OracleLoopStatement parseLoop() { - accept(Token.LOOP); - - OracleLoopStatement stmt = new OracleLoopStatement(); - - this.parseStatementList(stmt.getStatements()); - accept(Token.END); - accept(Token.LOOP); - return stmt; - } - - public SQLStatement parseGrant() { - accept(Token.GRANT); - OracleGrantStatement stmt = new OracleGrantStatement(); - - for (;;) { - if (lexer.token() == Token.ALL) { - lexer.nextToken(); - if (identifierEquals("PRIVILEGES")) { - lexer.nextToken(); - } - stmt.getPrivileges().add("ALL"); - } else if (lexer.token() == Token.SELECT) { - stmt.getPrivileges().add("SELECT"); - lexer.nextToken(); - } else if (lexer.token() == Token.UPDATE) { - stmt.getPrivileges().add("UPDATE"); - lexer.nextToken(); - } else if (lexer.token() == Token.DELETE) { - stmt.getPrivileges().add("DELETE"); - lexer.nextToken(); - } else if (lexer.token() == Token.INSERT) { - stmt.getPrivileges().add("INSERT"); - lexer.nextToken(); - } else if (lexer.token() == Token.CREATE) { - lexer.nextToken(); - - if (lexer.token() == Token.TABLE) { - stmt.getPrivileges().add("CREATE TABLE"); - lexer.nextToken(); - } else if (identifierEquals("SYNONYM")) { - stmt.getPrivileges().add("CREATE SYNONYM"); - lexer.nextToken(); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - - if (lexer.token() == Token.ON) { - lexer.nextToken(); - stmt.setOn(this.exprParser.expr()); - } - - return stmt; - } - - public SQLStatement parseSet() { - accept(Token.SET); - acceptIdentifier("TRANSACTION"); - - OracleSetTransactionStatement stmt = new OracleSetTransactionStatement(); - - if (identifierEquals("READ")) { - lexer.nextToken(); - acceptIdentifier("ONLY"); - stmt.setReadOnly(true); - } - - acceptIdentifier("NAME"); - - stmt.setName(this.exprParser.expr()); - return stmt; - } - - public OracleTruncateStatement parseTruncate() { - accept(Token.TRUNCATE); - accept(Token.TABLE); - OracleTruncateStatement stmt = new OracleTruncateStatement(); - - SQLName name = this.exprParser.name(); - stmt.addTableSource(name); - - if (identifierEquals("PURGE")) { - lexer.nextToken(); - - if (identifierEquals("SNAPSHOT")) { - lexer.nextToken(); - acceptIdentifier("LOG"); - stmt.setPurgeSnapshotLog(true); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - return stmt; - } - - public OracleStatement parserAlter() { - accept(Token.ALTER); - if (lexer.token() == Token.SESSION) { - lexer.nextToken(); - - OracleAlterSessionStatement stmt = new OracleAlterSessionStatement(); - if (lexer.token() == Token.SET) { - lexer.nextToken(); - parseAssignItems(stmt.getItems()); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - return stmt; - } else if (lexer.token() == Token.PROCEDURE) { - lexer.nextToken(); - OracleAlterProcedureStatement stmt = new OracleAlterProcedureStatement(); - stmt.setName(this.exprParser.name()); - if (identifierEquals("COMPILE")) { - lexer.nextToken(); - stmt.setCompile(true); - } - - if (identifierEquals("REUSE")) { - lexer.nextToken(); - acceptIdentifier("SETTINGS"); - stmt.setReuseSettings(true); - } - - return stmt; - } else if (lexer.token() == Token.TABLE) { - return parseAlterTable(); - } else if (lexer.token() == Token.INDEX) { - lexer.nextToken(); - OracleAlterIndexStatement stmt = new OracleAlterIndexStatement(); - stmt.setName(this.exprParser.name()); - - if (identifierEquals("RENAME")) { - lexer.nextToken(); - accept(Token.TO); - stmt.setRenameTo(this.exprParser.name()); - } - - for (;;) { - if (identifierEquals("rebuild")) { - lexer.nextToken(); - - OracleAlterIndexStatement.Rebuild rebuild = new OracleAlterIndexStatement.Rebuild(); - stmt.setRebuild(rebuild); - continue; - } else if (identifierEquals("MONITORING")) { - lexer.nextToken(); - acceptIdentifier("USAGE"); - stmt.setMonitoringUsage(Boolean.TRUE); - continue; - } else if (identifierEquals("PARALLEL")) { - lexer.nextToken(); - stmt.setParallel(this.exprParser.expr()); - } - break; - } - - return stmt; - } else if (identifierEquals("TRIGGER")) { - lexer.nextToken(); - OracleAlterTriggerStatement stmt = new OracleAlterTriggerStatement(); - stmt.setName(this.exprParser.name()); - - for (;;) { - if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - stmt.setEnable(Boolean.TRUE); - continue; - } else if (lexer.token() == Token.DISABLE) { - lexer.nextToken(); - stmt.setEnable(Boolean.FALSE); - continue; - } else if (identifierEquals("COMPILE")) { - lexer.nextToken(); - stmt.setCompile(true); - continue; - } - break; - } - - return stmt; - } else if (identifierEquals("SYNONYM")) { - lexer.nextToken(); - OracleAlterSynonymStatement stmt = new OracleAlterSynonymStatement(); - stmt.setName(this.exprParser.name()); - - for (;;) { - if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - stmt.setEnable(Boolean.TRUE); - continue; - } else if (lexer.token() == Token.DISABLE) { - lexer.nextToken(); - stmt.setEnable(Boolean.FALSE); - continue; - } else if (identifierEquals("COMPILE")) { - lexer.nextToken(); - stmt.setCompile(true); - continue; - } - break; - } - - return stmt; - } else if (lexer.token() == Token.VIEW) { - lexer.nextToken(); - OracleAlterViewStatement stmt = new OracleAlterViewStatement(); - stmt.setName(this.exprParser.name()); - - for (;;) { - if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - stmt.setEnable(Boolean.TRUE); - continue; - } else if (lexer.token() == Token.DISABLE) { - lexer.nextToken(); - stmt.setEnable(Boolean.FALSE); - continue; - } else if (identifierEquals("COMPILE")) { - lexer.nextToken(); - stmt.setCompile(true); - continue; - } - break; - } - - return stmt; - } else if (lexer.token() == Token.TABLESPACE) { - lexer.nextToken(); - - OracleAlterTablespaceStatement stmt = new OracleAlterTablespaceStatement(); - stmt.setName(this.exprParser.name()); - - if (identifierEquals("ADD")) { - lexer.nextToken(); - - if (identifierEquals("DATAFILE")) { - lexer.nextToken(); - - OracleAlterTablespaceAddDataFile item = new OracleAlterTablespaceAddDataFile(); - - for (;;) { - OracleFileSpecification file = new OracleFileSpecification(); - - for (;;) { - SQLExpr fileName = this.exprParser.expr(); - file.getFileNames().add(fileName); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - - if (identifierEquals("SIZE")) { - lexer.nextToken(); - file.setSize(this.exprParser.expr()); - } - - if (identifierEquals("AUTOEXTEND")) { - lexer.nextToken(); - if (identifierEquals("OFF")) { - lexer.nextToken(); - file.setAutoExtendOff(true); - } else if (identifierEquals("ON")) { - lexer.nextToken(); - file.setAutoExtendOn(this.exprParser.expr()); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - item.getFiles().add(file); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - - stmt.setItem(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - return stmt; - } - - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - private OracleStatement parseAlterTable() { - lexer.nextToken(); - OracleAlterTableStatement stmt = new OracleAlterTableStatement(); - stmt.setName(this.exprParser.name()); - - for (;;) { - if (identifierEquals("ADD")) { - lexer.nextToken(); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - - SQLAlterTableAddColumn item = parseAlterTableAddColumn(); - - stmt.getItems().add(item); - - accept(Token.RPAREN); - } else if (lexer.token() == Token.CONSTRAINT) { - stmt.getItems().add(parseConstaint()); - } else if (lexer.token() == Token.IDENTIFIER) { - SQLAlterTableAddColumn item = parseAlterTableAddColumn(); - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - continue; - } else if (identifierEquals("MOVE")) { - lexer.nextToken(); - - if (lexer.token() == Token.TABLESPACE) { - lexer.nextToken(); - - OracleAlterTableMoveTablespace item = new OracleAlterTableMoveTablespace(); - item.setName(this.exprParser.name()); - - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } else if (identifierEquals("RENAME")) { - stmt.getItems().add(parseAlterTableRename()); - } else if (identifierEquals("MODIFY")) { - lexer.nextToken(); - - OracleAlterTableModify item = new OracleAlterTableModify(); - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - - for (;;) { - SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - item.getColumns().add(columnDef); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - accept(Token.RPAREN); - - } else { - SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - item.getColumns().add(columnDef); - } - - stmt.getItems().add(item); - continue; - } else if (identifierEquals("SPLIT")) { - parseAlterTableSplit(stmt); - continue; - } else if (lexer.token() == Token.TRUNCATE) { - lexer.nextToken(); - if (identifierEquals("PARTITION")) { - lexer.nextToken(); - OracleAlterTableTruncatePartition item = new OracleAlterTableTruncatePartition(); - item.setName(this.exprParser.name()); - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - continue; - } else if (lexer.token() == Token.DROP) { - parseAlterDrop(stmt); - continue; - } else if (lexer.token() == Token.DISABLE) { - lexer.nextToken(); - if (lexer.token() == Token.CONSTRAINT) { - lexer.nextToken(); - SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); - item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } else if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - if (lexer.token() == Token.CONSTRAINT) { - lexer.nextToken(); - SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); - item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - break; - } - - if (lexer.token() == Token.UPDATE) { - lexer.nextToken(); - - if (identifierEquals("GLOBAL")) { - lexer.nextToken(); - acceptIdentifier("INDEXES"); - stmt.setUpdateGlobalIndexes(true); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - return stmt; - } - - private SQLAlterTableItem parseAlterTableRename() { - acceptIdentifier("RENAME"); - - if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn(); - renameColumn.setColumn(this.exprParser.name()); - accept(Token.TO); - renameColumn.setTo(this.exprParser.name()); - return renameColumn; - } - - if (lexer.token() == Token.TO) { - lexer.nextToken(); - OracleAlterTableRenameTo item = new OracleAlterTableRenameTo(); - item.setTo(this.exprParser.name()); - return item; - } - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - private OracleAlterTableAddConstaint parseConstaint() { - accept(Token.CONSTRAINT); - - OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint(); - - SQLName name = this.exprParser.name(); - - SQLConstaint constraint; - if (lexer.token() == Token.PRIMARY) { - constraint = exprParser.parsePrimaryKey(); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - constraint.setName(name); - - item.setConstraint(constraint); - - return item; - } - - public void parseAlterDrop(SQLAlterTableStatement stmt) { - lexer.nextToken(); - if (lexer.token() == Token.CONSTRAINT) { - lexer.nextToken(); - SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); - item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); - } else if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); - this.exprParser.names(item.getColumns()); - stmt.getItems().add(item); - accept(Token.RPAREN); - } else if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); - this.exprParser.names(item.getColumns()); - stmt.getItems().add(item); - } else if (identifierEquals("PARTITION")) { - lexer.nextToken(); - OracleAlterTableDropPartition item = new OracleAlterTableDropPartition(); - item.setName(this.exprParser.name()); - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - private void parseAlterTableSplit(OracleAlterTableStatement stmt) { - lexer.nextToken(); - if (identifierEquals("PARTITION")) { - lexer.nextToken(); - OracleAlterTableSplitPartition item = new OracleAlterTableSplitPartition(); - item.setName(this.exprParser.name()); - - if (identifierEquals("AT")) { - lexer.nextToken(); - accept(Token.LPAREN); - this.exprParser.exprList(item.getAt()); - accept(Token.RPAREN); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - if (lexer.token() == Token.INTO) { - lexer.nextToken(); - accept(Token.LPAREN); - - for (;;) { - NestedTablePartitionSpec spec = new NestedTablePartitionSpec(); - acceptIdentifier("PARTITION"); - spec.setPartition(this.exprParser.name()); - - for (;;) { - if (lexer.token() == Token.TABLESPACE) { - lexer.nextToken(); - SQLName tablespace = this.exprParser.name(); - spec.getSegmentAttributeItems().add(new TableSpaceItem(tablespace)); - continue; - } else if (identifierEquals("PCTREE")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("PCTUSED")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("INITRANS")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - - } else if (identifierEquals("STORAGE")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - - } else if (identifierEquals("LOGGING")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("NOLOGGING")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("FILESYSTEM_LIKE_LOGGING")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - - } - - break; - } - - item.getInto().add(spec); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - accept(Token.RPAREN); - } - - if (lexer.token() == Token.UPDATE) { - lexer.nextToken(); - acceptIdentifier("INDEXES"); - UpdateIndexesClause updateIndexes = new UpdateIndexesClause(); - item.setUpdateIndexes(updateIndexes); - } - stmt.getItems().add(item); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - } - - public OracleLockTableStatement parseLock() { - accept(Token.LOCK); - accept(Token.TABLE); - - OracleLockTableStatement stmt = new OracleLockTableStatement(); - stmt.setTable(this.exprParser.name()); - - accept(Token.IN); - if (lexer.token() == Token.SHARE) { - stmt.setLockMode(LockMode.SHARE); - lexer.nextToken(); - } else if (lexer.token() == Token.EXCLUSIVE) { - stmt.setLockMode(LockMode.EXCLUSIVE); - lexer.nextToken(); - } - accept(Token.MODE); - - if (lexer.token() == Token.NOWAIT) { - lexer.nextToken(); - } else if (lexer.token() == Token.WAIT) { - lexer.nextToken(); - stmt.setWait(exprParser.expr()); - } - return stmt; - } - - public OracleBlockStatement parseBlock() { - OracleBlockStatement block = new OracleBlockStatement(); - - if (lexer.token() == Token.DECLARE) { - lexer.nextToken(); - - parserParameters(block.getParameters()); - for (OracleParameter param : block.getParameters()) { - param.setParent(block); - } - } - - accept(Token.BEGIN); - - parseStatementList(block.getStatementList()); - - accept(Token.END); - - return block; - } - - private void parserParameters(List parameters) { - for (;;) { - OracleParameter parameter = new OracleParameter(); - - if (lexer.token() == Token.CURSOR) { - lexer.nextToken(); - - parameter.setName(this.exprParser.name()); - - accept(Token.IS); - SQLSelect select = this.createSQLSelectParser().select(); - - SQLDataTypeImpl dataType = new SQLDataTypeImpl(); - dataType.setName("CURSOR"); - parameter.setDataType(dataType); - - parameter.setDefaultValue(new SQLQueryExpr(select)); - } else { - parameter.setName(this.exprParser.name()); - parameter.setDataType(this.exprParser.parseDataType()); - - if (lexer.token() == Token.COLONEQ) { - lexer.nextToken(); - parameter.setDefaultValue(this.exprParser.expr()); - } - } - - parameters.add(parameter); - if (lexer.token() == Token.COMMA || lexer.token() == Token.SEMI) { - lexer.nextToken(); - } - - if (lexer.token() != Token.BEGIN && lexer.token() != Token.RPAREN) { - continue; - } - - break; - } - } - - public OracleSelectParser createSQLSelectParser() { - return new OracleSelectParser(this.exprParser); - } - - public OracleMergeStatement parseMerge() { - accept(Token.MERGE); - - OracleMergeStatement stmt = new OracleMergeStatement(); - - parseHints(stmt.getHints()); - - accept(Token.INTO); - stmt.setInto(exprParser.name()); - - stmt.setAlias(as()); - - accept(Token.USING); - - SQLTableSource using = this.createSQLSelectParser().parseTableSource(); - stmt.setUsing(using); - - accept(Token.ON); - stmt.setOn(exprParser.expr()); - - boolean insertFlag = false; - if (lexer.token() == Token.WHEN) { - lexer.nextToken(); - if (lexer.token() == Token.MATCHED) { - OracleMergeStatement.MergeUpdateClause updateClause = new OracleMergeStatement.MergeUpdateClause(); - lexer.nextToken(); - accept(Token.THEN); - accept(Token.UPDATE); - accept(Token.SET); - - for (;;) { - SQLUpdateSetItem item = new SQLUpdateSetItem(); - item.setColumn(this.exprParser.name()); - accept(Token.EQ); - item.setValue(this.exprParser.expr()); - - updateClause.getItems().add(item); - - if (lexer.token() == (Token.COMMA)) { - lexer.nextToken(); - continue; - } - - break; - } - - if (lexer.token() == Token.WHERE) { - lexer.nextToken(); - updateClause.setWhere(exprParser.expr()); - } - - if (lexer.token() == Token.DELETE) { - lexer.nextToken(); - accept(Token.WHERE); - updateClause.setWhere(exprParser.expr()); - } - - stmt.setUpdateClause(updateClause); - } else if (lexer.token() == Token.NOT) { - lexer.nextToken(); - insertFlag = true; - } - } - - if (!insertFlag) { - if (lexer.token() == Token.WHEN) { - lexer.nextToken(); - } - - if (lexer.token() == Token.NOT) { - lexer.nextToken(); - insertFlag = true; - } - } - - if (insertFlag) { - OracleMergeStatement.MergeInsertClause insertClause = new OracleMergeStatement.MergeInsertClause(); - - accept(Token.MATCHED); - accept(Token.THEN); - accept(Token.INSERT); - - if (lexer.token() == Token.LPAREN) { - accept(Token.LPAREN); - exprParser.exprList(insertClause.getColumns()); - accept(Token.RPAREN); - } - accept(Token.VALUES); - accept(Token.LPAREN); - exprParser.exprList(insertClause.getValues()); - accept(Token.RPAREN); - - if (lexer.token() == Token.WHERE) { - lexer.nextToken(); - insertClause.setWhere(exprParser.expr()); - } - - stmt.setInsertClause(insertClause); - } - - OracleErrorLoggingClause errorClause = parseErrorLoggingClause(); - stmt.setErrorLoggingClause(errorClause); - - return stmt; - } - - public OracleStatement parseInsert() { - if (lexer.token() == Token.LPAREN) { - OracleInsertStatement stmt = new OracleInsertStatement(); - parseInsert0(stmt, false); - - stmt.setReturning(parseReturningClause()); - stmt.setErrorLogging(parseErrorLoggingClause()); - - return stmt; - } - - accept(Token.INSERT); - - List hints = new ArrayList(); - - parseHints(hints); - - if (lexer.token() == Token.INTO) { - OracleInsertStatement stmt = new OracleInsertStatement(); - stmt.setHints(hints); - - parseInsert0(stmt); - - stmt.setReturning(parseReturningClause()); - stmt.setErrorLogging(parseErrorLoggingClause()); - - return stmt; - } - - OracleMultiInsertStatement stmt = parseMultiInsert(); - stmt.setHints(hints); - return stmt; - } - - public OracleMultiInsertStatement parseMultiInsert() { - OracleMultiInsertStatement stmt = new OracleMultiInsertStatement(); - - if (lexer.token() == Token.ALL) { - lexer.nextToken(); - stmt.setOption(OracleMultiInsertStatement.Option.ALL); - } else if (lexer.token() == Token.FIRST) { - lexer.nextToken(); - stmt.setOption(OracleMultiInsertStatement.Option.FIRST); - } - - while (lexer.token() == Token.INTO) { - OracleMultiInsertStatement.InsertIntoClause clause = new OracleMultiInsertStatement.InsertIntoClause(); - - parseInsert0(clause); - - clause.setReturning(parseReturningClause()); - clause.setErrorLogging(parseErrorLoggingClause()); - - stmt.getEntries().add(clause); - } - - if (lexer.token() == Token.WHEN) { - OracleMultiInsertStatement.ConditionalInsertClause clause = new OracleMultiInsertStatement.ConditionalInsertClause(); - - while (lexer.token() == Token.WHEN) { - lexer.nextToken(); - - OracleMultiInsertStatement.ConditionalInsertClauseItem item = new OracleMultiInsertStatement.ConditionalInsertClauseItem(); - - item.setWhen(this.exprParser.expr()); - accept(Token.THEN); - OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause(); - parseInsert0(insertInto); - item.setThen(insertInto); - - clause.getItems().add(item); - } - - if (lexer.token() == Token.ELSE) { - lexer.nextToken(); - - OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause(); - parseInsert0(insertInto, false); - clause.setElseItem(insertInto); - } - stmt.getEntries().add(clause); - } - - SQLSelect subQuery = this.createSQLSelectParser().select(); - stmt.setSubQuery(subQuery); - - return stmt; - } - - private OracleExceptionStatement parseException() { - accept(Token.EXCEPTION); - OracleExceptionStatement stmt = new OracleExceptionStatement(); - - for (;;) { - accept(Token.WHEN); - OracleExceptionStatement.Item item = new OracleExceptionStatement.Item(); - item.setWhen(this.exprParser.expr()); - accept(Token.THEN); - parseStatementList(item.getStatements()); - - stmt.getItems().add(item); - - if (lexer.token() != Token.WHEN) { - break; - } - } - return stmt; - } - - private OracleErrorLoggingClause parseErrorLoggingClause() { - if (identifierEquals("LOG")) { - OracleErrorLoggingClause errorClause = new OracleErrorLoggingClause(); - - lexer.nextToken(); - accept(Token.ERRORS); - if (lexer.token() == Token.INTO) { - lexer.nextToken(); - errorClause.setInto(exprParser.name()); - } - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - errorClause.setSimpleExpression(exprParser.expr()); - accept(Token.RPAREN); - } - - if (lexer.token() == Token.REJECT) { - lexer.nextToken(); - accept(Token.LIMIT); - errorClause.setLimit(exprParser.expr()); - } - - return errorClause; - } - return null; - } - - public OracleReturningClause parseReturningClause() { - OracleReturningClause clause = null; - - if (lexer.token() == Token.RETURNING) { - lexer.nextToken(); - clause = new OracleReturningClause(); - - for (;;) { - SQLExpr item = exprParser.expr(); - clause.getItems().add(item); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - accept(Token.INTO); - for (;;) { - SQLExpr item = exprParser.expr(); - clause.getValues().add(item); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - } - return clause; - } - - public SQLStatement parseStatement() { - List list = new ArrayList(); - - this.parseStatementList(list, 1); - - return list.get(0); - } - - public OracleExplainStatement parseExplain() { - acceptIdentifier("EXPLAIN"); - acceptIdentifier("PLAN"); - OracleExplainStatement stmt = new OracleExplainStatement(); - - if (lexer.token() == Token.SET) { - lexer.nextToken(); - acceptIdentifier("STATEMENT_ID"); - accept(Token.EQ); - stmt.setStatementId((SQLCharExpr) this.exprParser.primary()); - } - - if (lexer.token() == Token.INTO) { - lexer.nextToken(); - stmt.setInto(this.exprParser.name()); - } - - accept(Token.FOR); - stmt.setForStatement(parseStatement()); - - return stmt; - } - - public OracleDeleteStatement parseDeleteStatement() { - OracleDeleteStatement deleteStatement = new OracleDeleteStatement(); - - if (lexer.token() == Token.DELETE) { - lexer.nextToken(); - - if (lexer.token() == Token.COMMENT) { - lexer.nextToken(); - } - - parseHints(deleteStatement.getHints()); - - if (lexer.token() == (Token.FROM)) { - lexer.nextToken(); - } - - if (identifierEquals("ONLY")) { - lexer.nextToken(); - accept(Token.LPAREN); - - SQLName tableName = exprParser.name(); - deleteStatement.setTableName(tableName); - - accept(Token.RPAREN); - } else { - SQLName tableName = exprParser.name(); - deleteStatement.setTableName(tableName); - } - - deleteStatement.setAlias(as()); - } - - if (lexer.token() == (Token.WHERE)) { - lexer.nextToken(); - deleteStatement.setWhere(this.exprParser.expr()); - } - - if (lexer.token() == Token.RETURNING) { - OracleReturningClause clause = this.parseReturningClause(); - deleteStatement.setReturning(clause); - } - if (identifierEquals("RETURN") || identifierEquals("RETURNING")) { - throw new ParserException("TODO"); - } - - if (identifierEquals("LOG")) { - throw new ParserException("TODO"); - } - - return deleteStatement; - } - - public SQLStatement parseCreateDbLink() { - accept(Token.CREATE); - - OracleCreateDatabaseDbLinkStatement dbLink = new OracleCreateDatabaseDbLinkStatement(); - - if (identifierEquals("SHARED")) { - dbLink.setShared(true); - lexer.nextToken(); - } - - if (identifierEquals("PUBLIC")) { - dbLink.setPublic(true); - lexer.nextToken(); - } - - accept(Token.DATABASE); - acceptIdentifier("LINK"); - - dbLink.setName(this.exprParser.name()); - - if (lexer.token() == Token.CONNECT) { - lexer.nextToken(); - accept(Token.TO); - - dbLink.setUser(this.exprParser.name()); - - if (lexer.token() == Token.IDENTIFIED) { - lexer.nextToken(); - accept(Token.BY); - dbLink.setPassword(lexer.stringVal()); - accept(Token.IDENTIFIER); - } - } - - if (identifierEquals("AUTHENTICATED")) { - lexer.nextToken(); - accept(Token.BY); - dbLink.setAuthenticatedUser(this.exprParser.name()); - - accept(Token.IDENTIFIED); - accept(Token.BY); - dbLink.setPassword(lexer.stringVal()); - accept(Token.IDENTIFIER); - } - - if (lexer.token() == Token.USING) { - lexer.nextToken(); - dbLink.setUsing(this.exprParser.expr()); - } - - return dbLink; - } - - public OracleCreateIndexStatement parseCreateIndex(boolean acceptCreate) { - if (acceptCreate) { - accept(Token.CREATE); - } - - OracleCreateIndexStatement stmt = new OracleCreateIndexStatement(); - if (lexer.token() == Token.UNIQUE) { - stmt.setType("UNIQUE"); - lexer.nextToken(); - } else if (identifierEquals("BITMAP")) { - stmt.setType("BITMAP"); - lexer.nextToken(); - } - - accept(Token.INDEX); - - stmt.setName(this.exprParser.name()); - - accept(Token.ON); - - stmt.setTable(this.exprParser.name()); - - accept(Token.LPAREN); - - for (;;) { - SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); - stmt.getItems().add(item); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - accept(Token.RPAREN); - - for (;;) { - if (lexer.token() == Token.TABLESPACE) { - lexer.nextToken(); - stmt.setTablespace(this.exprParser.name()); - continue; - } else if (lexer.token() == Token.PCTFREE) { - lexer.nextToken(); - stmt.setPtcfree(this.exprParser.expr()); - continue; - } else if (lexer.token() == Token.INITRANS) { - lexer.nextToken(); - stmt.setInitrans(this.exprParser.expr()); - continue; - } else if (lexer.token() == Token.MAXTRANS) { - lexer.nextToken(); - stmt.setMaxtrans(this.exprParser.expr()); - continue; - } else if (lexer.token() == Token.COMPUTE) { - lexer.nextToken(); - acceptIdentifier("STATISTICS"); - stmt.setComputeStatistics(true); - continue; - } else if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - stmt.setEnable(true); - continue; - } else if (lexer.token() == Token.DISABLE) { - lexer.nextToken(); - stmt.setEnable(false); - continue; - } else if (identifierEquals("ONLINE")) { - lexer.nextToken(); - stmt.setOnline(true); - continue; - } else if (identifierEquals("NOPARALLEL")) { - lexer.nextToken(); - stmt.setNoParallel(true); - continue; - } else if (identifierEquals("PARALLEL")) { - lexer.nextToken(); - stmt.setParallel(this.exprParser.expr()); - continue; - } else if (lexer.token() == Token.INDEX) { - lexer.nextToken(); - acceptIdentifier("ONLY"); - acceptIdentifier("TOPLEVEL"); - stmt.setIndexOnlyTopLevel(true); - continue; - } else { - break; - } - } - return stmt; - } - - public OracleCreateSequenceStatement parseCreateSequence(boolean acceptCreate) { - if (acceptCreate) { - accept(Token.CREATE); - } - - acceptIdentifier("SEQUENCE"); - - OracleCreateSequenceStatement stmt = new OracleCreateSequenceStatement(); - stmt.setName(this.exprParser.name()); - - for (;;) { - if (lexer.token() == Token.START) { - lexer.nextToken(); - accept(Token.WITH); - stmt.setStartWith(this.exprParser.expr()); - continue; - } else if (identifierEquals("INCREMENT")) { - lexer.nextToken(); - accept(Token.BY); - stmt.setIncrementBy(this.exprParser.expr()); - continue; - } else if (lexer.token() == Token.CACHE) { - lexer.nextToken(); - stmt.setCache(Boolean.TRUE); - continue; - } else if (lexer.token() == Token.NOCACHE) { - lexer.nextToken(); - stmt.setCache(Boolean.FALSE); - continue; - } else if (identifierEquals("CYCLE")) { - lexer.nextToken(); - stmt.setCycle(Boolean.TRUE); - continue; - } else if (identifierEquals("NOCYCLE")) { - lexer.nextToken(); - stmt.setCycle(Boolean.FALSE); - continue; - } - break; - } - - return stmt; - } - - public OracleCreateProcedureStatement parseCreateProcedure() { - OracleCreateProcedureStatement stmt = new OracleCreateProcedureStatement(); - accept(Token.CREATE); - if (lexer.token() == Token.OR) { - lexer.nextToken(); - accept(Token.REPLACE); - stmt.setOrReplace(true); - } - - accept(Token.PROCEDURE); - - stmt.setName(this.exprParser.name()); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - parserParameters(stmt.getParameters()); - accept(Token.RPAREN); - } - - accept(Token.AS); - - OracleBlockStatement block = this.parseBlock(); - - stmt.setBlock(block); - - return stmt; - } - - public SQLUpdateStatement parseUpdateStatement() { - return new OracleUpdateParser(this.lexer).parseUpdateStatement(); - } -} +/* + * 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.parser; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLDataTypeImpl; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLHint; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; +import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLInsertInto; +import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.ast.statement.SQLSetStatement; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; +import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.parser.Token; + +public class OracleStatementParser extends SQLStatementParser { + + public OracleStatementParser(String sql){ + super(new OracleExprParser(sql)); + } + + public OracleStatementParser(Lexer lexer){ + super(new OracleExprParser(lexer)); + } + + @Override + public OracleExprParser getExprParser() { + return (OracleExprParser) exprParser; + } + + public void parseHints(List hints) { + this.getExprParser().parseHints(hints); + } + + public OracleCreateTableParser getSQLCreateTableParser() { + return new OracleCreateTableParser(lexer); + } + + protected void parseInsert0_hinits(SQLInsertInto insertStatement) { + if (insertStatement instanceof OracleInsertStatement) { + OracleInsertStatement stmt = (OracleInsertStatement) insertStatement; + this.getExprParser().parseHints(stmt.getHints()); + } else { + List hints = new ArrayList(1); + this.getExprParser().parseHints(hints); + } + } + + @Override + public void parseStatementList(List statementList) { + parseStatementList(statementList, -1); + } + + public void parseStatementList(List statementList, int max) { + for (;;) { + if (max != -1) { + if (statementList.size() >= max) { + return; + } + } + + if (lexer.token() == Token.EOF) { + return; + } + if (lexer.token() == Token.END) { + return; + } + if (lexer.token() == Token.ELSE) { + return; + } + + if (lexer.token() == (Token.SEMI)) { + lexer.nextToken(); + continue; + } + + if (lexer.token() == (Token.SELECT)) { + statementList.add(new SQLSelectStatement(new OracleSelectParser(this.exprParser).select())); + continue; + } + + if (lexer.token() == (Token.UPDATE)) { + statementList.add(parseUpdateStatement()); + continue; + } + + if (lexer.token() == (Token.CREATE)) { + statementList.add(parseCreate()); + continue; + } + + if (lexer.token() == Token.INSERT) { + statementList.add(parseInsert()); + continue; + } + + if (lexer.token() == (Token.DELETE)) { + statementList.add(parseDeleteStatement()); + continue; + } + + if (lexer.token() == (Token.SLASH)) { + lexer.nextToken(); + statementList.add(new OraclePLSQLCommitStatement()); + continue; + } + + if (lexer.token() == Token.ALTER) { + statementList.add(parserAlter()); + continue; + } + + if (lexer.token() == Token.WITH) { + statementList.add(new SQLSelectStatement(new OracleSelectParser(this.exprParser).select())); + continue; + } + + if (lexer.token() == Token.LBRACE || identifierEquals("CALL")) { + statementList.add(this.parseCall()); + continue; + } + + if (lexer.token() == Token.MERGE) { + statementList.add(this.parseMerge()); + continue; + } + + if (lexer.token() == Token.BEGIN) { + statementList.add(this.parseBlock()); + continue; + } + + if (lexer.token() == Token.DECLARE) { + statementList.add(this.parseBlock()); + continue; + } + + if (lexer.token() == Token.LOCK) { + statementList.add(this.parseLock()); + continue; + } + + if (lexer.token() == Token.TRUNCATE) { + statementList.add(this.parseTruncate()); + continue; + } + + if (lexer.token() == Token.VARIANT) { + SQLExpr variant = this.exprParser.primary(); + if (variant instanceof SQLBinaryOpExpr) { + SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) variant; + if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) { + SQLSetStatement stmt = new SQLSetStatement(binaryOpExpr.getLeft(), binaryOpExpr.getRight()); + statementList.add(stmt); + continue; + } + } + accept(Token.COLONEQ); + SQLExpr value = this.exprParser.expr(); + + SQLSetStatement stmt = new SQLSetStatement(variant, value); + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.EXCEPTION) { + statementList.add(this.parseException()); + continue; + } + + if (identifierEquals("EXIT")) { + lexer.nextToken(); + OracleExitStatement stmt = new OracleExitStatement(); + if (lexer.token() == Token.WHEN) { + lexer.nextToken(); + stmt.setWhen(this.exprParser.expr()); + } + statementList.add(stmt); + continue; + } + + if (identifierEquals("FETCH")) { + lexer.nextToken(); + OracleFetchStatement stmt = new OracleFetchStatement(); + stmt.setCursorName(this.exprParser.name()); + accept(Token.INTO); + for (;;) { + stmt.getInto().add(this.exprParser.name()); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + statementList.add(stmt); + continue; + } + + if (identifierEquals("ROLLBACK")) { + SQLRollbackStatement stmt = parseRollback(); + + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.IDENTIFIER) { + if (identifierEquals("EXPLAIN")) { + statementList.add(this.parseExplain()); + continue; + } + + SQLExpr expr = exprParser.expr(); + OracleExprStatement stmt = new OracleExprStatement(expr); + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.LPAREN) { + char ch = lexer.current(); + int bp = lexer.bp(); + lexer.nextToken(); + + if (lexer.token() == Token.SELECT) { + lexer.reset(bp, ch, Token.LPAREN); + statementList.add(this.parseSelect()); + continue; + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + if (lexer.token() == Token.SET) { + statementList.add(this.parseSet()); + continue; + } + + if (lexer.token() == Token.GRANT) { + statementList.add(this.parseGrant()); + continue; + } + if (lexer.token() == Token.COMMENT) { + statementList.add(this.parseComment()); + continue; + } + if (lexer.token() == Token.FOR) { + statementList.add(this.parseFor()); + continue; + } + if (lexer.token() == Token.LOOP) { + statementList.add(this.parseLoop()); + continue; + } + if (lexer.token() == Token.IF) { + statementList.add(this.parseIf()); + continue; + } + + if (lexer.token() == Token.GOTO) { + lexer.nextToken(); + SQLName label = this.exprParser.name(); + OracleGotoStatement stmt = new OracleGotoStatement(label); + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.COMMIT) { + lexer.nextToken(); + + if (identifierEquals("WORK")) { + lexer.nextToken(); + } + OracleCommitStatement stmt = new OracleCommitStatement(); + + if (identifierEquals("WRITE")) { + stmt.setWrite(true); + lexer.nextToken(); + + for (;;) { + if (lexer.token() == Token.WAIT) { + lexer.nextToken(); + stmt.setWait(Boolean.TRUE); + continue; + } else if (lexer.token() == Token.NOWAIT) { + lexer.nextToken(); + stmt.setWait(Boolean.FALSE); + continue; + } else if (lexer.token() == Token.IMMEDIATE) { + lexer.nextToken(); + stmt.setImmediate(Boolean.TRUE); + continue; + } else if (identifierEquals("BATCH")) { + lexer.nextToken(); + stmt.setImmediate(Boolean.FALSE); + continue; + } + + break; + } + } + + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.SAVEPOINT) { + lexer.nextToken(); + + OracleSavePointStatement stmt = new OracleSavePointStatement(); + + if (lexer.token() == Token.TO) { + lexer.nextToken(); + stmt.setTo(this.exprParser.name()); + } + + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.LTLT) { + lexer.nextToken(); + SQLName label = this.exprParser.name(); + OracleLabelStatement stmt = new OracleLabelStatement(label); + accept(Token.GTGT); + statementList.add(stmt); + continue; + } + + if (lexer.token() == Token.DROP) { + lexer.nextToken(); + + if (lexer.token() == Token.TABLE) { + SQLDropTableStatement stmt = parseDropTable(false); + statementList.add(stmt); + continue; + } + + boolean isPublic = false; + if (identifierEquals("PUBLIC")) { + lexer.nextToken(); + isPublic = true; + } + + if (lexer.token() == Token.DATABASE) { + lexer.nextToken(); + + if (identifierEquals("LINK")) { + lexer.nextToken(); + + OracleDropDatabaseLinkStatement stmt = new OracleDropDatabaseLinkStatement(); + if (isPublic) { + stmt.setPublic(isPublic); + } + + stmt.setName(this.exprParser.name()); + + statementList.add(stmt); + continue; + } + } + + if (lexer.token() == Token.INDEX) { + SQLStatement stmt = parseDropIndex(); + statementList.add(stmt); + continue; + } + + if (identifierEquals("SEQUENCE")) { + lexer.nextToken(); + + SQLName name = this.exprParser.name(); + + OracleDropSequenceStatement stmt = new OracleDropSequenceStatement(); + stmt.setName(name); + + statementList.add(stmt); + continue; + } + + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + if (lexer.token() == Token.NULL) { + lexer.nextToken(); + OracleExprStatement stmt = new OracleExprStatement(new SQLNullExpr()); + statementList.add(stmt); + continue; + } + + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + public SQLStatement parseIf() { + accept(Token.IF); + + OracleIfStatement stmt = new OracleIfStatement(); + + stmt.setCondition(this.exprParser.expr()); + + accept(Token.THEN); + + this.parseStatementList(stmt.getStatements()); + + while (lexer.token() == Token.ELSE) { + lexer.nextToken(); + + if (lexer.token() == Token.IF) { + lexer.nextToken(); + + OracleIfStatement.ElseIf elseIf = new OracleIfStatement.ElseIf(); + + elseIf.setCondition(this.exprParser.expr()); + + accept(Token.THEN); + this.parseStatementList(elseIf.getStatements()); + + stmt.getElseIfList().add(elseIf); + } else { + OracleIfStatement.Else elseItem = new OracleIfStatement.Else(); + this.parseStatementList(elseItem.getStatements()); + stmt.setElseItem(elseItem); + break; + } + } + + accept(Token.END); + accept(Token.IF); + + return stmt; + } + + public OracleForStatement parseFor() { + accept(Token.FOR); + + OracleForStatement stmt = new OracleForStatement(); + + stmt.setIndex(this.exprParser.name()); + accept(Token.IN); + stmt.setRange(this.exprParser.expr()); + accept(Token.LOOP); + + this.parseStatementList(stmt.getStatements()); + accept(Token.END); + accept(Token.LOOP); + return stmt; + } + + public OracleLoopStatement parseLoop() { + accept(Token.LOOP); + + OracleLoopStatement stmt = new OracleLoopStatement(); + + this.parseStatementList(stmt.getStatements()); + accept(Token.END); + accept(Token.LOOP); + return stmt; + } + + public SQLStatement parseGrant() { + accept(Token.GRANT); + OracleGrantStatement stmt = new OracleGrantStatement(); + + for (;;) { + if (lexer.token() == Token.ALL) { + lexer.nextToken(); + if (identifierEquals("PRIVILEGES")) { + lexer.nextToken(); + } + stmt.getPrivileges().add("ALL"); + } else if (lexer.token() == Token.SELECT) { + stmt.getPrivileges().add("SELECT"); + lexer.nextToken(); + } else if (lexer.token() == Token.UPDATE) { + stmt.getPrivileges().add("UPDATE"); + lexer.nextToken(); + } else if (lexer.token() == Token.DELETE) { + stmt.getPrivileges().add("DELETE"); + lexer.nextToken(); + } else if (lexer.token() == Token.INSERT) { + stmt.getPrivileges().add("INSERT"); + lexer.nextToken(); + } else if (lexer.token() == Token.CREATE) { + lexer.nextToken(); + + if (lexer.token() == Token.TABLE) { + stmt.getPrivileges().add("CREATE TABLE"); + lexer.nextToken(); + } else if (identifierEquals("SYNONYM")) { + stmt.getPrivileges().add("CREATE SYNONYM"); + lexer.nextToken(); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + + if (lexer.token() == Token.ON) { + lexer.nextToken(); + stmt.setOn(this.exprParser.expr()); + } + + return stmt; + } + + public SQLStatement parseSet() { + accept(Token.SET); + acceptIdentifier("TRANSACTION"); + + OracleSetTransactionStatement stmt = new OracleSetTransactionStatement(); + + if (identifierEquals("READ")) { + lexer.nextToken(); + acceptIdentifier("ONLY"); + stmt.setReadOnly(true); + } + + acceptIdentifier("NAME"); + + stmt.setName(this.exprParser.expr()); + return stmt; + } + + public OracleTruncateStatement parseTruncate() { + accept(Token.TRUNCATE); + accept(Token.TABLE); + OracleTruncateStatement stmt = new OracleTruncateStatement(); + + SQLName name = this.exprParser.name(); + stmt.addTableSource(name); + + if (identifierEquals("PURGE")) { + lexer.nextToken(); + + if (identifierEquals("SNAPSHOT")) { + lexer.nextToken(); + acceptIdentifier("LOG"); + stmt.setPurgeSnapshotLog(true); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + return stmt; + } + + public OracleStatement parserAlter() { + accept(Token.ALTER); + if (lexer.token() == Token.SESSION) { + lexer.nextToken(); + + OracleAlterSessionStatement stmt = new OracleAlterSessionStatement(); + if (lexer.token() == Token.SET) { + lexer.nextToken(); + parseAssignItems(stmt.getItems()); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + return stmt; + } else if (lexer.token() == Token.PROCEDURE) { + lexer.nextToken(); + OracleAlterProcedureStatement stmt = new OracleAlterProcedureStatement(); + stmt.setName(this.exprParser.name()); + if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + } + + if (identifierEquals("REUSE")) { + lexer.nextToken(); + acceptIdentifier("SETTINGS"); + stmt.setReuseSettings(true); + } + + return stmt; + } else if (lexer.token() == Token.TABLE) { + return parseAlterTable(); + } else if (lexer.token() == Token.INDEX) { + lexer.nextToken(); + OracleAlterIndexStatement stmt = new OracleAlterIndexStatement(); + stmt.setName(this.exprParser.name()); + + if (identifierEquals("RENAME")) { + lexer.nextToken(); + accept(Token.TO); + stmt.setRenameTo(this.exprParser.name()); + } + + for (;;) { + if (identifierEquals("rebuild")) { + lexer.nextToken(); + + OracleAlterIndexStatement.Rebuild rebuild = new OracleAlterIndexStatement.Rebuild(); + stmt.setRebuild(rebuild); + continue; + } else if (identifierEquals("MONITORING")) { + lexer.nextToken(); + acceptIdentifier("USAGE"); + stmt.setMonitoringUsage(Boolean.TRUE); + continue; + } else if (identifierEquals("PARALLEL")) { + lexer.nextToken(); + stmt.setParallel(this.exprParser.expr()); + } + break; + } + + return stmt; + } else if (identifierEquals("TRIGGER")) { + lexer.nextToken(); + OracleAlterTriggerStatement stmt = new OracleAlterTriggerStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + stmt.setEnable(Boolean.TRUE); + continue; + } else if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + stmt.setEnable(Boolean.FALSE); + continue; + } else if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + continue; + } + break; + } + + return stmt; + } else if (identifierEquals("SYNONYM")) { + lexer.nextToken(); + OracleAlterSynonymStatement stmt = new OracleAlterSynonymStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + stmt.setEnable(Boolean.TRUE); + continue; + } else if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + stmt.setEnable(Boolean.FALSE); + continue; + } else if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + continue; + } + break; + } + + return stmt; + } else if (lexer.token() == Token.VIEW) { + lexer.nextToken(); + OracleAlterViewStatement stmt = new OracleAlterViewStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + stmt.setEnable(Boolean.TRUE); + continue; + } else if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + stmt.setEnable(Boolean.FALSE); + continue; + } else if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + continue; + } + break; + } + + return stmt; + } else if (lexer.token() == Token.TABLESPACE) { + lexer.nextToken(); + + OracleAlterTablespaceStatement stmt = new OracleAlterTablespaceStatement(); + stmt.setName(this.exprParser.name()); + + if (identifierEquals("ADD")) { + lexer.nextToken(); + + if (identifierEquals("DATAFILE")) { + lexer.nextToken(); + + OracleAlterTablespaceAddDataFile item = new OracleAlterTablespaceAddDataFile(); + + for (;;) { + OracleFileSpecification file = new OracleFileSpecification(); + + for (;;) { + SQLExpr fileName = this.exprParser.expr(); + file.getFileNames().add(fileName); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + if (identifierEquals("SIZE")) { + lexer.nextToken(); + file.setSize(this.exprParser.expr()); + } + + if (identifierEquals("AUTOEXTEND")) { + lexer.nextToken(); + if (identifierEquals("OFF")) { + lexer.nextToken(); + file.setAutoExtendOff(true); + } else if (identifierEquals("ON")) { + lexer.nextToken(); + file.setAutoExtendOn(this.exprParser.expr()); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + item.getFiles().add(file); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + stmt.setItem(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + return stmt; + } + + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + private OracleStatement parseAlterTable() { + lexer.nextToken(); + OracleAlterTableStatement stmt = new OracleAlterTableStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (identifierEquals("ADD")) { + lexer.nextToken(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + + SQLAlterTableAddColumn item = parseAlterTableAddColumn(); + + stmt.getItems().add(item); + + accept(Token.RPAREN); + } else if (lexer.token() == Token.CONSTRAINT) { + stmt.getItems().add(parseConstaint()); + } else if (lexer.token() == Token.IDENTIFIER) { + SQLAlterTableAddColumn item = parseAlterTableAddColumn(); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + continue; + } else if (identifierEquals("MOVE")) { + lexer.nextToken(); + + if (lexer.token() == Token.TABLESPACE) { + lexer.nextToken(); + + OracleAlterTableMoveTablespace item = new OracleAlterTableMoveTablespace(); + item.setName(this.exprParser.name()); + + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } else if (identifierEquals("RENAME")) { + stmt.getItems().add(parseAlterTableRename()); + } else if (identifierEquals("MODIFY")) { + lexer.nextToken(); + + OracleAlterTableModify item = new OracleAlterTableModify(); + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + + for (;;) { + SQLColumnDefinition columnDef = this.exprParser.parseColumn(); + item.getColumns().add(columnDef); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + + } else { + SQLColumnDefinition columnDef = this.exprParser.parseColumn(); + item.getColumns().add(columnDef); + } + + stmt.getItems().add(item); + continue; + } else if (identifierEquals("SPLIT")) { + parseAlterTableSplit(stmt); + continue; + } else if (lexer.token() == Token.TRUNCATE) { + lexer.nextToken(); + if (identifierEquals("PARTITION")) { + lexer.nextToken(); + OracleAlterTableTruncatePartition item = new OracleAlterTableTruncatePartition(); + item.setName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + continue; + } else if (lexer.token() == Token.DROP) { + parseAlterDrop(stmt); + continue; + } else if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } else if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + break; + } + + if (lexer.token() == Token.UPDATE) { + lexer.nextToken(); + + if (identifierEquals("GLOBAL")) { + lexer.nextToken(); + acceptIdentifier("INDEXES"); + stmt.setUpdateGlobalIndexes(true); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + return stmt; + } + + private SQLAlterTableItem parseAlterTableRename() { + acceptIdentifier("RENAME"); + + if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn(); + renameColumn.setColumn(this.exprParser.name()); + accept(Token.TO); + renameColumn.setTo(this.exprParser.name()); + return renameColumn; + } + + if (lexer.token() == Token.TO) { + lexer.nextToken(); + OracleAlterTableRenameTo item = new OracleAlterTableRenameTo(); + item.setTo(this.exprParser.name()); + return item; + } + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + private OracleAlterTableAddConstaint parseConstaint() { + accept(Token.CONSTRAINT); + + OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint(); + + SQLName name = this.exprParser.name(); + + OracleConstraint constraint; + if (lexer.token() == Token.PRIMARY) { + constraint = (OracleConstraint) exprParser.parsePrimaryKey(); + } else if (lexer.token() == Token.UNIQUE) { + constraint = (OracleConstraint) exprParser.parseUnique(); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + if (lexer.token() == Token.EXCEPTIONS) { + lexer.nextToken(); + accept(Token.INTO); + SQLName exceptionsInto = this.exprParser.name(); + constraint.setExceptionsInto(exceptionsInto); + } + + constraint.setName(name); + + item.setConstraint(constraint); + + return item; + } + + public void parseAlterDrop(SQLAlterTableStatement stmt) { + lexer.nextToken(); + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.getItems().add(item); + } else if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); + this.exprParser.names(item.getColumns()); + stmt.getItems().add(item); + accept(Token.RPAREN); + } else if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); + this.exprParser.names(item.getColumns()); + stmt.getItems().add(item); + } else if (identifierEquals("PARTITION")) { + lexer.nextToken(); + OracleAlterTableDropPartition item = new OracleAlterTableDropPartition(); + item.setName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + private void parseAlterTableSplit(OracleAlterTableStatement stmt) { + lexer.nextToken(); + if (identifierEquals("PARTITION")) { + lexer.nextToken(); + OracleAlterTableSplitPartition item = new OracleAlterTableSplitPartition(); + item.setName(this.exprParser.name()); + + if (identifierEquals("AT")) { + lexer.nextToken(); + accept(Token.LPAREN); + this.exprParser.exprList(item.getAt()); + accept(Token.RPAREN); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + accept(Token.LPAREN); + + for (;;) { + NestedTablePartitionSpec spec = new NestedTablePartitionSpec(); + acceptIdentifier("PARTITION"); + spec.setPartition(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.TABLESPACE) { + lexer.nextToken(); + SQLName tablespace = this.exprParser.name(); + spec.getSegmentAttributeItems().add(new TableSpaceItem(tablespace)); + continue; + } else if (identifierEquals("PCTREE")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("PCTUSED")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("INITRANS")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + + } else if (identifierEquals("STORAGE")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + + } else if (identifierEquals("LOGGING")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("NOLOGGING")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("FILESYSTEM_LIKE_LOGGING")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + + } + + break; + } + + item.getInto().add(spec); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + } + + if (lexer.token() == Token.UPDATE) { + lexer.nextToken(); + acceptIdentifier("INDEXES"); + UpdateIndexesClause updateIndexes = new UpdateIndexesClause(); + item.setUpdateIndexes(updateIndexes); + } + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + public OracleLockTableStatement parseLock() { + accept(Token.LOCK); + accept(Token.TABLE); + + OracleLockTableStatement stmt = new OracleLockTableStatement(); + stmt.setTable(this.exprParser.name()); + + accept(Token.IN); + if (lexer.token() == Token.SHARE) { + stmt.setLockMode(LockMode.SHARE); + lexer.nextToken(); + } else if (lexer.token() == Token.EXCLUSIVE) { + stmt.setLockMode(LockMode.EXCLUSIVE); + lexer.nextToken(); + } + accept(Token.MODE); + + if (lexer.token() == Token.NOWAIT) { + lexer.nextToken(); + } else if (lexer.token() == Token.WAIT) { + lexer.nextToken(); + stmt.setWait(exprParser.expr()); + } + return stmt; + } + + public OracleBlockStatement parseBlock() { + OracleBlockStatement block = new OracleBlockStatement(); + + if (lexer.token() == Token.DECLARE) { + lexer.nextToken(); + + parserParameters(block.getParameters()); + for (OracleParameter param : block.getParameters()) { + param.setParent(block); + } + } + + accept(Token.BEGIN); + + parseStatementList(block.getStatementList()); + + accept(Token.END); + + return block; + } + + private void parserParameters(List parameters) { + for (;;) { + OracleParameter parameter = new OracleParameter(); + + if (lexer.token() == Token.CURSOR) { + lexer.nextToken(); + + parameter.setName(this.exprParser.name()); + + accept(Token.IS); + SQLSelect select = this.createSQLSelectParser().select(); + + SQLDataTypeImpl dataType = new SQLDataTypeImpl(); + dataType.setName("CURSOR"); + parameter.setDataType(dataType); + + parameter.setDefaultValue(new SQLQueryExpr(select)); + } else { + parameter.setName(this.exprParser.name()); + parameter.setDataType(this.exprParser.parseDataType()); + + if (lexer.token() == Token.COLONEQ) { + lexer.nextToken(); + parameter.setDefaultValue(this.exprParser.expr()); + } + } + + parameters.add(parameter); + if (lexer.token() == Token.COMMA || lexer.token() == Token.SEMI) { + lexer.nextToken(); + } + + if (lexer.token() != Token.BEGIN && lexer.token() != Token.RPAREN) { + continue; + } + + break; + } + } + + public OracleSelectParser createSQLSelectParser() { + return new OracleSelectParser(this.exprParser); + } + + public OracleMergeStatement parseMerge() { + accept(Token.MERGE); + + OracleMergeStatement stmt = new OracleMergeStatement(); + + parseHints(stmt.getHints()); + + accept(Token.INTO); + stmt.setInto(exprParser.name()); + + stmt.setAlias(as()); + + accept(Token.USING); + + SQLTableSource using = this.createSQLSelectParser().parseTableSource(); + stmt.setUsing(using); + + accept(Token.ON); + stmt.setOn(exprParser.expr()); + + boolean insertFlag = false; + if (lexer.token() == Token.WHEN) { + lexer.nextToken(); + if (lexer.token() == Token.MATCHED) { + OracleMergeStatement.MergeUpdateClause updateClause = new OracleMergeStatement.MergeUpdateClause(); + lexer.nextToken(); + accept(Token.THEN); + accept(Token.UPDATE); + accept(Token.SET); + + for (;;) { + SQLUpdateSetItem item = new SQLUpdateSetItem(); + item.setColumn(this.exprParser.name()); + accept(Token.EQ); + item.setValue(this.exprParser.expr()); + + updateClause.getItems().add(item); + + if (lexer.token() == (Token.COMMA)) { + lexer.nextToken(); + continue; + } + + break; + } + + if (lexer.token() == Token.WHERE) { + lexer.nextToken(); + updateClause.setWhere(exprParser.expr()); + } + + if (lexer.token() == Token.DELETE) { + lexer.nextToken(); + accept(Token.WHERE); + updateClause.setWhere(exprParser.expr()); + } + + stmt.setUpdateClause(updateClause); + } else if (lexer.token() == Token.NOT) { + lexer.nextToken(); + insertFlag = true; + } + } + + if (!insertFlag) { + if (lexer.token() == Token.WHEN) { + lexer.nextToken(); + } + + if (lexer.token() == Token.NOT) { + lexer.nextToken(); + insertFlag = true; + } + } + + if (insertFlag) { + OracleMergeStatement.MergeInsertClause insertClause = new OracleMergeStatement.MergeInsertClause(); + + accept(Token.MATCHED); + accept(Token.THEN); + accept(Token.INSERT); + + if (lexer.token() == Token.LPAREN) { + accept(Token.LPAREN); + exprParser.exprList(insertClause.getColumns()); + accept(Token.RPAREN); + } + accept(Token.VALUES); + accept(Token.LPAREN); + exprParser.exprList(insertClause.getValues()); + accept(Token.RPAREN); + + if (lexer.token() == Token.WHERE) { + lexer.nextToken(); + insertClause.setWhere(exprParser.expr()); + } + + stmt.setInsertClause(insertClause); + } + + OracleErrorLoggingClause errorClause = parseErrorLoggingClause(); + stmt.setErrorLoggingClause(errorClause); + + return stmt; + } + + public OracleStatement parseInsert() { + if (lexer.token() == Token.LPAREN) { + OracleInsertStatement stmt = new OracleInsertStatement(); + parseInsert0(stmt, false); + + stmt.setReturning(parseReturningClause()); + stmt.setErrorLogging(parseErrorLoggingClause()); + + return stmt; + } + + accept(Token.INSERT); + + List hints = new ArrayList(); + + parseHints(hints); + + if (lexer.token() == Token.INTO) { + OracleInsertStatement stmt = new OracleInsertStatement(); + stmt.setHints(hints); + + parseInsert0(stmt); + + stmt.setReturning(parseReturningClause()); + stmt.setErrorLogging(parseErrorLoggingClause()); + + return stmt; + } + + OracleMultiInsertStatement stmt = parseMultiInsert(); + stmt.setHints(hints); + return stmt; + } + + public OracleMultiInsertStatement parseMultiInsert() { + OracleMultiInsertStatement stmt = new OracleMultiInsertStatement(); + + if (lexer.token() == Token.ALL) { + lexer.nextToken(); + stmt.setOption(OracleMultiInsertStatement.Option.ALL); + } else if (lexer.token() == Token.FIRST) { + lexer.nextToken(); + stmt.setOption(OracleMultiInsertStatement.Option.FIRST); + } + + while (lexer.token() == Token.INTO) { + OracleMultiInsertStatement.InsertIntoClause clause = new OracleMultiInsertStatement.InsertIntoClause(); + + parseInsert0(clause); + + clause.setReturning(parseReturningClause()); + clause.setErrorLogging(parseErrorLoggingClause()); + + stmt.getEntries().add(clause); + } + + if (lexer.token() == Token.WHEN) { + OracleMultiInsertStatement.ConditionalInsertClause clause = new OracleMultiInsertStatement.ConditionalInsertClause(); + + while (lexer.token() == Token.WHEN) { + lexer.nextToken(); + + OracleMultiInsertStatement.ConditionalInsertClauseItem item = new OracleMultiInsertStatement.ConditionalInsertClauseItem(); + + item.setWhen(this.exprParser.expr()); + accept(Token.THEN); + OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause(); + parseInsert0(insertInto); + item.setThen(insertInto); + + clause.getItems().add(item); + } + + if (lexer.token() == Token.ELSE) { + lexer.nextToken(); + + OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause(); + parseInsert0(insertInto, false); + clause.setElseItem(insertInto); + } + stmt.getEntries().add(clause); + } + + SQLSelect subQuery = this.createSQLSelectParser().select(); + stmt.setSubQuery(subQuery); + + return stmt; + } + + private OracleExceptionStatement parseException() { + accept(Token.EXCEPTION); + OracleExceptionStatement stmt = new OracleExceptionStatement(); + + for (;;) { + accept(Token.WHEN); + OracleExceptionStatement.Item item = new OracleExceptionStatement.Item(); + item.setWhen(this.exprParser.expr()); + accept(Token.THEN); + parseStatementList(item.getStatements()); + + stmt.getItems().add(item); + + if (lexer.token() != Token.WHEN) { + break; + } + } + return stmt; + } + + private OracleErrorLoggingClause parseErrorLoggingClause() { + if (identifierEquals("LOG")) { + OracleErrorLoggingClause errorClause = new OracleErrorLoggingClause(); + + lexer.nextToken(); + accept(Token.ERRORS); + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + errorClause.setInto(exprParser.name()); + } + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + errorClause.setSimpleExpression(exprParser.expr()); + accept(Token.RPAREN); + } + + if (lexer.token() == Token.REJECT) { + lexer.nextToken(); + accept(Token.LIMIT); + errorClause.setLimit(exprParser.expr()); + } + + return errorClause; + } + return null; + } + + public OracleReturningClause parseReturningClause() { + OracleReturningClause clause = null; + + if (lexer.token() == Token.RETURNING) { + lexer.nextToken(); + clause = new OracleReturningClause(); + + for (;;) { + SQLExpr item = exprParser.expr(); + clause.getItems().add(item); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.INTO); + for (;;) { + SQLExpr item = exprParser.expr(); + clause.getValues().add(item); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + } + return clause; + } + + public SQLStatement parseStatement() { + List list = new ArrayList(); + + this.parseStatementList(list, 1); + + return list.get(0); + } + + public OracleExplainStatement parseExplain() { + acceptIdentifier("EXPLAIN"); + acceptIdentifier("PLAN"); + OracleExplainStatement stmt = new OracleExplainStatement(); + + if (lexer.token() == Token.SET) { + lexer.nextToken(); + acceptIdentifier("STATEMENT_ID"); + accept(Token.EQ); + stmt.setStatementId((SQLCharExpr) this.exprParser.primary()); + } + + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + stmt.setInto(this.exprParser.name()); + } + + accept(Token.FOR); + stmt.setForStatement(parseStatement()); + + return stmt; + } + + public OracleDeleteStatement parseDeleteStatement() { + OracleDeleteStatement deleteStatement = new OracleDeleteStatement(); + + if (lexer.token() == Token.DELETE) { + lexer.nextToken(); + + if (lexer.token() == Token.COMMENT) { + lexer.nextToken(); + } + + parseHints(deleteStatement.getHints()); + + if (lexer.token() == (Token.FROM)) { + lexer.nextToken(); + } + + if (identifierEquals("ONLY")) { + lexer.nextToken(); + accept(Token.LPAREN); + + SQLName tableName = exprParser.name(); + deleteStatement.setTableName(tableName); + + accept(Token.RPAREN); + } else { + SQLName tableName = exprParser.name(); + deleteStatement.setTableName(tableName); + } + + deleteStatement.setAlias(as()); + } + + if (lexer.token() == (Token.WHERE)) { + lexer.nextToken(); + deleteStatement.setWhere(this.exprParser.expr()); + } + + if (lexer.token() == Token.RETURNING) { + OracleReturningClause clause = this.parseReturningClause(); + deleteStatement.setReturning(clause); + } + if (identifierEquals("RETURN") || identifierEquals("RETURNING")) { + throw new ParserException("TODO"); + } + + if (identifierEquals("LOG")) { + throw new ParserException("TODO"); + } + + return deleteStatement; + } + + public SQLStatement parseCreateDbLink() { + accept(Token.CREATE); + + OracleCreateDatabaseDbLinkStatement dbLink = new OracleCreateDatabaseDbLinkStatement(); + + if (identifierEquals("SHARED")) { + dbLink.setShared(true); + lexer.nextToken(); + } + + if (identifierEquals("PUBLIC")) { + dbLink.setPublic(true); + lexer.nextToken(); + } + + accept(Token.DATABASE); + acceptIdentifier("LINK"); + + dbLink.setName(this.exprParser.name()); + + if (lexer.token() == Token.CONNECT) { + lexer.nextToken(); + accept(Token.TO); + + dbLink.setUser(this.exprParser.name()); + + if (lexer.token() == Token.IDENTIFIED) { + lexer.nextToken(); + accept(Token.BY); + dbLink.setPassword(lexer.stringVal()); + accept(Token.IDENTIFIER); + } + } + + if (identifierEquals("AUTHENTICATED")) { + lexer.nextToken(); + accept(Token.BY); + dbLink.setAuthenticatedUser(this.exprParser.name()); + + accept(Token.IDENTIFIED); + accept(Token.BY); + dbLink.setPassword(lexer.stringVal()); + accept(Token.IDENTIFIER); + } + + if (lexer.token() == Token.USING) { + lexer.nextToken(); + dbLink.setUsing(this.exprParser.expr()); + } + + return dbLink; + } + + public OracleCreateIndexStatement parseCreateIndex(boolean acceptCreate) { + if (acceptCreate) { + accept(Token.CREATE); + } + + OracleCreateIndexStatement stmt = new OracleCreateIndexStatement(); + if (lexer.token() == Token.UNIQUE) { + stmt.setType("UNIQUE"); + lexer.nextToken(); + } else if (identifierEquals("BITMAP")) { + stmt.setType("BITMAP"); + lexer.nextToken(); + } + + accept(Token.INDEX); + + stmt.setName(this.exprParser.name()); + + accept(Token.ON); + + stmt.setTable(this.exprParser.name()); + + accept(Token.LPAREN); + + for (;;) { + SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); + stmt.getItems().add(item); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + + for (;;) { + if (lexer.token() == Token.TABLESPACE) { + lexer.nextToken(); + stmt.setTablespace(this.exprParser.name()); + continue; + } else if (lexer.token() == Token.PCTFREE) { + lexer.nextToken(); + stmt.setPtcfree(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.INITRANS) { + lexer.nextToken(); + stmt.setInitrans(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.MAXTRANS) { + lexer.nextToken(); + stmt.setMaxtrans(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.COMPUTE) { + lexer.nextToken(); + acceptIdentifier("STATISTICS"); + stmt.setComputeStatistics(true); + continue; + } else if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + stmt.setEnable(true); + continue; + } else if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + stmt.setEnable(false); + continue; + } else if (identifierEquals("ONLINE")) { + lexer.nextToken(); + stmt.setOnline(true); + continue; + } else if (identifierEquals("NOPARALLEL")) { + lexer.nextToken(); + stmt.setNoParallel(true); + continue; + } else if (identifierEquals("PARALLEL")) { + lexer.nextToken(); + stmt.setParallel(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.INDEX) { + lexer.nextToken(); + acceptIdentifier("ONLY"); + acceptIdentifier("TOPLEVEL"); + stmt.setIndexOnlyTopLevel(true); + continue; + } else { + break; + } + } + return stmt; + } + + public OracleCreateSequenceStatement parseCreateSequence(boolean acceptCreate) { + if (acceptCreate) { + accept(Token.CREATE); + } + + acceptIdentifier("SEQUENCE"); + + OracleCreateSequenceStatement stmt = new OracleCreateSequenceStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.START) { + lexer.nextToken(); + accept(Token.WITH); + stmt.setStartWith(this.exprParser.expr()); + continue; + } else if (identifierEquals("INCREMENT")) { + lexer.nextToken(); + accept(Token.BY); + stmt.setIncrementBy(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.CACHE) { + lexer.nextToken(); + stmt.setCache(Boolean.TRUE); + continue; + } else if (lexer.token() == Token.NOCACHE) { + lexer.nextToken(); + stmt.setCache(Boolean.FALSE); + continue; + } else if (identifierEquals("CYCLE")) { + lexer.nextToken(); + stmt.setCycle(Boolean.TRUE); + continue; + } else if (identifierEquals("NOCYCLE")) { + lexer.nextToken(); + stmt.setCycle(Boolean.FALSE); + continue; + } + break; + } + + return stmt; + } + + public OracleCreateProcedureStatement parseCreateProcedure() { + OracleCreateProcedureStatement stmt = new OracleCreateProcedureStatement(); + accept(Token.CREATE); + if (lexer.token() == Token.OR) { + lexer.nextToken(); + accept(Token.REPLACE); + stmt.setOrReplace(true); + } + + accept(Token.PROCEDURE); + + stmt.setName(this.exprParser.name()); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + parserParameters(stmt.getParameters()); + accept(Token.RPAREN); + } + + accept(Token.AS); + + OracleBlockStatement block = this.parseBlock(); + + stmt.setBlock(block); + + return stmt; + } + + public SQLUpdateStatement parseUpdateStatement() { + return new OracleUpdateParser(this.lexer).parseUpdateStatement(); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index dbcaf6293d..aaf7e72e36 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -1,614 +1,614 @@ -/* - * 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.visitor; - -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -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 { - - void endVisit(OracleAggregateExpr astNode); - - void endVisit(OracleConstraintState astNode); - - void endVisit(OraclePLSQLCommitStatement astNode); - - void endVisit(OracleAnalytic x); - - void endVisit(OracleAnalyticWindowing x); - - void endVisit(OracleDateExpr x); - - void endVisit(OracleDbLinkExpr x); - - void endVisit(OracleDeleteStatement x); - - void endVisit(OracleExtractExpr x); - - void endVisit(OracleIntervalExpr x); - - void endVisit(OracleOrderBy x); - - void endVisit(OracleOuterExpr x); - - void endVisit(OracleSelectForUpdate x); - - void endVisit(OracleSelectHierachicalQueryClause x); - - void endVisit(OracleSelectJoin x); - - void endVisit(OracleOrderByItem x); - - void endVisit(OracleSelectPivot x); - - void endVisit(OracleSelectPivot.Item x); - - void endVisit(OracleSelectRestriction.CheckOption x); - - void endVisit(OracleSelectRestriction.ReadOnly x); - - void endVisit(OracleSelectSubqueryTableSource x); - - void endVisit(OracleSelectUnPivot x); - - void endVisit(OracleTimestampExpr x); - - void endVisit(OracleUpdateStatement x); - - boolean visit(OracleAggregateExpr astNode); - - boolean visit(OracleConstraintState astNode); - - boolean visit(OraclePLSQLCommitStatement astNode); - - boolean visit(OracleAnalytic x); - - boolean visit(OracleAnalyticWindowing x); - - boolean visit(OracleDateExpr x); - - boolean visit(OracleDbLinkExpr x); - - boolean visit(OracleDeleteStatement x); - - boolean visit(OracleExtractExpr x); - - boolean visit(OracleIntervalExpr x); - - boolean visit(OracleOrderBy x); - - boolean visit(OracleOuterExpr x); - - boolean visit(OracleSelectForUpdate x); - - boolean visit(OracleSelectHierachicalQueryClause x); - - boolean visit(OracleSelectJoin x); - - boolean visit(OracleOrderByItem x); - - boolean visit(OracleSelectPivot x); - - boolean visit(OracleSelectPivot.Item x); - - boolean visit(OracleSelectRestriction.CheckOption x); - - boolean visit(OracleSelectRestriction.ReadOnly x); - - boolean visit(OracleSelectSubqueryTableSource x); - - boolean visit(OracleSelectUnPivot x); - - boolean visit(OracleTimestampExpr x); - - boolean visit(OracleUpdateStatement x); - - boolean visit(SampleClause x); - - void endVisit(SampleClause x); - - boolean visit(OracleSelectTableReference x); - - void endVisit(OracleSelectTableReference x); - - boolean visit(PartitionExtensionClause x); - - void endVisit(PartitionExtensionClause x); - - boolean visit(VersionsFlashbackQueryClause x); - - void endVisit(VersionsFlashbackQueryClause x); - - boolean visit(AsOfFlashbackQueryClause x); - - void endVisit(AsOfFlashbackQueryClause x); - - boolean visit(GroupingSetExpr x); - - void endVisit(GroupingSetExpr x); - - boolean visit(OracleWithSubqueryEntry x); - - void endVisit(OracleWithSubqueryEntry x); - - boolean visit(SearchClause x); - - void endVisit(SearchClause x); - - boolean visit(CycleClause x); - - void endVisit(CycleClause x); - - boolean visit(OracleBinaryFloatExpr x); - - void endVisit(OracleBinaryFloatExpr x); - - boolean visit(OracleBinaryDoubleExpr x); - - void endVisit(OracleBinaryDoubleExpr x); - - boolean visit(OracleSelect x); - - void endVisit(OracleSelect x); - - boolean visit(OracleCursorExpr x); - - void endVisit(OracleCursorExpr x); - - boolean visit(OracleIsSetExpr x); - - void endVisit(OracleIsSetExpr x); - - boolean visit(ModelClause.ReturnRowsClause x); - - void endVisit(ModelClause.ReturnRowsClause x); - - boolean visit(ModelClause.MainModelClause x); - - void endVisit(ModelClause.MainModelClause x); - - boolean visit(ModelClause.ModelColumnClause x); - - void endVisit(ModelClause.ModelColumnClause x); - - boolean visit(ModelClause.QueryPartitionClause x); - - void endVisit(ModelClause.QueryPartitionClause x); - - boolean visit(ModelClause.ModelColumn x); - - void endVisit(ModelClause.ModelColumn x); - - boolean visit(ModelClause.ModelRulesClause x); - - void endVisit(ModelClause.ModelRulesClause x); - - boolean visit(ModelClause.CellAssignmentItem x); - - void endVisit(ModelClause.CellAssignmentItem x); - - boolean visit(ModelClause.CellAssignment x); - - void endVisit(ModelClause.CellAssignment x); - - boolean visit(ModelClause x); - - void endVisit(ModelClause x); - - boolean visit(OracleMergeStatement x); - - void endVisit(OracleMergeStatement x); - - boolean visit(OracleMergeStatement.MergeUpdateClause x); - - void endVisit(OracleMergeStatement.MergeUpdateClause x); - - boolean visit(OracleMergeStatement.MergeInsertClause x); - - void endVisit(OracleMergeStatement.MergeInsertClause x); - - boolean visit(OracleErrorLoggingClause x); - - void endVisit(OracleErrorLoggingClause x); - - boolean visit(OracleReturningClause x); - - void endVisit(OracleReturningClause x); - - boolean visit(OracleInsertStatement x); - - void endVisit(OracleInsertStatement x); - - boolean visit(InsertIntoClause x); - - void endVisit(InsertIntoClause x); - - boolean visit(OracleMultiInsertStatement x); - - void endVisit(OracleMultiInsertStatement x); - - boolean visit(ConditionalInsertClause x); - - void endVisit(ConditionalInsertClause x); - - boolean visit(ConditionalInsertClauseItem x); - - void endVisit(ConditionalInsertClauseItem x); - - boolean visit(OracleSelectQueryBlock x); - - void endVisit(OracleSelectQueryBlock x); - - boolean visit(OracleBlockStatement x); - - void endVisit(OracleBlockStatement x); - - boolean visit(OracleLockTableStatement x); - - void endVisit(OracleLockTableStatement x); - - boolean visit(OracleAlterSessionStatement x); - - void endVisit(OracleAlterSessionStatement x); - - boolean visit(OracleExprStatement x); - - void endVisit(OracleExprStatement x); - - boolean visit(OracleDatetimeExpr x); - - void endVisit(OracleDatetimeExpr x); - - boolean visit(OracleSysdateExpr x); - - void endVisit(OracleSysdateExpr x); - - boolean visit(OracleExceptionStatement x); - - void endVisit(OracleExceptionStatement x); - - boolean visit(OracleExceptionStatement.Item x); - - void endVisit(OracleExceptionStatement.Item x); - - boolean visit(OracleArgumentExpr x); - - void endVisit(OracleArgumentExpr x); - - boolean visit(OracleSetTransactionStatement x); - - void endVisit(OracleSetTransactionStatement x); - - boolean visit(OracleGrantStatement x); - - void endVisit(OracleGrantStatement x); - - boolean visit(OracleExplainStatement x); - - void endVisit(OracleExplainStatement x); - - boolean visit(OracleAlterProcedureStatement x); - - void endVisit(OracleAlterProcedureStatement x); - - boolean visit(OracleAlterTableDropPartition x); - - void endVisit(OracleAlterTableDropPartition x); - - boolean visit(OracleAlterTableTruncatePartition x); - - void endVisit(OracleAlterTableTruncatePartition x); - - boolean visit(OracleAlterTableStatement x); - - void endVisit(OracleAlterTableStatement x); - - boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x); - - void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x); - - boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x); - - void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x); - - boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x); - - void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x); - - boolean visit(OracleAlterTableSplitPartition x); - - void endVisit(OracleAlterTableSplitPartition x); - - boolean visit(OracleAlterTableModify x); - - void endVisit(OracleAlterTableModify x); - - boolean visit(OracleCreateIndexStatement x); - - void endVisit(OracleCreateIndexStatement x); - - boolean visit(OracleForStatement x); - - void endVisit(OracleForStatement x); - - boolean visit(Else x); - - void endVisit(Else x); - - boolean visit(ElseIf x); - - void endVisit(ElseIf x); - - boolean visit(OracleIfStatement x); - - void endVisit(OracleIfStatement x); - - boolean visit(OracleRangeExpr x); - - void endVisit(OracleRangeExpr x); - - boolean visit(OracleAlterIndexStatement x); - - void endVisit(OracleAlterIndexStatement x); - - boolean visit(OracleAlterTableAddConstaint x); - - void endVisit(OracleAlterTableAddConstaint x); - - boolean visit(OracleAlterTableRenameTo x); - - void endVisit(OracleAlterTableRenameTo x); - - boolean visit(OraclePrimaryKey x); - - void endVisit(OraclePrimaryKey x); - - boolean visit(OracleCreateTableStatement x); - - void endVisit(OracleCreateTableStatement x); - - boolean visit(OracleAlterIndexStatement.Rebuild x); - - void endVisit(OracleAlterIndexStatement.Rebuild x); - - boolean visit(OracleStorageClause x); - - void endVisit(OracleStorageClause x); - - boolean visit(OracleGotoStatement x); - - void endVisit(OracleGotoStatement x); - - boolean visit(OracleLabelStatement x); - - void endVisit(OracleLabelStatement x); - - boolean visit(OracleParameter x); - - void endVisit(OracleParameter x); - - boolean visit(OracleCommitStatement x); - - void endVisit(OracleCommitStatement x); - - boolean visit(OracleAlterTriggerStatement x); - - void endVisit(OracleAlterTriggerStatement x); - - boolean visit(OracleAlterSynonymStatement x); - - void endVisit(OracleAlterSynonymStatement x); - - boolean visit(OracleAlterViewStatement x); - - void endVisit(OracleAlterViewStatement x); - - boolean visit(AsOfSnapshotClause x); - - void endVisit(AsOfSnapshotClause x); - - boolean visit(OracleAlterTableMoveTablespace x); - - void endVisit(OracleAlterTableMoveTablespace x); - - boolean visit(OracleSizeExpr x); - - void endVisit(OracleSizeExpr x); - - boolean visit(OracleFileSpecification x); - - void endVisit(OracleFileSpecification x); - - boolean visit(OracleAlterTablespaceAddDataFile x); - - void endVisit(OracleAlterTablespaceAddDataFile x); - - boolean visit(OracleAlterTablespaceStatement x); - - void endVisit(OracleAlterTablespaceStatement x); - - boolean visit(OracleTruncateStatement x); - - void endVisit(OracleTruncateStatement x); - - boolean visit(OracleCreateSequenceStatement x); - - void endVisit(OracleCreateSequenceStatement x); - - boolean visit(OracleRangeValuesClause x); - - void endVisit(OracleRangeValuesClause x); - - boolean visit(OraclePartitionByRangeClause x); - - void endVisit(OraclePartitionByRangeClause x); - - boolean visit(OracleLoopStatement x); - - void endVisit(OracleLoopStatement x); - - boolean visit(OracleExitStatement x); - - void endVisit(OracleExitStatement x); - - boolean visit(OracleFetchStatement x); - - void endVisit(OracleFetchStatement x); - - boolean visit(OracleSavePointStatement x); - - void endVisit(OracleSavePointStatement x); - - boolean visit(OracleCreateProcedureStatement x); - - void endVisit(OracleCreateProcedureStatement x); - - boolean visit(OracleCreateDatabaseDbLinkStatement x); - - void endVisit(OracleCreateDatabaseDbLinkStatement x); - - boolean visit(OracleDropDatabaseLinkStatement x); - - void endVisit(OracleDropDatabaseLinkStatement x); - - boolean visit(OracleDataTypeTimestamp x); - - void endVisit(OracleDataTypeTimestamp x); - - boolean visit(OracleDataTypeIntervalYear x); - - void endVisit(OracleDataTypeIntervalYear x); - - boolean visit(OracleDataTypeIntervalDay x); - - void endVisit(OracleDataTypeIntervalDay x); - - boolean visit(OracleDropSequenceStatement x); - - void endVisit(OracleDropSequenceStatement x); - - boolean visit(OracleUsingIndexClause x); - - void endVisit(OracleUsingIndexClause x); - - boolean visit(OracleLobStorageClause x); - - void endVisit(OracleLobStorageClause x); -} +/* + * 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.visitor; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +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.OracleUnique; +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 { + + void endVisit(OracleAggregateExpr astNode); + + void endVisit(OraclePLSQLCommitStatement astNode); + + void endVisit(OracleAnalytic x); + + void endVisit(OracleAnalyticWindowing x); + + void endVisit(OracleDateExpr x); + + void endVisit(OracleDbLinkExpr x); + + void endVisit(OracleDeleteStatement x); + + void endVisit(OracleExtractExpr x); + + void endVisit(OracleIntervalExpr x); + + void endVisit(OracleOrderBy x); + + void endVisit(OracleOuterExpr x); + + void endVisit(OracleSelectForUpdate x); + + void endVisit(OracleSelectHierachicalQueryClause x); + + void endVisit(OracleSelectJoin x); + + void endVisit(OracleOrderByItem x); + + void endVisit(OracleSelectPivot x); + + void endVisit(OracleSelectPivot.Item x); + + void endVisit(OracleSelectRestriction.CheckOption x); + + void endVisit(OracleSelectRestriction.ReadOnly x); + + void endVisit(OracleSelectSubqueryTableSource x); + + void endVisit(OracleSelectUnPivot x); + + void endVisit(OracleTimestampExpr x); + + void endVisit(OracleUpdateStatement x); + + boolean visit(OracleAggregateExpr astNode); + + boolean visit(OraclePLSQLCommitStatement astNode); + + boolean visit(OracleAnalytic x); + + boolean visit(OracleAnalyticWindowing x); + + boolean visit(OracleDateExpr x); + + boolean visit(OracleDbLinkExpr x); + + boolean visit(OracleDeleteStatement x); + + boolean visit(OracleExtractExpr x); + + boolean visit(OracleIntervalExpr x); + + boolean visit(OracleOrderBy x); + + boolean visit(OracleOuterExpr x); + + boolean visit(OracleSelectForUpdate x); + + boolean visit(OracleSelectHierachicalQueryClause x); + + boolean visit(OracleSelectJoin x); + + boolean visit(OracleOrderByItem x); + + boolean visit(OracleSelectPivot x); + + boolean visit(OracleSelectPivot.Item x); + + boolean visit(OracleSelectRestriction.CheckOption x); + + boolean visit(OracleSelectRestriction.ReadOnly x); + + boolean visit(OracleSelectSubqueryTableSource x); + + boolean visit(OracleSelectUnPivot x); + + boolean visit(OracleTimestampExpr x); + + boolean visit(OracleUpdateStatement x); + + boolean visit(SampleClause x); + + void endVisit(SampleClause x); + + boolean visit(OracleSelectTableReference x); + + void endVisit(OracleSelectTableReference x); + + boolean visit(PartitionExtensionClause x); + + void endVisit(PartitionExtensionClause x); + + boolean visit(VersionsFlashbackQueryClause x); + + void endVisit(VersionsFlashbackQueryClause x); + + boolean visit(AsOfFlashbackQueryClause x); + + void endVisit(AsOfFlashbackQueryClause x); + + boolean visit(GroupingSetExpr x); + + void endVisit(GroupingSetExpr x); + + boolean visit(OracleWithSubqueryEntry x); + + void endVisit(OracleWithSubqueryEntry x); + + boolean visit(SearchClause x); + + void endVisit(SearchClause x); + + boolean visit(CycleClause x); + + void endVisit(CycleClause x); + + boolean visit(OracleBinaryFloatExpr x); + + void endVisit(OracleBinaryFloatExpr x); + + boolean visit(OracleBinaryDoubleExpr x); + + void endVisit(OracleBinaryDoubleExpr x); + + boolean visit(OracleSelect x); + + void endVisit(OracleSelect x); + + boolean visit(OracleCursorExpr x); + + void endVisit(OracleCursorExpr x); + + boolean visit(OracleIsSetExpr x); + + void endVisit(OracleIsSetExpr x); + + boolean visit(ModelClause.ReturnRowsClause x); + + void endVisit(ModelClause.ReturnRowsClause x); + + boolean visit(ModelClause.MainModelClause x); + + void endVisit(ModelClause.MainModelClause x); + + boolean visit(ModelClause.ModelColumnClause x); + + void endVisit(ModelClause.ModelColumnClause x); + + boolean visit(ModelClause.QueryPartitionClause x); + + void endVisit(ModelClause.QueryPartitionClause x); + + boolean visit(ModelClause.ModelColumn x); + + void endVisit(ModelClause.ModelColumn x); + + boolean visit(ModelClause.ModelRulesClause x); + + void endVisit(ModelClause.ModelRulesClause x); + + boolean visit(ModelClause.CellAssignmentItem x); + + void endVisit(ModelClause.CellAssignmentItem x); + + boolean visit(ModelClause.CellAssignment x); + + void endVisit(ModelClause.CellAssignment x); + + boolean visit(ModelClause x); + + void endVisit(ModelClause x); + + boolean visit(OracleMergeStatement x); + + void endVisit(OracleMergeStatement x); + + boolean visit(OracleMergeStatement.MergeUpdateClause x); + + void endVisit(OracleMergeStatement.MergeUpdateClause x); + + boolean visit(OracleMergeStatement.MergeInsertClause x); + + void endVisit(OracleMergeStatement.MergeInsertClause x); + + boolean visit(OracleErrorLoggingClause x); + + void endVisit(OracleErrorLoggingClause x); + + boolean visit(OracleReturningClause x); + + void endVisit(OracleReturningClause x); + + boolean visit(OracleInsertStatement x); + + void endVisit(OracleInsertStatement x); + + boolean visit(InsertIntoClause x); + + void endVisit(InsertIntoClause x); + + boolean visit(OracleMultiInsertStatement x); + + void endVisit(OracleMultiInsertStatement x); + + boolean visit(ConditionalInsertClause x); + + void endVisit(ConditionalInsertClause x); + + boolean visit(ConditionalInsertClauseItem x); + + void endVisit(ConditionalInsertClauseItem x); + + boolean visit(OracleSelectQueryBlock x); + + void endVisit(OracleSelectQueryBlock x); + + boolean visit(OracleBlockStatement x); + + void endVisit(OracleBlockStatement x); + + boolean visit(OracleLockTableStatement x); + + void endVisit(OracleLockTableStatement x); + + boolean visit(OracleAlterSessionStatement x); + + void endVisit(OracleAlterSessionStatement x); + + boolean visit(OracleExprStatement x); + + void endVisit(OracleExprStatement x); + + boolean visit(OracleDatetimeExpr x); + + void endVisit(OracleDatetimeExpr x); + + boolean visit(OracleSysdateExpr x); + + void endVisit(OracleSysdateExpr x); + + boolean visit(OracleExceptionStatement x); + + void endVisit(OracleExceptionStatement x); + + boolean visit(OracleExceptionStatement.Item x); + + void endVisit(OracleExceptionStatement.Item x); + + boolean visit(OracleArgumentExpr x); + + void endVisit(OracleArgumentExpr x); + + boolean visit(OracleSetTransactionStatement x); + + void endVisit(OracleSetTransactionStatement x); + + boolean visit(OracleGrantStatement x); + + void endVisit(OracleGrantStatement x); + + boolean visit(OracleExplainStatement x); + + void endVisit(OracleExplainStatement x); + + boolean visit(OracleAlterProcedureStatement x); + + void endVisit(OracleAlterProcedureStatement x); + + boolean visit(OracleAlterTableDropPartition x); + + void endVisit(OracleAlterTableDropPartition x); + + boolean visit(OracleAlterTableTruncatePartition x); + + void endVisit(OracleAlterTableTruncatePartition x); + + boolean visit(OracleAlterTableStatement x); + + void endVisit(OracleAlterTableStatement x); + + boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x); + + void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x); + + boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x); + + void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x); + + boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x); + + void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x); + + boolean visit(OracleAlterTableSplitPartition x); + + void endVisit(OracleAlterTableSplitPartition x); + + boolean visit(OracleAlterTableModify x); + + void endVisit(OracleAlterTableModify x); + + boolean visit(OracleCreateIndexStatement x); + + void endVisit(OracleCreateIndexStatement x); + + boolean visit(OracleForStatement x); + + void endVisit(OracleForStatement x); + + boolean visit(Else x); + + void endVisit(Else x); + + boolean visit(ElseIf x); + + void endVisit(ElseIf x); + + boolean visit(OracleIfStatement x); + + void endVisit(OracleIfStatement x); + + boolean visit(OracleRangeExpr x); + + void endVisit(OracleRangeExpr x); + + boolean visit(OracleAlterIndexStatement x); + + void endVisit(OracleAlterIndexStatement x); + + boolean visit(OracleAlterTableAddConstaint x); + + void endVisit(OracleAlterTableAddConstaint x); + + boolean visit(OracleAlterTableRenameTo x); + + void endVisit(OracleAlterTableRenameTo x); + + boolean visit(OraclePrimaryKey x); + + void endVisit(OraclePrimaryKey x); + + boolean visit(OracleCreateTableStatement x); + + void endVisit(OracleCreateTableStatement x); + + boolean visit(OracleAlterIndexStatement.Rebuild x); + + void endVisit(OracleAlterIndexStatement.Rebuild x); + + boolean visit(OracleStorageClause x); + + void endVisit(OracleStorageClause x); + + boolean visit(OracleGotoStatement x); + + void endVisit(OracleGotoStatement x); + + boolean visit(OracleLabelStatement x); + + void endVisit(OracleLabelStatement x); + + boolean visit(OracleParameter x); + + void endVisit(OracleParameter x); + + boolean visit(OracleCommitStatement x); + + void endVisit(OracleCommitStatement x); + + boolean visit(OracleAlterTriggerStatement x); + + void endVisit(OracleAlterTriggerStatement x); + + boolean visit(OracleAlterSynonymStatement x); + + void endVisit(OracleAlterSynonymStatement x); + + boolean visit(OracleAlterViewStatement x); + + void endVisit(OracleAlterViewStatement x); + + boolean visit(AsOfSnapshotClause x); + + void endVisit(AsOfSnapshotClause x); + + boolean visit(OracleAlterTableMoveTablespace x); + + void endVisit(OracleAlterTableMoveTablespace x); + + boolean visit(OracleSizeExpr x); + + void endVisit(OracleSizeExpr x); + + boolean visit(OracleFileSpecification x); + + void endVisit(OracleFileSpecification x); + + boolean visit(OracleAlterTablespaceAddDataFile x); + + void endVisit(OracleAlterTablespaceAddDataFile x); + + boolean visit(OracleAlterTablespaceStatement x); + + void endVisit(OracleAlterTablespaceStatement x); + + boolean visit(OracleTruncateStatement x); + + void endVisit(OracleTruncateStatement x); + + boolean visit(OracleCreateSequenceStatement x); + + void endVisit(OracleCreateSequenceStatement x); + + boolean visit(OracleRangeValuesClause x); + + void endVisit(OracleRangeValuesClause x); + + boolean visit(OraclePartitionByRangeClause x); + + void endVisit(OraclePartitionByRangeClause x); + + boolean visit(OracleLoopStatement x); + + void endVisit(OracleLoopStatement x); + + boolean visit(OracleExitStatement x); + + void endVisit(OracleExitStatement x); + + boolean visit(OracleFetchStatement x); + + void endVisit(OracleFetchStatement x); + + boolean visit(OracleSavePointStatement x); + + void endVisit(OracleSavePointStatement x); + + boolean visit(OracleCreateProcedureStatement x); + + void endVisit(OracleCreateProcedureStatement x); + + boolean visit(OracleCreateDatabaseDbLinkStatement x); + + void endVisit(OracleCreateDatabaseDbLinkStatement x); + + boolean visit(OracleDropDatabaseLinkStatement x); + + void endVisit(OracleDropDatabaseLinkStatement x); + + boolean visit(OracleDataTypeTimestamp x); + + void endVisit(OracleDataTypeTimestamp x); + + boolean visit(OracleDataTypeIntervalYear x); + + void endVisit(OracleDataTypeIntervalYear x); + + boolean visit(OracleDataTypeIntervalDay x); + + void endVisit(OracleDataTypeIntervalDay x); + + boolean visit(OracleDropSequenceStatement x); + + void endVisit(OracleDropSequenceStatement x); + + boolean visit(OracleUsingIndexClause x); + + void endVisit(OracleUsingIndexClause x); + + boolean visit(OracleLobStorageClause x); + + void endVisit(OracleLobStorageClause x); + + boolean visit(OracleUnique x); + + void endVisit(OracleUnique x); +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index 6d25062396..f3da021302 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -1,1390 +1,1389 @@ -/* - * 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.visitor; - -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -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 { - - public boolean visit(OracleSelect x) { - return true; - } - - public void endVisit(OracleSelect x) { - } - - @Override - public void endVisit(OracleAggregateExpr astNode) { - - } - - @Override - public void endVisit(OracleConstraintState astNode) { - - } - - @Override - public void endVisit(OraclePLSQLCommitStatement astNode) { - - } - - @Override - public void endVisit(OracleAnalytic x) { - - } - - @Override - public void endVisit(OracleAnalyticWindowing x) { - - } - - @Override - public void endVisit(OracleDateExpr x) { - - } - - @Override - public void endVisit(OracleDbLinkExpr x) { - - } - - @Override - public void endVisit(OracleDeleteStatement x) { - - } - - @Override - public void endVisit(OracleExtractExpr x) { - - } - - @Override - public void endVisit(OracleIntervalExpr x) { - - } - - @Override - public void endVisit(OracleOrderBy x) { - - } - - @Override - public void endVisit(OracleOuterExpr x) { - - } - - @Override - public void endVisit(OracleSelectForUpdate x) { - - } - - @Override - public void endVisit(OracleSelectHierachicalQueryClause x) { - - } - - @Override - public void endVisit(OracleSelectJoin x) { - - } - - @Override - public void endVisit(OracleOrderByItem x) { - - } - - @Override - public void endVisit(OracleSelectPivot x) { - - } - - @Override - public void endVisit(Item x) { - - } - - @Override - public void endVisit(CheckOption x) { - - } - - @Override - public void endVisit(ReadOnly x) { - - } - - @Override - public void endVisit(OracleSelectSubqueryTableSource x) { - - } - - @Override - public void endVisit(OracleSelectUnPivot x) { - - } - - @Override - public void endVisit(OracleTimestampExpr x) { - - } - - @Override - public void endVisit(OracleUpdateStatement x) { - - } - - @Override - public boolean visit(OracleAggregateExpr astNode) { - - return true; - } - - @Override - public boolean visit(OracleConstraintState astNode) { - - return true; - } - - @Override - public boolean visit(OraclePLSQLCommitStatement astNode) { - - return true; - } - - @Override - public boolean visit(OracleAnalytic x) { - - return true; - } - - @Override - public boolean visit(OracleAnalyticWindowing x) { - - return true; - } - - @Override - public boolean visit(OracleDateExpr x) { - - return true; - } - - @Override - public boolean visit(OracleDbLinkExpr x) { - - return true; - } - - @Override - public boolean visit(OracleDeleteStatement x) { - - return true; - } - - @Override - public boolean visit(OracleExtractExpr x) { - - return true; - } - - @Override - public boolean visit(OracleIntervalExpr x) { - - return true; - } - - @Override - public boolean visit(OracleOrderBy x) { - - return true; - } - - @Override - public boolean visit(OracleOuterExpr x) { - - return true; - } - - @Override - public boolean visit(OracleSelectForUpdate x) { - - return true; - } - - @Override - public boolean visit(OracleSelectHierachicalQueryClause x) { - - return true; - } - - @Override - public boolean visit(OracleSelectJoin x) { - - return true; - } - - @Override - public boolean visit(OracleOrderByItem x) { - - return true; - } - - @Override - public boolean visit(OracleSelectPivot x) { - - return true; - } - - @Override - public boolean visit(Item x) { - - return true; - } - - @Override - public boolean visit(CheckOption x) { - - return true; - } - - @Override - public boolean visit(ReadOnly x) { - - return true; - } - - @Override - public boolean visit(OracleSelectSubqueryTableSource x) { - - return true; - } - - @Override - public boolean visit(OracleSelectUnPivot x) { - - return true; - } - - @Override - public boolean visit(OracleTimestampExpr x) { - - return true; - } - - @Override - public boolean visit(OracleUpdateStatement x) { - - return true; - } - - @Override - public boolean visit(SampleClause x) { - - return true; - } - - @Override - public void endVisit(SampleClause x) { - - } - - @Override - public boolean visit(OracleSelectTableReference x) { - - return true; - } - - @Override - public void endVisit(OracleSelectTableReference x) { - - } - - @Override - public boolean visit(PartitionExtensionClause x) { - - return true; - } - - @Override - public void endVisit(PartitionExtensionClause x) { - - } - - @Override - public boolean visit(VersionsFlashbackQueryClause x) { - - return true; - } - - @Override - public void endVisit(VersionsFlashbackQueryClause x) { - - } - - @Override - public boolean visit(AsOfFlashbackQueryClause x) { - - return true; - } - - @Override - public void endVisit(AsOfFlashbackQueryClause x) { - - } - - @Override - public boolean visit(GroupingSetExpr x) { - - return true; - } - - @Override - public void endVisit(GroupingSetExpr x) { - - } - - @Override - public boolean visit(OracleWithSubqueryEntry x) { - - return true; - } - - @Override - public void endVisit(OracleWithSubqueryEntry x) { - - } - - @Override - public boolean visit(SearchClause x) { - - return true; - } - - @Override - public void endVisit(SearchClause x) { - - } - - @Override - public boolean visit(CycleClause x) { - - return true; - } - - @Override - public void endVisit(CycleClause x) { - - } - - @Override - public boolean visit(OracleBinaryFloatExpr x) { - - return true; - } - - @Override - public void endVisit(OracleBinaryFloatExpr x) { - - } - - @Override - public boolean visit(OracleBinaryDoubleExpr x) { - - return true; - } - - @Override - public void endVisit(OracleBinaryDoubleExpr x) { - - } - - @Override - public boolean visit(OracleCursorExpr x) { - return true; - } - - @Override - public void endVisit(OracleCursorExpr x) { - - } - - @Override - public boolean visit(OracleIsSetExpr x) { - return true; - } - - @Override - public void endVisit(OracleIsSetExpr x) { - - } - - @Override - public boolean visit(ReturnRowsClause x) { - return true; - } - - @Override - public void endVisit(ReturnRowsClause x) { - - } - - @Override - public boolean visit(ModelClause x) { - return true; - } - - @Override - public void endVisit(ModelClause x) { - - } - - @Override - public boolean visit(MainModelClause x) { - return true; - } - - @Override - public void endVisit(MainModelClause x) { - - } - - @Override - public boolean visit(ModelColumnClause x) { - return true; - } - - @Override - public void endVisit(ModelColumnClause x) { - - } - - @Override - public boolean visit(QueryPartitionClause x) { - return true; - } - - @Override - public void endVisit(QueryPartitionClause x) { - - } - - @Override - public boolean visit(ModelColumn x) { - return true; - } - - @Override - public void endVisit(ModelColumn x) { - - } - - @Override - public boolean visit(ModelRulesClause x) { - return true; - } - - @Override - public void endVisit(ModelRulesClause x) { - - } - - @Override - public boolean visit(CellAssignmentItem x) { - return true; - } - - @Override - public void endVisit(CellAssignmentItem x) { - - } - - @Override - public boolean visit(CellAssignment x) { - return true; - } - - @Override - public void endVisit(CellAssignment x) { - - } - - @Override - public boolean visit(OracleMergeStatement x) { - return true; - } - - @Override - public void endVisit(OracleMergeStatement x) { - } - - @Override - public boolean visit(MergeUpdateClause x) { - return true; - } - - @Override - public void endVisit(MergeUpdateClause x) { - - } - - @Override - public boolean visit(MergeInsertClause x) { - return true; - } - - @Override - public void endVisit(MergeInsertClause x) { - - } - - @Override - public boolean visit(OracleErrorLoggingClause x) { - return true; - } - - @Override - public void endVisit(OracleErrorLoggingClause x) { - - } - - @Override - public boolean visit(OracleReturningClause x) { - return true; - } - - @Override - public void endVisit(OracleReturningClause x) { - - } - - @Override - public boolean visit(OracleInsertStatement x) { - return true; - } - - @Override - public void endVisit(OracleInsertStatement x) { - - } - - @Override - public boolean visit(InsertIntoClause x) { - return true; - } - - @Override - public void endVisit(InsertIntoClause x) { - - } - - @Override - public boolean visit(OracleMultiInsertStatement x) { - return true; - } - - @Override - public void endVisit(OracleMultiInsertStatement x) { - - } - - @Override - public boolean visit(ConditionalInsertClause x) { - return true; - } - - @Override - public void endVisit(ConditionalInsertClause x) { - - } - - @Override - public boolean visit(ConditionalInsertClauseItem x) { - return true; - } - - @Override - public void endVisit(ConditionalInsertClauseItem x) { - - } - - @Override - public boolean visit(OracleSelectQueryBlock x) { - return true; - } - - @Override - public void endVisit(OracleSelectQueryBlock x) { - - } - - @Override - public boolean visit(OracleBlockStatement x) { - return true; - } - - @Override - public void endVisit(OracleBlockStatement x) { - - } - - @Override - public boolean visit(OracleLockTableStatement x) { - return true; - } - - @Override - public void endVisit(OracleLockTableStatement x) { - - } - - @Override - public boolean visit(OracleAlterSessionStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterSessionStatement x) { - - } - - @Override - public boolean visit(OracleExprStatement x) { - return true; - } - - @Override - public void endVisit(OracleExprStatement x) { - - } - - @Override - public boolean visit(OracleDatetimeExpr x) { - return true; - } - - @Override - public void endVisit(OracleDatetimeExpr x) { - - } - - @Override - public boolean visit(OracleSysdateExpr x) { - return true; - } - - @Override - public void endVisit(OracleSysdateExpr x) { - - } - - @Override - public boolean visit(OracleExceptionStatement x) { - return true; - } - - @Override - public void endVisit(OracleExceptionStatement x) { - - } - - @Override - public boolean visit(OracleExceptionStatement.Item x) { - return true; - } - - @Override - public void endVisit(OracleExceptionStatement.Item x) { - - } - - @Override - public boolean visit(OracleArgumentExpr x) { - return true; - } - - @Override - public void endVisit(OracleArgumentExpr x) { - - } - - @Override - public boolean visit(OracleSetTransactionStatement x) { - return true; - } - - @Override - public void endVisit(OracleSetTransactionStatement x) { - - } - - @Override - public boolean visit(OracleGrantStatement x) { - return true; - } - - @Override - public void endVisit(OracleGrantStatement x) { - - } - - @Override - public boolean visit(OracleExplainStatement x) { - return true; - } - - @Override - public void endVisit(OracleExplainStatement x) { - - } - - @Override - public boolean visit(OracleAlterProcedureStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterProcedureStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableDropPartition x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableDropPartition x) { - - } - - @Override - public boolean visit(OracleAlterTableTruncatePartition x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableTruncatePartition x) { - - } - - @Override - public boolean visit(OracleAlterTableStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition x) { - - } - - @Override - public boolean visit(OracleAlterTableModify x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableModify x) { - - } - - @Override - public boolean visit(OracleCreateIndexStatement x) { - return true; - } - - @Override - public void endVisit(OracleCreateIndexStatement x) { - - } - - @Override - public boolean visit(OracleAlterIndexStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterIndexStatement x) { - - } - - @Override - public boolean visit(OracleForStatement x) { - return true; - } - - @Override - public void endVisit(OracleForStatement x) { - - } - - @Override - public boolean visit(OracleAlterIndexStatement.Rebuild x) { - return true; - } - - @Override - public void endVisit(OracleAlterIndexStatement.Rebuild x) { - - } - - @Override - public boolean visit(Else x) { - return true; - } - - @Override - public void endVisit(Else x) { - - } - - @Override - public boolean visit(ElseIf x) { - return true; - } - - @Override - public void endVisit(ElseIf x) { - - } - - @Override - public boolean visit(OracleIfStatement x) { - return true; - } - - @Override - public void endVisit(OracleIfStatement x) { - - } - - @Override - public boolean visit(OracleRangeExpr x) { - return true; - } - - @Override - public void endVisit(OracleRangeExpr x) { - - } - - @Override - public boolean visit(OracleAlterTableAddConstaint x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableAddConstaint x) { - - } - - @Override - public boolean visit(OraclePrimaryKey x) { - return true; - } - - @Override - public void endVisit(OraclePrimaryKey x) { - - } - - @Override - public boolean visit(OracleCreateTableStatement x) { - return true; - } - - @Override - public void endVisit(OracleCreateTableStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableRenameTo x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableRenameTo x) { - - } - - @Override - public boolean visit(OracleStorageClause x) { - return true; - } - - @Override - public void endVisit(OracleStorageClause x) { - - } - - @Override - public boolean visit(OracleGotoStatement x) { - return true; - } - - @Override - public void endVisit(OracleGotoStatement x) { - - } - - @Override - public boolean visit(OracleLabelStatement x) { - return true; - } - - @Override - public void endVisit(OracleLabelStatement x) { - - } - - @Override - public boolean visit(OracleParameter x) { - return true; - } - - @Override - public void endVisit(OracleParameter x) { - - } - - @Override - public boolean visit(OracleCommitStatement x) { - return true; - } - - @Override - public void endVisit(OracleCommitStatement x) { - - } - - @Override - public boolean visit(OracleAlterTriggerStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterTriggerStatement x) { - - } - - @Override - public boolean visit(OracleAlterSynonymStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterSynonymStatement x) { - - } - - @Override - public boolean visit(AsOfSnapshotClause x) { - return true; - } - - @Override - public void endVisit(AsOfSnapshotClause x) { - - } - - @Override - public boolean visit(OracleAlterViewStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterViewStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableMoveTablespace x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableMoveTablespace x) { - - } - - @Override - public boolean visit(OracleSizeExpr x) { - return true; - } - - @Override - public void endVisit(OracleSizeExpr x) { - - } - - @Override - public boolean visit(OracleFileSpecification x) { - return true; - } - - @Override - public void endVisit(OracleFileSpecification x) { - - } - - @Override - public boolean visit(OracleAlterTablespaceAddDataFile x) { - return true; - } - - @Override - public void endVisit(OracleAlterTablespaceAddDataFile x) { - - } - - @Override - public boolean visit(OracleAlterTablespaceStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterTablespaceStatement x) { - - } - - @Override - public boolean visit(OracleTruncateStatement x) { - return true; - } - - @Override - public void endVisit(OracleTruncateStatement x) { - - } - - @Override - public boolean visit(OracleCreateSequenceStatement x) { - return true; - } - - @Override - public void endVisit(OracleCreateSequenceStatement x) { - - } - - @Override - public boolean visit(OracleRangeValuesClause x) { - return true; - } - - @Override - public void endVisit(OracleRangeValuesClause x) { - - } - - @Override - public boolean visit(OraclePartitionByRangeClause x) { - return true; - } - - @Override - public void endVisit(OraclePartitionByRangeClause x) { - - } - - @Override - public boolean visit(OracleLoopStatement x) { - return true; - } - - @Override - public void endVisit(OracleLoopStatement x) { - - } - - @Override - public boolean visit(OracleExitStatement x) { - return true; - } - - @Override - public void endVisit(OracleExitStatement x) { - - } - - @Override - public boolean visit(OracleFetchStatement x) { - return true; - } - - @Override - public void endVisit(OracleFetchStatement x) { - - } - - @Override - public boolean visit(OracleSavePointStatement x) { - return true; - } - - @Override - public void endVisit(OracleSavePointStatement x) { - - } - - @Override - public boolean visit(OracleCreateProcedureStatement x) { - return true; - } - - @Override - public void endVisit(OracleCreateProcedureStatement x) { - - } - - @Override - public boolean visit(OracleCreateDatabaseDbLinkStatement x) { - return true; - } - - @Override - public void endVisit(OracleCreateDatabaseDbLinkStatement x) { - - } - - @Override - public boolean visit(OracleDropDatabaseLinkStatement x) { - return true; - } - - @Override - public void endVisit(OracleDropDatabaseLinkStatement x) { - - } - - @Override - public boolean visit(OracleDataTypeTimestamp x) { - return true; - } - - @Override - public void endVisit(OracleDataTypeTimestamp x) { - - } - - @Override - public boolean visit(OracleDataTypeIntervalYear x) { - return true; - } - - @Override - public void endVisit(OracleDataTypeIntervalYear x) { - - } - - @Override - public boolean visit(OracleDataTypeIntervalDay x) { - return true; - } - - @Override - public void endVisit(OracleDataTypeIntervalDay x) { - - } - - @Override - public boolean visit(OracleDropSequenceStatement x) { - return true; - } - - @Override - public void endVisit(OracleDropSequenceStatement x) { - - } - - @Override - public boolean visit(OracleUsingIndexClause x) { - return true; - } - - @Override - public void endVisit(OracleUsingIndexClause x) { - - } - - @Override - public boolean visit(OracleLobStorageClause x) { - return true; - } - - @Override - public void endVisit(OracleLobStorageClause x) { - - } - -} +/* + * 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.visitor; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +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.OracleUnique; +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 { + + public boolean visit(OracleSelect x) { + return true; + } + + public void endVisit(OracleSelect x) { + } + + @Override + public void endVisit(OracleAggregateExpr astNode) { + + } + + @Override + public void endVisit(OraclePLSQLCommitStatement astNode) { + + } + + @Override + public void endVisit(OracleAnalytic x) { + + } + + @Override + public void endVisit(OracleAnalyticWindowing x) { + + } + + @Override + public void endVisit(OracleDateExpr x) { + + } + + @Override + public void endVisit(OracleDbLinkExpr x) { + + } + + @Override + public void endVisit(OracleDeleteStatement x) { + + } + + @Override + public void endVisit(OracleExtractExpr x) { + + } + + @Override + public void endVisit(OracleIntervalExpr x) { + + } + + @Override + public void endVisit(OracleOrderBy x) { + + } + + @Override + public void endVisit(OracleOuterExpr x) { + + } + + @Override + public void endVisit(OracleSelectForUpdate x) { + + } + + @Override + public void endVisit(OracleSelectHierachicalQueryClause x) { + + } + + @Override + public void endVisit(OracleSelectJoin x) { + + } + + @Override + public void endVisit(OracleOrderByItem x) { + + } + + @Override + public void endVisit(OracleSelectPivot x) { + + } + + @Override + public void endVisit(Item x) { + + } + + @Override + public void endVisit(CheckOption x) { + + } + + @Override + public void endVisit(ReadOnly x) { + + } + + @Override + public void endVisit(OracleSelectSubqueryTableSource x) { + + } + + @Override + public void endVisit(OracleSelectUnPivot x) { + + } + + @Override + public void endVisit(OracleTimestampExpr x) { + + } + + @Override + public void endVisit(OracleUpdateStatement x) { + + } + + @Override + public boolean visit(OracleAggregateExpr astNode) { + + return true; + } + + @Override + public boolean visit(OraclePLSQLCommitStatement astNode) { + + return true; + } + + @Override + public boolean visit(OracleAnalytic x) { + + return true; + } + + @Override + public boolean visit(OracleAnalyticWindowing x) { + + return true; + } + + @Override + public boolean visit(OracleDateExpr x) { + + return true; + } + + @Override + public boolean visit(OracleDbLinkExpr x) { + + return true; + } + + @Override + public boolean visit(OracleDeleteStatement x) { + + return true; + } + + @Override + public boolean visit(OracleExtractExpr x) { + + return true; + } + + @Override + public boolean visit(OracleIntervalExpr x) { + + return true; + } + + @Override + public boolean visit(OracleOrderBy x) { + + return true; + } + + @Override + public boolean visit(OracleOuterExpr x) { + + return true; + } + + @Override + public boolean visit(OracleSelectForUpdate x) { + + return true; + } + + @Override + public boolean visit(OracleSelectHierachicalQueryClause x) { + + return true; + } + + @Override + public boolean visit(OracleSelectJoin x) { + + return true; + } + + @Override + public boolean visit(OracleOrderByItem x) { + + return true; + } + + @Override + public boolean visit(OracleSelectPivot x) { + + return true; + } + + @Override + public boolean visit(Item x) { + + return true; + } + + @Override + public boolean visit(CheckOption x) { + + return true; + } + + @Override + public boolean visit(ReadOnly x) { + + return true; + } + + @Override + public boolean visit(OracleSelectSubqueryTableSource x) { + + return true; + } + + @Override + public boolean visit(OracleSelectUnPivot x) { + + return true; + } + + @Override + public boolean visit(OracleTimestampExpr x) { + + return true; + } + + @Override + public boolean visit(OracleUpdateStatement x) { + + return true; + } + + @Override + public boolean visit(SampleClause x) { + + return true; + } + + @Override + public void endVisit(SampleClause x) { + + } + + @Override + public boolean visit(OracleSelectTableReference x) { + + return true; + } + + @Override + public void endVisit(OracleSelectTableReference x) { + + } + + @Override + public boolean visit(PartitionExtensionClause x) { + + return true; + } + + @Override + public void endVisit(PartitionExtensionClause x) { + + } + + @Override + public boolean visit(VersionsFlashbackQueryClause x) { + + return true; + } + + @Override + public void endVisit(VersionsFlashbackQueryClause x) { + + } + + @Override + public boolean visit(AsOfFlashbackQueryClause x) { + + return true; + } + + @Override + public void endVisit(AsOfFlashbackQueryClause x) { + + } + + @Override + public boolean visit(GroupingSetExpr x) { + + return true; + } + + @Override + public void endVisit(GroupingSetExpr x) { + + } + + @Override + public boolean visit(OracleWithSubqueryEntry x) { + + return true; + } + + @Override + public void endVisit(OracleWithSubqueryEntry x) { + + } + + @Override + public boolean visit(SearchClause x) { + + return true; + } + + @Override + public void endVisit(SearchClause x) { + + } + + @Override + public boolean visit(CycleClause x) { + + return true; + } + + @Override + public void endVisit(CycleClause x) { + + } + + @Override + public boolean visit(OracleBinaryFloatExpr x) { + + return true; + } + + @Override + public void endVisit(OracleBinaryFloatExpr x) { + + } + + @Override + public boolean visit(OracleBinaryDoubleExpr x) { + + return true; + } + + @Override + public void endVisit(OracleBinaryDoubleExpr x) { + + } + + @Override + public boolean visit(OracleCursorExpr x) { + return true; + } + + @Override + public void endVisit(OracleCursorExpr x) { + + } + + @Override + public boolean visit(OracleIsSetExpr x) { + return true; + } + + @Override + public void endVisit(OracleIsSetExpr x) { + + } + + @Override + public boolean visit(ReturnRowsClause x) { + return true; + } + + @Override + public void endVisit(ReturnRowsClause x) { + + } + + @Override + public boolean visit(ModelClause x) { + return true; + } + + @Override + public void endVisit(ModelClause x) { + + } + + @Override + public boolean visit(MainModelClause x) { + return true; + } + + @Override + public void endVisit(MainModelClause x) { + + } + + @Override + public boolean visit(ModelColumnClause x) { + return true; + } + + @Override + public void endVisit(ModelColumnClause x) { + + } + + @Override + public boolean visit(QueryPartitionClause x) { + return true; + } + + @Override + public void endVisit(QueryPartitionClause x) { + + } + + @Override + public boolean visit(ModelColumn x) { + return true; + } + + @Override + public void endVisit(ModelColumn x) { + + } + + @Override + public boolean visit(ModelRulesClause x) { + return true; + } + + @Override + public void endVisit(ModelRulesClause x) { + + } + + @Override + public boolean visit(CellAssignmentItem x) { + return true; + } + + @Override + public void endVisit(CellAssignmentItem x) { + + } + + @Override + public boolean visit(CellAssignment x) { + return true; + } + + @Override + public void endVisit(CellAssignment x) { + + } + + @Override + public boolean visit(OracleMergeStatement x) { + return true; + } + + @Override + public void endVisit(OracleMergeStatement x) { + } + + @Override + public boolean visit(MergeUpdateClause x) { + return true; + } + + @Override + public void endVisit(MergeUpdateClause x) { + + } + + @Override + public boolean visit(MergeInsertClause x) { + return true; + } + + @Override + public void endVisit(MergeInsertClause x) { + + } + + @Override + public boolean visit(OracleErrorLoggingClause x) { + return true; + } + + @Override + public void endVisit(OracleErrorLoggingClause x) { + + } + + @Override + public boolean visit(OracleReturningClause x) { + return true; + } + + @Override + public void endVisit(OracleReturningClause x) { + + } + + @Override + public boolean visit(OracleInsertStatement x) { + return true; + } + + @Override + public void endVisit(OracleInsertStatement x) { + + } + + @Override + public boolean visit(InsertIntoClause x) { + return true; + } + + @Override + public void endVisit(InsertIntoClause x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement x) { + return true; + } + + @Override + public void endVisit(OracleMultiInsertStatement x) { + + } + + @Override + public boolean visit(ConditionalInsertClause x) { + return true; + } + + @Override + public void endVisit(ConditionalInsertClause x) { + + } + + @Override + public boolean visit(ConditionalInsertClauseItem x) { + return true; + } + + @Override + public void endVisit(ConditionalInsertClauseItem x) { + + } + + @Override + public boolean visit(OracleSelectQueryBlock x) { + return true; + } + + @Override + public void endVisit(OracleSelectQueryBlock x) { + + } + + @Override + public boolean visit(OracleBlockStatement x) { + return true; + } + + @Override + public void endVisit(OracleBlockStatement x) { + + } + + @Override + public boolean visit(OracleLockTableStatement x) { + return true; + } + + @Override + public void endVisit(OracleLockTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterSessionStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterSessionStatement x) { + + } + + @Override + public boolean visit(OracleExprStatement x) { + return true; + } + + @Override + public void endVisit(OracleExprStatement x) { + + } + + @Override + public boolean visit(OracleDatetimeExpr x) { + return true; + } + + @Override + public void endVisit(OracleDatetimeExpr x) { + + } + + @Override + public boolean visit(OracleSysdateExpr x) { + return true; + } + + @Override + public void endVisit(OracleSysdateExpr x) { + + } + + @Override + public boolean visit(OracleExceptionStatement x) { + return true; + } + + @Override + public void endVisit(OracleExceptionStatement x) { + + } + + @Override + public boolean visit(OracleExceptionStatement.Item x) { + return true; + } + + @Override + public void endVisit(OracleExceptionStatement.Item x) { + + } + + @Override + public boolean visit(OracleArgumentExpr x) { + return true; + } + + @Override + public void endVisit(OracleArgumentExpr x) { + + } + + @Override + public boolean visit(OracleSetTransactionStatement x) { + return true; + } + + @Override + public void endVisit(OracleSetTransactionStatement x) { + + } + + @Override + public boolean visit(OracleGrantStatement x) { + return true; + } + + @Override + public void endVisit(OracleGrantStatement x) { + + } + + @Override + public boolean visit(OracleExplainStatement x) { + return true; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(OracleAlterTableStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableModify x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableModify x) { + + } + + @Override + public boolean visit(OracleCreateIndexStatement x) { + return true; + } + + @Override + public void endVisit(OracleCreateIndexStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterIndexStatement x) { + + } + + @Override + public boolean visit(OracleForStatement x) { + return true; + } + + @Override + public void endVisit(OracleForStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement.Rebuild x) { + return true; + } + + @Override + public void endVisit(OracleAlterIndexStatement.Rebuild x) { + + } + + @Override + public boolean visit(Else x) { + return true; + } + + @Override + public void endVisit(Else x) { + + } + + @Override + public boolean visit(ElseIf x) { + return true; + } + + @Override + public void endVisit(ElseIf x) { + + } + + @Override + public boolean visit(OracleIfStatement x) { + return true; + } + + @Override + public void endVisit(OracleIfStatement x) { + + } + + @Override + public boolean visit(OracleRangeExpr x) { + return true; + } + + @Override + public void endVisit(OracleRangeExpr x) { + + } + + @Override + public boolean visit(OracleAlterTableAddConstaint x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableAddConstaint x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + return true; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + return true; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableRenameTo x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableRenameTo x) { + + } + + @Override + public boolean visit(OracleStorageClause x) { + return true; + } + + @Override + public void endVisit(OracleStorageClause x) { + + } + + @Override + public boolean visit(OracleGotoStatement x) { + return true; + } + + @Override + public void endVisit(OracleGotoStatement x) { + + } + + @Override + public boolean visit(OracleLabelStatement x) { + return true; + } + + @Override + public void endVisit(OracleLabelStatement x) { + + } + + @Override + public boolean visit(OracleParameter x) { + return true; + } + + @Override + public void endVisit(OracleParameter x) { + + } + + @Override + public boolean visit(OracleCommitStatement x) { + return true; + } + + @Override + public void endVisit(OracleCommitStatement x) { + + } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(AsOfSnapshotClause x) { + return true; + } + + @Override + public void endVisit(AsOfSnapshotClause x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + return true; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + + @Override + public boolean visit(OracleFileSpecification x) { + return true; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + return true; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleTruncateStatement x) { + return true; + } + + @Override + public void endVisit(OracleTruncateStatement x) { + + } + + @Override + public boolean visit(OracleCreateSequenceStatement x) { + return true; + } + + @Override + public void endVisit(OracleCreateSequenceStatement x) { + + } + + @Override + public boolean visit(OracleRangeValuesClause x) { + return true; + } + + @Override + public void endVisit(OracleRangeValuesClause x) { + + } + + @Override + public boolean visit(OraclePartitionByRangeClause x) { + return true; + } + + @Override + public void endVisit(OraclePartitionByRangeClause x) { + + } + + @Override + public boolean visit(OracleLoopStatement x) { + return true; + } + + @Override + public void endVisit(OracleLoopStatement x) { + + } + + @Override + public boolean visit(OracleExitStatement x) { + return true; + } + + @Override + public void endVisit(OracleExitStatement x) { + + } + + @Override + public boolean visit(OracleFetchStatement x) { + return true; + } + + @Override + public void endVisit(OracleFetchStatement x) { + + } + + @Override + public boolean visit(OracleSavePointStatement x) { + return true; + } + + @Override + public void endVisit(OracleSavePointStatement x) { + + } + + @Override + public boolean visit(OracleCreateProcedureStatement x) { + return true; + } + + @Override + public void endVisit(OracleCreateProcedureStatement x) { + + } + + @Override + public boolean visit(OracleCreateDatabaseDbLinkStatement x) { + return true; + } + + @Override + public void endVisit(OracleCreateDatabaseDbLinkStatement x) { + + } + + @Override + public boolean visit(OracleDropDatabaseLinkStatement x) { + return true; + } + + @Override + public void endVisit(OracleDropDatabaseLinkStatement x) { + + } + + @Override + public boolean visit(OracleDataTypeTimestamp x) { + return true; + } + + @Override + public void endVisit(OracleDataTypeTimestamp x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalYear x) { + return true; + } + + @Override + public void endVisit(OracleDataTypeIntervalYear x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalDay x) { + return true; + } + + @Override + public void endVisit(OracleDataTypeIntervalDay x) { + + } + + @Override + public boolean visit(OracleDropSequenceStatement x) { + return true; + } + + @Override + public void endVisit(OracleDropSequenceStatement x) { + + } + + @Override + public boolean visit(OracleUsingIndexClause x) { + return true; + } + + @Override + public void endVisit(OracleUsingIndexClause x) { + + } + + @Override + public boolean visit(OracleLobStorageClause x) { + return true; + } + + @Override + public void endVisit(OracleLobStorageClause x) { + + } + + @Override + public boolean visit(OracleUnique x) { + return true; + } + + @Override + public void endVisit(OracleUnique x) { + + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index b9a8f74c81..839f7e1f1f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -1,3303 +1,3350 @@ -/* - * 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.visitor; - -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLHint; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLSetQuantifier; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; -import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; -import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellReferenceOption; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRuleOption; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReferenceModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -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 { - - private final boolean printPostSemi; - - public OracleOutputVisitor(Appendable appender){ - this(appender, true); - } - - public OracleOutputVisitor(Appendable appender, boolean printPostSemi){ - super(appender); - this.printPostSemi = printPostSemi; - } - - public boolean isPrintPostSemi() { - return printPostSemi; - } - - public void postVisit(SQLObject x) { - if (!isPrintPostSemi()) { - return; - } - - if (x instanceof SQLStatement) { - if (x instanceof OraclePLSQLCommitStatement) { - return; - } - if (x.getParent() instanceof OracleCreateProcedureStatement) { - return; - } - - if (isPrettyFormat()) { - if (x.getParent() != null) { - print(";"); - } else { - println(";"); - } - } - } - } - - private void printHints(List hints) { - if (hints.size() > 0) { - print("/*+ "); - printAndAccept(hints, ", "); - print(" */"); - } - } - - public boolean visit(OracleAggregateExpr expr) { - print(expr.getMethodName()); - print("("); - - if (expr.getOption() != null) { - print(expr.getOption().toString()); - print(' '); - } - - printAndAccept(expr.getArguments(), ", "); - print(")"); - - if (expr.getOver() != null) { - print(" OVER ("); - expr.getOver().accept(this); - print(")"); - } - return false; - } - - public boolean visit(SQLAllColumnExpr x) { - print("*"); - return false; - } - - public boolean visit(OracleAnalytic x) { - boolean space = false; - if (x.getPartitionBy().size() > 0) { - print("PARTITION BY "); - printAndAccept(x.getPartitionBy(), ", "); - - space = true; - } - - if (x.getOrderBy() != null) { - if (space) { - print(" "); - } - x.getOrderBy().accept(this); - space = true; - } - - if (x.getWindowing() != null) { - if (space) { - print(" "); - } - x.getWindowing().accept(this); - } - - return false; - } - - public boolean visit(OracleAnalyticWindowing x) { - print(x.getType().name().toUpperCase()); - print(" "); - x.getExpr().accept(this); - return false; - } - - public boolean visit(OracleDateExpr x) { - print("DATE '"); - print(x.getLiteral()); - print('\''); - return false; - } - - public boolean visit(OracleDbLinkExpr x) { - x.getExpr().accept(this); - print("@"); - print(x.getDbLink()); - return false; - } - - public boolean visit(OracleDeleteStatement x) { - if (x.getTableName() != null) { - print("DELETE "); - printHints(x.getHints()); - - print("FROM "); - if (x.isOnly()) { - print("ONLY ("); - x.getTableName().accept(this); - print(")"); - } else { - x.getTableName().accept(this); - } - - printAlias(x.getAlias()); - } - - if (x.getWhere() != null) { - println(); - print("WHERE "); - x.getWhere().setParent(x); - x.getWhere().accept(this); - } - - if (x.getReturning() != null) { - println(); - x.getReturning().accept(this); - } - - return false; - } - - public boolean visit(OracleExtractExpr x) { - print("EXTRACT("); - print(x.getUnit().name()); - print(" FROM "); - x.getFrom().accept(this); - print(")"); - return false; - } - - public boolean visit(OracleIntervalExpr x) { - if (x.getValue() instanceof SQLLiteralExpr) { - print("INTERVAL "); - x.getValue().accept(this); - print(" "); - } else { - print('('); - x.getValue().accept(this); - print(") "); - } - - print(x.getType().name()); - - if (x.getPrecision() != null) { - print("("); - print(x.getPrecision().intValue()); - if (x.getFactionalSecondsPrecision() != null) { - print(", "); - print(x.getFactionalSecondsPrecision().intValue()); - } - print(")"); - } - - if (x.getToType() != null) { - print(" TO "); - print(x.getToType().name()); - if (x.getToFactionalSecondsPrecision() != null) { - print("("); - print(x.getToFactionalSecondsPrecision().intValue()); - print(")"); - } - } - - return false; - } - - public boolean visit(OracleOrderBy x) { - if (x.getItems().size() > 0) { - print("ORDER "); - if (x.isSibings()) { - print("SIBLINGS "); - } - print("BY "); - - printAndAccept(x.getItems(), ", "); - } - return false; - } - - public boolean visit(OracleOuterExpr x) { - x.getExpr().accept(this); - print("(+)"); - return false; - } - - public boolean visit(OraclePLSQLCommitStatement astNode) { - print("/"); - println(); - return false; - } - - public boolean visit(SQLSelect x) { - if (x instanceof OracleSelect) { - return visit((OracleSelect) x); - } - - return super.visit(x); - } - - public boolean visit(OracleSelect x) { - if (x.getWithSubQuery() != null) { - x.getWithSubQuery().accept(this); - println(); - } - - x.getQuery().accept(this); - - if (x.getRestriction() != null) { - print(" "); - x.getRestriction().accept(this); - } - - if (x.getForUpdate() != null) { - println(); - x.getForUpdate().accept(this); - } - - if (x.getOrderBy() != null) { - println(); - x.getOrderBy().accept(this); - } - - return false; - } - - public boolean visit(OracleSelectForUpdate x) { - print("FOR UPDATE"); - if (x.getOf().size() > 0) { - print("("); - printAndAccept(x.getOf(), ", "); - print(")"); - } - - if (x.isNotWait()) { - print(" NOWAIT"); - } else if (x.isSkipLocked()) { - print(" SKIP LOCKED"); - } else if (x.getWait() != null) { - print(" WAIT "); - x.getWait().accept(this); - } - return false; - } - - public boolean visit(OracleSelectHierachicalQueryClause x) { - if (x.getStartWith() != null) { - print("START WITH "); - x.getStartWith().accept(this); - println(); - } - - print("CONNECT BY "); - - if (x.isNoCycle()) { - print("NOCYCLE "); - } - - if (x.isPrior()) { - print("PRIOR "); - } - - x.getConnectBy().accept(this); - - return false; - } - - public boolean visit(OracleSelectJoin x) { - x.getLeft().accept(this); - - if (x.getJoinType() == JoinType.COMMA) { - print(", "); - x.getRight().accept(this); - } else { - boolean isRoot = x.getParent() instanceof SQLSelectQueryBlock; - if (isRoot) { - incrementIndent(); - } - - println(); - print(JoinType.toString(x.getJoinType())); - print(" "); - - x.getRight().accept(this); - - if (isRoot) { - decrementIndent(); - } - - if (x.getCondition() != null) { - print(" ON "); - x.getCondition().accept(this); - print(" "); - } - - if (x.getUsing().size() > 0) { - print(" USING ("); - printAndAccept(x.getUsing(), ", "); - print(")"); - } - - if (x.getFlashback() != null) { - println(); - x.getFlashback().accept(this); - } - } - - return false; - } - - public boolean visit(OracleOrderByItem x) { - x.getExpr().accept(this); - if (x.getType() != null) { - print(" "); - print(x.getType().name().toUpperCase()); - } - - if (x.getNullsOrderType() != null) { - print(" "); - print(x.getNullsOrderType().toFormalString()); - } - - return false; - } - - public boolean visit(OracleSelectPivot x) { - print("PIVOT"); - if (x.isXml()) { - print(" XML"); - } - print(" ("); - printAndAccept(x.getItems(), ", "); - - if (x.getPivotFor().size() > 0) { - print(" FOR "); - if (x.getPivotFor().size() == 1) { - ((SQLExpr) x.getPivotFor().get(0)).accept(this); - } else { - print("("); - printAndAccept(x.getPivotFor(), ", "); - print(")"); - } - } - - if (x.getPivotIn().size() > 0) { - print(" IN ("); - printAndAccept(x.getPivotIn(), ", "); - print(")"); - } - - print(")"); - - return false; - } - - public boolean visit(OracleSelectPivot.Item x) { - x.getExpr().accept(this); - if ((x.getAlias() != null) && (x.getAlias().length() > 0)) { - print(" AS "); - print(x.getAlias()); - } - return false; - } - - public boolean visit(SQLSelectQueryBlock select) { - if (select instanceof OracleSelectQueryBlock) { - return visit((OracleSelectQueryBlock) select); - } - - return super.visit(select); - } - - public boolean visit(OracleSelectQueryBlock x) { - print("SELECT "); - - if (x.getHints().size() > 0) { - printAndAccept(x.getHints(), ", "); - print(' '); - } - - if (SQLSetQuantifier.ALL == x.getDistionOption()) { - print("ALL "); - } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { - print("DISTINCT "); - } else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) { - print("UNIQUE "); - } - - printSelectList(x.getSelectList()); - - if (x.getInto() != null) { - println(); - print("INTO "); - x.getInto().accept(this); - } - - println(); - print("FROM "); - if (x.getFrom() == null) { - print("DUAL"); - } else { - x.getFrom().setParent(x); - x.getFrom().accept(this); - } - - if (x.getWhere() != null) { - println(); - print("WHERE "); - x.getWhere().setParent(x); - x.getWhere().accept(this); - } - - if (x.getHierachicalQueryClause() != null) { - println(); - x.getHierachicalQueryClause().accept(this); - } - - if (x.getGroupBy() != null) { - println(); - x.getGroupBy().accept(this); - } - - if (x.getModelClause() != null) { - println(); - x.getModelClause().accept(this); - } - - return false; - } - - public boolean visit(OracleSelectRestriction.CheckOption x) { - print("CHECK OPTION"); - if (x.getConstraint() != null) { - print(" "); - x.getConstraint().accept(this); - } - return false; - } - - public boolean visit(OracleSelectRestriction.ReadOnly x) { - print("READ ONLY"); - return false; - } - - public boolean visit(OracleSelectSubqueryTableSource x) { - print("("); - incrementIndent(); - println(); - x.getSelect().accept(this); - decrementIndent(); - println(); - print(")"); - - if (x.getPivot() != null) { - println(); - x.getPivot().accept(this); - } - - if (x.getFlashback() != null) { - println(); - x.getFlashback().accept(this); - } - - if ((x.getAlias() != null) && (x.getAlias().length() != 0)) { - print(" "); - print(x.getAlias()); - } - - return false; - } - - public boolean visit(OracleSelectTableReference x) { - if (x.isOnly()) { - print("ONLY ("); - x.getExpr().accept(this); - - if (x.getPartition() != null) { - print(" "); - x.getPartition().accept(this); - } - - print(")"); - } else { - x.getExpr().accept(this); - - if (x.getPartition() != null) { - print(" "); - x.getPartition().accept(this); - } - } - - if (x.getHints().size() > 0) { - this.printHints(x.getHints()); - } - - if (x.getSampleClause() != null) { - print(" "); - x.getSampleClause().accept(this); - } - - if (x.getPivot() != null) { - println(); - x.getPivot().accept(this); - } - - if (x.getFlashback() != null) { - println(); - x.getFlashback().accept(this); - } - - printAlias(x.getAlias()); - - return false; - } - - public boolean visit(OracleSelectUnPivot x) { - print("UNPIVOT"); - if (x.getNullsIncludeType() != null) { - print(" "); - print(OracleSelectUnPivot.NullsIncludeType.toString(x.getNullsIncludeType())); - } - - print(" ("); - if (x.getItems().size() == 1) { - ((SQLExpr) x.getItems().get(0)).accept(this); - } else { - print(" ("); - printAndAccept(x.getItems(), ", "); - print(")"); - } - - if (x.getPivotFor().size() > 0) { - print(" FOR "); - if (x.getPivotFor().size() == 1) { - ((SQLExpr) x.getPivotFor().get(0)).accept(this); - } else { - print("("); - printAndAccept(x.getPivotFor(), ", "); - print(")"); - } - } - - if (x.getPivotIn().size() > 0) { - print(" IN ("); - printAndAccept(x.getPivotIn(), ", "); - print(")"); - } - - print(")"); - return false; - } - - public boolean visit(OracleTimestampExpr x) { - print("TIMESTAMP '"); - - print(x.getLiteral()); - print('\''); - - if (x.getTimeZone() != null) { - print(" AT TIME ZONE '"); - print(x.getTimeZone()); - print('\''); - } - - return false; - } - - public boolean visit(OracleUpdateStatement x) { - print("UPDATE "); - printHints(x.getHints()); - - if (x.isOnly()) { - print("ONLY ("); - x.getTableSource().accept(this); - print(")"); - } else { - x.getTableSource().accept(this); - } - - printAlias(x.getAlias()); - - println(); - - print("SET "); - for (int i = 0, size = x.getItems().size(); i < size; ++i) { - if (i != 0) { - print(", "); - } - x.getItems().get(i).accept(this); - } - - if (x.getWhere() != null) { - println(); - print("WHERE "); - x.getWhere().setParent(x); - x.getWhere().accept(this); - } - - if (x.getReturning().size() > 0) { - println(); - print("RETURNING "); - printAndAccept(x.getReturning(), ", "); - print(" INTO "); - printAndAccept(x.getReturningInto(), ", "); - } - - return false; - } - - // /////////////////// - - @Override - public void endVisit(OracleAggregateExpr astNode) { - - } - - @Override - public void endVisit(OracleConstraintState astNode) { - - } - - @Override - public void endVisit(OraclePLSQLCommitStatement astNode) { - - } - - @Override - public void endVisit(OracleAnalytic x) { - - } - - @Override - public void endVisit(OracleAnalyticWindowing x) { - - } - - @Override - public void endVisit(OracleDateExpr x) { - - } - - @Override - public void endVisit(OracleDbLinkExpr x) { - - } - - @Override - public void endVisit(OracleDeleteStatement x) { - - } - - @Override - public void endVisit(OracleExtractExpr x) { - - } - - @Override - public void endVisit(OracleIntervalExpr x) { - - } - - @Override - public void endVisit(SQLMethodInvokeExpr x) { - - } - - @Override - public void endVisit(OracleOrderBy x) { - - } - - @Override - public void endVisit(OracleOuterExpr x) { - - } - - @Override - public void endVisit(OracleSelectForUpdate x) { - - } - - @Override - public void endVisit(OracleSelectHierachicalQueryClause x) { - - } - - @Override - public void endVisit(OracleSelectJoin x) { - - } - - @Override - public void endVisit(OracleOrderByItem x) { - - } - - @Override - public void endVisit(OracleSelectPivot x) { - - } - - @Override - public void endVisit(Item x) { - - } - - @Override - public void endVisit(CheckOption x) { - - } - - @Override - public void endVisit(ReadOnly x) { - - } - - @Override - public void endVisit(OracleSelectSubqueryTableSource x) { - - } - - @Override - public void endVisit(OracleSelectUnPivot x) { - - } - - @Override - public void endVisit(OracleTimestampExpr x) { - - } - - @Override - public void endVisit(OracleUpdateStatement x) { - - } - - @Override - public boolean visit(SampleClause x) { - print("SAMPLE "); - - if (x.isBlock()) { - print("BLOCK "); - } - - print("("); - printAndAccept(x.getPercent(), ", "); - print(")"); - - if (x.getSeedValue() != null) { - print(" SEED ("); - x.getSeedValue().accept(this); - print(")"); - } - - return false; - } - - @Override - public void endVisit(SampleClause x) { - - } - - @Override - public void endVisit(OracleSelectTableReference x) { - - } - - @Override - public boolean visit(PartitionExtensionClause x) { - if (x.isSubPartition()) { - print("SUBPARTITION "); - } else { - print("PARTITION "); - } - - if (x.getPartition() != null) { - print("("); - x.getPartition().accept(this); - print(")"); - } else { - print("FOR ("); - printAndAccept(x.getFor(), ","); - print(")"); - } - return false; - } - - @Override - public void endVisit(PartitionExtensionClause x) { - - } - - @Override - public boolean visit(VersionsFlashbackQueryClause x) { - print("VERSIONS BETWEEN "); - print(x.getType().name()); - print(" "); - x.getBegin().accept(this); - print(" AND "); - x.getEnd().accept(this); - return false; - } - - @Override - public void endVisit(VersionsFlashbackQueryClause x) { - - } - - @Override - public boolean visit(AsOfFlashbackQueryClause x) { - print("AS OF "); - print(x.getType().name()); - print(" ("); - x.getExpr().accept(this); - print(")"); - return false; - } - - @Override - public void endVisit(AsOfFlashbackQueryClause x) { - - } - - @Override - public boolean visit(GroupingSetExpr x) { - print("GROUPING SETS"); - print(" ("); - printAndAccept(x.getParameters(), ", "); - print(")"); - return false; - } - - @Override - public void endVisit(GroupingSetExpr x) { - - } - - @Override - public boolean visit(OracleWithSubqueryEntry x) { - x.getName().accept(this); - - if (x.getColumns().size() > 0) { - print(" ("); - printAndAccept(x.getColumns(), ", "); - print(")"); - } - println(); - print("AS"); - println(); - print("("); - incrementIndent(); - println(); - x.getSubQuery().accept(this); - decrementIndent(); - println(); - print(")"); - - if (x.getSearchClause() != null) { - println(); - x.getSearchClause().accept(this); - } - - if (x.getCycleClause() != null) { - println(); - x.getCycleClause().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleWithSubqueryEntry x) { - - } - - @Override - public boolean visit(SearchClause x) { - print("SEARCH "); - print(x.getType().name()); - print(" FIRST BY "); - printAndAccept(x.getItems(), ", "); - print(" SET "); - x.getOrderingColumn().accept(this); - - return false; - } - - @Override - public void endVisit(SearchClause x) { - - } - - @Override - public boolean visit(CycleClause x) { - print("CYCLE "); - printAndAccept(x.getAliases(), ", "); - print(" SET "); - x.getMark().accept(this); - print(" TO "); - x.getValue().accept(this); - print(" DEFAULT "); - x.getDefaultValue().accept(this); - - return false; - } - - @Override - public void endVisit(CycleClause x) { - - } - - @Override - public boolean visit(OracleBinaryFloatExpr x) { - print(x.getValue().toString()); - print('F'); - return false; - } - - @Override - public void endVisit(OracleBinaryFloatExpr x) { - - } - - @Override - public boolean visit(OracleBinaryDoubleExpr x) { - print(x.getValue().toString()); - print('D'); - return false; - } - - @Override - public void endVisit(OracleBinaryDoubleExpr x) { - - } - - @Override - public void endVisit(OracleSelect x) { - - } - - @Override - public boolean visit(OracleConstraintState x) { - printlnAndAccept(x.getStates(), " "); - return false; - } - - @Override - public boolean visit(OracleCursorExpr x) { - print("CURSOR("); - incrementIndent(); - println(); - x.getQuery().accept(this); - decrementIndent(); - println(); - print(")"); - return false; - } - - @Override - public void endVisit(OracleCursorExpr x) { - - } - - @Override - public boolean visit(OracleIsSetExpr x) { - x.getNestedTable().accept(this); - print(" IS A SET"); - return false; - } - - @Override - public void endVisit(OracleIsSetExpr x) { - - } - - @Override - public boolean visit(ReturnRowsClause x) { - if (x.isAll()) { - print("RETURN ALL ROWS"); - } else { - print("RETURN UPDATED ROWS"); - } - return false; - } - - @Override - public void endVisit(ReturnRowsClause x) { - - } - - @Override - public boolean visit(ModelClause x) { - print("MODEL"); - - incrementIndent(); - for (CellReferenceOption opt : x.getCellReferenceOptions()) { - print(' '); - print(opt.name); - } - - if (x.getReturnRowsClause() != null) { - print(' '); - x.getReturnRowsClause().accept(this); - } - - for (ReferenceModelClause item : x.getReferenceModelClauses()) { - print(' '); - item.accept(this); - } - - x.getMainModel().accept(this); - decrementIndent(); - - return false; - } - - @Override - public void endVisit(ModelClause x) { - - } - - @Override - public boolean visit(MainModelClause x) { - if (x.getMainModelName() != null) { - print(" MAIN "); - x.getMainModelName().accept(this); - } - - println(); - x.getModelColumnClause().accept(this); - - for (CellReferenceOption opt : x.getCellReferenceOptions()) { - println(); - print(opt.name); - } - - println(); - x.getModelRulesClause().accept(this); - - return false; - } - - @Override - public void endVisit(MainModelClause x) { - - } - - @Override - public boolean visit(ModelColumnClause x) { - if (x.getQueryPartitionClause() != null) { - x.getQueryPartitionClause().accept(this); - println(); - } - - print("DIMENSION BY ("); - printAndAccept(x.getDimensionByColumns(), ", "); - print(")"); - - println(); - print("MEASURES ("); - printAndAccept(x.getMeasuresColumns(), ", "); - print(")"); - return false; - } - - @Override - public void endVisit(ModelColumnClause x) { - - } - - @Override - public boolean visit(QueryPartitionClause x) { - print("PARTITION BY ("); - printAndAccept(x.getExprList(), ", "); - print(")"); - return false; - } - - @Override - public void endVisit(QueryPartitionClause x) { - - } - - @Override - public boolean visit(ModelColumn x) { - x.getExpr().accept(this); - if (x.getAlias() != null) { - print(" "); - print(x.getAlias()); - } - return false; - } - - @Override - public void endVisit(ModelColumn x) { - - } - - @Override - public boolean visit(ModelRulesClause x) { - if (x.getOptions().size() > 0) { - print("RULES"); - for (ModelRuleOption opt : x.getOptions()) { - print(" "); - print(opt.name); - } - } - - if (x.getIterate() != null) { - print(" ITERATE ("); - x.getIterate().accept(this); - print(")"); - - if (x.getUntil() != null) { - print(" UNTIL ("); - x.getUntil().accept(this); - print(")"); - } - } - - print(" ("); - printAndAccept(x.getCellAssignmentItems(), ", "); - print(")"); - return false; - - } - - @Override - public void endVisit(ModelRulesClause x) { - - } - - @Override - public boolean visit(CellAssignmentItem x) { - if (x.getOption() != null) { - print(x.getOption().name); - print(" "); - } - - x.getCellAssignment().accept(this); - - if (x.getOrderBy() != null) { - print(" "); - x.getOrderBy().accept(this); - } - - print(" = "); - x.getExpr().accept(this); - - return false; - } - - @Override - public void endVisit(CellAssignmentItem x) { - - } - - @Override - public boolean visit(CellAssignment x) { - x.getMeasureColumn().accept(this); - print("["); - printAndAccept(x.getConditions(), ", "); - print("]"); - return false; - } - - @Override - public void endVisit(CellAssignment x) { - - } - - @Override - public boolean visit(OracleMergeStatement x) { - print("MERGE "); - if (x.getHints().size() > 0) { - printAndAccept(x.getHints(), ", "); - print(" "); - } - - print("INTO "); - x.getInto().accept(this); - - if (x.getAlias() != null) { - print(" "); - print(x.getAlias()); - } - - println(); - print("USING "); - x.getUsing().accept(this); - - print(" ON "); - x.getOn().accept(this); - - if (x.getUpdateClause() != null) { - println(); - x.getUpdateClause().accept(this); - } - - if (x.getInsertClause() != null) { - println(); - x.getInsertClause().accept(this); - } - - if (x.getErrorLoggingClause() != null) { - println(); - x.getErrorLoggingClause().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleMergeStatement x) { - - } - - @Override - public boolean visit(MergeUpdateClause x) { - print("WHEN MATCHED THEN UPDATE SET "); - printAndAccept(x.getItems(), ", "); - if (x.getWhere() != null) { - incrementIndent(); - println(); - print("WHERE "); - x.getWhere().setParent(x); - x.getWhere().accept(this); - decrementIndent(); - } - - if (x.getDeleteWhere() != null) { - incrementIndent(); - println(); - print("DELETE WHERE "); - x.getDeleteWhere().setParent(x); - x.getDeleteWhere().accept(this); - decrementIndent(); - } - - return false; - } - - @Override - public void endVisit(MergeUpdateClause x) { - - } - - @Override - public boolean visit(MergeInsertClause x) { - print("WHEN NOT MATCHED THEN INSERT"); - if (x.getColumns().size() > 0) { - print(" "); - printAndAccept(x.getColumns(), ", "); - } - print(" VALUES ("); - printAndAccept(x.getValues(), ", "); - print(")"); - if (x.getWhere() != null) { - incrementIndent(); - println(); - print("WHERE "); - x.getWhere().setParent(x); - x.getWhere().accept(this); - decrementIndent(); - } - - return false; - } - - @Override - public void endVisit(MergeInsertClause x) { - - } - - @Override - public boolean visit(OracleErrorLoggingClause x) { - print("LOG ERRORS "); - if (x.getInto() != null) { - print("INTO "); - x.getInto().accept(this); - print(" "); - } - - if (x.getSimpleExpression() != null) { - print("("); - x.getSimpleExpression().accept(this); - print(")"); - } - - if (x.getLimit() != null) { - print(" REJECT LIMIT "); - x.getLimit().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleErrorLoggingClause x) { - - } - - @Override - public boolean visit(OracleReturningClause x) { - print("RETURNING "); - printAndAccept(x.getItems(), ", "); - print(" INTO "); - printAndAccept(x.getValues(), ", "); - - return false; - } - - @Override - public void endVisit(OracleReturningClause x) { - - } - - @Override - public boolean visit(OracleInsertStatement x) { - visit((SQLInsertStatement) x); - - if (x.getReturning() != null) { - println(); - x.getReturning().accept(this); - } - - if (x.getErrorLogging() != null) { - println(); - x.getErrorLogging().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleInsertStatement x) { - endVisit((SQLInsertStatement) x); - } - - @Override - public boolean visit(InsertIntoClause x) { - print("INTO "); - - x.getTableSource().accept(this); - - if (x.getColumns().size() > 0) { - incrementIndent(); - println(); - print("("); - for (int i = 0, size = x.getColumns().size(); i < size; ++i) { - if (i != 0) { - if (i % 5 == 0) { - println(); - } - print(", "); - } - x.getColumns().get(i).accept(this); - } - print(")"); - decrementIndent(); - } - - if (x.getValues() != null) { - println(); - print("VALUES "); - x.getValues().accept(this); - } else { - if (x.getQuery() != null) { - println(); - x.getQuery().setParent(x); - x.getQuery().accept(this); - } - } - - return false; - } - - @Override - public void endVisit(InsertIntoClause x) { - - } - - @Override - public boolean visit(OracleMultiInsertStatement x) { - print("INSERT "); - - if (x.getHints().size() > 0) { - this.printHints(x.getHints()); - } - - if (x.getOption() != null) { - print(x.getOption().name()); - print(" "); - } - - for (int i = 0, size = x.getEntries().size(); i < size; ++i) { - incrementIndent(); - println(); - x.getEntries().get(i).accept(this); - decrementIndent(); - } - - println(); - x.getSubQuery().accept(this); - - return false; - } - - @Override - public void endVisit(OracleMultiInsertStatement x) { - - } - - @Override - public boolean visit(ConditionalInsertClause x) { - for (int i = 0, size = x.getItems().size(); i < size; ++i) { - if (i != 0) { - println(); - } - - ConditionalInsertClauseItem item = x.getItems().get(i); - - item.accept(this); - } - - if (x.getElseItem() != null) { - println(); - print("ELSE"); - incrementIndent(); - println(); - x.getElseItem().accept(this); - decrementIndent(); - } - - return false; - } - - @Override - public void endVisit(ConditionalInsertClause x) { - - } - - @Override - public boolean visit(ConditionalInsertClauseItem x) { - print("WHEN "); - x.getWhen().accept(this); - print(" THEN"); - incrementIndent(); - println(); - x.getThen().accept(this); - decrementIndent(); - return false; - } - - @Override - public void endVisit(ConditionalInsertClauseItem x) { - - } - - @Override - public void endVisit(OracleSelectQueryBlock x) { - - } - - @Override - public boolean visit(OracleBlockStatement x) { - if (x.getParameters().size() != 0) { - print("DECLARE"); - incrementIndent(); - println(); - - for (int i = 0, size = x.getParameters().size(); i < size; ++i) { - if (i != 0) { - println(); - } - OracleParameter param = x.getParameters().get(i); - param.accept(this); - print(";"); - } - - decrementIndent(); - println(); - } - print("BEGIN"); - incrementIndent(); - println(); - for (int i = 0, size = x.getStatementList().size(); i < size; ++i) { - if (i != 0) { - println(); - } - SQLStatement stmt = x.getStatementList().get(i); - stmt.setParent(x); - stmt.accept(this); - } - decrementIndent(); - println(); - print("END"); - return false; - } - - @Override - public void endVisit(OracleBlockStatement x) { - - } - - @Override - public boolean visit(OracleLockTableStatement x) { - print("LOCK TABLE "); - x.getTable().accept(this); - print(" IN "); - print(x.getLockMode().name()); - print(" MODE "); - if (x.isNoWait()) { - print("NOWAIT"); - } else if (x.getWait() != null) { - print("WAIT "); - x.getWait().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleLockTableStatement x) { - - } - - @Override - public boolean visit(OracleAlterSessionStatement x) { - print("ALTER SESSION SET "); - printAndAccept(x.getItems(), ", "); - return false; - } - - @Override - public void endVisit(OracleAlterSessionStatement x) { - - } - - @Override - public boolean visit(OracleExprStatement x) { - x.getExpr().accept(this); - return false; - } - - @Override - public void endVisit(OracleExprStatement x) { - - } - - @Override - public boolean visit(OracleDatetimeExpr x) { - x.getExpr().accept(this); - SQLExpr timeZone = x.getTimeZone(); - - if (timeZone instanceof SQLIdentifierExpr) { - if (((SQLIdentifierExpr) timeZone).getName().equalsIgnoreCase("LOCAL")) { - print(" AT LOCAL"); - return false; - } - } - - print(" AT TIME ZONE "); - timeZone.accept(this); - - return false; - } - - @Override - public void endVisit(OracleDatetimeExpr x) { - - } - - @Override - public boolean visit(OracleSysdateExpr x) { - print("SYSDATE"); - if (x.getOption() != null) { - print("@"); - print(x.getOption()); - } - return false; - } - - @Override - public void endVisit(OracleSysdateExpr x) { - - } - - @Override - public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - - } - - @Override - public boolean visit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - print("WHEN "); - x.getWhen().accept(this); - incrementIndent(); - - for (int i = 0, size = x.getStatements().size(); i < size; ++i) { - println(); - SQLStatement stmt = x.getStatements().get(i); - stmt.setParent(x); - stmt.accept(this); - } - decrementIndent(); - return false; - } - - @Override - public boolean visit(OracleExceptionStatement x) { - print("EXCEPTION"); - incrementIndent(); - for (OracleExceptionStatement.Item item : x.getItems()) { - println(); - item.accept(this); - } - decrementIndent(); - return false; - } - - @Override - public void endVisit(OracleExceptionStatement x) { - - } - - @Override - public boolean visit(OracleArgumentExpr x) { - print(x.getArgumentName()); - print(" => "); - x.getValue().accept(this); - return false; - } - - @Override - public void endVisit(OracleArgumentExpr x) { - - } - - @Override - public boolean visit(OracleSetTransactionStatement x) { - if (x.isReadOnly()) { - print("SET TRANSACTION READ ONLY NAME "); - } else { - print("SET TRANSACTION NAME "); - } - x.getName().accept(this); - return false; - } - - @Override - public void endVisit(OracleSetTransactionStatement x) { - - } - - @Override - public boolean visit(OracleGrantStatement x) { - print("GRANT "); - for (int i = 0, size = x.getPrivileges().size(); i < size; ++i) { - if (i != 0) { - print(", "); - } - print(x.getPrivileges().get(i)); - } - - if (x.getOn() != null) { - print(" ON "); - x.getOn().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleGrantStatement x) { - - } - - @Override - public boolean visit(OracleExplainStatement x) { - print("EXPLAIN PLAN"); - incrementIndent(); - println(); - if (x.getStatementId() != null) { - print("SET STATEMENT_ID = "); - x.getStatementId().accept(this); - println(); - } - - if (x.getInto() != null) { - print("INTO "); - x.getInto().accept(this); - println(); - } - - print("FRO"); - println(); - x.getForStatement().accept(this); - - decrementIndent(); - return false; - } - - @Override - public void endVisit(OracleExplainStatement x) { - - } - - @Override - public boolean visit(OracleAlterProcedureStatement x) { - print("ALTER PROCEDURE "); - x.getName().accept(this); - if (x.isCompile()) { - print(" COMPILE"); - } - if (x.isReuseSettings()) { - print(" REUSE SETTINGS"); - } - return false; - } - - @Override - public void endVisit(OracleAlterProcedureStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableDropPartition x) { - print("DROP PARTITION "); - x.getName().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableDropPartition x) { - - } - - @Override - public boolean visit(OracleAlterTableStatement x) { - print("ALTER TABLE "); - x.getName().accept(this); - incrementIndent(); - for (SQLAlterTableItem item : x.getItems()) { - println(); - item.accept(this); - } - if (x.isUpdateGlobalIndexes()) { - println(); - print("UPDATE GLOABL INDEXES"); - } - decrementIndent(); - return false; - } - - @Override - public void endVisit(OracleAlterTableStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableTruncatePartition x) { - print("TRUNCATE PARTITION "); - x.getName().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableTruncatePartition x) { - - } - - @Override - public boolean visit(TableSpaceItem x) { - print("TABLESPACE "); - x.getTablespace().accept(this); - return false; - } - - @Override - public void endVisit(TableSpaceItem x) { - - } - - @Override - public boolean visit(UpdateIndexesClause x) { - print("UPDATE INDEXES"); - if (x.getItems().size() > 0) { - print("("); - printAndAccept(x.getItems(), ", "); - print(")"); - } - return false; - } - - @Override - public void endVisit(UpdateIndexesClause x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition x) { - print("SPLIT PARTITION "); - x.getName().accept(this); - - if (x.getAt().size() > 0) { - incrementIndent(); - println(); - print("AT ("); - printAndAccept(x.getAt(), ", "); - print(")"); - decrementIndent(); - } - - if (x.getInto().size() > 0) { - println(); - incrementIndent(); - print("INTO ("); - printAndAccept(x.getInto(), ", "); - print(")"); - decrementIndent(); - } - - if (x.getUpdateIndexes() != null) { - println(); - incrementIndent(); - x.getUpdateIndexes().accept(this); - decrementIndent(); - } - return false; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition x) { - - } - - @Override - public boolean visit(NestedTablePartitionSpec x) { - print("PARTITION "); - x.getPartition().accept(this); - for (SQLObject item : x.getSegmentAttributeItems()) { - print(" "); - item.accept(this); - } - return false; - } - - @Override - public void endVisit(NestedTablePartitionSpec x) { - - } - - @Override - public boolean visit(OracleAlterTableModify x) { - print("MODIFY ("); - incrementIndent(); - for (int i = 0, size = x.getColumns().size(); i < size; ++i) { - println(); - SQLColumnDefinition column = x.getColumns().get(i); - column.accept(this); - if (i != size - 1) { - print(", "); - } - } - decrementIndent(); - println(); - print(")"); - - return false; - } - - @Override - public void endVisit(OracleAlterTableModify x) { - - } - - @Override - public boolean visit(OracleCreateIndexStatement x) { - print("CREATE "); - if (x.getType() != null) { - print(x.getType()); - print(" "); - } - - print("INDEX "); - - x.getName().accept(this); - print(" ON "); - x.getTable().accept(this); - print("("); - printAndAccept(x.getItems(), ", "); - print(")"); - - if (x.isIndexOnlyTopLevel()) { - println(); - print("INDEX ONLY TOPLEVEL"); - } - - if (x.getPtcfree() != null) { - println(); - print("PCTFREE "); - x.getPtcfree().accept(this); - } - - if (x.getInitrans() != null) { - println(); - print("INITRANS "); - x.getInitrans().accept(this); - } - - if (x.getMaxtrans() != null) { - println(); - print("MAXTRANS "); - x.getMaxtrans().accept(this); - } - - if (x.isComputeStatistics()) { - println(); - print("COMPUTE STATISTICS"); - } - - if (x.getTablespace() != null) { - println(); - print("TABLESPACE "); - x.getTablespace().accept(this); - } - - if (x.isOnline()) { - print(" ONLINE"); - } - - if (x.isNoParallel()) { - print(" NOPARALLEL"); - } else if (x.getParallel() != null) { - print(" PARALLEL "); - x.getParallel().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleCreateIndexStatement x) { - - } - - @Override - public boolean visit(OracleAlterIndexStatement x) { - print("ALTER INDEX "); - x.getName().accept(this); - - if (x.getRenameTo() != null) { - print(" RENAME TO "); - x.getRenameTo().accept(this); - } - - if (x.getMonitoringUsage() != null) { - print(" MONITORING USAGE"); - } - - if (x.getRebuild() != null) { - print(" "); - x.getRebuild().accept(this); - } - - if (x.getParallel() != null) { - print(" PARALLEL"); - x.getParallel().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleAlterIndexStatement x) { - - } - - @Override - public boolean visit(Rebuild x) { - print("REBUILD"); - - if (x.getOption() != null) { - print(" "); - x.getOption().accept(this); - } - return false; - } - - @Override - public void endVisit(Rebuild x) { - - } - - @Override - public boolean visit(OracleForStatement x) { - print("FOR "); - x.getIndex().accept(this); - print(" IN "); - x.getRange().accept(this); - println(); - print("LOOP"); - incrementIndent(); - println(); - - for (int i = 0, size = x.getStatements().size(); i < size; ++i) { - SQLStatement item = x.getStatements().get(i); - item.setParent(x); - item.accept(this); - if (i != size - 1) { - println(); - } - } - - decrementIndent(); - println(); - print("END LOOP"); - return false; - } - - @Override - public void endVisit(OracleForStatement x) { - - } - - @Override - public boolean visit(Else x) { - print("ELSE"); - incrementIndent(); - println(); - - for (int i = 0, size = x.getStatements().size(); i < size; ++i) { - if (i != 0) { - println(); - } - SQLStatement item = x.getStatements().get(i); - item.setParent(x); - item.accept(this); - } - - decrementIndent(); - return false; - } - - @Override - public boolean visit(ElseIf x) { - print("ELSE IF "); - x.getCondition().accept(this); - print(" THEN"); - incrementIndent(); - println(); - - for (int i = 0, size = x.getStatements().size(); i < size; ++i) { - if (i != 0) { - println(); - } - SQLStatement item = x.getStatements().get(i); - item.setParent(x); - item.accept(this); - } - - decrementIndent(); - return false; - } - - @Override - public void endVisit(ElseIf x) { - - } - - @Override - public void endVisit(Else x) { - - } - - @Override - public boolean visit(OracleIfStatement x) { - print("IF "); - x.getCondition().accept(this); - print(" THEN"); - incrementIndent(); - println(); - for (int i = 0, size = x.getStatements().size(); i < size; ++i) { - SQLStatement item = x.getStatements().get(i); - item.setParent(x); - item.accept(this); - if (i != size - 1) { - println(); - } - } - decrementIndent(); - - for (ElseIf elseIf : x.getElseIfList()) { - println(); - elseIf.accept(this); - } - - if (x.getElseItem() != null) { - println(); - x.getElseItem().accept(this); - } - println(); - print("END IF"); - return false; - } - - @Override - public void endVisit(OracleIfStatement x) { - - } - - @Override - public boolean visit(OracleRangeExpr x) { - x.getLowBound().accept(this); - print(".."); - x.getUpBound().accept(this); - return false; - } - - @Override - public void endVisit(OracleRangeExpr x) { - - } - - protected void visitColumnDefault(SQLColumnDefinition x) { - if (x.getParent() instanceof OracleBlockStatement) { - print(" := "); - } else { - print(" DEFAULT "); - } - x.getDefaultExpr().accept(this); - } - - @Override - public boolean visit(OracleAlterTableAddConstaint x) { - print("ADD "); - x.getConstraint().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableAddConstaint x) { - - } - - @Override - public boolean visit(OraclePrimaryKey x) { - if (x.getName() != null) { - print("CONSTRAINT "); - x.getName().accept(this); - print(" "); - } - print("PRIMARY KEY ("); - printAndAccept(x.getColumns(), ", "); - print(")"); - if (x.getUsing() != null) { - println(); - x.getUsing().accept(this); - } - return false; - } - - @Override - public void endVisit(OraclePrimaryKey x) { - - } - - @Override - public boolean visit(OracleCreateTableStatement x) { - this.visit((SQLCreateTableStatement) x); - - if (x.isOrganizationIndex()) { - println(); - print("ORGANIZATION INDEX"); - } - - if (x.getPtcfree() != null) { - println(); - print("PCTFREE "); - x.getPtcfree().accept(this); - } - - if (x.getInitrans() != null) { - println(); - print("INITRANS "); - x.getInitrans().accept(this); - } - - if (x.getMaxtrans() != null) { - println(); - print("MAXTRANS "); - x.getMaxtrans().accept(this); - } - - if (x.isInMemoryMetadata()) { - println(); - print("IN_MEMORY_METADATA"); - } - - if (x.isCursorSpecificSegment()) { - println(); - print("CURSOR_SPECIFIC_SEGMENT"); - } - - if (x.getParallel() == Boolean.TRUE) { - println(); - print("PARALLEL"); - } else if (x.getParallel() == Boolean.FALSE) { - println(); - print("NOPARALLEL"); - } - - if (x.getCache() == Boolean.TRUE) { - println(); - print("CACHE"); - } else if (x.getCache() == Boolean.FALSE) { - println(); - print("NOCACHE"); - } - - if (x.getCompress() == Boolean.TRUE) { - println(); - print("COMPRESS"); - } else if (x.getCompress() == Boolean.FALSE) { - println(); - print("NOCOMPRESS"); - } - - if (x.getLogging() == Boolean.TRUE) { - println(); - print("LOGGING"); - } else if (x.getLogging() == Boolean.FALSE) { - println(); - print("NOLOGGING"); - } - - if (x.getTablespace() != null) { - println(); - print("TABLESPACE "); - x.getTablespace().accept(this); - } - - if (x.getStorage() != null) { - println(); - x.getStorage().accept(this); - } - - if (x.getLobStorage() != null) { - println(); - x.getLobStorage().accept(this); - } - - if (x.isOnCommit()) { - println(); - print("ON COMMIT"); - } - - if (x.isPreserveRows()) { - println(); - print("PRESERVE ROWS"); - } - - if (x.getPartitioning() != null) { - println(); - x.getPartitioning().accept(this); - } - - if (x.getSelect() != null) { - println(); - print("AS"); - println(); - x.getSelect().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleCreateTableStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableRenameTo x) { - print("RENAME TO "); - x.getTo().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableRenameTo x) { - - } - - @Override - public boolean visit(OracleStorageClause x) { - print("STORAGE ("); - - if (x.getInitial() != null) { - print(" INITIAL "); - x.getInitial().accept(this); - } - - if (x.getFreeLists() != null) { - print(" FREELISTS "); - x.getFreeLists().accept(this); - } - - if (x.getFreeListGroups() != null) { - print(" FREELIST GROUPS "); - x.getFreeListGroups().accept(this); - } - - if (x.getBufferPool() != null) { - print(" BUFFER_POOL "); - x.getBufferPool().accept(this); - } - - if (x.getObjno() != null) { - print(" OBJNO "); - x.getObjno().accept(this); - } - - print(")"); - return false; - } - - @Override - public void endVisit(OracleStorageClause x) { - - } - - @Override - public boolean visit(OracleGotoStatement x) { - print("GOTO "); - x.getLabel().accept(this); - return false; - } - - @Override - public void endVisit(OracleGotoStatement x) { - - } - - @Override - public boolean visit(OracleLabelStatement x) { - print("<<"); - x.getLabel().accept(this); - print(">>"); - return false; - } - - @Override - public void endVisit(OracleLabelStatement x) { - - } - - @Override - public boolean visit(OracleParameter x) { - if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) { - print("CURSOR "); - x.getName().accept(this); - print(" IS"); - incrementIndent(); - println(); - SQLSelect select = ((SQLQueryExpr) x.getDefaultValue()).getSubQuery(); - select.accept(this); - decrementIndent(); - - } else { - x.getName().accept(this); - print(" "); - - x.getDataType().accept(this); - - if (x.getDefaultValue() != null) { - print(" := "); - x.getDefaultValue().accept(this); - } - } - - return false; - } - - @Override - public void endVisit(OracleParameter x) { - - } - - @Override - public boolean visit(OracleCommitStatement x) { - print("COMMIT"); - - if (x.isWrite()) { - print(" WRITE"); - if (x.getWait() != null) { - if (x.getWait().booleanValue()) { - print(" WAIT"); - } else { - print(" NOWAIT"); - } - } - - if (x.getImmediate() != null) { - if (x.getImmediate().booleanValue()) { - print(" IMMEDIATE"); - } else { - print(" BATCH"); - } - } - } - - return false; - } - - @Override - public void endVisit(OracleCommitStatement x) { - - } - - @Override - public boolean visit(OracleAlterTriggerStatement x) { - print("ALTER TRIGGER "); - x.getName().accept(this); - - if (x.isCompile()) { - print(" COMPILE"); - } - - if (x.getEnable() != null) { - if (x.getEnable().booleanValue()) { - print("ENABLE"); - } else { - print("DISABLE"); - } - } - return false; - } - - @Override - public void endVisit(OracleAlterTriggerStatement x) { - - } - - @Override - public boolean visit(OracleAlterSynonymStatement x) { - print("ALTER SYNONYM "); - x.getName().accept(this); - - if (x.isCompile()) { - print(" COMPILE"); - } - - if (x.getEnable() != null) { - if (x.getEnable().booleanValue()) { - print("ENABLE"); - } else { - print("DISABLE"); - } - } - return false; - } - - @Override - public void endVisit(OracleAlterSynonymStatement x) { - - } - - @Override - public boolean visit(AsOfSnapshotClause x) { - print("AS OF SNAPSHOT("); - x.getExpr().accept(this); - print(")"); - return false; - } - - @Override - public void endVisit(AsOfSnapshotClause x) { - - } - - @Override - public boolean visit(OracleAlterViewStatement x) { - print("ALTER VIEW "); - x.getName().accept(this); - - if (x.isCompile()) { - print(" COMPILE"); - } - - if (x.getEnable() != null) { - if (x.getEnable().booleanValue()) { - print("ENABLE"); - } else { - print("DISABLE"); - } - } - return false; - } - - @Override - public void endVisit(OracleAlterViewStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableMoveTablespace x) { - print(" MOVE TABLESPACE "); - x.getName().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableMoveTablespace x) { - - } - - @Override - public boolean visit(OracleSizeExpr x) { - x.getValue().accept(this); - print(x.getUnit().name()); - return false; - } - - @Override - public void endVisit(OracleSizeExpr x) { - - } - - @Override - public boolean visit(OracleFileSpecification x) { - printAndAccept(x.getFileNames(), ", "); - - if (x.getSize() != null) { - print(" SIZE "); - x.getSize().accept(this); - } - - if (x.isAutoExtendOff()) { - print(" AUTOEXTEND OFF"); - } else if (x.getAutoExtendOn() != null) { - print(" AUTOEXTEND ON "); - x.getAutoExtendOn().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleFileSpecification x) { - - } - - @Override - public boolean visit(OracleAlterTablespaceAddDataFile x) { - print("ADD DATAFILE"); - incrementIndent(); - for (OracleFileSpecification file : x.getFiles()) { - println(); - file.accept(this); - } - decrementIndent(); - return false; - } - - @Override - public void endVisit(OracleAlterTablespaceAddDataFile x) { - - } - - @Override - public boolean visit(OracleAlterTablespaceStatement x) { - print("ALTER TABLESPACE "); - x.getName().accept(this); - println(); - x.getItem().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTablespaceStatement x) { - - } - - @Override - public boolean visit(OracleTruncateStatement x) { - print("TRUNCATE TABLE "); - printAndAccept(x.getTableSources(), ", "); - - if (x.isPurgeSnapshotLog()) { - print(" PURGE SNAPSHOT LOG"); - } - return false; - } - - @Override - public void endVisit(OracleTruncateStatement x) { - - } - - @Override - public boolean visit(OracleCreateSequenceStatement x) { - print("CREATE SEQUENCE "); - x.getName().accept(this); - - if (x.getStartWith() != null) { - print(" START WITH "); - x.getStartWith().accept(this); - } - - if (x.getIncrementBy() != null) { - print(" INCREMENT BY "); - x.getIncrementBy().accept(this); - } - - if (x.getMaxValue() != null) { - print(" MAXVALUE "); - x.getMaxValue().accept(this); - } - - if (x.getCycle() != null) { - if (x.getCycle().booleanValue()) { - print(" CYCLE"); - } else { - print(" NOCYCLE"); - } - } - - if (x.getCache() != null) { - if (x.getCache().booleanValue()) { - print(" CACHE"); - } else { - print(" NOCACHE"); - } - } - - return false; - } - - @Override - public void endVisit(OracleCreateSequenceStatement x) { - - } - - @Override - public boolean visit(OracleRangeValuesClause x) { - print("PARTITION "); - x.getName().accept(this); - print(" VALUES LESS THAN ("); - printAndAccept(x.getValues(), ", "); - print(")"); - return false; - } - - @Override - public void endVisit(OracleRangeValuesClause x) { - - } - - @Override - public boolean visit(OraclePartitionByRangeClause x) { - print("PARTITION BY RANGE ("); - printAndAccept(x.getColumns(), ", "); - print(")"); - - if (x.getInterval() != null) { - print(" INTERVAL "); - x.getInterval().accept(this); - } - - if (x.getStoreIn().size() > 0) { - print(" STORE IN ("); - printAndAccept(x.getStoreIn(), ", "); - print(")"); - } - - println(); - print("("); - incrementIndent(); - for (int i = 0, size = x.getRanges().size(); i < size; ++i) { - if (i != 0) { - print(","); - } - println(); - x.getRanges().get(i).accept(this); - } - decrementIndent(); - println(); - print(")"); - return false; - } - - @Override - public void endVisit(OraclePartitionByRangeClause x) { - - } - - @Override - public boolean visit(OracleLoopStatement x) { - print("LOOP"); - incrementIndent(); - println(); - - for (int i = 0, size = x.getStatements().size(); i < size; ++i) { - SQLStatement item = x.getStatements().get(i); - item.setParent(x); - item.accept(this); - if (i != size - 1) { - println(); - } - } - - decrementIndent(); - println(); - print("END LOOP"); - return false; - } - - @Override - public void endVisit(OracleLoopStatement x) { - - } - - @Override - public boolean visit(OracleExitStatement x) { - print("EXIT"); - if (x.getWhen() != null) { - print(" WHEN "); - x.getWhen().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleExitStatement x) { - - } - - @Override - public boolean visit(OracleFetchStatement x) { - print("FETCH "); - x.getCursorName().accept(this); - print(" INTO "); - printAndAccept(x.getInto(), ", "); - return false; - } - - @Override - public void endVisit(OracleFetchStatement x) { - - } - - @Override - public void endVisit(SQLRollbackStatement x) { - - } - - @Override - public boolean visit(OracleSavePointStatement x) { - print("ROLLBACK"); - if (x.getTo() != null) { - print(" TO "); - x.getTo().accept(this); - } - return false; - } - - @Override - public void endVisit(OracleSavePointStatement x) { - - } - - @Override - public boolean visit(OracleCreateProcedureStatement x) { - if (x.isOrReplace()) { - print("CREATE OR REPLACE PROCEDURE "); - } else { - print("CREATE PROCEDURE "); - } - x.getName().accept(this); - - int paramSize = x.getParameters().size(); - - if (paramSize > 0) { - print(" ("); - incrementIndent(); - println(); - - for (int i = 0; i < paramSize; ++i) { - if (i != 0) { - print(", "); - println(); - } - OracleParameter param = x.getParameters().get(i); - param.accept(this); - } - - decrementIndent(); - println(); - print(")"); - } - - println(); - x.getBlock().setParent(x); - x.getBlock().accept(this); - return false; - } - - @Override - public void endVisit(OracleCreateProcedureStatement x) { - - } - - @Override - public boolean visit(OracleCreateDatabaseDbLinkStatement x) { - print("CREATE "); - if (x.isShared()) { - print("SHARE "); - } - - if (x.isPublic()) { - print("PUBLIC "); - } - - print("DATABASE LINK "); - - x.getName().accept(this); - - if (x.getUser() != null) { - print(" CONNECT TO "); - x.getUser().accept(this); - - if (x.getPassword() != null) { - print(" IDENTIFIED BY "); - print(x.getPassword()); - } - } - - if (x.getAuthenticatedUser() != null) { - print(" AUTHENTICATED BY "); - x.getAuthenticatedUser().accept(this); - if (x.getAuthenticatedPassword() != null) { - print(" IDENTIFIED BY "); - print(x.getAuthenticatedPassword()); - } - } - - if (x.getUsing() != null) { - print(" USING "); - x.getUsing().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleCreateDatabaseDbLinkStatement x) { - - } - - @Override - public boolean visit(OracleDropDatabaseLinkStatement x) { - print("DROP "); - if (x.isPublic()) { - print("PUBLIC "); - } - print("DATABASE LINK "); - x.getName().accept(this); - - return false; - } - - @Override - public void endVisit(OracleDropDatabaseLinkStatement x) { - - } - - public boolean visit(SQLCharactorDataType x) { - print(x.getName()); - if (x.getArguments().size() > 0) { - print("("); - x.getArguments().get(0).accept(this); - if (x.getCharType() != null) { - print(' '); - print(x.getCharType()); - } - print(")"); - } - return false; - } - - @Override - public boolean visit(OracleDataTypeTimestamp x) { - print(x.getName()); - if (x.getArguments().size() > 0) { - print("("); - x.getArguments().get(0).accept(this); - print(")"); - } - - if (x.isWithTimeZone()) { - print(" WITH TIME ZONE"); - } else if (x.isWithLocalTimeZone()) { - print(" WITH LOCAL TIME ZONE"); - } - - return false; - } - - @Override - public void endVisit(OracleDataTypeTimestamp x) { - - } - - @Override - public boolean visit(OracleDataTypeIntervalYear x) { - print(x.getName()); - if (x.getArguments().size() > 0) { - print("("); - x.getArguments().get(0).accept(this); - print(")"); - } - - print(" TO MONTH"); - - return false; - } - - @Override - public void endVisit(OracleDataTypeIntervalYear x) { - - } - - @Override - public boolean visit(OracleDataTypeIntervalDay x) { - print(x.getName()); - if (x.getArguments().size() > 0) { - print("("); - x.getArguments().get(0).accept(this); - print(")"); - } - - print(" TO SECOND"); - - if (x.getFractionalSeconds().size() > 0) { - print("("); - x.getFractionalSeconds().get(0).accept(this); - print(")"); - } - - return false; - } - - @Override - public void endVisit(OracleDataTypeIntervalDay x) { - - } - - @Override - public boolean visit(OracleDropSequenceStatement x) { - print("DROP SEQUENCE "); - x.getName().accept(this); - return false; - } - - @Override - 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) { - - } - - @Override - public boolean visit(OracleLobStorageClause x) { - print("LOB ("); - printAndAccept(x.getItems(), ","); - print(") STORE AS "); - - if (x.isSecureFile()) { - print("SECUREFILE "); - } - - if (x.isBasicFile()) { - print("BASICFILE "); - } - - boolean first = true; - print('('); - if (x.getTableSpace() != null) { - if (!first) { - print(' '); - } - print("TABLESPACE "); - x.getTableSpace().accept(this); - first = false; - } - - if (x.getEnable() != null) { - if (!first) { - print(' '); - } - if (x.getEnable().booleanValue()) { - print("ENABLE STORAGE IN ROW"); - } else { - print("DISABLE STORAGE IN ROW"); - } - } - - if (x.getChunk() != null) { - if (!first) { - print(' '); - } - print("CHUNK "); - x.getChunk().accept(this); - } - - if (x.getCache() != null) { - if (!first) { - print(' '); - } - if (x.getCache().booleanValue()) { - print("CACHE"); - } else { - print("NOCACHE"); - } - - if (x.getLogging() != null) { - if (x.getLogging().booleanValue()) { - print(" LOGGING"); - } else { - print(" NOLOGGING"); - } - } - } - - if (x.getCompress() != null) { - if (!first) { - print(' '); - } - if (x.getCompress().booleanValue()) { - print("COMPRESS"); - } else { - print("NOCOMPRESS"); - } - } - - if (x.getKeepDuplicate() != null) { - if (!first) { - print(' '); - } - if (x.getKeepDuplicate().booleanValue()) { - print("KEEP_DUPLICATES"); - } else { - print("DEDUPLICATE"); - } - } - - print(')'); - return false; - } - - @Override - public void endVisit(OracleLobStorageClause x) { - - } -} +/* + * 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.visitor; + +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLHint; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLSetQuantifier; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; +import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLUnique; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellReferenceOption; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRuleOption; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReferenceModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +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.OracleUnique; +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 { + + private final boolean printPostSemi; + + public OracleOutputVisitor(Appendable appender){ + this(appender, true); + } + + public OracleOutputVisitor(Appendable appender, boolean printPostSemi){ + super(appender); + this.printPostSemi = printPostSemi; + } + + public boolean isPrintPostSemi() { + return printPostSemi; + } + + public void postVisit(SQLObject x) { + if (!isPrintPostSemi()) { + return; + } + + if (x instanceof SQLStatement) { + if (x instanceof OraclePLSQLCommitStatement) { + return; + } + if (x.getParent() instanceof OracleCreateProcedureStatement) { + return; + } + + if (isPrettyFormat()) { + if (x.getParent() != null) { + print(";"); + } else { + println(";"); + } + } + } + } + + private void printHints(List hints) { + if (hints.size() > 0) { + print("/*+ "); + printAndAccept(hints, ", "); + print(" */"); + } + } + + public boolean visit(OracleAggregateExpr expr) { + print(expr.getMethodName()); + print("("); + + if (expr.getOption() != null) { + print(expr.getOption().toString()); + print(' '); + } + + printAndAccept(expr.getArguments(), ", "); + print(")"); + + if (expr.getOver() != null) { + print(" OVER ("); + expr.getOver().accept(this); + print(")"); + } + return false; + } + + public boolean visit(SQLAllColumnExpr x) { + print("*"); + return false; + } + + public boolean visit(OracleAnalytic x) { + boolean space = false; + if (x.getPartitionBy().size() > 0) { + print("PARTITION BY "); + printAndAccept(x.getPartitionBy(), ", "); + + space = true; + } + + if (x.getOrderBy() != null) { + if (space) { + print(" "); + } + x.getOrderBy().accept(this); + space = true; + } + + if (x.getWindowing() != null) { + if (space) { + print(" "); + } + x.getWindowing().accept(this); + } + + return false; + } + + public boolean visit(OracleAnalyticWindowing x) { + print(x.getType().name().toUpperCase()); + print(" "); + x.getExpr().accept(this); + return false; + } + + public boolean visit(OracleDateExpr x) { + print("DATE '"); + print(x.getLiteral()); + print('\''); + return false; + } + + public boolean visit(OracleDbLinkExpr x) { + x.getExpr().accept(this); + print("@"); + print(x.getDbLink()); + return false; + } + + public boolean visit(OracleDeleteStatement x) { + if (x.getTableName() != null) { + print("DELETE "); + printHints(x.getHints()); + + print("FROM "); + if (x.isOnly()) { + print("ONLY ("); + x.getTableName().accept(this); + print(")"); + } else { + x.getTableName().accept(this); + } + + printAlias(x.getAlias()); + } + + if (x.getWhere() != null) { + println(); + print("WHERE "); + x.getWhere().setParent(x); + x.getWhere().accept(this); + } + + if (x.getReturning() != null) { + println(); + x.getReturning().accept(this); + } + + return false; + } + + public boolean visit(OracleExtractExpr x) { + print("EXTRACT("); + print(x.getUnit().name()); + print(" FROM "); + x.getFrom().accept(this); + print(")"); + return false; + } + + public boolean visit(OracleIntervalExpr x) { + if (x.getValue() instanceof SQLLiteralExpr) { + print("INTERVAL "); + x.getValue().accept(this); + print(" "); + } else { + print('('); + x.getValue().accept(this); + print(") "); + } + + print(x.getType().name()); + + if (x.getPrecision() != null) { + print("("); + print(x.getPrecision().intValue()); + if (x.getFactionalSecondsPrecision() != null) { + print(", "); + print(x.getFactionalSecondsPrecision().intValue()); + } + print(")"); + } + + if (x.getToType() != null) { + print(" TO "); + print(x.getToType().name()); + if (x.getToFactionalSecondsPrecision() != null) { + print("("); + print(x.getToFactionalSecondsPrecision().intValue()); + print(")"); + } + } + + return false; + } + + public boolean visit(OracleOrderBy x) { + if (x.getItems().size() > 0) { + print("ORDER "); + if (x.isSibings()) { + print("SIBLINGS "); + } + print("BY "); + + printAndAccept(x.getItems(), ", "); + } + return false; + } + + public boolean visit(OracleOuterExpr x) { + x.getExpr().accept(this); + print("(+)"); + return false; + } + + public boolean visit(OraclePLSQLCommitStatement astNode) { + print("/"); + println(); + return false; + } + + public boolean visit(SQLSelect x) { + if (x instanceof OracleSelect) { + return visit((OracleSelect) x); + } + + return super.visit(x); + } + + public boolean visit(OracleSelect x) { + if (x.getWithSubQuery() != null) { + x.getWithSubQuery().accept(this); + println(); + } + + x.getQuery().accept(this); + + if (x.getRestriction() != null) { + print(" "); + x.getRestriction().accept(this); + } + + if (x.getForUpdate() != null) { + println(); + x.getForUpdate().accept(this); + } + + if (x.getOrderBy() != null) { + println(); + x.getOrderBy().accept(this); + } + + return false; + } + + public boolean visit(OracleSelectForUpdate x) { + print("FOR UPDATE"); + if (x.getOf().size() > 0) { + print("("); + printAndAccept(x.getOf(), ", "); + print(")"); + } + + if (x.isNotWait()) { + print(" NOWAIT"); + } else if (x.isSkipLocked()) { + print(" SKIP LOCKED"); + } else if (x.getWait() != null) { + print(" WAIT "); + x.getWait().accept(this); + } + return false; + } + + public boolean visit(OracleSelectHierachicalQueryClause x) { + if (x.getStartWith() != null) { + print("START WITH "); + x.getStartWith().accept(this); + println(); + } + + print("CONNECT BY "); + + if (x.isNoCycle()) { + print("NOCYCLE "); + } + + if (x.isPrior()) { + print("PRIOR "); + } + + x.getConnectBy().accept(this); + + return false; + } + + public boolean visit(OracleSelectJoin x) { + x.getLeft().accept(this); + + if (x.getJoinType() == JoinType.COMMA) { + print(", "); + x.getRight().accept(this); + } else { + boolean isRoot = x.getParent() instanceof SQLSelectQueryBlock; + if (isRoot) { + incrementIndent(); + } + + println(); + print(JoinType.toString(x.getJoinType())); + print(" "); + + x.getRight().accept(this); + + if (isRoot) { + decrementIndent(); + } + + if (x.getCondition() != null) { + print(" ON "); + x.getCondition().accept(this); + print(" "); + } + + if (x.getUsing().size() > 0) { + print(" USING ("); + printAndAccept(x.getUsing(), ", "); + print(")"); + } + + if (x.getFlashback() != null) { + println(); + x.getFlashback().accept(this); + } + } + + return false; + } + + public boolean visit(OracleOrderByItem x) { + x.getExpr().accept(this); + if (x.getType() != null) { + print(" "); + print(x.getType().name().toUpperCase()); + } + + if (x.getNullsOrderType() != null) { + print(" "); + print(x.getNullsOrderType().toFormalString()); + } + + return false; + } + + public boolean visit(OracleSelectPivot x) { + print("PIVOT"); + if (x.isXml()) { + print(" XML"); + } + print(" ("); + printAndAccept(x.getItems(), ", "); + + if (x.getPivotFor().size() > 0) { + print(" FOR "); + if (x.getPivotFor().size() == 1) { + ((SQLExpr) x.getPivotFor().get(0)).accept(this); + } else { + print("("); + printAndAccept(x.getPivotFor(), ", "); + print(")"); + } + } + + if (x.getPivotIn().size() > 0) { + print(" IN ("); + printAndAccept(x.getPivotIn(), ", "); + print(")"); + } + + print(")"); + + return false; + } + + public boolean visit(OracleSelectPivot.Item x) { + x.getExpr().accept(this); + if ((x.getAlias() != null) && (x.getAlias().length() > 0)) { + print(" AS "); + print(x.getAlias()); + } + return false; + } + + public boolean visit(SQLSelectQueryBlock select) { + if (select instanceof OracleSelectQueryBlock) { + return visit((OracleSelectQueryBlock) select); + } + + return super.visit(select); + } + + public boolean visit(OracleSelectQueryBlock x) { + print("SELECT "); + + if (x.getHints().size() > 0) { + printAndAccept(x.getHints(), ", "); + print(' '); + } + + if (SQLSetQuantifier.ALL == x.getDistionOption()) { + print("ALL "); + } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { + print("DISTINCT "); + } else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) { + print("UNIQUE "); + } + + printSelectList(x.getSelectList()); + + if (x.getInto() != null) { + println(); + print("INTO "); + x.getInto().accept(this); + } + + println(); + print("FROM "); + if (x.getFrom() == null) { + print("DUAL"); + } else { + x.getFrom().setParent(x); + x.getFrom().accept(this); + } + + if (x.getWhere() != null) { + println(); + print("WHERE "); + x.getWhere().setParent(x); + x.getWhere().accept(this); + } + + if (x.getHierachicalQueryClause() != null) { + println(); + x.getHierachicalQueryClause().accept(this); + } + + if (x.getGroupBy() != null) { + println(); + x.getGroupBy().accept(this); + } + + if (x.getModelClause() != null) { + println(); + x.getModelClause().accept(this); + } + + return false; + } + + public boolean visit(OracleSelectRestriction.CheckOption x) { + print("CHECK OPTION"); + if (x.getConstraint() != null) { + print(" "); + x.getConstraint().accept(this); + } + return false; + } + + public boolean visit(OracleSelectRestriction.ReadOnly x) { + print("READ ONLY"); + return false; + } + + public boolean visit(OracleSelectSubqueryTableSource x) { + print("("); + incrementIndent(); + println(); + x.getSelect().accept(this); + decrementIndent(); + println(); + print(")"); + + if (x.getPivot() != null) { + println(); + x.getPivot().accept(this); + } + + if (x.getFlashback() != null) { + println(); + x.getFlashback().accept(this); + } + + if ((x.getAlias() != null) && (x.getAlias().length() != 0)) { + print(" "); + print(x.getAlias()); + } + + return false; + } + + public boolean visit(OracleSelectTableReference x) { + if (x.isOnly()) { + print("ONLY ("); + x.getExpr().accept(this); + + if (x.getPartition() != null) { + print(" "); + x.getPartition().accept(this); + } + + print(")"); + } else { + x.getExpr().accept(this); + + if (x.getPartition() != null) { + print(" "); + x.getPartition().accept(this); + } + } + + if (x.getHints().size() > 0) { + this.printHints(x.getHints()); + } + + if (x.getSampleClause() != null) { + print(" "); + x.getSampleClause().accept(this); + } + + if (x.getPivot() != null) { + println(); + x.getPivot().accept(this); + } + + if (x.getFlashback() != null) { + println(); + x.getFlashback().accept(this); + } + + printAlias(x.getAlias()); + + return false; + } + + public boolean visit(OracleSelectUnPivot x) { + print("UNPIVOT"); + if (x.getNullsIncludeType() != null) { + print(" "); + print(OracleSelectUnPivot.NullsIncludeType.toString(x.getNullsIncludeType())); + } + + print(" ("); + if (x.getItems().size() == 1) { + ((SQLExpr) x.getItems().get(0)).accept(this); + } else { + print(" ("); + printAndAccept(x.getItems(), ", "); + print(")"); + } + + if (x.getPivotFor().size() > 0) { + print(" FOR "); + if (x.getPivotFor().size() == 1) { + ((SQLExpr) x.getPivotFor().get(0)).accept(this); + } else { + print("("); + printAndAccept(x.getPivotFor(), ", "); + print(")"); + } + } + + if (x.getPivotIn().size() > 0) { + print(" IN ("); + printAndAccept(x.getPivotIn(), ", "); + print(")"); + } + + print(")"); + return false; + } + + public boolean visit(OracleTimestampExpr x) { + print("TIMESTAMP '"); + + print(x.getLiteral()); + print('\''); + + if (x.getTimeZone() != null) { + print(" AT TIME ZONE '"); + print(x.getTimeZone()); + print('\''); + } + + return false; + } + + public boolean visit(OracleUpdateStatement x) { + print("UPDATE "); + printHints(x.getHints()); + + if (x.isOnly()) { + print("ONLY ("); + x.getTableSource().accept(this); + print(")"); + } else { + x.getTableSource().accept(this); + } + + printAlias(x.getAlias()); + + println(); + + print("SET "); + for (int i = 0, size = x.getItems().size(); i < size; ++i) { + if (i != 0) { + print(", "); + } + x.getItems().get(i).accept(this); + } + + if (x.getWhere() != null) { + println(); + print("WHERE "); + x.getWhere().setParent(x); + x.getWhere().accept(this); + } + + if (x.getReturning().size() > 0) { + println(); + print("RETURNING "); + printAndAccept(x.getReturning(), ", "); + print(" INTO "); + printAndAccept(x.getReturningInto(), ", "); + } + + return false; + } + + // /////////////////// + + @Override + public void endVisit(OracleAggregateExpr astNode) { + + } + + @Override + public void endVisit(OraclePLSQLCommitStatement astNode) { + + } + + @Override + public void endVisit(OracleAnalytic x) { + + } + + @Override + public void endVisit(OracleAnalyticWindowing x) { + + } + + @Override + public void endVisit(OracleDateExpr x) { + + } + + @Override + public void endVisit(OracleDbLinkExpr x) { + + } + + @Override + public void endVisit(OracleDeleteStatement x) { + + } + + @Override + public void endVisit(OracleExtractExpr x) { + + } + + @Override + public void endVisit(OracleIntervalExpr x) { + + } + + @Override + public void endVisit(SQLMethodInvokeExpr x) { + + } + + @Override + public void endVisit(OracleOrderBy x) { + + } + + @Override + public void endVisit(OracleOuterExpr x) { + + } + + @Override + public void endVisit(OracleSelectForUpdate x) { + + } + + @Override + public void endVisit(OracleSelectHierachicalQueryClause x) { + + } + + @Override + public void endVisit(OracleSelectJoin x) { + + } + + @Override + public void endVisit(OracleOrderByItem x) { + + } + + @Override + public void endVisit(OracleSelectPivot x) { + + } + + @Override + public void endVisit(Item x) { + + } + + @Override + public void endVisit(CheckOption x) { + + } + + @Override + public void endVisit(ReadOnly x) { + + } + + @Override + public void endVisit(OracleSelectSubqueryTableSource x) { + + } + + @Override + public void endVisit(OracleSelectUnPivot x) { + + } + + @Override + public void endVisit(OracleTimestampExpr x) { + + } + + @Override + public void endVisit(OracleUpdateStatement x) { + + } + + @Override + public boolean visit(SampleClause x) { + print("SAMPLE "); + + if (x.isBlock()) { + print("BLOCK "); + } + + print("("); + printAndAccept(x.getPercent(), ", "); + print(")"); + + if (x.getSeedValue() != null) { + print(" SEED ("); + x.getSeedValue().accept(this); + print(")"); + } + + return false; + } + + @Override + public void endVisit(SampleClause x) { + + } + + @Override + public void endVisit(OracleSelectTableReference x) { + + } + + @Override + public boolean visit(PartitionExtensionClause x) { + if (x.isSubPartition()) { + print("SUBPARTITION "); + } else { + print("PARTITION "); + } + + if (x.getPartition() != null) { + print("("); + x.getPartition().accept(this); + print(")"); + } else { + print("FOR ("); + printAndAccept(x.getFor(), ","); + print(")"); + } + return false; + } + + @Override + public void endVisit(PartitionExtensionClause x) { + + } + + @Override + public boolean visit(VersionsFlashbackQueryClause x) { + print("VERSIONS BETWEEN "); + print(x.getType().name()); + print(" "); + x.getBegin().accept(this); + print(" AND "); + x.getEnd().accept(this); + return false; + } + + @Override + public void endVisit(VersionsFlashbackQueryClause x) { + + } + + @Override + public boolean visit(AsOfFlashbackQueryClause x) { + print("AS OF "); + print(x.getType().name()); + print(" ("); + x.getExpr().accept(this); + print(")"); + return false; + } + + @Override + public void endVisit(AsOfFlashbackQueryClause x) { + + } + + @Override + public boolean visit(GroupingSetExpr x) { + print("GROUPING SETS"); + print(" ("); + printAndAccept(x.getParameters(), ", "); + print(")"); + return false; + } + + @Override + public void endVisit(GroupingSetExpr x) { + + } + + @Override + public boolean visit(OracleWithSubqueryEntry x) { + x.getName().accept(this); + + if (x.getColumns().size() > 0) { + print(" ("); + printAndAccept(x.getColumns(), ", "); + print(")"); + } + println(); + print("AS"); + println(); + print("("); + incrementIndent(); + println(); + x.getSubQuery().accept(this); + decrementIndent(); + println(); + print(")"); + + if (x.getSearchClause() != null) { + println(); + x.getSearchClause().accept(this); + } + + if (x.getCycleClause() != null) { + println(); + x.getCycleClause().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleWithSubqueryEntry x) { + + } + + @Override + public boolean visit(SearchClause x) { + print("SEARCH "); + print(x.getType().name()); + print(" FIRST BY "); + printAndAccept(x.getItems(), ", "); + print(" SET "); + x.getOrderingColumn().accept(this); + + return false; + } + + @Override + public void endVisit(SearchClause x) { + + } + + @Override + public boolean visit(CycleClause x) { + print("CYCLE "); + printAndAccept(x.getAliases(), ", "); + print(" SET "); + x.getMark().accept(this); + print(" TO "); + x.getValue().accept(this); + print(" DEFAULT "); + x.getDefaultValue().accept(this); + + return false; + } + + @Override + public void endVisit(CycleClause x) { + + } + + @Override + public boolean visit(OracleBinaryFloatExpr x) { + print(x.getValue().toString()); + print('F'); + return false; + } + + @Override + public void endVisit(OracleBinaryFloatExpr x) { + + } + + @Override + public boolean visit(OracleBinaryDoubleExpr x) { + print(x.getValue().toString()); + print('D'); + return false; + } + + @Override + public void endVisit(OracleBinaryDoubleExpr x) { + + } + + @Override + public void endVisit(OracleSelect x) { + + } + + @Override + public boolean visit(OracleCursorExpr x) { + print("CURSOR("); + incrementIndent(); + println(); + x.getQuery().accept(this); + decrementIndent(); + println(); + print(")"); + return false; + } + + @Override + public void endVisit(OracleCursorExpr x) { + + } + + @Override + public boolean visit(OracleIsSetExpr x) { + x.getNestedTable().accept(this); + print(" IS A SET"); + return false; + } + + @Override + public void endVisit(OracleIsSetExpr x) { + + } + + @Override + public boolean visit(ReturnRowsClause x) { + if (x.isAll()) { + print("RETURN ALL ROWS"); + } else { + print("RETURN UPDATED ROWS"); + } + return false; + } + + @Override + public void endVisit(ReturnRowsClause x) { + + } + + @Override + public boolean visit(ModelClause x) { + print("MODEL"); + + incrementIndent(); + for (CellReferenceOption opt : x.getCellReferenceOptions()) { + print(' '); + print(opt.name); + } + + if (x.getReturnRowsClause() != null) { + print(' '); + x.getReturnRowsClause().accept(this); + } + + for (ReferenceModelClause item : x.getReferenceModelClauses()) { + print(' '); + item.accept(this); + } + + x.getMainModel().accept(this); + decrementIndent(); + + return false; + } + + @Override + public void endVisit(ModelClause x) { + + } + + @Override + public boolean visit(MainModelClause x) { + if (x.getMainModelName() != null) { + print(" MAIN "); + x.getMainModelName().accept(this); + } + + println(); + x.getModelColumnClause().accept(this); + + for (CellReferenceOption opt : x.getCellReferenceOptions()) { + println(); + print(opt.name); + } + + println(); + x.getModelRulesClause().accept(this); + + return false; + } + + @Override + public void endVisit(MainModelClause x) { + + } + + @Override + public boolean visit(ModelColumnClause x) { + if (x.getQueryPartitionClause() != null) { + x.getQueryPartitionClause().accept(this); + println(); + } + + print("DIMENSION BY ("); + printAndAccept(x.getDimensionByColumns(), ", "); + print(")"); + + println(); + print("MEASURES ("); + printAndAccept(x.getMeasuresColumns(), ", "); + print(")"); + return false; + } + + @Override + public void endVisit(ModelColumnClause x) { + + } + + @Override + public boolean visit(QueryPartitionClause x) { + print("PARTITION BY ("); + printAndAccept(x.getExprList(), ", "); + print(")"); + return false; + } + + @Override + public void endVisit(QueryPartitionClause x) { + + } + + @Override + public boolean visit(ModelColumn x) { + x.getExpr().accept(this); + if (x.getAlias() != null) { + print(" "); + print(x.getAlias()); + } + return false; + } + + @Override + public void endVisit(ModelColumn x) { + + } + + @Override + public boolean visit(ModelRulesClause x) { + if (x.getOptions().size() > 0) { + print("RULES"); + for (ModelRuleOption opt : x.getOptions()) { + print(" "); + print(opt.name); + } + } + + if (x.getIterate() != null) { + print(" ITERATE ("); + x.getIterate().accept(this); + print(")"); + + if (x.getUntil() != null) { + print(" UNTIL ("); + x.getUntil().accept(this); + print(")"); + } + } + + print(" ("); + printAndAccept(x.getCellAssignmentItems(), ", "); + print(")"); + return false; + + } + + @Override + public void endVisit(ModelRulesClause x) { + + } + + @Override + public boolean visit(CellAssignmentItem x) { + if (x.getOption() != null) { + print(x.getOption().name); + print(" "); + } + + x.getCellAssignment().accept(this); + + if (x.getOrderBy() != null) { + print(" "); + x.getOrderBy().accept(this); + } + + print(" = "); + x.getExpr().accept(this); + + return false; + } + + @Override + public void endVisit(CellAssignmentItem x) { + + } + + @Override + public boolean visit(CellAssignment x) { + x.getMeasureColumn().accept(this); + print("["); + printAndAccept(x.getConditions(), ", "); + print("]"); + return false; + } + + @Override + public void endVisit(CellAssignment x) { + + } + + @Override + public boolean visit(OracleMergeStatement x) { + print("MERGE "); + if (x.getHints().size() > 0) { + printAndAccept(x.getHints(), ", "); + print(" "); + } + + print("INTO "); + x.getInto().accept(this); + + if (x.getAlias() != null) { + print(" "); + print(x.getAlias()); + } + + println(); + print("USING "); + x.getUsing().accept(this); + + print(" ON "); + x.getOn().accept(this); + + if (x.getUpdateClause() != null) { + println(); + x.getUpdateClause().accept(this); + } + + if (x.getInsertClause() != null) { + println(); + x.getInsertClause().accept(this); + } + + if (x.getErrorLoggingClause() != null) { + println(); + x.getErrorLoggingClause().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleMergeStatement x) { + + } + + @Override + public boolean visit(MergeUpdateClause x) { + print("WHEN MATCHED THEN UPDATE SET "); + printAndAccept(x.getItems(), ", "); + if (x.getWhere() != null) { + incrementIndent(); + println(); + print("WHERE "); + x.getWhere().setParent(x); + x.getWhere().accept(this); + decrementIndent(); + } + + if (x.getDeleteWhere() != null) { + incrementIndent(); + println(); + print("DELETE WHERE "); + x.getDeleteWhere().setParent(x); + x.getDeleteWhere().accept(this); + decrementIndent(); + } + + return false; + } + + @Override + public void endVisit(MergeUpdateClause x) { + + } + + @Override + public boolean visit(MergeInsertClause x) { + print("WHEN NOT MATCHED THEN INSERT"); + if (x.getColumns().size() > 0) { + print(" "); + printAndAccept(x.getColumns(), ", "); + } + print(" VALUES ("); + printAndAccept(x.getValues(), ", "); + print(")"); + if (x.getWhere() != null) { + incrementIndent(); + println(); + print("WHERE "); + x.getWhere().setParent(x); + x.getWhere().accept(this); + decrementIndent(); + } + + return false; + } + + @Override + public void endVisit(MergeInsertClause x) { + + } + + @Override + public boolean visit(OracleErrorLoggingClause x) { + print("LOG ERRORS "); + if (x.getInto() != null) { + print("INTO "); + x.getInto().accept(this); + print(" "); + } + + if (x.getSimpleExpression() != null) { + print("("); + x.getSimpleExpression().accept(this); + print(")"); + } + + if (x.getLimit() != null) { + print(" REJECT LIMIT "); + x.getLimit().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleErrorLoggingClause x) { + + } + + @Override + public boolean visit(OracleReturningClause x) { + print("RETURNING "); + printAndAccept(x.getItems(), ", "); + print(" INTO "); + printAndAccept(x.getValues(), ", "); + + return false; + } + + @Override + public void endVisit(OracleReturningClause x) { + + } + + @Override + public boolean visit(OracleInsertStatement x) { + visit((SQLInsertStatement) x); + + if (x.getReturning() != null) { + println(); + x.getReturning().accept(this); + } + + if (x.getErrorLogging() != null) { + println(); + x.getErrorLogging().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleInsertStatement x) { + endVisit((SQLInsertStatement) x); + } + + @Override + public boolean visit(InsertIntoClause x) { + print("INTO "); + + x.getTableSource().accept(this); + + if (x.getColumns().size() > 0) { + incrementIndent(); + println(); + print("("); + for (int i = 0, size = x.getColumns().size(); i < size; ++i) { + if (i != 0) { + if (i % 5 == 0) { + println(); + } + print(", "); + } + x.getColumns().get(i).accept(this); + } + print(")"); + decrementIndent(); + } + + if (x.getValues() != null) { + println(); + print("VALUES "); + x.getValues().accept(this); + } else { + if (x.getQuery() != null) { + println(); + x.getQuery().setParent(x); + x.getQuery().accept(this); + } + } + + return false; + } + + @Override + public void endVisit(InsertIntoClause x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement x) { + print("INSERT "); + + if (x.getHints().size() > 0) { + this.printHints(x.getHints()); + } + + if (x.getOption() != null) { + print(x.getOption().name()); + print(" "); + } + + for (int i = 0, size = x.getEntries().size(); i < size; ++i) { + incrementIndent(); + println(); + x.getEntries().get(i).accept(this); + decrementIndent(); + } + + println(); + x.getSubQuery().accept(this); + + return false; + } + + @Override + public void endVisit(OracleMultiInsertStatement x) { + + } + + @Override + public boolean visit(ConditionalInsertClause x) { + for (int i = 0, size = x.getItems().size(); i < size; ++i) { + if (i != 0) { + println(); + } + + ConditionalInsertClauseItem item = x.getItems().get(i); + + item.accept(this); + } + + if (x.getElseItem() != null) { + println(); + print("ELSE"); + incrementIndent(); + println(); + x.getElseItem().accept(this); + decrementIndent(); + } + + return false; + } + + @Override + public void endVisit(ConditionalInsertClause x) { + + } + + @Override + public boolean visit(ConditionalInsertClauseItem x) { + print("WHEN "); + x.getWhen().accept(this); + print(" THEN"); + incrementIndent(); + println(); + x.getThen().accept(this); + decrementIndent(); + return false; + } + + @Override + public void endVisit(ConditionalInsertClauseItem x) { + + } + + @Override + public void endVisit(OracleSelectQueryBlock x) { + + } + + @Override + public boolean visit(OracleBlockStatement x) { + if (x.getParameters().size() != 0) { + print("DECLARE"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getParameters().size(); i < size; ++i) { + if (i != 0) { + println(); + } + OracleParameter param = x.getParameters().get(i); + param.accept(this); + print(";"); + } + + decrementIndent(); + println(); + } + print("BEGIN"); + incrementIndent(); + println(); + for (int i = 0, size = x.getStatementList().size(); i < size; ++i) { + if (i != 0) { + println(); + } + SQLStatement stmt = x.getStatementList().get(i); + stmt.setParent(x); + stmt.accept(this); + } + decrementIndent(); + println(); + print("END"); + return false; + } + + @Override + public void endVisit(OracleBlockStatement x) { + + } + + @Override + public boolean visit(OracleLockTableStatement x) { + print("LOCK TABLE "); + x.getTable().accept(this); + print(" IN "); + print(x.getLockMode().name()); + print(" MODE "); + if (x.isNoWait()) { + print("NOWAIT"); + } else if (x.getWait() != null) { + print("WAIT "); + x.getWait().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleLockTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterSessionStatement x) { + print("ALTER SESSION SET "); + printAndAccept(x.getItems(), ", "); + return false; + } + + @Override + public void endVisit(OracleAlterSessionStatement x) { + + } + + @Override + public boolean visit(OracleExprStatement x) { + x.getExpr().accept(this); + return false; + } + + @Override + public void endVisit(OracleExprStatement x) { + + } + + @Override + public boolean visit(OracleDatetimeExpr x) { + x.getExpr().accept(this); + SQLExpr timeZone = x.getTimeZone(); + + if (timeZone instanceof SQLIdentifierExpr) { + if (((SQLIdentifierExpr) timeZone).getName().equalsIgnoreCase("LOCAL")) { + print(" AT LOCAL"); + return false; + } + } + + print(" AT TIME ZONE "); + timeZone.accept(this); + + return false; + } + + @Override + public void endVisit(OracleDatetimeExpr x) { + + } + + @Override + public boolean visit(OracleSysdateExpr x) { + print("SYSDATE"); + if (x.getOption() != null) { + print("@"); + print(x.getOption()); + } + return false; + } + + @Override + public void endVisit(OracleSysdateExpr x) { + + } + + @Override + public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { + + } + + @Override + public boolean visit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { + print("WHEN "); + x.getWhen().accept(this); + incrementIndent(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + println(); + SQLStatement stmt = x.getStatements().get(i); + stmt.setParent(x); + stmt.accept(this); + } + decrementIndent(); + return false; + } + + @Override + public boolean visit(OracleExceptionStatement x) { + print("EXCEPTION"); + incrementIndent(); + for (OracleExceptionStatement.Item item : x.getItems()) { + println(); + item.accept(this); + } + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleExceptionStatement x) { + + } + + @Override + public boolean visit(OracleArgumentExpr x) { + print(x.getArgumentName()); + print(" => "); + x.getValue().accept(this); + return false; + } + + @Override + public void endVisit(OracleArgumentExpr x) { + + } + + @Override + public boolean visit(OracleSetTransactionStatement x) { + if (x.isReadOnly()) { + print("SET TRANSACTION READ ONLY NAME "); + } else { + print("SET TRANSACTION NAME "); + } + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleSetTransactionStatement x) { + + } + + @Override + public boolean visit(OracleGrantStatement x) { + print("GRANT "); + for (int i = 0, size = x.getPrivileges().size(); i < size; ++i) { + if (i != 0) { + print(", "); + } + print(x.getPrivileges().get(i)); + } + + if (x.getOn() != null) { + print(" ON "); + x.getOn().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleGrantStatement x) { + + } + + @Override + public boolean visit(OracleExplainStatement x) { + print("EXPLAIN PLAN"); + incrementIndent(); + println(); + if (x.getStatementId() != null) { + print("SET STATEMENT_ID = "); + x.getStatementId().accept(this); + println(); + } + + if (x.getInto() != null) { + print("INTO "); + x.getInto().accept(this); + println(); + } + + print("FRO"); + println(); + x.getForStatement().accept(this); + + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + print("ALTER PROCEDURE "); + x.getName().accept(this); + if (x.isCompile()) { + print(" COMPILE"); + } + if (x.isReuseSettings()) { + print(" REUSE SETTINGS"); + } + return false; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + print("DROP PARTITION "); + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableStatement x) { + print("ALTER TABLE "); + x.getName().accept(this); + incrementIndent(); + for (SQLAlterTableItem item : x.getItems()) { + println(); + item.accept(this); + } + if (x.isUpdateGlobalIndexes()) { + println(); + print("UPDATE GLOABL INDEXES"); + } + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleAlterTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + print("TRUNCATE PARTITION "); + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(TableSpaceItem x) { + print("TABLESPACE "); + x.getTablespace().accept(this); + return false; + } + + @Override + public void endVisit(TableSpaceItem x) { + + } + + @Override + public boolean visit(UpdateIndexesClause x) { + print("UPDATE INDEXES"); + if (x.getItems().size() > 0) { + print("("); + printAndAccept(x.getItems(), ", "); + print(")"); + } + return false; + } + + @Override + public void endVisit(UpdateIndexesClause x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition x) { + print("SPLIT PARTITION "); + x.getName().accept(this); + + if (x.getAt().size() > 0) { + incrementIndent(); + println(); + print("AT ("); + printAndAccept(x.getAt(), ", "); + print(")"); + decrementIndent(); + } + + if (x.getInto().size() > 0) { + println(); + incrementIndent(); + print("INTO ("); + printAndAccept(x.getInto(), ", "); + print(")"); + decrementIndent(); + } + + if (x.getUpdateIndexes() != null) { + println(); + incrementIndent(); + x.getUpdateIndexes().accept(this); + decrementIndent(); + } + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition x) { + + } + + @Override + public boolean visit(NestedTablePartitionSpec x) { + print("PARTITION "); + x.getPartition().accept(this); + for (SQLObject item : x.getSegmentAttributeItems()) { + print(" "); + item.accept(this); + } + return false; + } + + @Override + public void endVisit(NestedTablePartitionSpec x) { + + } + + @Override + public boolean visit(OracleAlterTableModify x) { + print("MODIFY ("); + incrementIndent(); + for (int i = 0, size = x.getColumns().size(); i < size; ++i) { + println(); + SQLColumnDefinition column = x.getColumns().get(i); + column.accept(this); + if (i != size - 1) { + print(", "); + } + } + decrementIndent(); + println(); + print(")"); + + return false; + } + + @Override + public void endVisit(OracleAlterTableModify x) { + + } + + @Override + public boolean visit(OracleCreateIndexStatement x) { + print("CREATE "); + if (x.getType() != null) { + print(x.getType()); + print(" "); + } + + print("INDEX "); + + x.getName().accept(this); + print(" ON "); + x.getTable().accept(this); + print("("); + printAndAccept(x.getItems(), ", "); + print(")"); + + if (x.isIndexOnlyTopLevel()) { + println(); + print("INDEX ONLY TOPLEVEL"); + } + + if (x.getPtcfree() != null) { + println(); + print("PCTFREE "); + x.getPtcfree().accept(this); + } + + if (x.getInitrans() != null) { + println(); + print("INITRANS "); + x.getInitrans().accept(this); + } + + if (x.getMaxtrans() != null) { + println(); + print("MAXTRANS "); + x.getMaxtrans().accept(this); + } + + if (x.isComputeStatistics()) { + println(); + print("COMPUTE STATISTICS"); + } + + if (x.getTablespace() != null) { + println(); + print("TABLESPACE "); + x.getTablespace().accept(this); + } + + if (x.isOnline()) { + print(" ONLINE"); + } + + if (x.isNoParallel()) { + print(" NOPARALLEL"); + } else if (x.getParallel() != null) { + print(" PARALLEL "); + x.getParallel().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleCreateIndexStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement x) { + print("ALTER INDEX "); + x.getName().accept(this); + + if (x.getRenameTo() != null) { + print(" RENAME TO "); + x.getRenameTo().accept(this); + } + + if (x.getMonitoringUsage() != null) { + print(" MONITORING USAGE"); + } + + if (x.getRebuild() != null) { + print(" "); + x.getRebuild().accept(this); + } + + if (x.getParallel() != null) { + print(" PARALLEL"); + x.getParallel().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement x) { + + } + + @Override + public boolean visit(Rebuild x) { + print("REBUILD"); + + if (x.getOption() != null) { + print(" "); + x.getOption().accept(this); + } + return false; + } + + @Override + public void endVisit(Rebuild x) { + + } + + @Override + public boolean visit(OracleForStatement x) { + print("FOR "); + x.getIndex().accept(this); + print(" IN "); + x.getRange().accept(this); + println(); + print("LOOP"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + + decrementIndent(); + println(); + print("END LOOP"); + return false; + } + + @Override + public void endVisit(OracleForStatement x) { + + } + + @Override + public boolean visit(Else x) { + print("ELSE"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + if (i != 0) { + println(); + } + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + } + + decrementIndent(); + return false; + } + + @Override + public boolean visit(ElseIf x) { + print("ELSE IF "); + x.getCondition().accept(this); + print(" THEN"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + if (i != 0) { + println(); + } + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + } + + decrementIndent(); + return false; + } + + @Override + public void endVisit(ElseIf x) { + + } + + @Override + public void endVisit(Else x) { + + } + + @Override + public boolean visit(OracleIfStatement x) { + print("IF "); + x.getCondition().accept(this); + print(" THEN"); + incrementIndent(); + println(); + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + decrementIndent(); + + for (ElseIf elseIf : x.getElseIfList()) { + println(); + elseIf.accept(this); + } + + if (x.getElseItem() != null) { + println(); + x.getElseItem().accept(this); + } + println(); + print("END IF"); + return false; + } + + @Override + public void endVisit(OracleIfStatement x) { + + } + + @Override + public boolean visit(OracleRangeExpr x) { + x.getLowBound().accept(this); + print(".."); + x.getUpBound().accept(this); + return false; + } + + @Override + public void endVisit(OracleRangeExpr x) { + + } + + protected void visitColumnDefault(SQLColumnDefinition x) { + if (x.getParent() instanceof OracleBlockStatement) { + print(" := "); + } else { + print(" DEFAULT "); + } + x.getDefaultExpr().accept(this); + } + + @Override + public boolean visit(OracleAlterTableAddConstaint x) { + print("ADD "); + x.getConstraint().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableAddConstaint x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + if (x.getName() != null) { + print("CONSTRAINT "); + x.getName().accept(this); + print(" "); + } + print("PRIMARY KEY ("); + printAndAccept(x.getColumns(), ", "); + print(")"); + if (x.getUsing() != null) { + println(); + x.getUsing().accept(this); + } + if (x.getExceptionsInto() != null) { + println(); + print("EXCEPTIONS INTO "); + x.getExceptionsInto().accept(this); + } + return false; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + this.visit((SQLCreateTableStatement) x); + + if (x.isOrganizationIndex()) { + println(); + print("ORGANIZATION INDEX"); + } + + if (x.getPtcfree() != null) { + println(); + print("PCTFREE "); + x.getPtcfree().accept(this); + } + + if (x.getInitrans() != null) { + println(); + print("INITRANS "); + x.getInitrans().accept(this); + } + + if (x.getMaxtrans() != null) { + println(); + print("MAXTRANS "); + x.getMaxtrans().accept(this); + } + + if (x.isInMemoryMetadata()) { + println(); + print("IN_MEMORY_METADATA"); + } + + if (x.isCursorSpecificSegment()) { + println(); + print("CURSOR_SPECIFIC_SEGMENT"); + } + + if (x.getParallel() == Boolean.TRUE) { + println(); + print("PARALLEL"); + } else if (x.getParallel() == Boolean.FALSE) { + println(); + print("NOPARALLEL"); + } + + if (x.getCache() == Boolean.TRUE) { + println(); + print("CACHE"); + } else if (x.getCache() == Boolean.FALSE) { + println(); + print("NOCACHE"); + } + + if (x.getCompress() == Boolean.TRUE) { + println(); + print("COMPRESS"); + } else if (x.getCompress() == Boolean.FALSE) { + println(); + print("NOCOMPRESS"); + } + + if (x.getLogging() == Boolean.TRUE) { + println(); + print("LOGGING"); + } else if (x.getLogging() == Boolean.FALSE) { + println(); + print("NOLOGGING"); + } + + if (x.getTablespace() != null) { + println(); + print("TABLESPACE "); + x.getTablespace().accept(this); + } + + if (x.getStorage() != null) { + println(); + x.getStorage().accept(this); + } + + if (x.getLobStorage() != null) { + println(); + x.getLobStorage().accept(this); + } + + if (x.isOnCommit()) { + println(); + print("ON COMMIT"); + } + + if (x.isPreserveRows()) { + println(); + print("PRESERVE ROWS"); + } + + if (x.getPartitioning() != null) { + println(); + x.getPartitioning().accept(this); + } + + if (x.getSelect() != null) { + println(); + print("AS"); + println(); + x.getSelect().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableRenameTo x) { + print("RENAME TO "); + x.getTo().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableRenameTo x) { + + } + + @Override + public boolean visit(OracleStorageClause x) { + print("STORAGE ("); + + boolean first = true; + if (x.getInitial() != null) { + if (!first) { + print(' '); + } + print("INITIAL "); + x.getInitial().accept(this); + first = false; + } + + if (x.getMaxSize() != null) { + if (!first) { + print(' '); + } + print("MAXSIZE "); + x.getMaxSize().accept(this); + first = false; + } + + if (x.getFreeLists() != null) { + if (!first) { + print(' '); + } + print("FREELISTS "); + x.getFreeLists().accept(this); + first = false; + } + + if (x.getFreeListGroups() != null) { + if (!first) { + print(' '); + } + + print("FREELIST GROUPS "); + x.getFreeListGroups().accept(this); + first = false; + } + + if (x.getBufferPool() != null) { + if (!first) { + print(' '); + } + print("BUFFER_POOL "); + x.getBufferPool().accept(this); + first = false; + } + + if (x.getObjno() != null) { + if (!first) { + print(' '); + } + print("OBJNO "); + x.getObjno().accept(this); + first = false; + } + + print(")"); + return false; + } + + @Override + public void endVisit(OracleStorageClause x) { + + } + + @Override + public boolean visit(OracleGotoStatement x) { + print("GOTO "); + x.getLabel().accept(this); + return false; + } + + @Override + public void endVisit(OracleGotoStatement x) { + + } + + @Override + public boolean visit(OracleLabelStatement x) { + print("<<"); + x.getLabel().accept(this); + print(">>"); + return false; + } + + @Override + public void endVisit(OracleLabelStatement x) { + + } + + @Override + public boolean visit(OracleParameter x) { + if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) { + print("CURSOR "); + x.getName().accept(this); + print(" IS"); + incrementIndent(); + println(); + SQLSelect select = ((SQLQueryExpr) x.getDefaultValue()).getSubQuery(); + select.accept(this); + decrementIndent(); + + } else { + x.getName().accept(this); + print(" "); + + x.getDataType().accept(this); + + if (x.getDefaultValue() != null) { + print(" := "); + x.getDefaultValue().accept(this); + } + } + + return false; + } + + @Override + public void endVisit(OracleParameter x) { + + } + + @Override + public boolean visit(OracleCommitStatement x) { + print("COMMIT"); + + if (x.isWrite()) { + print(" WRITE"); + if (x.getWait() != null) { + if (x.getWait().booleanValue()) { + print(" WAIT"); + } else { + print(" NOWAIT"); + } + } + + if (x.getImmediate() != null) { + if (x.getImmediate().booleanValue()) { + print(" IMMEDIATE"); + } else { + print(" BATCH"); + } + } + } + + return false; + } + + @Override + public void endVisit(OracleCommitStatement x) { + + } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + print("ALTER TRIGGER "); + x.getName().accept(this); + + if (x.isCompile()) { + print(" COMPILE"); + } + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print("ENABLE"); + } else { + print("DISABLE"); + } + } + return false; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + print("ALTER SYNONYM "); + x.getName().accept(this); + + if (x.isCompile()) { + print(" COMPILE"); + } + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print("ENABLE"); + } else { + print("DISABLE"); + } + } + return false; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(AsOfSnapshotClause x) { + print("AS OF SNAPSHOT("); + x.getExpr().accept(this); + print(")"); + return false; + } + + @Override + public void endVisit(AsOfSnapshotClause x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + print("ALTER VIEW "); + x.getName().accept(this); + + if (x.isCompile()) { + print(" COMPILE"); + } + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print("ENABLE"); + } else { + print("DISABLE"); + } + } + return false; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + print(" MOVE TABLESPACE "); + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + x.getValue().accept(this); + print(x.getUnit().name()); + return false; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + + @Override + public boolean visit(OracleFileSpecification x) { + printAndAccept(x.getFileNames(), ", "); + + if (x.getSize() != null) { + print(" SIZE "); + x.getSize().accept(this); + } + + if (x.isAutoExtendOff()) { + print(" AUTOEXTEND OFF"); + } else if (x.getAutoExtendOn() != null) { + print(" AUTOEXTEND ON "); + x.getAutoExtendOn().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + print("ADD DATAFILE"); + incrementIndent(); + for (OracleFileSpecification file : x.getFiles()) { + println(); + file.accept(this); + } + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + print("ALTER TABLESPACE "); + x.getName().accept(this); + println(); + x.getItem().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleTruncateStatement x) { + print("TRUNCATE TABLE "); + printAndAccept(x.getTableSources(), ", "); + + if (x.isPurgeSnapshotLog()) { + print(" PURGE SNAPSHOT LOG"); + } + return false; + } + + @Override + public void endVisit(OracleTruncateStatement x) { + + } + + @Override + public boolean visit(OracleCreateSequenceStatement x) { + print("CREATE SEQUENCE "); + x.getName().accept(this); + + if (x.getStartWith() != null) { + print(" START WITH "); + x.getStartWith().accept(this); + } + + if (x.getIncrementBy() != null) { + print(" INCREMENT BY "); + x.getIncrementBy().accept(this); + } + + if (x.getMaxValue() != null) { + print(" MAXVALUE "); + x.getMaxValue().accept(this); + } + + if (x.getCycle() != null) { + if (x.getCycle().booleanValue()) { + print(" CYCLE"); + } else { + print(" NOCYCLE"); + } + } + + if (x.getCache() != null) { + if (x.getCache().booleanValue()) { + print(" CACHE"); + } else { + print(" NOCACHE"); + } + } + + return false; + } + + @Override + public void endVisit(OracleCreateSequenceStatement x) { + + } + + @Override + public boolean visit(OracleRangeValuesClause x) { + print("PARTITION "); + x.getName().accept(this); + print(" VALUES LESS THAN ("); + printAndAccept(x.getValues(), ", "); + print(")"); + return false; + } + + @Override + public void endVisit(OracleRangeValuesClause x) { + + } + + @Override + public boolean visit(OraclePartitionByRangeClause x) { + print("PARTITION BY RANGE ("); + printAndAccept(x.getColumns(), ", "); + print(")"); + + if (x.getInterval() != null) { + print(" INTERVAL "); + x.getInterval().accept(this); + } + + if (x.getStoreIn().size() > 0) { + print(" STORE IN ("); + printAndAccept(x.getStoreIn(), ", "); + print(")"); + } + + println(); + print("("); + incrementIndent(); + for (int i = 0, size = x.getRanges().size(); i < size; ++i) { + if (i != 0) { + print(","); + } + println(); + x.getRanges().get(i).accept(this); + } + decrementIndent(); + println(); + print(")"); + return false; + } + + @Override + public void endVisit(OraclePartitionByRangeClause x) { + + } + + @Override + public boolean visit(OracleLoopStatement x) { + print("LOOP"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + + decrementIndent(); + println(); + print("END LOOP"); + return false; + } + + @Override + public void endVisit(OracleLoopStatement x) { + + } + + @Override + public boolean visit(OracleExitStatement x) { + print("EXIT"); + if (x.getWhen() != null) { + print(" WHEN "); + x.getWhen().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleExitStatement x) { + + } + + @Override + public boolean visit(OracleFetchStatement x) { + print("FETCH "); + x.getCursorName().accept(this); + print(" INTO "); + printAndAccept(x.getInto(), ", "); + return false; + } + + @Override + public void endVisit(OracleFetchStatement x) { + + } + + @Override + public void endVisit(SQLRollbackStatement x) { + + } + + @Override + public boolean visit(OracleSavePointStatement x) { + print("ROLLBACK"); + if (x.getTo() != null) { + print(" TO "); + x.getTo().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleSavePointStatement x) { + + } + + @Override + public boolean visit(OracleCreateProcedureStatement x) { + if (x.isOrReplace()) { + print("CREATE OR REPLACE PROCEDURE "); + } else { + print("CREATE PROCEDURE "); + } + x.getName().accept(this); + + int paramSize = x.getParameters().size(); + + if (paramSize > 0) { + print(" ("); + incrementIndent(); + println(); + + for (int i = 0; i < paramSize; ++i) { + if (i != 0) { + print(", "); + println(); + } + OracleParameter param = x.getParameters().get(i); + param.accept(this); + } + + decrementIndent(); + println(); + print(")"); + } + + println(); + x.getBlock().setParent(x); + x.getBlock().accept(this); + return false; + } + + @Override + public void endVisit(OracleCreateProcedureStatement x) { + + } + + @Override + public boolean visit(OracleCreateDatabaseDbLinkStatement x) { + print("CREATE "); + if (x.isShared()) { + print("SHARE "); + } + + if (x.isPublic()) { + print("PUBLIC "); + } + + print("DATABASE LINK "); + + x.getName().accept(this); + + if (x.getUser() != null) { + print(" CONNECT TO "); + x.getUser().accept(this); + + if (x.getPassword() != null) { + print(" IDENTIFIED BY "); + print(x.getPassword()); + } + } + + if (x.getAuthenticatedUser() != null) { + print(" AUTHENTICATED BY "); + x.getAuthenticatedUser().accept(this); + if (x.getAuthenticatedPassword() != null) { + print(" IDENTIFIED BY "); + print(x.getAuthenticatedPassword()); + } + } + + if (x.getUsing() != null) { + print(" USING "); + x.getUsing().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleCreateDatabaseDbLinkStatement x) { + + } + + @Override + public boolean visit(OracleDropDatabaseLinkStatement x) { + print("DROP "); + if (x.isPublic()) { + print("PUBLIC "); + } + print("DATABASE LINK "); + x.getName().accept(this); + + return false; + } + + @Override + public void endVisit(OracleDropDatabaseLinkStatement x) { + + } + + public boolean visit(SQLCharactorDataType x) { + print(x.getName()); + if (x.getArguments().size() > 0) { + print("("); + x.getArguments().get(0).accept(this); + if (x.getCharType() != null) { + print(' '); + print(x.getCharType()); + } + print(")"); + } + return false; + } + + @Override + public boolean visit(OracleDataTypeTimestamp x) { + print(x.getName()); + if (x.getArguments().size() > 0) { + print("("); + x.getArguments().get(0).accept(this); + print(")"); + } + + if (x.isWithTimeZone()) { + print(" WITH TIME ZONE"); + } else if (x.isWithLocalTimeZone()) { + print(" WITH LOCAL TIME ZONE"); + } + + return false; + } + + @Override + public void endVisit(OracleDataTypeTimestamp x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalYear x) { + print(x.getName()); + if (x.getArguments().size() > 0) { + print("("); + x.getArguments().get(0).accept(this); + print(")"); + } + + print(" TO MONTH"); + + return false; + } + + @Override + public void endVisit(OracleDataTypeIntervalYear x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalDay x) { + print(x.getName()); + if (x.getArguments().size() > 0) { + print("("); + x.getArguments().get(0).accept(this); + print(")"); + } + + print(" TO SECOND"); + + if (x.getFractionalSeconds().size() > 0) { + print("("); + x.getFractionalSeconds().get(0).accept(this); + print(")"); + } + + return false; + } + + @Override + public void endVisit(OracleDataTypeIntervalDay x) { + + } + + @Override + public boolean visit(OracleDropSequenceStatement x) { + print("DROP SEQUENCE "); + x.getName().accept(this); + return false; + } + + @Override + 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) { + + } + + @Override + public boolean visit(OracleLobStorageClause x) { + print("LOB ("); + printAndAccept(x.getItems(), ","); + print(") STORE AS "); + + if (x.isSecureFile()) { + print("SECUREFILE "); + } + + if (x.isBasicFile()) { + print("BASICFILE "); + } + + boolean first = true; + print('('); + if (x.getTableSpace() != null) { + if (!first) { + print(' '); + } + print("TABLESPACE "); + x.getTableSpace().accept(this); + first = false; + } + + if (x.getEnable() != null) { + if (!first) { + print(' '); + } + if (x.getEnable().booleanValue()) { + print("ENABLE STORAGE IN ROW"); + } else { + print("DISABLE STORAGE IN ROW"); + } + } + + if (x.getChunk() != null) { + if (!first) { + print(' '); + } + print("CHUNK "); + x.getChunk().accept(this); + } + + if (x.getCache() != null) { + if (!first) { + print(' '); + } + if (x.getCache().booleanValue()) { + print("CACHE"); + } else { + print("NOCACHE"); + } + + if (x.getLogging() != null) { + if (x.getLogging().booleanValue()) { + print(" LOGGING"); + } else { + print(" NOLOGGING"); + } + } + } + + if (x.getCompress() != null) { + if (!first) { + print(' '); + } + if (x.getCompress().booleanValue()) { + print("COMPRESS"); + } else { + print("NOCOMPRESS"); + } + } + + if (x.getKeepDuplicate() != null) { + if (!first) { + print(' '); + } + if (x.getKeepDuplicate().booleanValue()) { + print("KEEP_DUPLICATES"); + } else { + print("DEDUPLICATE"); + } + } + + print(')'); + return false; + } + + @Override + public void endVisit(OracleLobStorageClause x) { + + } + + @Override + public boolean visit(OracleUnique x) { + visit((SQLUnique) x); + + if (x.getUsing() != null) { + println(); + x.getUsing().accept(this); + } + if (x.getExceptionsInto() != null) { + println(); + print("EXCEPTIONS INTO "); + x.getExceptionsInto().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleUnique x) { + + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 8e82d39fcc..6138ee6da2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -1,1809 +1,1809 @@ -/* - * 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.visitor; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; -import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; -import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -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; -import com.alibaba.druid.stat.TableStat.Mode; -import com.alibaba.druid.stat.TableStat.Relationship; -import com.alibaba.druid.util.JdbcUtils; - -public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor { - - public OracleSchemaStatVisitor(){ - this(new ArrayList()); - } - - public OracleSchemaStatVisitor(List parameters){ - super(parameters); - this.variants.put("DUAL", null); - this.variants.put("NOTFOUND", null); - this.variants.put("TRUE", null); - this.variants.put("FALSE", null); - } - - @Override - public String getDbType() { - return JdbcUtils.ORACLE; - } - - protected Column getColumn(SQLExpr expr) { - if (expr instanceof OracleOuterExpr) { - expr = ((OracleOuterExpr) expr).getExpr(); - } - - return super.getColumn(expr); - } - - public boolean visit(OracleSelectTableReference x) { - SQLExpr expr = x.getExpr(); - - if (expr instanceof SQLMethodInvokeExpr) { - SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) expr; - if ("TABLE".equalsIgnoreCase(methodInvoke.getMethodName()) && methodInvoke.getParameters().size() == 1) { - expr = methodInvoke.getParameters().get(0); - } - } - - Map aliasMap = getAliasMap(); - - if (expr instanceof SQLName) { - String ident; - if (expr instanceof SQLPropertyExpr) { - String owner = ((SQLPropertyExpr) expr).getOwner().toString(); - String name = ((SQLPropertyExpr) expr).getName(); - - if (aliasMap.containsKey(owner)) { - owner = aliasMap.get(owner); - } - ident = owner + "." + name; - } else { - ident = expr.toString(); - } - - if (subQueryMap.containsKey(ident)) { - return false; - } - - if ("DUAL".equalsIgnoreCase(ident)) { - return false; - } - - x.putAttribute(ATTR_TABLE, ident); - - TableStat stat = getTableStat(ident); - - Mode mode = getMode(); - switch (mode) { - case Delete: - stat.incrementDeleteCount(); - break; - case Insert: - stat.incrementInsertCount(); - break; - case Update: - stat.incrementUpdateCount(); - break; - case Select: - stat.incrementSelectCount(); - break; - case Merge: - stat.incrementMergeCount(); - break; - default: - break; - } - - if (aliasMap != null) { - if (x.getAlias() != null) { - aliasMap.put(x.getAlias(), ident); - } - aliasMap.put(ident, ident); - } - return false; - } - - accept(x.getExpr()); - - return false; - } - - public boolean visit(SQLAggregateExpr x) { - accept(x.getArguments()); - return false; - } - - public boolean visit(OracleAggregateExpr x) { - accept(x.getArguments()); - accept(x.getOver()); - return false; - } - - public void endVisit(OracleSelect x) { - endVisit((SQLSelect) x); - } - - public boolean visit(OracleSelect x) { - setCurrentTable(x); - - if (x.getOrderBy() != null) { - x.getOrderBy().setParent(x); - } - - accept(x.getWithSubQuery()); - accept(x.getQuery()); - - setCurrentTable(x, (String) x.getQuery().getAttribute("table")); - - accept(x.getOrderBy()); - - return false; - } - - public void endVisit(SQLSelect x) { - if (x.getQuery() != null) { - String table = (String) x.getQuery().getAttribute(ATTR_TABLE); - if (table != null) { - x.putAttribute(ATTR_TABLE, table); - } - } - restoreCurrentTable(x); - } - - public boolean visit(OracleUpdateStatement x) { - setAliasMap(); - setMode(x, Mode.Update); - - SQLTableSource tableSource = x.getTableSource(); - SQLExpr tableExpr = null; - - if (tableSource instanceof SQLExprTableSource) { - tableExpr = ((SQLExprTableSource) tableSource).getExpr(); - } - - if (tableExpr instanceof SQLName) { - String ident = tableExpr.toString(); - setCurrentTable(ident); - - TableStat stat = getTableStat(ident); - stat.incrementUpdateCount(); - - Map aliasMap = getAliasMap(); - aliasMap.put(ident, ident); - aliasMap.put(tableSource.getAlias(), ident); - } else { - tableSource.accept(this); - } - - accept(x.getItems()); - accept(x.getWhere()); - - return false; - } - - public void endVisit(OracleUpdateStatement x) { - } - - public boolean visit(OracleDeleteStatement x) { - return visit((SQLDeleteStatement) x); - } - - public void endVisit(OracleDeleteStatement x) { - } - - public boolean visit(OracleSelectQueryBlock x) { - if (x.getWhere() != null) { - x.getWhere().setParent(x); - } - - if (x.getInto() instanceof SQLName) { - String tableName = x.getInto().toString(); - TableStat stat = getTableStat(tableName); - if (stat != null) { - stat.incrementInsertCount(); - } - } - - visit((SQLSelectQueryBlock) x); - - return true; - } - - public void endVisit(OracleSelectQueryBlock x) { - endVisit((SQLSelectQueryBlock) x); - } - - public boolean visit(SQLPropertyExpr x) { - if ("ROWNUM".equalsIgnoreCase(x.getName())) { - return false; - } - - return super.visit(x); - } - - public boolean visit(SQLMethodInvokeExpr x) { - accept(x.getParameters()); - return false; - } - - public boolean visit(SQLIdentifierExpr x) { - if ("ROWNUM".equalsIgnoreCase(x.getName())) { - return false; - } - - if ("SYSDATE".equalsIgnoreCase(x.getName())) { - return false; - } - - if ("+".equalsIgnoreCase(x.getName())) { - return false; - } - - if ("LEVEL".equals(x.getName())) { - return false; - } - - return super.visit(x); - } - - @Override - public void endVisit(OracleAggregateExpr astNode) { - - } - - @Override - public void endVisit(OracleConstraintState astNode) { - - } - - @Override - public void endVisit(OraclePLSQLCommitStatement astNode) { - - } - - @Override - public void endVisit(OracleAnalytic x) { - - } - - @Override - public void endVisit(OracleAnalyticWindowing x) { - - } - - @Override - public void endVisit(OracleDateExpr x) { - - } - - @Override - public void endVisit(OracleDbLinkExpr x) { - - } - - @Override - public void endVisit(OracleExtractExpr x) { - - } - - @Override - public void endVisit(OracleIntervalExpr x) { - - } - - @Override - public void endVisit(OracleOrderBy x) { - - } - - @Override - public void endVisit(OracleOuterExpr x) { - - } - - @Override - public void endVisit(OracleSelectForUpdate x) { - - } - - @Override - public void endVisit(OracleSelectHierachicalQueryClause x) { - - } - - @Override - public void endVisit(OracleSelectJoin x) { - - } - - @Override - public void endVisit(OracleOrderByItem x) { - - } - - @Override - public void endVisit(OracleSelectPivot x) { - - } - - @Override - public void endVisit(Item x) { - - } - - @Override - public void endVisit(CheckOption x) { - - } - - @Override - public void endVisit(ReadOnly x) { - - } - - @Override - public void endVisit(OracleSelectSubqueryTableSource x) { - - } - - @Override - public void endVisit(OracleSelectUnPivot x) { - - } - - @Override - public void endVisit(OracleTimestampExpr x) { - - } - - @Override - public boolean visit(OracleConstraintState astNode) { - - return true; - } - - @Override - public boolean visit(OraclePLSQLCommitStatement astNode) { - - return true; - } - - @Override - public boolean visit(OracleAnalytic x) { - - return true; - } - - @Override - public boolean visit(OracleAnalyticWindowing x) { - - return true; - } - - @Override - public boolean visit(OracleDateExpr x) { - - return true; - } - - @Override - public boolean visit(OracleDbLinkExpr x) { - - return true; - } - - @Override - public boolean visit(OracleExtractExpr x) { - - return true; - } - - @Override - public boolean visit(OracleIntervalExpr x) { - - return true; - } - - @Override - public boolean visit(OracleOrderBy x) { - return this.visit((SQLOrderBy) x); - } - - @Override - public boolean visit(OracleOuterExpr x) { - - return true; - } - - @Override - public boolean visit(OracleSelectForUpdate x) { - - return true; - } - - @Override - public boolean visit(OracleSelectHierachicalQueryClause x) { - - return true; - } - - @Override - public boolean visit(OracleSelectJoin x) { - x.getLeft().accept(this); - x.getRight().accept(this); - - { - String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); - String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); - if (leftTable != null && leftTable.equals(rightTable)) { - x.putAttribute(ATTR_TABLE, leftTable); - } - } - if (x.getCondition() != null) { - x.getCondition().accept(this); - } - - for (SQLExpr item : x.getUsing()) { - if (item instanceof SQLIdentifierExpr) { - String columnName = ((SQLIdentifierExpr) item).getName(); - String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); - String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); - if (leftTable != null && rightTable != null) { - Relationship relationship = new Relationship(); - relationship.setLeft(new Column(leftTable, columnName)); - relationship.setRight(new Column(rightTable, columnName)); - relationship.setOperator("USING"); - relationships.add(relationship); - } - - if (leftTable != null) { - addColumn(leftTable, columnName); - } - - if (rightTable != null) { - addColumn(rightTable, columnName); - } - } - } - - return false; - } - - @Override - public boolean visit(OracleOrderByItem x) { - - return true; - } - - @Override - public boolean visit(OracleSelectPivot x) { - - return true; - } - - @Override - public boolean visit(Item x) { - - return true; - } - - @Override - public boolean visit(CheckOption x) { - - return true; - } - - @Override - public boolean visit(ReadOnly x) { - - return true; - } - - @Override - public boolean visit(OracleSelectSubqueryTableSource x) { - accept(x.getSelect()); - accept(x.getPivot()); - accept(x.getFlashback()); - - String table = (String) x.getSelect().getAttribute(ATTR_TABLE); - if (x.getAlias() != null) { - if (table != null) { - this.aliasMap.put(x.getAlias(), table); - } - this.subQueryMap.put(x.getAlias(), x.getSelect()); - this.setCurrentTable(x.getAlias()); - } - - if (table != null) { - x.putAttribute(ATTR_TABLE, table); - } - return false; - } - - @Override - public boolean visit(OracleSelectUnPivot x) { - - return true; - } - - @Override - public boolean visit(OracleTimestampExpr x) { - return true; - } - - @Override - public boolean visit(SampleClause x) { - - return true; - } - - @Override - public void endVisit(SampleClause x) { - - } - - @Override - public void endVisit(OracleSelectTableReference x) { - - } - - @Override - public boolean visit(PartitionExtensionClause x) { - - return true; - } - - @Override - public void endVisit(PartitionExtensionClause x) { - - } - - @Override - public boolean visit(VersionsFlashbackQueryClause x) { - - return true; - } - - @Override - public void endVisit(VersionsFlashbackQueryClause x) { - - } - - @Override - public boolean visit(AsOfFlashbackQueryClause x) { - - return true; - } - - @Override - public void endVisit(AsOfFlashbackQueryClause x) { - - } - - @Override - public boolean visit(GroupingSetExpr x) { - - return true; - } - - @Override - public void endVisit(GroupingSetExpr x) { - - } - - @Override - public boolean visit(OracleWithSubqueryEntry x) { - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - String alias = null; - if (x.getName() != null) { - alias = x.getName().toString(); - } - - if (alias != null) { - aliasMap.put(alias, null); - subQueryMap.put(alias, x.getSubQuery()); - } - } - x.getSubQuery().accept(this); - return false; - } - - @Override - public void endVisit(OracleWithSubqueryEntry x) { - - } - - @Override - public boolean visit(SearchClause x) { - - return true; - } - - @Override - public void endVisit(SearchClause x) { - - } - - @Override - public boolean visit(CycleClause x) { - - return true; - } - - @Override - public void endVisit(CycleClause x) { - - } - - @Override - public boolean visit(OracleBinaryFloatExpr x) { - - return true; - } - - @Override - public void endVisit(OracleBinaryFloatExpr x) { - - } - - @Override - public boolean visit(OracleBinaryDoubleExpr x) { - - return true; - } - - @Override - public void endVisit(OracleBinaryDoubleExpr x) { - - } - - @Override - public boolean visit(OracleCursorExpr x) { - - return true; - } - - @Override - public void endVisit(OracleCursorExpr x) { - - } - - @Override - public boolean visit(OracleIsSetExpr x) { - - return true; - } - - @Override - public void endVisit(OracleIsSetExpr x) { - - } - - @Override - public boolean visit(ReturnRowsClause x) { - - return true; - } - - @Override - public void endVisit(ReturnRowsClause x) { - - } - - @Override - public boolean visit(MainModelClause x) { - - return true; - } - - @Override - public void endVisit(MainModelClause x) { - - } - - @Override - public boolean visit(ModelColumnClause x) { - - return true; - } - - @Override - public void endVisit(ModelColumnClause x) { - - } - - @Override - public boolean visit(QueryPartitionClause x) { - - return true; - } - - @Override - public void endVisit(QueryPartitionClause x) { - - } - - @Override - public boolean visit(ModelColumn x) { - - return true; - } - - @Override - public void endVisit(ModelColumn x) { - - } - - @Override - public boolean visit(ModelRulesClause x) { - - return true; - } - - @Override - public void endVisit(ModelRulesClause x) { - - } - - @Override - public boolean visit(CellAssignmentItem x) { - - return true; - } - - @Override - public void endVisit(CellAssignmentItem x) { - - } - - @Override - public boolean visit(CellAssignment x) { - - return true; - } - - @Override - public void endVisit(CellAssignment x) { - - } - - @Override - public boolean visit(ModelClause x) { - return true; - } - - @Override - public void endVisit(ModelClause x) { - - } - - @Override - public boolean visit(OracleMergeStatement x) { - setAliasMap(); - - String originalTable = getCurrentTable(); - - setMode(x.getUsing(), Mode.Select); - x.getUsing().accept(this); - - setMode(x, Mode.Merge); - - String ident = x.getInto().toString(); - setCurrentTable(x, ident); - x.putAttribute("_old_local_", originalTable); - - TableStat stat = getTableStat(ident); - stat.incrementMergeCount(); - - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - if (x.getAlias() != null) { - aliasMap.put(x.getAlias(), ident); - } - aliasMap.put(ident, ident); - } - - x.getOn().accept(this); - - if (x.getUpdateClause() != null) { - x.getUpdateClause().accept(this); - } - - if (x.getInsertClause() != null) { - x.getInsertClause().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleMergeStatement x) { - } - - @Override - public boolean visit(MergeUpdateClause x) { - return true; - } - - @Override - public void endVisit(MergeUpdateClause x) { - - } - - @Override - public boolean visit(MergeInsertClause x) { - return true; - } - - @Override - public void endVisit(MergeInsertClause x) { - - } - - @Override - public boolean visit(OracleErrorLoggingClause x) { - return true; - } - - @Override - public void endVisit(OracleErrorLoggingClause x) { - - } - - @Override - public boolean visit(OracleReturningClause x) { - return true; - } - - @Override - public void endVisit(OracleReturningClause x) { - - } - - @Override - public boolean visit(OracleInsertStatement x) { - return visit((SQLInsertStatement) x); - } - - @Override - public void endVisit(OracleInsertStatement x) { - endVisit((SQLInsertStatement) x); - } - - @Override - public boolean visit(InsertIntoClause x) { - - if (x.getTableName() instanceof SQLName) { - String ident = ((SQLName) x.getTableName()).toString(); - setCurrentTable(x, ident); - - TableStat stat = getTableStat(ident); - stat.incrementInsertCount(); - - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - if (x.getAlias() != null) { - aliasMap.put(x.getAlias(), ident); - } - aliasMap.put(ident, ident); - } - } - - accept(x.getColumns()); - accept(x.getQuery()); - accept(x.getReturning()); - accept(x.getErrorLogging()); - - return false; - } - - @Override - public void endVisit(InsertIntoClause x) { - - } - - @Override - public boolean visit(OracleMultiInsertStatement x) { - x.putAttribute("_original_use_mode", getMode()); - setMode(x, Mode.Insert); - - setAliasMap(); - - accept(x.getSubQuery()); - - for (OracleMultiInsertStatement.Entry entry : x.getEntries()) { - entry.setParent(x); - } - - accept(x.getEntries()); - - return false; - } - - @Override - public void endVisit(OracleMultiInsertStatement x) { - - } - - @Override - public boolean visit(ConditionalInsertClause x) { - for (ConditionalInsertClauseItem item : x.getItems()) { - item.setParent(x); - } - if (x.getElseItem() != null) { - x.getElseItem().setParent(x); - } - return true; - } - - @Override - public void endVisit(ConditionalInsertClause x) { - - } - - @Override - public boolean visit(ConditionalInsertClauseItem x) { - SQLObject parent = x.getParent(); - if (parent instanceof ConditionalInsertClause) { - parent = parent.getParent(); - } - if (parent instanceof OracleMultiInsertStatement) { - SQLSelect subQuery = ((OracleMultiInsertStatement) parent).getSubQuery(); - if (subQuery != null) { - String table = (String) subQuery.getAttribute("_table_"); - setCurrentTable(x, table); - } - } - x.getWhen().accept(this); - x.getThen().accept(this); - restoreCurrentTable(x); - return false; - } - - @Override - public void endVisit(ConditionalInsertClauseItem x) { - - } - - @Override - public boolean visit(OracleBlockStatement x) { - for (OracleParameter param : x.getParameters()) { - param.setParent(x); - - SQLExpr name = param.getName(); - this.variants.put(name.toString(), name); - } - return true; - } - - @Override - public void endVisit(OracleBlockStatement x) { - - } - - @Override - public boolean visit(OracleAlterSessionStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterSessionStatement x) { - - } - - @Override - public boolean visit(OracleExprStatement x) { - return false; - } - - @Override - public void endVisit(OracleExprStatement x) { - - } - - @Override - public boolean visit(OracleLockTableStatement x) { - String tableName = x.getTable().toString(); - getTableStat(tableName); - return false; - } - - @Override - public void endVisit(OracleLockTableStatement x) { - - } - - @Override - public boolean visit(OracleDatetimeExpr x) { - return true; - } - - @Override - public void endVisit(OracleDatetimeExpr x) { - - } - - @Override - public boolean visit(OracleSysdateExpr x) { - return false; - } - - @Override - public void endVisit(OracleSysdateExpr x) { - - } - - @Override - public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - - } - - @Override - public boolean visit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - return true; - } - - @Override - public boolean visit(OracleExceptionStatement x) { - return true; - } - - @Override - public void endVisit(OracleExceptionStatement x) { - - } - - @Override - public boolean visit(OracleArgumentExpr x) { - return true; - } - - @Override - public void endVisit(OracleArgumentExpr x) { - - } - - @Override - public boolean visit(OracleSetTransactionStatement x) { - return false; - } - - @Override - public void endVisit(OracleSetTransactionStatement x) { - - } - - @Override - public boolean visit(OracleGrantStatement x) { - return false; - } - - @Override - public void endVisit(OracleGrantStatement x) { - - } - - @Override - public boolean visit(OracleExplainStatement x) { - return false; - } - - @Override - public void endVisit(OracleExplainStatement x) { - - } - - @Override - public boolean visit(OracleAlterProcedureStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterProcedureStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableDropPartition x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableDropPartition x) { - - } - - @Override - public boolean visit(OracleAlterTableTruncatePartition x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableTruncatePartition x) { - - } - - @Override - public boolean visit(OracleAlterTableStatement x) { - String tableName = x.getName().toString(); - TableStat stat = getTableStat(tableName); - stat.incrementAlterCount(); - - setCurrentTable(x, tableName); - - for (SQLObject item : x.getItems()) { - item.setParent(x); - item.accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleAlterTableStatement x) { - restoreCurrentTable(x); - } - - @Override - public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { - - } - - @Override - public boolean visit(OracleAlterTableSplitPartition x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableSplitPartition x) { - - } - - @Override - public boolean visit(OracleAlterTableModify x) { - OracleAlterTableStatement stmt = (OracleAlterTableStatement) x.getParent(); - String table = stmt.getName().toString(); - - for (SQLColumnDefinition column : x.getColumns()) { - String columnName = column.getName().toString(); - addColumn(table, columnName); - - } - - return false; - } - - @Override - public void endVisit(OracleAlterTableModify x) { - - } - - @Override - public boolean visit(OracleCreateIndexStatement x) { - return visit((SQLCreateIndexStatement) x); - } - - @Override - public void endVisit(OracleCreateIndexStatement x) { - restoreCurrentTable(x); - } - - @Override - public boolean visit(OracleAlterIndexStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterIndexStatement x) { - - } - - @Override - public boolean visit(OracleForStatement x) { - x.getRange().setParent(x); - - SQLName index = x.getIndex(); - this.getVariants().put(index.toString(), x); - - x.getRange().accept(this); - accept(x.getStatements()); - - return false; - } - - @Override - public void endVisit(OracleForStatement x) { - - } - - @Override - public boolean visit(OracleAlterIndexStatement.Rebuild x) { - return false; - } - - @Override - public void endVisit(OracleAlterIndexStatement.Rebuild x) { - - } - - @Override - public boolean visit(Else x) { - return true; - } - - @Override - public void endVisit(Else x) { - - } - - @Override - public boolean visit(ElseIf x) { - return true; - } - - @Override - public void endVisit(ElseIf x) { - - } - - @Override - public boolean visit(OracleIfStatement x) { - return true; - } - - @Override - public void endVisit(OracleIfStatement x) { - - } - - @Override - public boolean visit(OracleRangeExpr x) { - return true; - } - - @Override - public void endVisit(OracleRangeExpr x) { - - } - - @Override - public boolean visit(OracleAlterTableAddConstaint x) { - x.getConstraint().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableAddConstaint x) { - - } - - @Override - public boolean visit(OraclePrimaryKey x) { - accept(x.getColumns()); - - return false; - } - - @Override - public void endVisit(OraclePrimaryKey x) { - - } - - @Override - public boolean visit(OracleCreateTableStatement x) { - this.visit((SQLCreateTableStatement) x); - - if (x.getSelect() != null) { - x.getSelect().accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleCreateTableStatement x) { - this.endVisit((SQLCreateTableStatement) x); - } - - @Override - public boolean visit(OracleAlterTableRenameTo x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableRenameTo x) { - - } - - @Override - public boolean visit(OracleStorageClause x) { - return false; - } - - @Override - public void endVisit(OracleStorageClause x) { - - } - - @Override - public boolean visit(OracleGotoStatement x) { - return false; - } - - @Override - public void endVisit(OracleGotoStatement x) { - - } - - @Override - public boolean visit(OracleLabelStatement x) { - return false; - } - - @Override - public void endVisit(OracleLabelStatement x) { - - } - - @Override - public boolean visit(OracleParameter x) { - return true; - } - - @Override - public void endVisit(OracleParameter x) { - - } - - @Override - public boolean visit(OracleCommitStatement x) { - return true; - } - - @Override - public void endVisit(OracleCommitStatement x) { - - } - - @Override - public boolean visit(OracleAlterTriggerStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterTriggerStatement x) { - - } - - @Override - public boolean visit(OracleAlterSynonymStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterSynonymStatement x) { - - } - - @Override - public boolean visit(AsOfSnapshotClause x) { - return false; - } - - @Override - public void endVisit(AsOfSnapshotClause x) { - - } - - @Override - public boolean visit(OracleAlterViewStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterViewStatement x) { - - } - - @Override - public boolean visit(OracleAlterTableMoveTablespace x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableMoveTablespace x) { - - } - - @Override - public boolean visit(OracleSizeExpr x) { - return false; - } - - @Override - public void endVisit(OracleSizeExpr x) { - - } - - @Override - public boolean visit(OracleFileSpecification x) { - return false; - } - - @Override - public void endVisit(OracleFileSpecification x) { - - } - - @Override - public boolean visit(OracleAlterTablespaceAddDataFile x) { - return false; - } - - @Override - public void endVisit(OracleAlterTablespaceAddDataFile x) { - - } - - @Override - public boolean visit(OracleAlterTablespaceStatement x) { - return false; - } - - @Override - public void endVisit(OracleAlterTablespaceStatement x) { - - } - - @Override - public boolean visit(OracleTruncateStatement x) { - return visit((SQLTruncateStatement) x); - } - - @Override - public void endVisit(OracleTruncateStatement x) { - - } - - @Override - public boolean visit(OracleCreateSequenceStatement x) { - return false; - } - - @Override - public void endVisit(OracleCreateSequenceStatement x) { - - } - - @Override - public boolean visit(OracleRangeValuesClause x) { - return false; - } - - @Override - public void endVisit(OracleRangeValuesClause x) { - - } - - @Override - public boolean visit(OraclePartitionByRangeClause x) { - return false; - } - - @Override - public void endVisit(OraclePartitionByRangeClause x) { - - } - - @Override - public boolean visit(OracleLoopStatement x) { - return true; - } - - @Override - public void endVisit(OracleLoopStatement x) { - - } - - @Override - public boolean visit(OracleExitStatement x) { - return true; - } - - @Override - public void endVisit(OracleExitStatement x) { - - } - - @Override - public boolean visit(OracleFetchStatement x) { - return true; - } - - @Override - public void endVisit(OracleFetchStatement x) { - - } - - @Override - public boolean visit(OracleSavePointStatement x) { - return false; - } - - @Override - public void endVisit(OracleSavePointStatement x) { - - } - - @Override - public boolean visit(OracleCreateProcedureStatement x) { - String name = x.getName().toString(); - this.variants.put(name, x); - accept(x.getBlock()); - return false; - } - - @Override - public void endVisit(OracleCreateProcedureStatement x) { - - } - - @Override - public boolean visit(OracleCreateDatabaseDbLinkStatement x) { - return false; - } - - @Override - public void endVisit(OracleCreateDatabaseDbLinkStatement x) { - - } - - @Override - public boolean visit(OracleDropDatabaseLinkStatement x) { - return false; - } - - @Override - public void endVisit(OracleDropDatabaseLinkStatement x) { - - } - - @Override - public boolean visit(OracleDataTypeTimestamp x) { - return false; - } - - @Override - public void endVisit(OracleDataTypeTimestamp x) { - - } - - @Override - public boolean visit(OracleDataTypeIntervalYear x) { - return false; - } - - @Override - public void endVisit(OracleDataTypeIntervalYear x) { - - } - - @Override - public boolean visit(OracleDataTypeIntervalDay x) { - return false; - } - - @Override - public void endVisit(OracleDataTypeIntervalDay x) { - - } - - @Override - public boolean visit(OracleDropSequenceStatement x) { - return false; - } - - @Override - public void endVisit(OracleDropSequenceStatement x) { - - } - - @Override - public boolean visit(OracleUsingIndexClause x) { - return false; - } - - @Override - public void endVisit(OracleUsingIndexClause x) { - - } - - @Override - public boolean visit(OracleLobStorageClause x) { - return false; - } - - @Override - public void endVisit(OracleLobStorageClause x) { - - } -} +/* + * 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.visitor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLOrderBy; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; +import com.alibaba.druid.sql.ast.statement.SQLUnique; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +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.OracleUnique; +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; +import com.alibaba.druid.stat.TableStat.Mode; +import com.alibaba.druid.stat.TableStat.Relationship; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor { + + public OracleSchemaStatVisitor(){ + this(new ArrayList()); + } + + public OracleSchemaStatVisitor(List parameters){ + super(parameters); + this.variants.put("DUAL", null); + this.variants.put("NOTFOUND", null); + this.variants.put("TRUE", null); + this.variants.put("FALSE", null); + } + + @Override + public String getDbType() { + return JdbcUtils.ORACLE; + } + + protected Column getColumn(SQLExpr expr) { + if (expr instanceof OracleOuterExpr) { + expr = ((OracleOuterExpr) expr).getExpr(); + } + + return super.getColumn(expr); + } + + public boolean visit(OracleSelectTableReference x) { + SQLExpr expr = x.getExpr(); + + if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) expr; + if ("TABLE".equalsIgnoreCase(methodInvoke.getMethodName()) && methodInvoke.getParameters().size() == 1) { + expr = methodInvoke.getParameters().get(0); + } + } + + Map aliasMap = getAliasMap(); + + if (expr instanceof SQLName) { + String ident; + if (expr instanceof SQLPropertyExpr) { + String owner = ((SQLPropertyExpr) expr).getOwner().toString(); + String name = ((SQLPropertyExpr) expr).getName(); + + if (aliasMap.containsKey(owner)) { + owner = aliasMap.get(owner); + } + ident = owner + "." + name; + } else { + ident = expr.toString(); + } + + if (subQueryMap.containsKey(ident)) { + return false; + } + + if ("DUAL".equalsIgnoreCase(ident)) { + return false; + } + + x.putAttribute(ATTR_TABLE, ident); + + TableStat stat = getTableStat(ident); + + Mode mode = getMode(); + switch (mode) { + case Delete: + stat.incrementDeleteCount(); + break; + case Insert: + stat.incrementInsertCount(); + break; + case Update: + stat.incrementUpdateCount(); + break; + case Select: + stat.incrementSelectCount(); + break; + case Merge: + stat.incrementMergeCount(); + break; + default: + break; + } + + if (aliasMap != null) { + if (x.getAlias() != null) { + aliasMap.put(x.getAlias(), ident); + } + aliasMap.put(ident, ident); + } + return false; + } + + accept(x.getExpr()); + + return false; + } + + public boolean visit(SQLAggregateExpr x) { + accept(x.getArguments()); + return false; + } + + public boolean visit(OracleAggregateExpr x) { + accept(x.getArguments()); + accept(x.getOver()); + return false; + } + + public void endVisit(OracleSelect x) { + endVisit((SQLSelect) x); + } + + public boolean visit(OracleSelect x) { + setCurrentTable(x); + + if (x.getOrderBy() != null) { + x.getOrderBy().setParent(x); + } + + accept(x.getWithSubQuery()); + accept(x.getQuery()); + + setCurrentTable(x, (String) x.getQuery().getAttribute("table")); + + accept(x.getOrderBy()); + + return false; + } + + public void endVisit(SQLSelect x) { + if (x.getQuery() != null) { + String table = (String) x.getQuery().getAttribute(ATTR_TABLE); + if (table != null) { + x.putAttribute(ATTR_TABLE, table); + } + } + restoreCurrentTable(x); + } + + public boolean visit(OracleUpdateStatement x) { + setAliasMap(); + setMode(x, Mode.Update); + + SQLTableSource tableSource = x.getTableSource(); + SQLExpr tableExpr = null; + + if (tableSource instanceof SQLExprTableSource) { + tableExpr = ((SQLExprTableSource) tableSource).getExpr(); + } + + if (tableExpr instanceof SQLName) { + String ident = tableExpr.toString(); + setCurrentTable(ident); + + TableStat stat = getTableStat(ident); + stat.incrementUpdateCount(); + + Map aliasMap = getAliasMap(); + aliasMap.put(ident, ident); + aliasMap.put(tableSource.getAlias(), ident); + } else { + tableSource.accept(this); + } + + accept(x.getItems()); + accept(x.getWhere()); + + return false; + } + + public void endVisit(OracleUpdateStatement x) { + } + + public boolean visit(OracleDeleteStatement x) { + return visit((SQLDeleteStatement) x); + } + + public void endVisit(OracleDeleteStatement x) { + } + + public boolean visit(OracleSelectQueryBlock x) { + if (x.getWhere() != null) { + x.getWhere().setParent(x); + } + + if (x.getInto() instanceof SQLName) { + String tableName = x.getInto().toString(); + TableStat stat = getTableStat(tableName); + if (stat != null) { + stat.incrementInsertCount(); + } + } + + visit((SQLSelectQueryBlock) x); + + return true; + } + + public void endVisit(OracleSelectQueryBlock x) { + endVisit((SQLSelectQueryBlock) x); + } + + public boolean visit(SQLPropertyExpr x) { + if ("ROWNUM".equalsIgnoreCase(x.getName())) { + return false; + } + + return super.visit(x); + } + + public boolean visit(SQLMethodInvokeExpr x) { + accept(x.getParameters()); + return false; + } + + public boolean visit(SQLIdentifierExpr x) { + if ("ROWNUM".equalsIgnoreCase(x.getName())) { + return false; + } + + if ("SYSDATE".equalsIgnoreCase(x.getName())) { + return false; + } + + if ("+".equalsIgnoreCase(x.getName())) { + return false; + } + + if ("LEVEL".equals(x.getName())) { + return false; + } + + return super.visit(x); + } + + @Override + public void endVisit(OracleAggregateExpr astNode) { + + } + + @Override + public void endVisit(OraclePLSQLCommitStatement astNode) { + + } + + @Override + public void endVisit(OracleAnalytic x) { + + } + + @Override + public void endVisit(OracleAnalyticWindowing x) { + + } + + @Override + public void endVisit(OracleDateExpr x) { + + } + + @Override + public void endVisit(OracleDbLinkExpr x) { + + } + + @Override + public void endVisit(OracleExtractExpr x) { + + } + + @Override + public void endVisit(OracleIntervalExpr x) { + + } + + @Override + public void endVisit(OracleOrderBy x) { + + } + + @Override + public void endVisit(OracleOuterExpr x) { + + } + + @Override + public void endVisit(OracleSelectForUpdate x) { + + } + + @Override + public void endVisit(OracleSelectHierachicalQueryClause x) { + + } + + @Override + public void endVisit(OracleSelectJoin x) { + + } + + @Override + public void endVisit(OracleOrderByItem x) { + + } + + @Override + public void endVisit(OracleSelectPivot x) { + + } + + @Override + public void endVisit(Item x) { + + } + + @Override + public void endVisit(CheckOption x) { + + } + + @Override + public void endVisit(ReadOnly x) { + + } + + @Override + public void endVisit(OracleSelectSubqueryTableSource x) { + + } + + @Override + public void endVisit(OracleSelectUnPivot x) { + + } + + @Override + public void endVisit(OracleTimestampExpr x) { + + } + + @Override + public boolean visit(OraclePLSQLCommitStatement astNode) { + + return true; + } + + @Override + public boolean visit(OracleAnalytic x) { + + return true; + } + + @Override + public boolean visit(OracleAnalyticWindowing x) { + + return true; + } + + @Override + public boolean visit(OracleDateExpr x) { + + return true; + } + + @Override + public boolean visit(OracleDbLinkExpr x) { + + return true; + } + + @Override + public boolean visit(OracleExtractExpr x) { + + return true; + } + + @Override + public boolean visit(OracleIntervalExpr x) { + + return true; + } + + @Override + public boolean visit(OracleOrderBy x) { + return this.visit((SQLOrderBy) x); + } + + @Override + public boolean visit(OracleOuterExpr x) { + + return true; + } + + @Override + public boolean visit(OracleSelectForUpdate x) { + + return true; + } + + @Override + public boolean visit(OracleSelectHierachicalQueryClause x) { + + return true; + } + + @Override + public boolean visit(OracleSelectJoin x) { + x.getLeft().accept(this); + x.getRight().accept(this); + + { + String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); + String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); + if (leftTable != null && leftTable.equals(rightTable)) { + x.putAttribute(ATTR_TABLE, leftTable); + } + } + if (x.getCondition() != null) { + x.getCondition().accept(this); + } + + for (SQLExpr item : x.getUsing()) { + if (item instanceof SQLIdentifierExpr) { + String columnName = ((SQLIdentifierExpr) item).getName(); + String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); + String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); + if (leftTable != null && rightTable != null) { + Relationship relationship = new Relationship(); + relationship.setLeft(new Column(leftTable, columnName)); + relationship.setRight(new Column(rightTable, columnName)); + relationship.setOperator("USING"); + relationships.add(relationship); + } + + if (leftTable != null) { + addColumn(leftTable, columnName); + } + + if (rightTable != null) { + addColumn(rightTable, columnName); + } + } + } + + return false; + } + + @Override + public boolean visit(OracleOrderByItem x) { + + return true; + } + + @Override + public boolean visit(OracleSelectPivot x) { + + return true; + } + + @Override + public boolean visit(Item x) { + + return true; + } + + @Override + public boolean visit(CheckOption x) { + + return true; + } + + @Override + public boolean visit(ReadOnly x) { + + return true; + } + + @Override + public boolean visit(OracleSelectSubqueryTableSource x) { + accept(x.getSelect()); + accept(x.getPivot()); + accept(x.getFlashback()); + + String table = (String) x.getSelect().getAttribute(ATTR_TABLE); + if (x.getAlias() != null) { + if (table != null) { + this.aliasMap.put(x.getAlias(), table); + } + this.subQueryMap.put(x.getAlias(), x.getSelect()); + this.setCurrentTable(x.getAlias()); + } + + if (table != null) { + x.putAttribute(ATTR_TABLE, table); + } + return false; + } + + @Override + public boolean visit(OracleSelectUnPivot x) { + + return true; + } + + @Override + public boolean visit(OracleTimestampExpr x) { + return true; + } + + @Override + public boolean visit(SampleClause x) { + + return true; + } + + @Override + public void endVisit(SampleClause x) { + + } + + @Override + public void endVisit(OracleSelectTableReference x) { + + } + + @Override + public boolean visit(PartitionExtensionClause x) { + + return true; + } + + @Override + public void endVisit(PartitionExtensionClause x) { + + } + + @Override + public boolean visit(VersionsFlashbackQueryClause x) { + + return true; + } + + @Override + public void endVisit(VersionsFlashbackQueryClause x) { + + } + + @Override + public boolean visit(AsOfFlashbackQueryClause x) { + + return true; + } + + @Override + public void endVisit(AsOfFlashbackQueryClause x) { + + } + + @Override + public boolean visit(GroupingSetExpr x) { + + return true; + } + + @Override + public void endVisit(GroupingSetExpr x) { + + } + + @Override + public boolean visit(OracleWithSubqueryEntry x) { + Map aliasMap = getAliasMap(); + if (aliasMap != null) { + String alias = null; + if (x.getName() != null) { + alias = x.getName().toString(); + } + + if (alias != null) { + aliasMap.put(alias, null); + subQueryMap.put(alias, x.getSubQuery()); + } + } + x.getSubQuery().accept(this); + return false; + } + + @Override + public void endVisit(OracleWithSubqueryEntry x) { + + } + + @Override + public boolean visit(SearchClause x) { + + return true; + } + + @Override + public void endVisit(SearchClause x) { + + } + + @Override + public boolean visit(CycleClause x) { + + return true; + } + + @Override + public void endVisit(CycleClause x) { + + } + + @Override + public boolean visit(OracleBinaryFloatExpr x) { + + return true; + } + + @Override + public void endVisit(OracleBinaryFloatExpr x) { + + } + + @Override + public boolean visit(OracleBinaryDoubleExpr x) { + + return true; + } + + @Override + public void endVisit(OracleBinaryDoubleExpr x) { + + } + + @Override + public boolean visit(OracleCursorExpr x) { + + return true; + } + + @Override + public void endVisit(OracleCursorExpr x) { + + } + + @Override + public boolean visit(OracleIsSetExpr x) { + + return true; + } + + @Override + public void endVisit(OracleIsSetExpr x) { + + } + + @Override + public boolean visit(ReturnRowsClause x) { + + return true; + } + + @Override + public void endVisit(ReturnRowsClause x) { + + } + + @Override + public boolean visit(MainModelClause x) { + + return true; + } + + @Override + public void endVisit(MainModelClause x) { + + } + + @Override + public boolean visit(ModelColumnClause x) { + + return true; + } + + @Override + public void endVisit(ModelColumnClause x) { + + } + + @Override + public boolean visit(QueryPartitionClause x) { + + return true; + } + + @Override + public void endVisit(QueryPartitionClause x) { + + } + + @Override + public boolean visit(ModelColumn x) { + + return true; + } + + @Override + public void endVisit(ModelColumn x) { + + } + + @Override + public boolean visit(ModelRulesClause x) { + + return true; + } + + @Override + public void endVisit(ModelRulesClause x) { + + } + + @Override + public boolean visit(CellAssignmentItem x) { + + return true; + } + + @Override + public void endVisit(CellAssignmentItem x) { + + } + + @Override + public boolean visit(CellAssignment x) { + + return true; + } + + @Override + public void endVisit(CellAssignment x) { + + } + + @Override + public boolean visit(ModelClause x) { + return true; + } + + @Override + public void endVisit(ModelClause x) { + + } + + @Override + public boolean visit(OracleMergeStatement x) { + setAliasMap(); + + String originalTable = getCurrentTable(); + + setMode(x.getUsing(), Mode.Select); + x.getUsing().accept(this); + + setMode(x, Mode.Merge); + + String ident = x.getInto().toString(); + setCurrentTable(x, ident); + x.putAttribute("_old_local_", originalTable); + + TableStat stat = getTableStat(ident); + stat.incrementMergeCount(); + + Map aliasMap = getAliasMap(); + if (aliasMap != null) { + if (x.getAlias() != null) { + aliasMap.put(x.getAlias(), ident); + } + aliasMap.put(ident, ident); + } + + x.getOn().accept(this); + + if (x.getUpdateClause() != null) { + x.getUpdateClause().accept(this); + } + + if (x.getInsertClause() != null) { + x.getInsertClause().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleMergeStatement x) { + } + + @Override + public boolean visit(MergeUpdateClause x) { + return true; + } + + @Override + public void endVisit(MergeUpdateClause x) { + + } + + @Override + public boolean visit(MergeInsertClause x) { + return true; + } + + @Override + public void endVisit(MergeInsertClause x) { + + } + + @Override + public boolean visit(OracleErrorLoggingClause x) { + return true; + } + + @Override + public void endVisit(OracleErrorLoggingClause x) { + + } + + @Override + public boolean visit(OracleReturningClause x) { + return true; + } + + @Override + public void endVisit(OracleReturningClause x) { + + } + + @Override + public boolean visit(OracleInsertStatement x) { + return visit((SQLInsertStatement) x); + } + + @Override + public void endVisit(OracleInsertStatement x) { + endVisit((SQLInsertStatement) x); + } + + @Override + public boolean visit(InsertIntoClause x) { + + if (x.getTableName() instanceof SQLName) { + String ident = ((SQLName) x.getTableName()).toString(); + setCurrentTable(x, ident); + + TableStat stat = getTableStat(ident); + stat.incrementInsertCount(); + + Map aliasMap = getAliasMap(); + if (aliasMap != null) { + if (x.getAlias() != null) { + aliasMap.put(x.getAlias(), ident); + } + aliasMap.put(ident, ident); + } + } + + accept(x.getColumns()); + accept(x.getQuery()); + accept(x.getReturning()); + accept(x.getErrorLogging()); + + return false; + } + + @Override + public void endVisit(InsertIntoClause x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement x) { + x.putAttribute("_original_use_mode", getMode()); + setMode(x, Mode.Insert); + + setAliasMap(); + + accept(x.getSubQuery()); + + for (OracleMultiInsertStatement.Entry entry : x.getEntries()) { + entry.setParent(x); + } + + accept(x.getEntries()); + + return false; + } + + @Override + public void endVisit(OracleMultiInsertStatement x) { + + } + + @Override + public boolean visit(ConditionalInsertClause x) { + for (ConditionalInsertClauseItem item : x.getItems()) { + item.setParent(x); + } + if (x.getElseItem() != null) { + x.getElseItem().setParent(x); + } + return true; + } + + @Override + public void endVisit(ConditionalInsertClause x) { + + } + + @Override + public boolean visit(ConditionalInsertClauseItem x) { + SQLObject parent = x.getParent(); + if (parent instanceof ConditionalInsertClause) { + parent = parent.getParent(); + } + if (parent instanceof OracleMultiInsertStatement) { + SQLSelect subQuery = ((OracleMultiInsertStatement) parent).getSubQuery(); + if (subQuery != null) { + String table = (String) subQuery.getAttribute("_table_"); + setCurrentTable(x, table); + } + } + x.getWhen().accept(this); + x.getThen().accept(this); + restoreCurrentTable(x); + return false; + } + + @Override + public void endVisit(ConditionalInsertClauseItem x) { + + } + + @Override + public boolean visit(OracleBlockStatement x) { + for (OracleParameter param : x.getParameters()) { + param.setParent(x); + + SQLExpr name = param.getName(); + this.variants.put(name.toString(), name); + } + return true; + } + + @Override + public void endVisit(OracleBlockStatement x) { + + } + + @Override + public boolean visit(OracleAlterSessionStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterSessionStatement x) { + + } + + @Override + public boolean visit(OracleExprStatement x) { + return false; + } + + @Override + public void endVisit(OracleExprStatement x) { + + } + + @Override + public boolean visit(OracleLockTableStatement x) { + String tableName = x.getTable().toString(); + getTableStat(tableName); + return false; + } + + @Override + public void endVisit(OracleLockTableStatement x) { + + } + + @Override + public boolean visit(OracleDatetimeExpr x) { + return true; + } + + @Override + public void endVisit(OracleDatetimeExpr x) { + + } + + @Override + public boolean visit(OracleSysdateExpr x) { + return false; + } + + @Override + public void endVisit(OracleSysdateExpr x) { + + } + + @Override + public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { + + } + + @Override + public boolean visit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { + return true; + } + + @Override + public boolean visit(OracleExceptionStatement x) { + return true; + } + + @Override + public void endVisit(OracleExceptionStatement x) { + + } + + @Override + public boolean visit(OracleArgumentExpr x) { + return true; + } + + @Override + public void endVisit(OracleArgumentExpr x) { + + } + + @Override + public boolean visit(OracleSetTransactionStatement x) { + return false; + } + + @Override + public void endVisit(OracleSetTransactionStatement x) { + + } + + @Override + public boolean visit(OracleGrantStatement x) { + return false; + } + + @Override + public void endVisit(OracleGrantStatement x) { + + } + + @Override + public boolean visit(OracleExplainStatement x) { + return false; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(OracleAlterTableStatement x) { + String tableName = x.getName().toString(); + TableStat stat = getTableStat(tableName); + stat.incrementAlterCount(); + + setCurrentTable(x, tableName); + + for (SQLObject item : x.getItems()) { + item.setParent(x); + item.accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleAlterTableStatement x) { + restoreCurrentTable(x); + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableModify x) { + OracleAlterTableStatement stmt = (OracleAlterTableStatement) x.getParent(); + String table = stmt.getName().toString(); + + for (SQLColumnDefinition column : x.getColumns()) { + String columnName = column.getName().toString(); + addColumn(table, columnName); + + } + + return false; + } + + @Override + public void endVisit(OracleAlterTableModify x) { + + } + + @Override + public boolean visit(OracleCreateIndexStatement x) { + return visit((SQLCreateIndexStatement) x); + } + + @Override + public void endVisit(OracleCreateIndexStatement x) { + restoreCurrentTable(x); + } + + @Override + public boolean visit(OracleAlterIndexStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement x) { + + } + + @Override + public boolean visit(OracleForStatement x) { + x.getRange().setParent(x); + + SQLName index = x.getIndex(); + this.getVariants().put(index.toString(), x); + + x.getRange().accept(this); + accept(x.getStatements()); + + return false; + } + + @Override + public void endVisit(OracleForStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement.Rebuild x) { + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement.Rebuild x) { + + } + + @Override + public boolean visit(Else x) { + return true; + } + + @Override + public void endVisit(Else x) { + + } + + @Override + public boolean visit(ElseIf x) { + return true; + } + + @Override + public void endVisit(ElseIf x) { + + } + + @Override + public boolean visit(OracleIfStatement x) { + return true; + } + + @Override + public void endVisit(OracleIfStatement x) { + + } + + @Override + public boolean visit(OracleRangeExpr x) { + return true; + } + + @Override + public void endVisit(OracleRangeExpr x) { + + } + + @Override + public boolean visit(OracleAlterTableAddConstaint x) { + x.getConstraint().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableAddConstaint x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + accept(x.getColumns()); + + return false; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + this.visit((SQLCreateTableStatement) x); + + if (x.getSelect() != null) { + x.getSelect().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + this.endVisit((SQLCreateTableStatement) x); + } + + @Override + public boolean visit(OracleAlterTableRenameTo x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableRenameTo x) { + + } + + @Override + public boolean visit(OracleStorageClause x) { + return false; + } + + @Override + public void endVisit(OracleStorageClause x) { + + } + + @Override + public boolean visit(OracleGotoStatement x) { + return false; + } + + @Override + public void endVisit(OracleGotoStatement x) { + + } + + @Override + public boolean visit(OracleLabelStatement x) { + return false; + } + + @Override + public void endVisit(OracleLabelStatement x) { + + } + + @Override + public boolean visit(OracleParameter x) { + return true; + } + + @Override + public void endVisit(OracleParameter x) { + + } + + @Override + public boolean visit(OracleCommitStatement x) { + return true; + } + + @Override + public void endVisit(OracleCommitStatement x) { + + } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(AsOfSnapshotClause x) { + return false; + } + + @Override + public void endVisit(AsOfSnapshotClause x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + return false; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + + @Override + public boolean visit(OracleFileSpecification x) { + return false; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleTruncateStatement x) { + return visit((SQLTruncateStatement) x); + } + + @Override + public void endVisit(OracleTruncateStatement x) { + + } + + @Override + public boolean visit(OracleCreateSequenceStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreateSequenceStatement x) { + + } + + @Override + public boolean visit(OracleRangeValuesClause x) { + return false; + } + + @Override + public void endVisit(OracleRangeValuesClause x) { + + } + + @Override + public boolean visit(OraclePartitionByRangeClause x) { + return false; + } + + @Override + public void endVisit(OraclePartitionByRangeClause x) { + + } + + @Override + public boolean visit(OracleLoopStatement x) { + return true; + } + + @Override + public void endVisit(OracleLoopStatement x) { + + } + + @Override + public boolean visit(OracleExitStatement x) { + return true; + } + + @Override + public void endVisit(OracleExitStatement x) { + + } + + @Override + public boolean visit(OracleFetchStatement x) { + return true; + } + + @Override + public void endVisit(OracleFetchStatement x) { + + } + + @Override + public boolean visit(OracleSavePointStatement x) { + return false; + } + + @Override + public void endVisit(OracleSavePointStatement x) { + + } + + @Override + public boolean visit(OracleCreateProcedureStatement x) { + String name = x.getName().toString(); + this.variants.put(name, x); + accept(x.getBlock()); + return false; + } + + @Override + public void endVisit(OracleCreateProcedureStatement x) { + + } + + @Override + public boolean visit(OracleCreateDatabaseDbLinkStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreateDatabaseDbLinkStatement x) { + + } + + @Override + public boolean visit(OracleDropDatabaseLinkStatement x) { + return false; + } + + @Override + public void endVisit(OracleDropDatabaseLinkStatement x) { + + } + + @Override + public boolean visit(OracleDataTypeTimestamp x) { + return false; + } + + @Override + public void endVisit(OracleDataTypeTimestamp x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalYear x) { + return false; + } + + @Override + public void endVisit(OracleDataTypeIntervalYear x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalDay x) { + return false; + } + + @Override + public void endVisit(OracleDataTypeIntervalDay x) { + + } + + @Override + public boolean visit(OracleDropSequenceStatement x) { + return false; + } + + @Override + public void endVisit(OracleDropSequenceStatement x) { + + } + + @Override + public boolean visit(OracleUsingIndexClause x) { + return false; + } + + @Override + public void endVisit(OracleUsingIndexClause x) { + + } + + @Override + public boolean visit(OracleLobStorageClause x) { + return false; + } + + @Override + public void endVisit(OracleLobStorageClause x) { + + } + + @Override + public boolean visit(OracleUnique x) { + return visit((SQLUnique) x); + } + + @Override + public void endVisit(OracleUnique x) { + + } +} 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 181e506973..f79294bb6f 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -1,173 +1,175 @@ -/* - * 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.parser; - -public class SQLParser { - - protected final Lexer lexer; - - public SQLParser(String sql){ - this(new Lexer(sql)); - this.lexer.nextToken(); - } - - public SQLParser(Lexer lexer){ - this.lexer = lexer; - } - - public final Lexer getLexer() { - return lexer; - } - - protected boolean identifierEquals(String text) { - return lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase(text); - } - - protected void acceptIdentifier(String text) { - if (identifierEquals(text)) { - lexer.nextToken(); - } else { - setErrorEndPos(lexer.pos()); - throw new ParserException("syntax error, expect " + text + ", actual " + lexer.token()); - } - } - - protected String as() { - String alias = null; - - if (lexer.token() == Token.AS) { - lexer.nextToken(); - - if (lexer.token() == Token.LITERAL_ALIAS) { - alias = '"' + lexer.stringVal() + '"'; - lexer.nextToken(); - } else if (lexer.token() == Token.IDENTIFIER) { - alias = lexer.stringVal(); - lexer.nextToken(); - } else if (lexer.token() == Token.LITERAL_CHARS) { - alias = "'" + lexer.stringVal() + "'"; - lexer.nextToken(); - } else { - switch (lexer.token()) { - case KEY: - case INDEX: - case CASE: - case MODEL: - case PCTFREE: - case INITRANS: - case MAXTRANS: - case SEGMENT: - case CREATION: - case IMMEDIATE: - case DEFERRED: - case STORAGE: - case NEXT: - case MINEXTENTS: - case MAXEXTENTS: - case PCTINCREASE: - case FLASH_CACHE: - case CELL_FLASH_CACHE: - case KEEP: - case NONE: - case LOB: - case STORE: - case ROW: - case CHUNK: - case CACHE: - case NOCACHE: - case LOGGING: - case NOCOMPRESS: - case KEEP_DUPLICATES: - alias = lexer.stringVal(); - lexer.nextToken(); - return alias; - case QUES: - alias = "?"; - lexer.nextToken(); - default: - break; - } - } - - if (alias != null) { - while (lexer.token() == Token.DOT) { - lexer.nextToken(); - alias += ('.' + lexer.token().name()); - lexer.nextToken(); - } - - return alias; - } - - if (lexer.token() == Token.LPAREN) { - return null; - } - - throw new ParserException("Error : " + lexer.token()); - } - - if (lexer.token() == Token.LITERAL_ALIAS) { - alias = '"' + lexer.stringVal() + '"'; - lexer.nextToken(); - } else if (lexer.token() == Token.IDENTIFIER) { - alias = lexer.stringVal(); - lexer.nextToken(); - } else if (lexer.token() == Token.LITERAL_CHARS) { - alias = "'" + lexer.stringVal() + "'"; - lexer.nextToken(); - } else if (lexer.token() == Token.CASE) { - alias = lexer.token.name(); - lexer.nextToken(); - } - - switch (lexer.token()) { - case KEY: - alias = lexer.token().name(); - lexer.nextToken(); - return alias; - default: - break; - } - - return alias; - } - - public void accept(Token token) { - if (lexer.token() == token) { - lexer.nextToken(); - } else { - setErrorEndPos(lexer.pos()); - throw new ParserException("syntax error, expect " + token + ", actual " + lexer.token() + " " - + lexer.stringVal() + ", pos " + this.lexer.pos()); - } - } - - public void match(Token token) { - if (lexer.token() != token) { - throw new ParserException("syntax error, expect " + token + ", actual " + lexer.token() + " " - + lexer.stringVal()); - } - } - - private int errorEndPos = -1; - - protected void setErrorEndPos(int errPos) { - if (errPos > errorEndPos) { - errorEndPos = errPos; - } - } - -} +/* + * 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.parser; + +public class SQLParser { + + protected final Lexer lexer; + + public SQLParser(String sql){ + this(new Lexer(sql)); + this.lexer.nextToken(); + } + + public SQLParser(Lexer lexer){ + this.lexer = lexer; + } + + public final Lexer getLexer() { + return lexer; + } + + protected boolean identifierEquals(String text) { + return lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase(text); + } + + protected void acceptIdentifier(String text) { + if (identifierEquals(text)) { + lexer.nextToken(); + } else { + setErrorEndPos(lexer.pos()); + throw new ParserException("syntax error, expect " + text + ", actual " + lexer.token()); + } + } + + protected String as() { + String alias = null; + + if (lexer.token() == Token.AS) { + lexer.nextToken(); + + if (lexer.token() == Token.LITERAL_ALIAS) { + alias = '"' + lexer.stringVal() + '"'; + lexer.nextToken(); + } else if (lexer.token() == Token.IDENTIFIER) { + alias = lexer.stringVal(); + lexer.nextToken(); + } else if (lexer.token() == Token.LITERAL_CHARS) { + alias = "'" + lexer.stringVal() + "'"; + lexer.nextToken(); + } else { + switch (lexer.token()) { + case KEY: + case INDEX: + case CASE: + case MODEL: + case PCTFREE: + case INITRANS: + case MAXTRANS: + case SEGMENT: + case CREATION: + case IMMEDIATE: + case DEFERRED: + case STORAGE: + case NEXT: + case MINEXTENTS: + case MAXEXTENTS: + case MAXSIZE: + case PCTINCREASE: + case FLASH_CACHE: + case CELL_FLASH_CACHE: + case KEEP: + case NONE: + case LOB: + case STORE: + case ROW: + case CHUNK: + case CACHE: + case NOCACHE: + case LOGGING: + case NOCOMPRESS: + case KEEP_DUPLICATES: + case EXCEPTIONS: + alias = lexer.stringVal(); + lexer.nextToken(); + return alias; + case QUES: + alias = "?"; + lexer.nextToken(); + default: + break; + } + } + + if (alias != null) { + while (lexer.token() == Token.DOT) { + lexer.nextToken(); + alias += ('.' + lexer.token().name()); + lexer.nextToken(); + } + + return alias; + } + + if (lexer.token() == Token.LPAREN) { + return null; + } + + throw new ParserException("Error : " + lexer.token()); + } + + if (lexer.token() == Token.LITERAL_ALIAS) { + alias = '"' + lexer.stringVal() + '"'; + lexer.nextToken(); + } else if (lexer.token() == Token.IDENTIFIER) { + alias = lexer.stringVal(); + lexer.nextToken(); + } else if (lexer.token() == Token.LITERAL_CHARS) { + alias = "'" + lexer.stringVal() + "'"; + lexer.nextToken(); + } else if (lexer.token() == Token.CASE) { + alias = lexer.token.name(); + lexer.nextToken(); + } + + switch (lexer.token()) { + case KEY: + alias = lexer.token().name(); + lexer.nextToken(); + return alias; + default: + break; + } + + return alias; + } + + public void accept(Token token) { + if (lexer.token() == token) { + lexer.nextToken(); + } else { + setErrorEndPos(lexer.pos()); + throw new ParserException("syntax error, expect " + token + ", actual " + lexer.token() + " " + + lexer.stringVal() + ", pos " + this.lexer.pos()); + } + } + + public void match(Token token) { + if (lexer.token() != token) { + throw new ParserException("syntax error, expect " + token + ", actual " + lexer.token() + " " + + lexer.stringVal()); + } + } + + private int errorEndPos = -1; + + protected void setErrorEndPos(int errPos) { + if (errPos > errorEndPos) { + errorEndPos = errPos; + } + } + +} 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 7b1b00c66d..467efbb4fb 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -1,274 +1,276 @@ -/* - * 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.parser; - -/** - * - * SQL Token - * @author wenshao 2011-5-18 下午05:16:49 - * @formatter:off - */ -public enum Token { - FOR("FOR"), - IF("IF"), - INDEX("INDEX"), - PRIMARY("PRIMARY"), - KEY("KEY"), - DEFAULT("DEFAULT"), - CONSTRAINT("CONSTRAINT"), - CHECK("CHECK"), - VIEW("VIEW"), - CREATE("CREATE"), - ALTER("ALTER"), - DROP("DROP"), - TABLE("TABLE"), - TABLESPACE("TABLESPACE"), - UPDATE("UPDATE"), - SET("SET"), - SELECT("SELECT"), - FROM("FROM"), - WHERE("WHERE"), - ORDER("ORDER"), - BY("BY"), - GROUP("GROUP"), - HAVING("HAVING"), - INSERT("INSERT"), - INTO("INTO"), - NULL("NULL"), - NOT("NOT"), - AS("AS"), - DELETE("DELETE"), - DISTINCT("DISTINCT"), - UNIQUE("UNIQUE"), - FOREIGN("FOREIGN"), - REFERENCES("REFERENCES"), - ALL("ALL"), - UNION("UNION"), - INTERSECT("INTERSECT"), - MINUS("MINUS"), - INNER("INNER"), - LEFT("LEFT"), - RIGHT("RIGHT"), - FULL("FULL"), - OUTER("OUTER"), - JOIN("JOIN"), - ON("ON"), - SCHEMA("SCHEMA"), - CAST("CAST"), - COLUMN("COLUMN"), - USE("USE"), - DATABASE("DATABASE"), - TO("TO"), - - AND("AND"), - OR("OR"), - XOR("XOR"), - CASE("CASE"), - WHEN("WHEN"), - THEN("THEN"), - ELSE("ELSE"), - END("END"), - EXISTS("EXISTS"), - IN("IN"), - - NEW("NEW"), - ASC("ASC"), - DESC("DESC"), - IS("IS"), - LIKE("LIKE"), - ESCAPE("ESCAPE"), - BETWEEN("BETWEEN"), - VALUES("VALUES"), - INTERVAL("INTERVAL"), - - LOCK("LOCK"), - SOME("SOME"), - ANY("ANY"), - TRUNCATE("TRUNCATE"), - - // mysql - TRUE("TRUE"), - FALSE("FALSE"), - LIMIT("LIMIT"), - KILL("KILL"), - IDENTIFIED("IDENTIFIED"), - PASSWORD("PASSWORD"), - DUAL("DUAL"), - BINARY("BINARY"), - SHOW("SHOW"), - REPLACE("REPLACE"), - - //postgresql - WINDOW("WINDOW"), - OFFSET("OFFSET"), - ROW("ROW"), - ROWS("ROWS"), - ONLY("ONLY"), - FIRST("FIRST"), - NEXT("NEXT"), - FETCH("FETCH"), - OF("OF"), - SHARE("SHARE"), - NOWAIT("NOWAIT"), - RECURSIVE("RECURSIVE"), - TEMPORARY("TEMPORARY"), - TEMP("TEMP"), - UNLOGGED("UNLOGGED"), - RESTART("RESTART"), - IDENTITY("IDENTITY"), - CONTINUE("CONTINUE"), - CASCADE("CASCADE"), - RESTRICT("RESTRICT"), - USING("USING"), - CURRENT("CURRENT"), - RETURNING("RETURNING"), - COMMENT("COMMENT"), - OVER("OVER"), - - // oracle - START("START"), - PRIOR("PRIOR"), - CONNECT("CONNECT"), - WITH("WITH"), - EXTRACT("EXTRACT"), - CURSOR("CURSOR"), - MODEL("MODEL"), - MERGE("MERGE"), - MATCHED("MATCHED"), - ERRORS("ERRORS"), - REJECT("REJECT"), - UNLIMITED("UNLIMITED"), - BEGIN("BEGIN"), - EXCLUSIVE("EXCLUSIVE"), - MODE("MODE"), - WAIT("WAIT"), - ADVISE("ADVISE"), - SESSION("SESSION"), - PROCEDURE("PROCEDURE"), - SYSDATE("SYSDATE"), - DECLARE("DECLARE"), - EXCEPTION("EXCEPTION"), - GRANT("GRANT"), - LOOP("LOOP"), - GOTO("GOTO"), - COMMIT("COMMIT"), - SAVEPOINT("SAVEPOINT"), - CROSS("CROSS"), - - PCTFREE("PCTFREE"), - INITRANS("INITRANS"), - MAXTRANS("MAXTRANS"), - ENABLE("ENABLE"), - DISABLE("DISABLE"), - SEGMENT("SEGMENT"), - CREATION("CREATION"), - IMMEDIATE("IMMEDIATE"), - DEFERRED("DEFERRED"), - STORAGE("STORAGE"), - MINEXTENTS("MINEXTENTS"), - MAXEXTENTS("MAXEXTENTS"), - PCTINCREASE("PCTINCREASE"), - FLASH_CACHE("FLASH_CACHE"), - CELL_FLASH_CACHE("CELL_FLASH_CACHE"), - KEEP("KEEP"), - NONE("NONE"), - LOB("LOB"), - STORE("STORE"), - CHUNK("CHUNK"), - CACHE("CACHE"), - NOCACHE("NOCACHE"), - LOGGING("LOGGING"), - NOCOMPRESS("NOCOMPRESS"), - KEEP_DUPLICATES("KEEP_DUPLICATES"), - - COMPUTE("COMPUTE"), - - // transact-sql - TOP("TOP"), - - // hive - - EOF, - ERROR, - IDENTIFIER, - HINT, - VARIANT, - LITERAL_INT, - LITERAL_FLOAT, - LITERAL_HEX, - LITERAL_CHARS, - LITERAL_NCHARS, - - LITERAL_ALIAS, - LINE_COMMENT, - MULTI_LINE_COMMENT, - - // Oracle - BINARY_FLOAT, - BINARY_DOUBLE, - - LPAREN("("), - RPAREN(")"), - LBRACE("{"), - RBRACE("}"), - LBRACKET("["), - RBRACKET("]"), - SEMI(";"), - COMMA(","), - DOT("."), - DOTDOT(".."), - DOTDOTDOT("..,"), - EQ("="), - GT(">"), - LT("<"), - BANG("!"), - TILDE("~"), - QUES("?"), - COLON(":"), - COLONCOLON(":"), - COLONEQ(":="), - EQEQ("=="), - LTEQ("<="), - LTEQGT("<=>"), - LTGT("<>"), - GTEQ(">="), - BANGEQ("!="), - BANGGT("!>"), - BANGLT("!<"), - AMPAMP("&&"), - BARBAR("||"), - PLUS("+"), - SUB("-"), - STAR("*"), - SLASH("/"), - AMP("&"), - BAR("|"), - CARET("^"), - PERCENT("%"), - LTLT("<<"), - GTGT(">>"), - MONKEYS_AT("@"); - - public final String name; - - Token(){ - this(null); - } - - Token(String name){ - this.name = name; - } -} +/* + * 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.parser; + +/** + * + * SQL Token + * @author wenshao 2011-5-18 下午05:16:49 + * @formatter:off + */ +public enum Token { + FOR("FOR"), + IF("IF"), + INDEX("INDEX"), + PRIMARY("PRIMARY"), + KEY("KEY"), + DEFAULT("DEFAULT"), + CONSTRAINT("CONSTRAINT"), + CHECK("CHECK"), + VIEW("VIEW"), + CREATE("CREATE"), + ALTER("ALTER"), + DROP("DROP"), + TABLE("TABLE"), + TABLESPACE("TABLESPACE"), + UPDATE("UPDATE"), + SET("SET"), + SELECT("SELECT"), + FROM("FROM"), + WHERE("WHERE"), + ORDER("ORDER"), + BY("BY"), + GROUP("GROUP"), + HAVING("HAVING"), + INSERT("INSERT"), + INTO("INTO"), + NULL("NULL"), + NOT("NOT"), + AS("AS"), + DELETE("DELETE"), + DISTINCT("DISTINCT"), + UNIQUE("UNIQUE"), + FOREIGN("FOREIGN"), + REFERENCES("REFERENCES"), + ALL("ALL"), + UNION("UNION"), + INTERSECT("INTERSECT"), + MINUS("MINUS"), + INNER("INNER"), + LEFT("LEFT"), + RIGHT("RIGHT"), + FULL("FULL"), + OUTER("OUTER"), + JOIN("JOIN"), + ON("ON"), + SCHEMA("SCHEMA"), + CAST("CAST"), + COLUMN("COLUMN"), + USE("USE"), + DATABASE("DATABASE"), + TO("TO"), + + AND("AND"), + OR("OR"), + XOR("XOR"), + CASE("CASE"), + WHEN("WHEN"), + THEN("THEN"), + ELSE("ELSE"), + END("END"), + EXISTS("EXISTS"), + IN("IN"), + + NEW("NEW"), + ASC("ASC"), + DESC("DESC"), + IS("IS"), + LIKE("LIKE"), + ESCAPE("ESCAPE"), + BETWEEN("BETWEEN"), + VALUES("VALUES"), + INTERVAL("INTERVAL"), + + LOCK("LOCK"), + SOME("SOME"), + ANY("ANY"), + TRUNCATE("TRUNCATE"), + + // mysql + TRUE("TRUE"), + FALSE("FALSE"), + LIMIT("LIMIT"), + KILL("KILL"), + IDENTIFIED("IDENTIFIED"), + PASSWORD("PASSWORD"), + DUAL("DUAL"), + BINARY("BINARY"), + SHOW("SHOW"), + REPLACE("REPLACE"), + + //postgresql + WINDOW("WINDOW"), + OFFSET("OFFSET"), + ROW("ROW"), + ROWS("ROWS"), + ONLY("ONLY"), + FIRST("FIRST"), + NEXT("NEXT"), + FETCH("FETCH"), + OF("OF"), + SHARE("SHARE"), + NOWAIT("NOWAIT"), + RECURSIVE("RECURSIVE"), + TEMPORARY("TEMPORARY"), + TEMP("TEMP"), + UNLOGGED("UNLOGGED"), + RESTART("RESTART"), + IDENTITY("IDENTITY"), + CONTINUE("CONTINUE"), + CASCADE("CASCADE"), + RESTRICT("RESTRICT"), + USING("USING"), + CURRENT("CURRENT"), + RETURNING("RETURNING"), + COMMENT("COMMENT"), + OVER("OVER"), + + // oracle + START("START"), + PRIOR("PRIOR"), + CONNECT("CONNECT"), + WITH("WITH"), + EXTRACT("EXTRACT"), + CURSOR("CURSOR"), + MODEL("MODEL"), + MERGE("MERGE"), + MATCHED("MATCHED"), + ERRORS("ERRORS"), + REJECT("REJECT"), + UNLIMITED("UNLIMITED"), + BEGIN("BEGIN"), + EXCLUSIVE("EXCLUSIVE"), + MODE("MODE"), + WAIT("WAIT"), + ADVISE("ADVISE"), + SESSION("SESSION"), + PROCEDURE("PROCEDURE"), + SYSDATE("SYSDATE"), + DECLARE("DECLARE"), + EXCEPTION("EXCEPTION"), + GRANT("GRANT"), + LOOP("LOOP"), + GOTO("GOTO"), + COMMIT("COMMIT"), + SAVEPOINT("SAVEPOINT"), + CROSS("CROSS"), + + PCTFREE("PCTFREE"), + INITRANS("INITRANS"), + MAXTRANS("MAXTRANS"), + ENABLE("ENABLE"), + DISABLE("DISABLE"), + SEGMENT("SEGMENT"), + CREATION("CREATION"), + IMMEDIATE("IMMEDIATE"), + DEFERRED("DEFERRED"), + STORAGE("STORAGE"), + MINEXTENTS("MINEXTENTS"), + MAXEXTENTS("MAXEXTENTS"), + MAXSIZE("MAXSIZE"), + PCTINCREASE("PCTINCREASE"), + FLASH_CACHE("FLASH_CACHE"), + CELL_FLASH_CACHE("CELL_FLASH_CACHE"), + KEEP("KEEP"), + NONE("NONE"), + LOB("LOB"), + STORE("STORE"), + CHUNK("CHUNK"), + CACHE("CACHE"), + NOCACHE("NOCACHE"), + LOGGING("LOGGING"), + NOCOMPRESS("NOCOMPRESS"), + KEEP_DUPLICATES("KEEP_DUPLICATES"), + EXCEPTIONS("EXCEPTIONS"), + + COMPUTE("COMPUTE"), + + // transact-sql + TOP("TOP"), + + // hive + + EOF, + ERROR, + IDENTIFIER, + HINT, + VARIANT, + LITERAL_INT, + LITERAL_FLOAT, + LITERAL_HEX, + LITERAL_CHARS, + LITERAL_NCHARS, + + LITERAL_ALIAS, + LINE_COMMENT, + MULTI_LINE_COMMENT, + + // Oracle + BINARY_FLOAT, + BINARY_DOUBLE, + + LPAREN("("), + RPAREN(")"), + LBRACE("{"), + RBRACE("}"), + LBRACKET("["), + RBRACKET("]"), + SEMI(";"), + COMMA(","), + DOT("."), + DOTDOT(".."), + DOTDOTDOT("..,"), + EQ("="), + GT(">"), + LT("<"), + BANG("!"), + TILDE("~"), + QUES("?"), + COLON(":"), + COLONCOLON(":"), + COLONEQ(":="), + EQEQ("=="), + LTEQ("<="), + LTEQGT("<=>"), + LTGT("<>"), + GTEQ(">="), + BANGEQ("!="), + BANGGT("!>"), + BANGLT("!<"), + AMPAMP("&&"), + BARBAR("||"), + PLUS("+"), + SUB("-"), + STAR("*"), + SLASH("/"), + AMP("&"), + BAR("|"), + CARET("^"), + PERCENT("%"), + LTLT("<<"), + GTGT(">>"), + MONKEYS_AT("@"); + + public final String name; + + Token(){ + this(null); + } + + Token(String name){ + this.name = name; + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest19.java new file mode 100644 index 0000000000..ca2e90a571 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest19.java @@ -0,0 +1,72 @@ +/* + * 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.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleAlterTableTest19 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE warehouses" // + + " ADD CONSTRAINT wh_unq UNIQUE (warehouse_id, warehouse_name)"// + + " USING INDEX PCTFREE 5"// + + " EXCEPTIONS INTO wrong_id;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals("ALTER TABLE warehouses" // + + "\n\tADD CONSTRAINT wh_unq UNIQUE (warehouse_id, warehouse_name)"// + + "\n\tUSING INDEX PCTFREE 5"// + + "\n\tEXCEPTIONS INTO wrong_id", SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("warehouses"))); + + Assert.assertEquals(4, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_IDS_ZZJ_TBD0209", + // "discount_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_affiliate_tran_product", + // "commission_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java index 968f3e5c2a..8ef08890f4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java @@ -71,7 +71,7 @@ public class OracleCreateTableTest19 extends OracleTest { + "\nNOCOMPRESS" + "\nLOGGING" + "\nTABLESPACE \"USERS\"" - + "\nSTORAGE ( INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)", + + "\nSTORAGE (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/OracleCreateTableTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java new file mode 100644 index 0000000000..7bf7ed2bb2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java @@ -0,0 +1,67 @@ +/* + * 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.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest21 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE divisions " + " (div_no NUMBER(2), " + " div_name VARCHAR2(14), " + + " location VARCHAR2(13) ) " + " STORAGE ( INITIAL 8M MAXSIZE 1G );"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statement = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE divisions ("// + + "\n\tdiv_no NUMBER(2),"// + + "\n\tdiv_name VARCHAR2(14),"// + + "\n\tlocation VARCHAR2(13)"// + + "\n)"// + + "\nSTORAGE (INITIAL 8M MAXSIZE 1G)",// + SQLUtils.toSQLString(statement, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statement.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("divisions", "div_no"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index 4dd3caf279..b0555a9d34 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -62,7 +62,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; @@ -114,7 +113,6 @@ public class OracleASTVisitorAdapterTest extends TestCase { public void test_adapter() throws Exception { OracleASTVisitorAdapter adapter = new OracleASTVisitorAdapter(); - new OracleConstraintState().accept(adapter); new OraclePLSQLCommitStatement().accept(adapter); new OracleAnalytic().accept(adapter); new OracleAnalyticWindowing().accept(adapter);