diff --git a/.gitignore b/.gitignore index 745e052c15..5dfebe2e52 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ /.DS_Store /1 /derby.log -/src/test/resources/ +/src/test/resources/pool_config # IntelliJ Idea .idea/ diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index dcbf499221..ae0baf7255 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -37,7 +37,7 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe protected SQLKeep keep; protected SQLOver over; protected SQLOrderBy withinGroup; - protected boolean ignoreNulls = false; + protected Boolean ignoreNulls = false; public SQLAggregateExpr(String methodName){ this.methodName = methodName; @@ -117,6 +117,10 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe } public boolean isIgnoreNulls() { + return this.ignoreNulls != null && this.ignoreNulls; + } + + public Boolean getIgnoreNulls() { return this.ignoreNulls; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java index 952b4beac6..0d7c1014fc 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java @@ -23,8 +23,9 @@ package com.alibaba.druid.sql.ast.expr; public enum SQLBinaryOperator { Union("UNION", 0), COLLATE("COLLATE", 20), - BitwiseXor("^", 50), - + BitwiseXor("^", 50), + BitwiseXorEQ("^=", 110), + Multiply("*", 60), Divide("/", 60), DIV("DIV", 60), // mysql integer division @@ -70,7 +71,7 @@ public enum SQLBinaryOperator { Array_Contains("@>", 110), Array_ContainedBy("<@", 110), SAME_AS("~=", 110), - + RLike("RLIKE", 110), NotRLike("NOT RLIKE", 110), @@ -149,4 +150,19 @@ public enum SQLBinaryOperator { public boolean isLogical() { return this == BooleanAnd || this == BooleanOr || this == BooleanXor; } + + public boolean isArithmetic() { + switch (this) { + case Add: + case Subtract: + case Multiply: + case Divide: + case DIV: + case Modulus: + case Mod: + return true; + default: + return false; + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java index 98a91f2f80..0080aaabeb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java @@ -1025,4 +1025,14 @@ public class OracleToMySqlOutputVisitor extends MySqlOutputVisitor implements Or public void endVisit(OraclePipeRowStatement x) { } + + @Override + public boolean visit(OracleIsOfTypeExpr x) { + return false; + } + + @Override + public void endVisit(OracleIsOfTypeExpr x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java index 2f1f1e9a93..57bd6f7220 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.dialect.oracle.ast; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObjectImpl; @@ -41,4 +42,8 @@ public abstract class OracleSQLObjectImpl extends SQLObjectImpl implements Oracl public SQLDataType computeDataType() { return null; } + + public String toString() { + return SQLUtils.toOracleString(this); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java index 9ea26374f6..94e8fa7f3c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java @@ -19,10 +19,14 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class ModelClause extends OracleSQLObjectImpl { @@ -391,7 +395,7 @@ public class ModelClause extends OracleSQLObjectImpl { } - public static class CellAssignment extends OracleSQLObjectImpl { + public static class CellAssignment extends SQLExprImpl implements OracleExpr { private SQLExpr measureColumn; private final List conditions = new ArrayList(); @@ -404,8 +408,11 @@ public class ModelClause extends OracleSQLObjectImpl { return measureColumn; } - public void setMeasureColumn(SQLExpr measureColumn) { - this.measureColumn = measureColumn; + public void setMeasureColumn(SQLExpr e) { + if (e != null) { + e.setParent(this); + } + this.measureColumn = e; } @Override @@ -417,6 +424,46 @@ public class ModelClause extends OracleSQLObjectImpl { visitor.endVisit(this); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CellAssignment that = (CellAssignment) o; + + if (measureColumn != null ? !measureColumn.equals(that.measureColumn) : that.measureColumn != null) + return false; + return conditions != null ? conditions.equals(that.conditions) : that.conditions == null; + } + + @Override + public int hashCode() { + int result = measureColumn != null ? measureColumn.hashCode() : 0; + result = 31 * result + (conditions != null ? conditions.hashCode() : 0); + return result; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + accept0((OracleASTVisitor) visitor); + } + + @Override + public SQLExpr clone() { + CellAssignment x = new CellAssignment(); + if (measureColumn != null) { + x.setMeasureColumn(measureColumn.clone()); + } + return null; + } + + @Override + public List getChildren() { + List children = new ArrayList(); + children.add(measureColumn); + children.addAll(conditions); + return children; + } } public ModelClause clone() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java index 0362ddd30d..a96bbe1a70 100755 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -29,10 +30,10 @@ public class OracleIntervalExpr extends SQLExprImpl implements SQLLiteralExpr, O private SQLExpr value; private OracleIntervalType type; - private Integer precision; + private SQLExpr precision; private Integer factionalSecondsPrecision; private OracleIntervalType toType; - private Integer toFactionalSecondsPrecision; + private SQLExpr toFactionalSecondsPrecision; public OracleIntervalExpr(){ @@ -72,11 +73,18 @@ public class OracleIntervalExpr extends SQLExprImpl implements SQLLiteralExpr, O this.type = type; } - public Integer getPrecision() { + public SQLExpr getPrecision() { return this.precision; } public void setPrecision(Integer precision) { + this.setPrecision(new SQLIntegerExpr(precision)); + } + + public void setPrecision(SQLExpr precision) { + if (precision != null) { + precision.setParent(this); + } this.precision = precision; } @@ -96,12 +104,15 @@ public class OracleIntervalExpr extends SQLExprImpl implements SQLLiteralExpr, O this.toType = toType; } - public Integer getToFactionalSecondsPrecision() { + public SQLExpr getToFactionalSecondsPrecision() { return this.toFactionalSecondsPrecision; } - public void setToFactionalSecondsPrecision(Integer toFactionalSecondsPrecision) { - this.toFactionalSecondsPrecision = toFactionalSecondsPrecision; + public void setToFactionalSecondsPrecision(SQLExpr x) { + if (x != null) { + x.setParent(this); + } + this.toFactionalSecondsPrecision = x; } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsOfTypeExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsOfTypeExpr.java new file mode 100644 index 0000000000..d28a5d1673 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsOfTypeExpr.java @@ -0,0 +1,97 @@ +/* + * Copyright 1999-2017 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.expr; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +import java.util.ArrayList; +import java.util.List; + +public class OracleIsOfTypeExpr extends SQLExprImpl implements OracleExpr { + private SQLExpr expr; + private List types = new ArrayList(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + OracleIsOfTypeExpr that = (OracleIsOfTypeExpr) o; + + if (expr != null ? !expr.equals(that.expr) : that.expr != null) return false; + return types != null ? types.equals(that.types) : that.types == null; + } + + @Override + public int hashCode() { + int result = expr != null ? expr.hashCode() : 0; + result = 31 * result + (types != null ? types.hashCode() : 0); + return result; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + accept0((OracleASTVisitor) visitor); + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + acceptChild(visitor, types); + } + visitor.endVisit(this); + } + + @Override + public SQLExpr clone() { + OracleIsOfTypeExpr x = new OracleIsOfTypeExpr(); + if (expr != null) { + x.setExpr(expr); + } + return null; + } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (expr != null) { + children.add(expr); + } + children.addAll(types); + return children; + } + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + public List getTypes() { + return types; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java index 55b3e1c950..6e8e6b996c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java @@ -92,6 +92,9 @@ public class OracleSelectPivot extends OracleSelectPivotBase { } public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } this.expr = expr; } 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 959c65647c..c6edc60a14 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 @@ -20,21 +20,7 @@ import java.util.Arrays; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.SQLKeep.DenseRank; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAggregateOption; -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.SQLNumericLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; -import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; -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.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; @@ -592,6 +578,17 @@ public class OracleExprParser extends SQLExprParser { expr = dblink; } + + if (lexer.token() == Token.LBRACKET) { + SQLArrayExpr arrayExpr = new SQLArrayExpr(); + arrayExpr.setExpr(expr); + lexer.nextToken(); + this.exprList(arrayExpr.getValues(), arrayExpr); + accept(Token.RBRACKET); + expr = arrayExpr; + + expr = primaryRest(expr); + } if (lexer.identifierEquals("DAY") || lexer.identifierEquals("YEAR")) { Lexer.SavePoint savePoint = lexer.mark(); @@ -743,6 +740,10 @@ public class OracleExprParser extends SQLExprParser { lexer.nextToken(); acceptIdentifier("NULLS"); aggregateExpr.setIgnoreNulls(true); + } else if (lexer.identifierEquals(FnvHash.Constants.RESPECT)) { + lexer.nextToken(); + acceptIdentifier("NULLS"); + aggregateExpr.setIgnoreNulls(false); } accept(Token.RPAREN); @@ -873,10 +874,15 @@ public class OracleExprParser extends SQLExprParser { accept(Token.INTERVAL); OracleIntervalExpr interval = new OracleIntervalExpr(); - if (lexer.token() != Token.LITERAL_CHARS) { + + if (lexer.token() == Token.LITERAL_CHARS) { + interval.setValue(new SQLCharExpr(lexer.stringVal())); + } else if (lexer.token() == Token.VARIANT) { + interval.setValue(new SQLVariantRefExpr(lexer.stringVal())); + } else { return new SQLIdentifierExpr("INTERVAL"); } - interval.setValue(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); OracleIntervalType type; @@ -906,12 +912,11 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { + if (lexer.token() != Token.LITERAL_INT && lexer.token() != Token.VARIANT) { throw new ParserException("syntax error. " + lexer.info()); } - interval.setPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); - + interval.setPrecision(this.primary()); + if (lexer.token() == Token.COMMA) { lexer.nextToken(); if (lexer.token() != Token.LITERAL_INT) { @@ -930,11 +935,10 @@ public class OracleExprParser extends SQLExprParser { interval.setToType(OracleIntervalType.SECOND); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - if (lexer.token() != Token.LITERAL_INT) { + if (lexer.token() != Token.LITERAL_INT && lexer.token() != Token.VARIANT) { throw new ParserException("syntax error. " + lexer.info()); } - interval.setToFactionalSecondsPrecision(lexer.integerValue().intValue()); - lexer.nextToken(); + interval.setToFactionalSecondsPrecision(primary()); accept(Token.RPAREN); } } else { @@ -958,6 +962,41 @@ public class OracleExprParser extends SQLExprParser { lexer.nextToken(); accept(Token.SET); expr = new OracleIsSetExpr(expr); + } else if (lexer.token() == Token.OF) { + lexer.nextToken(); + + if (lexer.identifierEquals(FnvHash.Constants.TYPE)) { + lexer.nextToken(); + } + + OracleIsOfTypeExpr isOf = new OracleIsOfTypeExpr(); + isOf.setExpr(expr); + accept(Token.LPAREN); + + for (;;) { + boolean only = lexer.identifierEquals(FnvHash.Constants.ONLY); + if (only) { + lexer.nextToken(); + } + + SQLExpr type = this.name(); + if (only) { + type.putAttribute("ONLY", true); + } + + type.setParent(isOf); + isOf.getTypes().add(type); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + + accept(Token.RPAREN); + + expr = isOf; } else { SQLExpr rightExpr = primary(); expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Is, rightExpr, getDbType()); 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 713c5fc8a2..b663551042 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 @@ -144,7 +144,8 @@ public class OracleLexer extends Lexer { } public void scanVariable() { - if (ch != ':' && ch != '#' && ch != '$') { + final char c0 = ch; + if (c0 != ':' && c0 != '#' && c0 != '$') { throw new ParserException("illegal variable. " + info()); } @@ -154,25 +155,46 @@ public class OracleLexer extends Lexer { boolean quoteFlag = false; boolean mybatisFlag = false; - if (charAt(pos + 1) == '"') { + + char c1 = charAt(pos + 1); + if (c0 == ':' && c1 == ' ') { + pos++; + bufPos = 2; + c1 = charAt(pos + 1); + } + + if (c1 == '"') { pos++; bufPos++; quoteFlag = true; - } else if (charAt(pos + 1) == '{') { + } else if (c1 == '{') { pos++; bufPos++; mybatisFlag = true; } - for (;;) { - ch = charAt(++pos); + if (c0 == ':' && c1 >= '0' && c1 <= '9') { + for (; ; ) { + ch = charAt(++pos); - if (!isIdentifierChar(ch)) { - break; + if (ch < '0' || ch > '9') { + break; + } + + bufPos++; + continue; } + } else { + for (; ; ) { + ch = charAt(++pos); - bufPos++; - continue; + if (!isIdentifierChar(ch)) { + break; + } + + bufPos++; + continue; + } } if (quoteFlag) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index e2e53605dc..474eded469 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -48,6 +48,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableSource; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; import com.alibaba.druid.sql.parser.*; +import com.alibaba.druid.util.FnvHash; public class OracleSelectParser extends SQLSelectParser { @@ -204,8 +205,16 @@ public class OracleSelectParser extends SQLSelectParser { throw new ParserException("syntax erorr : " + lexer.token()); } - searchClause.setType(SearchClause.Type.valueOf(lexer.stringVal())); - lexer.nextToken(); + if (lexer.identifierEquals(FnvHash.Constants.DEPTH)) { + lexer.nextToken(); + searchClause.setType(SearchClause.Type.DEPTH); + } else if (lexer.identifierEquals(FnvHash.Constants.BREADTH)) { + lexer.nextToken(); + searchClause.setType(SearchClause.Type.BREADTH); + } else { + searchClause.setType(SearchClause.Type.valueOf(lexer.stringVal().toUpperCase())); + lexer.nextToken(); + } acceptIdentifier("FIRST"); accept(Token.BY); @@ -522,9 +531,16 @@ public class OracleSelectParser extends SQLSelectParser { item.setCellAssignment(parseCellAssignment()); item.setOrderBy(this.parseOrderBy()); accept(Token.EQ); - item.setExpr(expr()); + + SQLExpr expr = this.expr(); + item.setExpr(expr); modelRulesClause.getCellAssignmentItems().add(item); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } } mainModel.setModelRulesClause(modelRulesClause); @@ -533,7 +549,7 @@ public class OracleSelectParser extends SQLSelectParser { private CellAssignment parseCellAssignment() { CellAssignment cellAssignment = new CellAssignment(); - cellAssignment.setMeasureColumn(expr()); + cellAssignment.setMeasureColumn(this.exprParser.name()); accept(Token.LBRACKET); this.exprParser.exprList(cellAssignment.getConditions(), cellAssignment); accept(Token.RBRACKET); @@ -609,6 +625,7 @@ public class OracleSelectParser extends SQLSelectParser { } else if (lexer.token() == Token.IDENTIFIER) { SQLTableSource identTable = parseTableSource(); accept(Token.RPAREN); + parsePivot((OracleSelectTableSource) identTable); return identTable; } else { throw new ParserException("TODO :" + lexer.info()); @@ -688,6 +705,11 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); partition.setPartition(exprParser.name()); accept(Token.RPAREN); + } else if (lexer.token() == Token.BY) { + lexer.nextToken(); + accept(Token.LPAREN); + partition.setPartition(exprParser.name()); + accept(Token.RPAREN); } else { accept(Token.FOR); accept(Token.LPAREN); @@ -861,6 +883,14 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.ON) { lexer.nextToken(); join.setCondition(this.exprParser.expr()); + + if (lexer.token() == Token.ON + && tableSource instanceof SQLJoinTableSource + && ((SQLJoinTableSource) tableSource).getCondition() == null) { + lexer.nextToken(); + SQLExpr leftCondidition = this.exprParser.expr(); + ((SQLJoinTableSource) tableSource).setCondition(leftCondidition); + } } else if (lexer.token() == Token.USING) { lexer.nextToken(); accept(Token.LPAREN); @@ -868,6 +898,8 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.RPAREN); } + parsePivot(join); + return parseTableSourceRest(join); } @@ -921,25 +953,28 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.IN); accept(Token.LPAREN); - if (lexer.token() == (Token.LPAREN)) { - throw new ParserException("TODO. " + lexer.info()); - } +// if (lexer.token() == (Token.LPAREN)) { +// throw new ParserException("TODO. " + lexer.info()); +// } if (lexer.token() == (Token.SELECT)) { - throw new ParserException("TODO. " + lexer.info()); - } - - for (;;) { + SQLExpr expr = this.exprParser.expr(); item = new OracleSelectPivot.Item(); - item.setExpr(this.exprParser.expr()); - item.setAlias(as()); + item.setExpr(expr); pivot.getPivotIn().add(item); + } else { + for (; ; ) { + item = new OracleSelectPivot.Item(); + item.setExpr(this.exprParser.expr()); + item.setAlias(as()); + pivot.getPivotIn().add(item); - if (lexer.token() != Token.COMMA) { - break; + if (lexer.token() != Token.COMMA) { + break; + } + + lexer.nextToken(); } - - lexer.nextToken(); } accept(Token.RPAREN); 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 344cc22f31..6ad946dbd2 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 @@ -1381,7 +1381,10 @@ public class OracleStatementParser extends SQLStatementParser { stmt.addItem(item); accept(Token.RPAREN); - } else if (lexer.token() == Token.CONSTRAINT) { + } else if (lexer.token() == Token.CONSTRAINT + || lexer.token() == Token.FOREIGN + || lexer.token() == Token.PRIMARY + || lexer.token() == Token.UNIQUE) { OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(); constraint.setParent(item); 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 16260991dd..cc846abbf0 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 @@ -437,4 +437,8 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OraclePipeRowStatement x); void endVisit(OraclePipeRowStatement x); + + boolean visit(OracleIsOfTypeExpr x); + + void endVisit(OracleIsOfTypeExpr 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 6130d835bf..0d4dac71b9 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 @@ -1083,4 +1083,14 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora public void endVisit(OraclePipeRowStatement x) { } + + @Override + public boolean visit(OracleIsOfTypeExpr x) { + return true; + } + + @Override + public void endVisit(OracleIsOfTypeExpr 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 2c5dcc4a5a..b181b1611e 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 @@ -187,7 +187,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (x.getPrecision() != null) { print('('); - print(x.getPrecision().intValue()); + printExpr(x.getPrecision()); if (x.getFactionalSecondsPrecision() != null) { print0(", "); print(x.getFactionalSecondsPrecision().intValue()); @@ -200,7 +200,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print0(x.getToType().name()); if (x.getToFactionalSecondsPrecision() != null) { print('('); - print(x.getToFactionalSecondsPrecision().intValue()); + printExpr(x.getToFactionalSecondsPrecision()); print(')'); } } @@ -297,6 +297,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS printFlashback(x.getFlashback()); } + OracleSelectPivotBase pivot = x.getPivot(); + if (pivot != null) { + println(); + pivot.accept(this); + } + return false; } @@ -471,9 +477,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS println(); print(')'); - if (x.getPivot() != null) { + OracleSelectPivotBase pivot = x.getPivot(); + if (pivot != null) { println(); - x.getPivot().accept(this); + pivot.accept(this); } printFlashback(x.getFlashback()); @@ -3341,4 +3348,30 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public void endVisit(OraclePipeRowStatement x) { } + + @Override + public boolean visit(OracleIsOfTypeExpr x) { + printExpr(x.getExpr()); + print0(ucase ? " IS OF TYPE (" : " is of type ("); + + List types = x.getTypes(); + for (int i = 0, size = types.size(); i < size; ++i) { + if (i != 0) { + print0(", "); + } + SQLExpr type = types.get(i); + if (Boolean.TRUE == type.getAttribute("ONLY")) { + print0(ucase ? "ONLY " : "only "); + } + type.accept(this); + } + + print(')'); + return false; + } + + @Override + public void endVisit(OracleIsOfTypeExpr 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 ae1ecbc616..4afcbad54c 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 @@ -1375,4 +1375,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OraclePipeRowStatement x) { } + + @Override + public boolean visit(OracleIsOfTypeExpr x) { + return false; + } + + @Override + public void endVisit(OracleIsOfTypeExpr x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGTypeCastExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGTypeCastExpr.java index da327f4970..720c5fb5b1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGTypeCastExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGTypeCastExpr.java @@ -33,7 +33,12 @@ public class PGTypeCastExpr extends SQLCastExpr implements PGExpr { @Override protected void accept0(SQLASTVisitor visitor) { - accept0((PGASTVisitor) visitor); + if (visitor instanceof PGASTVisitor) { + accept0((PGASTVisitor) visitor); + return; + } + + super.accept0(visitor); } public String toString() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java index 45a584932e..5e31c16025 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java @@ -38,7 +38,12 @@ public class PGUpdateStatement extends SQLUpdateStatement implements PGSQLStatem } protected void accept0(SQLASTVisitor visitor) { - accept0((PGASTVisitor) visitor); + if (visitor instanceof PGASTVisitor) { + accept0((PGASTVisitor) visitor); + return; + } + + super.accept0(visitor); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 94536f5756..c171146402 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -31,6 +31,8 @@ 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; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.JdbcConstants; import java.util.ArrayList; import java.util.List; @@ -393,5 +395,77 @@ public class PGSQLStatementParser extends SQLStatementParser { return stmt; } + public SQLCreateSequenceStatement parseCreateSequence(boolean acceptCreate) { + if (acceptCreate) { + accept(Token.CREATE); + } + + accept(Token.SEQUENCE); + + SQLCreateSequenceStatement stmt = new SQLCreateSequenceStatement(); + stmt.setDbType(dbType); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.START) { + lexer.nextToken(); + accept(Token.WITH); + stmt.setStartWith(this.exprParser.expr()); + continue; + } else if (lexer.identifierEquals("INCREMENT")) { + lexer.nextToken(); + accept(Token.BY); + stmt.setIncrementBy(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.CACHE || lexer.identifierEquals(FnvHash.Constants.CACHE)) { + lexer.nextToken(); + stmt.setCache(Boolean.TRUE); + + if (lexer.token() == Token.LITERAL_INT) { + stmt.setCacheValue(this.exprParser.primary()); + } + continue; + } else if (lexer.token() == Token.NOCACHE) { + lexer.nextToken(); + stmt.setCache(Boolean.FALSE); + continue; + } else if (lexer.token() == Token.ORDER) { + lexer.nextToken(); + stmt.setOrder(Boolean.TRUE); + continue; + } else if (lexer.identifierEquals("NOORDER")) { + lexer.nextToken(); + stmt.setOrder(Boolean.FALSE); + continue; + } else if (lexer.identifierEquals("CYCLE")) { + lexer.nextToken(); + stmt.setCycle(Boolean.TRUE); + continue; + } else if (lexer.identifierEquals("NOCYCLE")) { + lexer.nextToken(); + stmt.setCycle(Boolean.FALSE); + continue; + } else if (lexer.identifierEquals("MINVALUE")) { + lexer.nextToken(); + stmt.setMinValue(this.exprParser.expr()); + continue; + } else if (lexer.identifierEquals("MAXVALUE")) { + lexer.nextToken(); + stmt.setMaxValue(this.exprParser.expr()); + continue; + } else if (lexer.identifierEquals("NOMAXVALUE")) { + lexer.nextToken(); + stmt.setNoMaxValue(true); + continue; + } else if (lexer.identifierEquals("NOMINVALUE")) { + lexer.nextToken(); + stmt.setNoMinValue(true); + continue; + } + break; + } + + return stmt; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index a866a18989..bfd46a7ca7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -1082,7 +1082,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor if (x.getPrecision() != null) { print('('); - print(x.getPrecision().intValue()); + printExpr(x.getPrecision()); if (x.getFactionalSecondsPrecision() != null) { print0(", "); print(x.getFactionalSecondsPrecision().intValue()); @@ -1095,7 +1095,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor print0(x.getToType().name()); if (x.getToFactionalSecondsPrecision() != null) { print('('); - print(x.getToFactionalSecondsPrecision().intValue()); + printExpr(x.getToFactionalSecondsPrecision()); print(')'); } } @@ -2770,4 +2770,29 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor x.getExpr().accept(this); return false; } + + @Override + public boolean visit(OracleIsOfTypeExpr x) { + printExpr(x.getExpr()); + print0(ucase ? " IS OF TYPE (" : " is of type ("); + + List types = x.getTypes(); + for (int i = 0, size = types.size(); i < size; ++i) { + if (i != 0) { + print0(", "); + } + SQLExpr type = types.get(i); + if (Boolean.TRUE == type.getAttribute("ONLY")) { + print0(ucase ? "ONLY " : "only "); + } + type.accept(this); + } + + print(')'); + return false; + } + + public void endVisit(OracleIsOfTypeExpr x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 2dc84bac41..bd777a394c 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -866,7 +866,40 @@ public class Lexer { scanChar(); token = Token.LT_SUB_GT; } else { - token = Token.LT; + if (ch == ' ') { + char c1 = charAt(pos + 1); + if (c1 == '=') { + scanChar(); + scanChar(); + if (ch == '>') { + token = Token.LTEQGT; + scanChar(); + } else { + token = Token.LTEQ; + } + } else if (c1 == '>') { + scanChar(); + scanChar(); + token = Token.LTGT; + } else if (c1 == '<') { + scanChar(); + scanChar(); + token = Token.LTLT; + } else if (c1 == '@') { + scanChar(); + scanChar(); + token = Token.LT_MONKEYS_AT; + } else if (c1 == '-' && charAt(pos + 2) == '>') { + scanChar(); + scanChar(); + scanChar(); + token = Token.LT_SUB_GT; + } else { + token = Token.LT; + } + } else { + token = Token.LT; + } } break; case '!': diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index acdd191592..34437357a0 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -24,26 +24,7 @@ import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.*; -import com.alibaba.druid.sql.ast.statement.SQLNotNullConstraint; -import com.alibaba.druid.sql.ast.statement.SQLNullConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAssignItem; -import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; -import com.alibaba.druid.sql.ast.statement.SQLCheck; -import com.alibaba.druid.sql.ast.statement.SQLColumnCheck; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLColumnReference; -import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey; -import com.alibaba.druid.sql.ast.statement.SQLConstraint; -import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; -import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; -import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectItem; -import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; -import com.alibaba.druid.sql.ast.statement.SQLUnique; -import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; @@ -140,8 +121,15 @@ public class SQLExprParser extends SQLParser { switch (token) { case CARET: { lexer.nextToken(); + SQLBinaryOperator op; + if (lexer.token == Token.EQ) { + lexer.nextToken(); + op = SQLBinaryOperator.BitwiseXorEQ; + } else { + op = SQLBinaryOperator.BitwiseXor; + } SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BitwiseXor, rightExp, dbType); + expr = new SQLBinaryOpExpr(expr, op, rightExp, dbType); expr = bitXorRest(expr); break; } @@ -303,6 +291,13 @@ public class SQLExprParser extends SQLParser { } accept(Token.RPAREN); + + if (lexer.token == Token.UNION && sqlExpr instanceof SQLQueryExpr) { + SQLQueryExpr queryExpr = (SQLQueryExpr) sqlExpr; + + SQLSelectQuery query = this.createSelectParser().queryRest(queryExpr.getSubQuery().getQuery()); + queryExpr.getSubQuery().setQuery(query); + } break; case INSERT: lexer.nextToken(); @@ -707,6 +702,18 @@ public class SQLExprParser extends SQLParser { sqlExpr = new SQLBinaryExpr(strVal); break; } + case SET: { + Lexer.SavePoint savePoint = lexer.mark(); + lexer.nextToken(); + if (lexer.token() == Token.LPAREN) { + sqlExpr = new SQLIdentifierExpr("SET"); + } else { + lexer.reset(savePoint); + throw new ParserException("ERROR. " + lexer.info()); + } + break; + } + default: throw new ParserException("ERROR. " + lexer.info()); } @@ -844,37 +851,37 @@ public class SQLExprParser extends SQLParser { && "GROUPING".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) { SQLGroupingSetExpr groupingSets = new SQLGroupingSetExpr(); lexer.nextToken(); - + accept(Token.LPAREN); - - for (;;) { + + for (; ; ) { SQLExpr item; if (lexer.token == Token.LPAREN) { lexer.nextToken(); - + SQLListExpr listExpr = new SQLListExpr(); this.exprList(listExpr.getItems(), listExpr); item = listExpr; - + accept(Token.RPAREN); } else { item = this.expr(); } - + item.setParent(groupingSets); groupingSets.addParameter(item); - + if (lexer.token == Token.RPAREN) { break; } - + accept(Token.COMMA); } this.exprList(groupingSets.getParameters(), groupingSets); accept(Token.RPAREN); - + return groupingSets; } else { if (lexer.token == Token.LPAREN) { @@ -992,7 +999,13 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.USING || lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); - SQLExpr using = this.primary(); + SQLExpr using; + if (lexer.token == Token.STAR) { + lexer.nextToken(); + using = new SQLAllColumnExpr(); + } else { + using = this.primary(); + } methodInvokeExpr.setUsing(using); } @@ -1542,8 +1555,13 @@ public class SQLExprParser extends SQLParser { public final SQLExpr bitOrRest(SQLExpr expr) { while (lexer.token == Token.BAR) { lexer.nextToken(); + SQLBinaryOperator op = SQLBinaryOperator.BitwiseOr; + if (lexer.token == Token.BAR) { + lexer.nextToken(); + op = SQLBinaryOperator.Concat; + } SQLExpr rightExp = bitAnd(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BitwiseOr, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, op, rightExp, getDbType()); expr = bitAndRest(expr); } return expr; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 3d0be2ef58..2a053095c2 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -1897,6 +1897,11 @@ public class SQLStatementParser extends SQLParser { return parseCreateType(); } + if (lexer.identifierEquals(FnvHash.Constants.PUBLIC)) { + lexer.reset(markBp, markChar, Token.CREATE); + return parseCreateSynonym(); + } + // lexer.reset(mark_bp, mark_ch, Token.CREATE); throw new ParserException("TODO " + lexer.info()); } else if (token == Token.DATABASE) { @@ -2726,82 +2731,90 @@ public class SQLStatementParser extends SQLParser { accept(Token.ON); stmt.setOn(exprParser.expr()); - boolean insertFlag = false; - if (lexer.token == Token.WHEN) { - lexer.nextToken(); - if (lexer.token == Token.MATCHED) { - SQLMergeStatement.MergeUpdateClause updateClause = new SQLMergeStatement.MergeUpdateClause(); + for (;;) { + boolean insertFlag = false; + if (lexer.token == Token.WHEN) { lexer.nextToken(); - accept(Token.THEN); - accept(Token.UPDATE); - accept(Token.SET); + if (lexer.token == Token.MATCHED) { + SQLMergeStatement.MergeUpdateClause updateClause = new SQLMergeStatement.MergeUpdateClause(); + lexer.nextToken(); + accept(Token.THEN); + accept(Token.UPDATE); + accept(Token.SET); - for (;;) { - SQLUpdateSetItem item = this.exprParser.parseUpdateSetItem(); + for (; ; ) { + SQLUpdateSetItem item = this.exprParser.parseUpdateSetItem(); - updateClause.addItem(item); - item.setParent(updateClause); + updateClause.addItem(item); + item.setParent(updateClause); - if (lexer.token == (Token.COMMA)) { - lexer.nextToken(); - continue; + if (lexer.token == (Token.COMMA)) { + lexer.nextToken(); + continue; + } + + break; } - 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) { + SQLMergeStatement.MergeInsertClause insertClause = new SQLMergeStatement.MergeInsertClause(); + + accept(Token.MATCHED); + accept(Token.THEN); + accept(Token.INSERT); + + if (lexer.token == Token.LPAREN) { + accept(Token.LPAREN); + exprParser.exprList(insertClause.getColumns(), insertClause); + accept(Token.RPAREN); + } + accept(Token.VALUES); + accept(Token.LPAREN); + exprParser.exprList(insertClause.getValues(), insertClause); + accept(Token.RPAREN); if (lexer.token == Token.WHERE) { lexer.nextToken(); - updateClause.setWhere(exprParser.expr()); + insertClause.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; + stmt.setInsertClause(insertClause); } - } - if (!insertFlag) { if (lexer.token == Token.WHEN) { - lexer.nextToken(); + continue; } - if (lexer.token == Token.NOT) { - lexer.nextToken(); - insertFlag = true; - } - } - - if (insertFlag) { - SQLMergeStatement.MergeInsertClause insertClause = new SQLMergeStatement.MergeInsertClause(); - - accept(Token.MATCHED); - accept(Token.THEN); - accept(Token.INSERT); - - if (lexer.token == Token.LPAREN) { - accept(Token.LPAREN); - exprParser.exprList(insertClause.getColumns(), insertClause); - accept(Token.RPAREN); - } - accept(Token.VALUES); - accept(Token.LPAREN); - exprParser.exprList(insertClause.getValues(), insertClause); - accept(Token.RPAREN); - - if (lexer.token == Token.WHERE) { - lexer.nextToken(); - insertClause.setWhere(exprParser.expr()); - } - - stmt.setInsertClause(insertClause); + break; } SQLErrorLoggingClause errorClause = parseErrorLoggingClause(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index d717eae675..b06a969fd1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -41,6 +41,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreatePackageStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; import com.alibaba.druid.sql.dialect.oracle.parser.OracleFunctionDataType; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.JdbcUtils; @@ -1597,8 +1598,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet visit(subQuery); print(')'); println(); - } else if (parent instanceof SQLStatement - && !(parent instanceof OracleForStatement)) { + } else if ((parent instanceof SQLStatement + && !(parent instanceof OracleForStatement)) + || parent instanceof OracleSelectPivot.Item) { this.indentCount++; println(); @@ -4973,7 +4975,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } if (x.isNoMaxValue()) { - print0(ucase ? " NOMAXVALUE" : " nomaxvalue"); + if (JdbcConstants.POSTGRESQL.equals(dbType)) { + print0(ucase ? " NO MAXVALUE" : " no maxvalue"); + } else { + print0(ucase ? " NOMAXVALUE" : " nomaxvalue"); + } } if (x.getMinValue() != null) { @@ -4982,14 +4988,22 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } if (x.isNoMinValue()) { - print0(ucase ? " NOMINVALUE" : " nominvalue"); + if (JdbcConstants.POSTGRESQL.equals(dbType)) { + print0(ucase ? " NO MINVALUE" : " no minvalue"); + } else { + print0(ucase ? " NOMINVALUE" : " nominvalue"); + } } if (x.getCycle() != null) { if (x.getCycle().booleanValue()) { print0(ucase ? " CYCLE" : " cycle"); } else { - print0(ucase ? " NOCYCLE" : " nocycle"); + if (JdbcConstants.POSTGRESQL.equals(dbType)) { + print0(ucase ? " NO CYCLE" : " no cycle"); + } else { + print0(ucase ? " NOCYCLE" : " nocycle"); + } } } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 6e6a4424b2..36adbe872d 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -306,6 +306,7 @@ public final class FnvHash { long SQL_SMALL_RESULT = fnv1a_64_lower("SQL_SMALL_RESULT"); long SQL_BIG_RESULT = fnv1a_64_lower("SQL_BIG_RESULT"); long SQL_BUFFER_RESULT = fnv1a_64_lower("SQL_BUFFER_RESULT"); + long CACHE = fnv1a_64_lower("CACHE"); long SQL_CACHE = fnv1a_64_lower("SQL_CACHE"); long SQL_NO_CACHE = fnv1a_64_lower("SQL_NO_CACHE"); long SQL_CALC_FOUND_ROWS = fnv1a_64_lower("SQL_CALC_FOUND_ROWS"); @@ -439,6 +440,7 @@ public final class FnvHash { long FOLLOWING = fnv1a_64_lower("FOLLOWING"); long UNBOUNDED = fnv1a_64_lower("UNBOUNDED"); long SIBLINGS = fnv1a_64_lower("SIBLINGS"); + long RESPECT = fnv1a_64_lower("RESPECT"); long NULLS = fnv1a_64_lower("NULLS"); long FIRST = fnv1a_64_lower("FIRST"); long LAST = fnv1a_64_lower("LAST"); @@ -511,6 +513,7 @@ public final class FnvHash { long TRUNC = fnv1a_64_lower("TRUNC"); long SYSTIMESTAMP = fnv1a_64_lower("SYSTIMESTAMP"); long TYPE = fnv1a_64_lower("TYPE"); + long ONLY = fnv1a_64_lower("ONLY"); long MEMBER = fnv1a_64_lower("MEMBER"); long STATIC = fnv1a_64_lower("STATIC"); long UNSUPPORTED = fnv1a_64_lower("UNSUPPORTED"); @@ -524,5 +527,8 @@ public final class FnvHash { long COMPRESS = fnv1a_64_lower("COMPRESS"); long YES = fnv1a_64_lower("YES"); long WMSYS = fnv1a_64_lower("WMSYS"); + + long DEPTH = fnv1a_64_lower("DEPTH"); + long BREADTH = fnv1a_64_lower("BREADTH"); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java index b33a25fce8..96f5a49a0b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java @@ -56,11 +56,11 @@ public class DB2SelectTest_23 extends DB2Test { // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name"))); - Assert.assertEquals("SELECT CURRENT DATE, CURRENT DATE\n" + + Assert.assertEquals("SELECT CURRENT DATE, CURRENT TIMESTAMP\n" + "FROM dual", // SQLUtils.toSQLString(stmt, JdbcConstants.DB2)); - Assert.assertEquals("select CURRENT DATE, CURRENT DATE\n" + + Assert.assertEquals("select CURRENT DATE, CURRENT TIMESTAMP\n" + "from dual", // SQLUtils.toSQLString(stmt, JdbcConstants.DB2, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java index f02b936fa2..795fb2954e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java @@ -71,7 +71,7 @@ public class MySqlSelectTest_42_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT cte1.b, cte2.d\n" + + "SELECT b, d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // @@ -87,7 +87,7 @@ public class MySqlSelectTest_42_with_cte extends MysqlTest { "\t\tselect c, d\n" + "\t\tfrom table2\n" + "\t)\n" + - "select cte1.b, cte2.d\n" + + "select b, d\n" + "from cte1\n" + "\tjoin cte2\n" + "where cte1.a = cte2.c;", // @@ -104,7 +104,7 @@ public class MySqlSelectTest_42_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT cte1.b, cte2.d\n" + + "SELECT b, d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java index 61e6b36a60..a8d9b0e2e7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java @@ -62,7 +62,7 @@ public class MySqlSelectTest_43_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT cte1.b, cte2.d\n" + + "SELECT b, d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // @@ -78,7 +78,7 @@ public class MySqlSelectTest_43_with_cte extends MysqlTest { "\t\tselect c, d\n" + "\t\tfrom table2\n" + "\t)\n" + - "select cte1.b, cte2.d\n" + + "select b, d\n" + "from cte1\n" + "\tjoin cte2\n" + "where cte1.a = cte2.c;", // @@ -95,7 +95,7 @@ public class MySqlSelectTest_43_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT cte1.b, cte2.d\n" + + "SELECT b, d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_69_mysql8_windows_function.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_69_mysql8_windows_function.java new file mode 100644 index 0000000000..10aeaa39f7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_69_mysql8_windows_function.java @@ -0,0 +1,101 @@ +/* + * Copyright 1999-2017 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.mysql.select; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserFeature; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlSelectTest_69_mysql8_windows_function extends MysqlTest { + + public void test_0() throws Exception { + String sql = "SELECT\n" + + " val,\n" + + " ROW_NUMBER() OVER w AS 'row_number',\n" + + " CUME_DIST() OVER w AS 'cume_dist',\n" + + " PERCENT_RANK() OVER w AS 'percent_rank'\n" + + " FROM numbers\n" + + " WINDOW w AS (ORDER BY val);"; + + System.out.println(sql); + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcConstants.MYSQL, SQLParserFeature.OptimizedForParameterized); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + System.out.println(stmt); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + stmt.accept(visitor); + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("WITH RECURSIVE ancestors AS (\n" + + "\t\tSELECT *\n" + + "\t\tFROM org\n" + + "\t\tWHERE 1 = 1\n" + + "\t\t\tAND deleted = 1\n" + + "\t\tUNION\n" + + "\t\tSELECT f.*\n" + + "\t\tFROM org f, ancestors a\n" + + "\t\tWHERE f.id = a.parent_id\n" + + "\t)\n" + + "SELECT *\n" + + "FROM ancestors;", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("with recursive ancestors as (\n" + + "\t\tselect *\n" + + "\t\tfrom org\n" + + "\t\twhere 1 = 1\n" + + "\t\t\tand deleted = 1\n" + + "\t\tunion\n" + + "\t\tselect f.*\n" + + "\t\tfrom org f, ancestors a\n" + + "\t\twhere f.id = a.parent_id\n" + + "\t)\n" + + "select *\n" + + "from ancestors;", // + output); + } + + { + String output = SQLUtils.toMySqlString(stmt, new SQLUtils.FormatOption(true, true, true)); + assertEquals("WITH RECURSIVE ancestors AS (\n" + + "\t\tSELECT *\n" + + "\t\tFROM org\n" + + "\t\tWHERE 1 = 1\n" + + "\t\t\tAND deleted = ?\n" + + "\t\tUNION\n" + + "\t\tSELECT f.*\n" + + "\t\tFROM org f, ancestors a\n" + + "\t\tWHERE f.id = a.parent_id\n" + + "\t)\n" + + "SELECT *\n" + + "FROM ancestors;", // + output); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/AntlrExamplesTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/AntlrExamplesTest.java new file mode 100644 index 0000000000..b811c637f4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/AntlrExamplesTest.java @@ -0,0 +1,22 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.net.URL; + +public class AntlrExamplesTest extends TestCase { + public void test_for_antlr_examples() throws Exception { + String path = "bvt/parser/antlr_grammers_v4_plsql/examples/"; + URL resource = Thread.currentThread().getContextClassLoader().getResource(path); + File dir = new File(resource.getFile()); + for (File file : dir.listFiles()) { + System.out.println(file); + String sql = FileUtils.readFileToString(file); + SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest10.java new file mode 100644 index 0000000000..45643f58f0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest10.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2017 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 com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import org.junit.Assert; + +import java.util.List; + +public class OracleMergeTest10 extends OracleTest { + + public void test_0() throws Exception { + String sql = "merge into bonuses d \n" + + " using (select employee_id.* from employees) s \n" + + " on (employee_id = a) \n" + + " when not matched then insert (d.employee_id, d.bonus) \n" + + " values (s.employee_id, s.salary)\n" + + " where (s.salary <= 8000)\n" + + " when matched then update set d.bonus = bonus \n" + + " delete where (salary > 8000)"; + + SQLStatementParser parser = new OracleStatementParser(sql); + List stmtList = parser.parseStatementList(); + SQLMergeStatement mergeStatement = (SQLMergeStatement) stmtList.get(0); + String result = SQLUtils.toOracleString(mergeStatement); + Assert.assertEquals("MERGE INTO bonuses d\n" + + "USING (\n" + + "\tSELECT employee_id.*\n" + + "\tFROM employees\n" + + ") s ON (employee_id = a) \n" + + "WHEN MATCHED THEN UPDATE SET d.bonus = bonus\n" + + "\tWHERE salary > 8000\n" + + "WHEN NOT MATCHED THEN INSERT (d.employee_id, d.bonus) VALUES (s.employee_id, s.salary)\n" + + "\tWHERE s.salary <= 8000", + result); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest61.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest61.java index 9f77a1c227..bd4dbdbe89 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest61.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest61.java @@ -55,7 +55,7 @@ public class OracleSelectTest61 extends OracleTest { Assert.assertEquals("SELECT column_expression\n" + "FROM sys.ALL_IND_EXPRESSIONS\n" + - "WHERE column_position = :cp", text); + "WHERE column_position = : cp", text); } { @@ -63,7 +63,7 @@ public class OracleSelectTest61 extends OracleTest { Assert.assertEquals("select column_expression\n" + "from sys.ALL_IND_EXPRESSIONS\n" + - "where column_position = :cp", text); + "where column_position = : cp", text); } // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java index 0bdc8dab46..421998c30c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java @@ -81,7 +81,7 @@ public class OracleSelectTest64_with_recursive extends OracleTest { "\t\tWHERE parent_id IS NULL\n" + "\t\tUNION ALL\n" + "\t\t-- Recursive member.\n" + - "\t\tSELECT t2.id, t2.parent_id, t1.lvl + 1\n" + + "\t\tSELECT t2.id, t2.parent_id, lvl + 1\n" + "\t\tFROM tab1 t2, t1\n" + "\t\tWHERE t2.parent_id = t1.id\n" + "\t)\n" + @@ -103,7 +103,7 @@ public class OracleSelectTest64_with_recursive extends OracleTest { "\t\twhere parent_id is null\n" + "\t\tunion all\n" + "\t\t-- Recursive member.\n" + - "\t\tselect t2.id, t2.parent_id, t1.lvl + 1\n" + + "\t\tselect t2.id, t2.parent_id, lvl + 1\n" + "\t\tfrom tab1 t2, t1\n" + "\t\twhere t2.parent_id = t1.id\n" + "\t)\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest87_bindvar.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest87_bindvar.java new file mode 100644 index 0000000000..12af5a4915 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest87_bindvar.java @@ -0,0 +1,76 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest87_bindvar extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select *\n" + + "from a\n" + + "where a=:3\n" + + "and b= : 4\n" + + "and c= :5and :a = :b"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM a\n" + + "WHERE a = :3\n" + + "\tAND b = : 4\n" + + "\tAND c = :5\n" + + "\tAND :a = :b", text); + } + + 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()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(4, visitor.getColumns().size()); + assertEquals(3, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest88_bindvar.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest88_bindvar.java new file mode 100644 index 0000000000..d71ffe2df4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest88_bindvar.java @@ -0,0 +1,77 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest88_bindvar extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select *\n" + + "from \n" + + "(\n" + + " select *\n" + + " from \"rme\" \"rm\" \n" + + " where \"rm\".a-interval:\"sys_b_07\" day(:\"sys_b_08\") to second(:\"sys_b_09\")\n" + + ")"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT *\n" + + "\tFROM \"rme\" \"rm\"\n" + + "\tWHERE \"rm\".a - (:\"sys_b_07\") DAY(:\"sys_b_08\") TO SECOND(:\"sys_b_09\")\n" + + ")", text); + } + + 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()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(2, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest89_condition.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest89_condition.java new file mode 100644 index 0000000000..8a6cf08c28 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest89_condition.java @@ -0,0 +1,88 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest89_condition extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from v.e\n" + + "where\n" + + "\tcid <> rid\n" + + "\tand rid not in\n" + + "\t(\n" + + "\t\t(select distinct rid from v.s )\n" + + "\t\tunion\n" + + "\t\t(select distinct rid from v.p )\n" + + "\t)\n" + + "\tand \"timestamp\" <= 1298505600000\n" + + "\n"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM v.e\n" + + "WHERE cid <> rid\n" + + "\tAND rid NOT IN (\n" + + "\t\tSELECT DISTINCT rid\n" + + "\t\tFROM v.s\n" + + "\t\tUNION\n" + + "\t\tSELECT DISTINCT rid\n" + + "\t\tFROM v.p\n" + + "\t)\n" + + "\tAND \"timestamp\" <= 1298505600000", text); + } + + 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()); + + assertEquals(3, visitor.getTables().size()); + assertEquals(6, visitor.getColumns().size()); + assertEquals(4, visitor.getConditions().size()); + assertEquals(1, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest90_isof.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest90_isof.java new file mode 100644 index 0000000000..d48c1181ca --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest90_isof.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest90_isof extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from persons p\n" + + " where value(p) is of type(only employee_t)"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM persons p\n" + + "WHERE value(p) IS OF TYPE (ONLY employee_t)", text); + } + + 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()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(1, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest91.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest91.java new file mode 100644 index 0000000000..2817be0e45 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest91.java @@ -0,0 +1,74 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest91 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select *\n" + + "from hdr a\n" + + "inner join sh s\n" + + "inner join ca c\n" + + "on c.id = s.id\n" + + "on a.va = s.va"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM hdr a\n" + + "INNER JOIN sh s ON a.va = s.va \n" + + "\tINNER JOIN ca c ON c.id = s.id ", text); + } + + 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()); + + assertEquals(3, visitor.getTables().size()); + assertEquals(4, visitor.getColumns().size()); + assertEquals(4, visitor.getConditions().size()); + assertEquals(2, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest92_lexer.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest92_lexer.java new file mode 100644 index 0000000000..9b933596c6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest92_lexer.java @@ -0,0 +1,70 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest92_lexer extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from dual where 1 < > 2 and 1 ! = 2 and 1 ^ /*aaa */ = 2"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM dual\n" + + "WHERE 1 <> 2\n" + + "\tAND 1 != 2\n" + + "\tAND 1 ^= 2", text); + } + + 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()); + + assertEquals(0, visitor.getTables().size()); + assertEquals(1, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest93_model.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest93_model.java new file mode 100644 index 0000000000..f6d845f1c7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest93_model.java @@ -0,0 +1,90 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest93_model extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select country,prod,year,s\n" + + "from sales_view_ref\n" + + "model\n" + + "partition by (country)\n" + + "dimension by (prod, year)\n" + + "measures (sale s)\n" + + "ignore nav\n" + + "-- cell_reference_options\n" + + "unique dimension\n" + + "-- here starts model_rules_clause\n" + + "rules upsert sequential order\n" + + "(\n" + + "s[prod='mouse pad', year=2001] = s['mouse pad', 1999] + s['mouse pad', 2000],\n" + + "s['standard mouse', 2002] = s['standard mouse', 2001]\n" + + ")\n" + + "order by country, prod, year"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT country, prod, year, s\n" + + "FROM sales_view_ref\n" + + "MODEL\n" + + "\tPARTITION BY (country)\n" + + "\tDIMENSION BY (prod, year)\n" + + "\tMEASURES (sale s)\n" + + "\tIGNORE NAV\n" + + "\tUNIQUE DIMENSION\n" + + "\tRULES UPSERT SEQUENTIAL ORDER (s[prod = 'mouse pad', year = 2001] = s['mouse pad', 1999] + s['mouse pad', 2000], s['standard mouse', 2002] = s['standard mouse', 2001])\n" + + "ORDER BY country, prod, year", text); + } + + 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()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(4, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(3, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest94.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest94.java new file mode 100644 index 0000000000..3df6894d6c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest94.java @@ -0,0 +1,83 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest94 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from (\n" + + " select times_purchased as \"puchase frequency\", state_code\n" + + " from customers t\n" + + " )\n" + + " pivot xml\n" + + " (\n" + + " count(state_code)\n" + + " for state_code in (select state_code from preferred_states)\n" + + " )\n" + + " order by 1"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT times_purchased AS \"puchase frequency\", state_code\n" + + "\tFROM customers t\n" + + ")\n" + + "PIVOT XML (COUNT(state_code) FOR state_code IN (\n" + + "\tSELECT state_code\n" + + "\tFROM preferred_states))\n" + + "ORDER BY 1", text); + } + + 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()); + + assertEquals(2, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest95_pivot.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest95_pivot.java new file mode 100644 index 0000000000..db9cee42ab --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest95_pivot.java @@ -0,0 +1,88 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest95_pivot extends OracleTest { + + public void test_0() throws Exception { + String sql = // + " select *\n" + + " from (s join d using(c))\n" + + " pivot\n" + + " (\n" + + " max(c_c_p) as max_ccp\n" + + " , max(d_c_p) max_dcp\n" + + " , max(d_x_p) dxp\n" + + " , count(1) cnt\n" + + " for (i, p) in\n" + + " (\n" + + " (1,1) as one_one,\n" + + " (1,2) as one_two,\n" + + " (1,3) as one_three,\n" + + " (2,1) as two_one,\n" + + " (2,2) as two_two,\n" + + " (2,3) as two_three\n" + + " )\n" + + " )\n" + + " where d_t = 'p'\n"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM s\n" + + "\tJOIN d USING (c)\n" + + "PIVOT (MAX(c_c_p) AS max_ccp, MAX(d_c_p) AS max_dcp, MAX(d_x_p) AS dxp, COUNT(1) AS cnt FOR (i, p) IN ((1, 1) AS one_one, (1, 2) AS one_two, (1, 3) AS one_three, (2, 1) AS two_one, (2, 2) AS two_two, (2, 3) AS two_three))\n" + + "WHERE d_t = 'p'", text); + } + + 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()); + + assertEquals(2, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(3, visitor.getConditions().size()); + assertEquals(1, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest96_pivot.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest96_pivot.java new file mode 100644 index 0000000000..6d6feb0db6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest96_pivot.java @@ -0,0 +1,88 @@ +/* + * Copyright 1999-2017 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest96_pivot extends OracleTest { + + public void test_0() throws Exception { + String sql = // + " select *\n" + + " from s join d using(c)\n" + + " pivot\n" + + " (\n" + + " max(c_c_p) as max_ccp\n" + + " , max(d_c_p) max_dcp\n" + + " , max(d_x_p) dxp\n" + + " , count(1) cnt\n" + + " for (i, p) in\n" + + " (\n" + + " (1,1) as one_one,\n" + + " (1,2) as one_two,\n" + + " (1,3) as one_three,\n" + + " (2,1) as two_one,\n" + + " (2,2) as two_two,\n" + + " (2,3) as two_three\n" + + " )\n" + + " )\n" + + " where d_t = 'p'\n"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM s\n" + + "\tJOIN d USING (c)\n" + + "PIVOT (MAX(c_c_p) AS max_ccp, MAX(d_c_p) AS max_dcp, MAX(d_x_p) AS dxp, COUNT(1) AS cnt FOR (i, p) IN ((1, 1) AS one_one, (1, 2) AS one_two, (1, 3) AS one_three, (2, 1) AS two_one, (2, 2) AS two_two, (2, 3) AS two_three))\n" + + "WHERE d_t = 'p'", text); + } + + 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()); + + assertEquals(2, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(3, visitor.getConditions().size()); + assertEquals(1, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/aggregate01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/aggregate01.sql new file mode 100644 index 0000000000..a1970c45d0 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/aggregate01.sql @@ -0,0 +1,72 @@ +with + codes2codelocales as + ( + select t6.cdl_name as cod_name, t7.cdl_name as cod_cod_name, t14.cod_oid + from servicedesk.itsm_codes t14 + left outer join servicedesk.itsm_codes_locale t6 on (t6.cdl_cod_oid=t14.cod_oid) + left outer join servicedesk.itsm_codes_locale t7 on (t7.cdl_cod_oid=t14.cod_cod_oid) + ) + , incident as + ( + select t1.*, + c2cl1.cod_name as "closure code", c2cl1.cod_cod_name as "closure code parent", + c2cl2.cod_name as "reason caused code", c2cl2.cod_cod_name as "reason caused code parent", + t11.cdl_name "severity", t13.cdl_name "business impact", t16.cdl_name "priority", + t2.rct_name "status", t12.rct_name "category", t99.rct_name "folder" + from servicedesk.itsm_incidents t1 + join servicedesk.itsm_codes_locale t11 on (t1.inc_sev_oid=t11.cdl_cod_oid) + join servicedesk.itsm_codes_locale t13 on (t1.inc_imp_oid=t13.cdl_cod_oid) + join servicedesk.itsm_codes_locale t16 on (t1.inc_pri_oid=t16.cdl_cod_oid) + join servicedeskrepo.rep_codes_text t2 on (t1.inc_sta_oid=t2.rct_rcd_oid) + join servicedeskrepo.rep_codes_text t12 on (t1.inc_cat_oid=t12.rct_rcd_oid) + join servicedeskrepo.rep_codes_text t99 on (t1.inc_poo_oid=t99.rct_rcd_oid) + left outer join codes2codelocales c2cl1 on (t1.inc_clo_oid=c2cl1.cod_oid) + left outer join codes2codelocales c2cl2 on (t1.inc_cla_oid=c2cl2.cod_oid) + where t1."reg_created" between sysdate-1 and sysdate + ) + , workgrouphistory as + ( + select i.inc_id + , max(t101.hin_subject) keep (dense_rank first order by (t101.reg_created)) as "first" + , max(t101.hin_subject) keep (dense_rank last order by (t101.reg_created)) as "last" + from + servicedesk.itsm_historylines_incident t101 + join incident i on (t101.hin_inc_oid = i.inc_oid) +-- from servicedesk.itsm_incidents i (t101.hin_inc_oid = i.inc_oid) + where t101.hin_subject like 'to workgroup from%' +-- and i."reg_created" between sysdate-1 and sysdate + group by i.inc_id + ) +select + incident.inc_id "id" + ,incident."status" + ,incident.inc_description "description" + ,t4.wog_searchcode "workgroup" + ,t5.per_searchcode "person" + ,incident.inc_solution "solution" + ,incident."closure code" + ,incident."closure code parent" + ,incident."reason caused code" + ,incident."reason caused code parent" + ,t10.cit_searchcode "ci" + ,incident."severity" + ,incident."category" + ,incident."business impact" + ,incident."priority" + ,to_char(incident."reg_created", 'dd-mm-yy hh24:mi:ss') "registered" + ,to_char(incident."inc_deadline", 'dd-mm-yy hh24:mi:ss') "deadline" + ,to_char(incident."inc_actualfinish", 'dd-mm-yy hh24:mi:ss') "finish" + ,t3.icf_incshorttext3 "message group" + ,t3.icf_incshorttext4 "application" + ,t3.icf_incshorttext2 "msg id" + ,incident."folder" + ,workgrouphistory."first" "first wg" + ,workgrouphistory."last" "last wg" + ,t102.hin_subject "frirst pri" +from incident +join servicedesk.itsm_inc_custom_fields t3 on (incident.inc_oid=t3.icf_inc_oid) +join servicedesk.itsm_workgroups t4 on (incident.inc_assign_workgroup=t4.wog_oid) +join workgrouphistory on (incident.inc_id = workgrouphistory.inc_id) +left outer join servicedesk.itsm_persons t5 on (incident.inc_assign_person_to=t5.per_oid) +left outer join servicedesk.itsm_configuration_items t10 on (incident.inc_cit_oid=t10.cit_oid) +left outer join servicedesk.itsm_historylines_incident t102 on (incident.inc_oid = t102.hin_inc_oid and t102.hin_subject like 'priority set to%') diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/alter_table.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/alter_table.sql new file mode 100644 index 0000000000..42be9960f5 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/alter_table.sql @@ -0,0 +1,38 @@ +alter table hr.employees + add constraint emp_fk foreign key (department_id) + references hr.departments (department_id) + on delete cascade; + +alter table hr.employees + add foreign key (department_id) + references hr.departments (department_id) + on delete set null; + +alter table hr.employees + add constraint emp_fk foreign key (department_id, employee_id) + references hr.some_table (department_id, employee_id); + +alter table employees + add primary key (employee_id); + +alter table hr.employees + add constraint emp_complex_pk primary key (employee_id, department_id); + +alter table hr.employees + add constraint emp_uq unique (employee_id, email); + +alter table employees + add unique (employee_id); + +ALTER TABLE suppliers +ADD CONSTRAINT check_supplier_name + CHECK (supplier_name IN ('IBM', 'Microsoft', 'NVIDIA')); + +ALTER TABLE suppliers + DROP CONSTRAINT check_supplier_id; + +ALTER TABLE suppliers + ENABLE CONSTRAINT check_supplier_id; + +ALTER TABLE suppliers + DISABLE CONSTRAINT check_supplier_id; diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/analytic_query.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/analytic_query.sql new file mode 100644 index 0000000000..d13a2f5656 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/analytic_query.sql @@ -0,0 +1,82 @@ +select time_id, product + , last_value(quantity ignore nulls) over (partition by product order by time_id) quantity + , last_value(quantity respect nulls) over (partition by product order by time_id) quantity + from ( select times.time_id, product, quantity + from inventory partition by (product) + right outer join times on (times.time_id = inventory.time_id) + where times.time_id between to_date('01/04/01', 'dd/mm/yy') + and to_date('06/04/01', 'dd/mm/yy')) + order by 2,1; + +select times.time_id, product, quantity from inventory + partition by (product) + right outer join times on (times.time_id = inventory.time_id) + where times.time_id between to_date('01/04/01', 'dd/mm/yy') + and to_date('06/04/01', 'dd/mm/yy') + order by 2,1; + +select deptno + , ename + , hiredate + , listagg(ename, ',') within group (order by hiredate) over (partition by deptno) as employees +from emp; + + select metric_id ,bsln_guid ,timegroup ,obs_value as obs_value + , cume_dist () over (partition by metric_id, bsln_guid, timegroup order by obs_value ) as cume_dist + , count(1) over (partition by metric_id, bsln_guid, timegroup ) as n + , row_number () over (partition by metric_id, bsln_guid, timegroup order by obs_value) as rrank + , percentile_disc(:b7 ) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as mid_tail_value + , max(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as max_val + , min(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as min_val + , avg(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as avg_val + , stddev(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as sdev_val + , percentile_cont(0.25) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_25 + , percentile_cont(0.5) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_50 + , percentile_cont(0.75) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_75 + , percentile_cont(0.90) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_90 + , percentile_cont(0.95) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_95 + , percentile_cont(0.99) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_99 + from timegrouped_rawdata d; + +select trim(both ' ' from ' a ') from dual where trim(:a) is not null; + +with +clus_tab as ( +select id, +a.attribute_name aname, +a.conditional_operator op, +nvl(a.attribute_str_value, +round(decode(a.attribute_name, n.col, +a.attribute_num_value * n.scale + n.shift, +a.attribute_num_value),4)) val, +a.attribute_support support, +a.attribute_confidence confidence +from table(dbms_data_mining.get_model_details_km('km_sh_clus_sample')) t, +table(t.rule.antecedent) a, +km_sh_sample_norm n +where a.attribute_name = n.col (+) and a.attribute_confidence > 0.55 +), +clust as ( +select id, +cast(collect(cattr(aname, op, to_char(val), support, confidence)) as cattrs) cl_attrs +from clus_tab +group by id +), +custclus as ( +select t.cust_id, s.cluster_id, s.probability +from (select +cust_id +, cluster_set(km_sh_clus_sample, null, 0.2 using *) pset +from km_sh_sample_apply_prepared +where cust_id = 101362) t, +table(t.pset) s +) +select a.probability prob, a.cluster_id cl_id, +b.attr, b.op, b.val, b.supp, b.conf +from custclus a, +(select t.id, c.* +from clust t, +table(t.cl_attrs) c) b +where a.cluster_id = b.id +order by prob desc, cl_id asc, conf desc, attr asc, val asc; + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar01.sql new file mode 100644 index 0000000000..2192adb9d9 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar01.sql @@ -0,0 +1,14 @@ +insert into p +( +a1, +b2, +c3, +d4, +e5, +f6, +g7, +h8 +) +values +( :b1, :b2, :b3, :b4, :5, :6, :7, :8) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar02.sql new file mode 100644 index 0000000000..bd3132d3d6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar02.sql @@ -0,0 +1,6 @@ +select * +from a +where a=:3 +and b= : 4 +and c= :5and :a = :b + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar03.sql new file mode 100644 index 0000000000..c27dde8059 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar03.sql @@ -0,0 +1,18 @@ +select count(*), max(scn) +from +( + select sp.bo#, sp.pmoptype, sp.scn, sp.flags + from sumpartlog$ sp, sumdep$ sd + where sd.sumobj# = :1 and sd.p_obj# = sp.bo# + group by sp.bo#, sp.pmoptype, sp.scn, sp.flags + minus + select sp.bo#, sp.pmoptype, sp.scn, sp.flags + from sumpartlog$ sp + where sp.bo# not in + ( + select sk.detailobj# from sumkey$ sk where sk.sumobj# = :1 and sk.detailcolfunction in (2,3) + ) + and bitand(sp.flags, 2) != 2 and sp.pmoptype in (2,3,5,7) + group by sp.bo#, sp.pmoptype, sp.scn, sp.flags +) +where scn > : 2 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar04.sql new file mode 100644 index 0000000000..fc0f8256bc --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar04.sql @@ -0,0 +1,7 @@ +select * +from +( + select * + from "rme" "rm" + where "rm".a-interval:"sys_b_07" day(:"sys_b_08") to second(:"sys_b_09") +) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar05.sql new file mode 100644 index 0000000000..92b3e25cc5 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/bindvar05.sql @@ -0,0 +1,14 @@ +select object_name, object_id, + decode(status, 'INVALID', 'TRUE', 'FALSE') invalid, + 'TRUE' runnable, + plsql_debug +from sys.dba_objects o, dba_plsql_object_settings s +where o.owner = :schema +and s.owner = :schema +and s.name = o.object_name +and s.type = 'PACKAGE' +and object_type = 'PACKAGE' +and subobject_name is null +and object_id not in ( select purge_object from recyclebin ) +and upper(object_name) in upper(:name) + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when01.sql new file mode 100644 index 0000000000..357eb37cd1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when01.sql @@ -0,0 +1,9 @@ +select +ROOT,LEV,OBJ,LinK,PaTH,cycle, + case + when (LEV - LEaD(LEV) over (order by orD)) < 0 then 0 + else 1 + end is_LEaF +from T + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when02.sql new file mode 100644 index 0000000000..a307d2cc4e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when02.sql @@ -0,0 +1,32 @@ +select + STaLENESS, OSIZE, OBJ#, TYPE#, + case + when STaLENESS > .5 then 128 + when STaLENESS > .1 then 256 + else 0 + end + aFLaGS aFLaGS, + STaTUS, + SID, + SERIaL#, + PaRT#, + BO# + , + case + when is_FULL_EVENTS_HisTorY = 1 then SRC.Bor_LasT_STaTUS_TIME + else + case GREaTEST (NVL (WP.Bor_LasT_STaT_TIME, date '1900-01-01'), NVL (SRC.Bor_LasT_STaTUS_TIME, date '1900-01-01')) + when date '1900-01-01' then null + when WP.Bor_LasT_STaT_TIME then WP.Bor_LasT_STaT_TIME + when SRC.Bor_LasT_STaTUS_TIME then SRC.Bor_LasT_STaTUS_TIME + else null + end + end + , + case GREaTEST (NVL (WP.Bor_LasT_STaT_TIME, date '1900-01-01'), NVL (SRC.Bor_LasT_STaTUS_TIME, date '1900-01-01')) + when date '1900-01-01' then null + when WP.Bor_LasT_STaT_TIME then WP.Bor_LasT_STaT_TIME + when SRC.Bor_LasT_STaTUS_TIME then SRC.Bor_LasT_STaTUS_TIME + else null + end +from X + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when03.sql new file mode 100644 index 0000000000..6bb753e178 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when03.sql @@ -0,0 +1,9 @@ +select +case (STaTUS) +when 'N' then 1 +when 'B' then 2 +when 'a' then 3 +end as STaTE +from VaLUE +where KID=:B2 and RID=:B1 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when04.sql new file mode 100644 index 0000000000..92c4761bb6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when04.sql @@ -0,0 +1,3 @@ +select +case when row_number() over (partition by bo# order by staleness, osize, obj#) = 1 then 32 else 0 end + 64 aflags +from f diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when05.sql new file mode 100644 index 0000000000..60cca13e86 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when05.sql @@ -0,0 +1,12 @@ +select staleness +, osize, obj# +, type# +, case when row_number() over (partition by bo# order by staleness, osize, obj#) = 1 then 64 else 0 end + + + case when row_number() over (partition by (select tcp0.bo# from tabcompart$ tcp0 where tcp0.obj#=st0.bo#) order by staleness, osize, obj#) = 1 then 32 + else 0 end aflags +, 0 status +, :b3 sid +, :b2 serial# +, part#, bo# +from st0 \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when06.sql new file mode 100644 index 0000000000..a8e2029336 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when06.sql @@ -0,0 +1,8 @@ +SELECT +case + when STaLENESS > .5 then 128 + when STaLENESS > .1 then 256 + else 0 + end aFLaGS + FROM employees + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when07.sql new file mode 100644 index 0000000000..504e7943d8 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/case_when07.sql @@ -0,0 +1,6 @@ +SELECT h1.CRTYPE , +CASE 'month' + WHEN 'week' THEN TO_CHAR(h1.DateFrom, 'YYYYIW') + ELSE to_char(h1.DateFrom,'YYYYMM') +END +FROM CQ_CHANGEREQUESTS h1 \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset01.sql new file mode 100644 index 0000000000..bc68388000 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset01.sql @@ -0,0 +1,7 @@ +select t1.department_id, t2.* + from hr_info t1, table(cast(multiset( + select t3.last_name, t3.department_id, t3.salary + from people t3 + where t3.department_id = t1.department_id) + as people_tab_typ)) t2 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset02.sql new file mode 100644 index 0000000000..cb9631cda2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset02.sql @@ -0,0 +1,6 @@ + select title + from + table(select courses from department where name = 'history') + where name like '%etruscan%' + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset03.sql new file mode 100644 index 0000000000..412af233ce --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset03.sql @@ -0,0 +1,7 @@ + select + 1 + , cursor(select 1 from dual) c1 + , cursor(select 2, 3 from dual) as c2 + from + table(select 1 from dual) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset04.sql new file mode 100644 index 0000000000..6fa8a9d094 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset04.sql @@ -0,0 +1,3 @@ +select e1.last_name from employees e1 + where f( cursor(select e2.hire_date from employees e2 where e1.employee_id = e2.manager_id), e1.hire_date) = 1 +order by last_name \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset05.sql new file mode 100644 index 0000000000..2985d8230e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset05.sql @@ -0,0 +1,6 @@ +select * +from + table + ( + function_name() + ) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset06.sql new file mode 100644 index 0000000000..d2cee88374 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset06.sql @@ -0,0 +1,4 @@ +select + cast(collect(cattr(aname, op, to_char(val), support, confidence)) as cattrs) cl_attrs +from a + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset07.sql new file mode 100644 index 0000000000..49fd2fb81b --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset07.sql @@ -0,0 +1,39 @@ +select + "a3"."r_id" "r_id" +from + "pe" "a3", + "me" "a2" +where + "a3"."m_id"="a2"."m_id" + and "a2"."mi_t" = + any + ((( + select "a4"."sys$"."id" + from the + ( + select "qa"."u_pkg"."getchartable" + ( + "qa"."u_pkg"."glist" + ( + cursor + ( + select "qa"."u_pkg"."glist" + ( + cursor + ( + select "a6"."mi_t" "mi_t" + from "me" "a6" + connect by "a6"."mi_uid"=prior "a6"."mi_id" + start with "a6"."mi_t"=:b1 + ) + ) + "lst" + from "sys"."dual" "a5" + ) + ) + ) + from dual + ) + "a4" + ))) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset08.sql new file mode 100644 index 0000000000..efa17074bc --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/cast_multiset08.sql @@ -0,0 +1 @@ +select * from table (cast (f_int_date_varchar2() as table_int_date_varchar2)) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/columns01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/columns01.sql new file mode 100644 index 0000000000..0600b260e0 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/columns01.sql @@ -0,0 +1,7 @@ +select a, b, +a d, +ddd as ddd, +ddd as "dfdf", +x as +from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/comment_on.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/comment_on.sql new file mode 100644 index 0000000000..b6252b4fed --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/comment_on.sql @@ -0,0 +1,19 @@ +-- column + +comment on column employees.employee_id is 'Primary key of employees table.'; + +comment on column hr.employees.employee_id is 'Multiline +comment on column.'; + +comment on column "hr"."employees"."employee_id" is 'Primary key of employees table.'; + +-- table + +comment on table employees is 'employees table. Contains 107 rows.'; + +comment on table hr.employees is 'employees table. Contains 107 rows.'; + +comment on table "hr"."employees" is 'employees table. Contains 107 rows.'; + +comment on table "my schema"."my table" is 'Some demo table with space in its name +and a multiline comment.'; \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/comments.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/comments.sql new file mode 100644 index 0000000000..fba76460cd --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/comments.sql @@ -0,0 +1,4 @@ +-- com1 +select * /* +com2 */ +from dual -- com3 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition01.sql new file mode 100644 index 0000000000..df5362c753 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition01.sql @@ -0,0 +1,7 @@ +select department_id, last_name, salary + from employees x + where salary > (select avg(salary) + from employees + where x.department_id = department_id) + order by department_id + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition02.sql new file mode 100644 index 0000000000..07188ef013 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition02.sql @@ -0,0 +1,8 @@ +select * + from employees x + where salary > (select avg(salary) from x) + and 1 = 1 + and hiredate = sysdate + and to_yminterval('01-00') < sysdate + and to_yminterval('01-00') + x < sysdate + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition03.sql new file mode 100644 index 0000000000..5aa4cba819 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition03.sql @@ -0,0 +1,10 @@ +select * + from employees x + where salary > (select avg(salary) from x) + and 1 = 1 + and hiredate = sysdate + and to_yminterval('01-00') < sysdate + and to_yminterval('01-00') + x < sysdate + or a=b + and d=e + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition04.sql new file mode 100644 index 0000000000..e5463cb781 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition04.sql @@ -0,0 +1,36 @@ +select * +from t +where +( + ( + ( + ( + ( + ( + ( + ( + ( + ( + ( + ( + ( + ( + ( + ( type = '2' ) or ( type = '3' ) + ) and ( t.cde < 20 ) + ) and ( t.se = 'xxx' ) + ) and ( t.id = '000000000002' ) + ) and ( ( t.attr_1 is null ) or ( t.attr_1 = '*' ) ) + ) and ( ( t.attr_2 is null ) or ( t.attr_2 = '*' ) ) + ) and ( ( t.attr_3 is null ) or ( t.attr_3 = '*' ) ) + ) and ( ( t.attr_4 is null ) or ( t.attr_4 = '*' ) ) + ) and ( ( t.attr_5 is null ) or ( t.attr_5 = '*' ) ) + ) and ( ( t.itype is null ) or ( t.itype = '*' ) ) + ) and ( ( t.inbr is null ) or ( t.inbr = '*' ) ) + ) and ( ( t.stat = '01' ) or ( t.stat = '*' ) ) + ) and ( ( t.orgn is null ) or ( t.orgn = '*' ) ) + ) and ( t.mbr = '0000000000001' ) + ) and ( t.nbr is null ) +) + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition05.sql new file mode 100644 index 0000000000..e9bb8642d2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition05.sql @@ -0,0 +1,20 @@ +select * +from t +where + ( t.type = '2' ) or ( t.type = '3' ) + and t.cde < 20 + and t.se = 'xxx' + and t.id = '000000000002' + and ( ( t.sku_attr_1 is null ) or ( t.sku_attr_1 = '*' ) ) + and ( ( t.sku_attr_2 is null ) or ( t.sku_attr_2 = '*' ) ) + and ( ( t.sku_attr_3 is null ) or ( t.sku_attr_3 = '*' ) ) + and ( ( t.sku_attr_4 is null ) or ( t.sku_attr_4 = '*' ) ) + and ( ( t.sku_attr_5 is null ) or ( t.sku_attr_5 = '*' ) ) + and ( ( t.itype is null ) or ( t.itype = '*' ) ) + and ( ( t.bnbr is null ) or ( t.bnbr = '*' ) ) + and ( ( t.stat = '01' ) or ( t.stat = '*' ) ) + and ( ( t.orgn is null ) or ( t.orgn = '*' ) ) + and ( t.mbr = '0000000000001' ) + and ( t.nbr is null ) + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition06.sql new file mode 100644 index 0000000000..fccc0f9621 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition06.sql @@ -0,0 +1,14 @@ + select * +from t1, t2 +where (trunc(t1.timestamp) between to_date('110226','yymmdd') and to_date('110326','yymmdd')) +and t1.code(+) = 'cn' +and t1.id(+)=t2.id +and t1.cid=t2.cid +and t1.mid = 1245714070376993504 +and t1.tmst >= to_date('110226','yymmdd') +-- note: this is possible too "column_spec outer_join_sign conditional_operator +and shipper.alt_party_code(+) is null +and t2.code(+) = 'sh' +and t1.sid(+)=t2.sid +and ( ( t1.scode like 'mmm' and t2.scode like 'xax' ) ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition07.sql new file mode 100644 index 0000000000..769a7724c4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition07.sql @@ -0,0 +1,5 @@ +select * +from append +where +-- note space between '>' and '=' +(length(w.numer) > = 8) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition08.sql new file mode 100644 index 0000000000..80a0cca368 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition08.sql @@ -0,0 +1,5 @@ +select * +from "p" +where +-- note there are no parens around 231092 +( ( "p"."id" in 231092 ) ) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition09.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition09.sql new file mode 100644 index 0000000000..4d1f738c45 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition09.sql @@ -0,0 +1,16 @@ +select + sum(nvl(pl.qty,0)) + from + oline ol, + pline pl, + blocation bl + where + ol.id = pl.id + and pl.no = pl.no + and bl.id = pl.id + and + ( + (select count(*) from la.sa where pl.id like sa.bid) > 0 + or + (select count(*) from la.sa where bl.id like sa.id) > 0 + ) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition10.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition10.sql new file mode 100644 index 0000000000..4b73949283 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition10.sql @@ -0,0 +1,15 @@ +select department_id, last_name, salary + from employees x + where + 1 = 1 + and + ( + ( + HI + ) + > + ( + .1 * T.ROWCNT + ) + ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition11.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition11.sql new file mode 100644 index 0000000000..d93cfbd568 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition11.sql @@ -0,0 +1,7 @@ +select distinct X +from X,Y,Z +where + X.id = Z.id (+) +and nvl(X.cid, '^') = nvl(Y.clientid (+), '^') +and 0 = Lib.SKU(X.sid, nvl(Z.cid, '^')) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition12.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition12.sql new file mode 100644 index 0000000000..71a5428e20 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition12.sql @@ -0,0 +1,11 @@ +select * from v.e +where + cid <> rid + and rid not in + ( + (select distinct rid from v.s ) + union + (select distinct rid from v.p ) + ) + and "timestamp" <= 1298505600000 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition14.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition14.sql new file mode 100644 index 0000000000..bff0216df2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition14.sql @@ -0,0 +1,2 @@ +select * from dual where trim(sxhnode_key) is not null + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition15.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition15.sql new file mode 100644 index 0000000000..a7c1513782 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition15.sql @@ -0,0 +1,13 @@ +select + "a3"."r_id" "r_id" +from + "pe" "a3", + "me" "a2" +where + "a3"."m_id"="a2"."m_id" + and "a2"."mi_t" = + any + ((( + select "a4"."sys$"."id" + from t "a4" + ))) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition16.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition16.sql new file mode 100644 index 0000000000..dd711ee7ae --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/condition16.sql @@ -0,0 +1,3 @@ +select * from persons p + where value(p) is of type(only employee_t) + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by01.sql new file mode 100644 index 0000000000..2dd3cd199e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by01.sql @@ -0,0 +1,20 @@ +with o as +( + select 'a' obj, 'b' link from dual union all + select 'a', 'c' from dual union all + select 'c', 'd' from dual union all + select 'd', 'c' from dual union all + select 'd', 'e' from dual union all + select 'e', 'e' from dual +) +select + connect_by_root obj root, + level, + obj,link, + sys_connect_by_path(obj||'->'||link,','), + connect_by_iscycle, + connect_by_isleaf +from o +connect by nocycle obj=prior link +start with obj='a' + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by02.sql new file mode 100644 index 0000000000..f960c524ae --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by02.sql @@ -0,0 +1,6 @@ +select lpad(' ',2*(level-1)) || last_name org_chart, +employee_id, manager_id, job_id + from employees + start with job_id = 'ad_pres' + connect by prior employee_id = manager_id and level <= 2 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by03.sql new file mode 100644 index 0000000000..2f8d7d3201 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by03.sql @@ -0,0 +1,7 @@ +select lpad(' ',2*(level-1)) || last_name org_chart, + employee_id, manager_id, job_id + from employees + where job_id != 'fi_mgr' + start with job_id = 'ad_vp' + connect by prior employee_id = manager_id + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by04.sql new file mode 100644 index 0000000000..e4b8299050 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by04.sql @@ -0,0 +1,7 @@ +select lpad(' ',2*(level-1)) || last_name org_chart, + employee_id, manager_id, job_id + from employees + start with job_id = 'ad_vp' + connect by prior employee_id = manager_id + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by05.sql new file mode 100644 index 0000000000..72e565aa76 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/connect_by05.sql @@ -0,0 +1,9 @@ +with liste as ( + select substr(:liste, instr(','||:liste||',', ',', 1, rn), + instr(','||:liste||',', ',', 1, rn+1) - + instr(','||:liste||',', ',', 1, rn)-1) valeur +from ( + select rownum rn from dual + connect by level<=length(:liste) - length(replace(:liste,',',''))+1)) +select trim(valeur) +from liste diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym01.sql new file mode 100644 index 0000000000..d0a5938259 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym01.sql @@ -0,0 +1 @@ +create public synonym emp for hr.employees diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym02.sql new file mode 100644 index 0000000000..03a348686f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym02.sql @@ -0,0 +1 @@ +create synonym hr.chicago_employees for hr.employees@chicago_db \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym03.sql new file mode 100644 index 0000000000..648f617d6a --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/create_synonym03.sql @@ -0,0 +1 @@ +create or replace public synonym depts for departments \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime01.sql new file mode 100644 index 0000000000..2d9e99d8b7 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime01.sql @@ -0,0 +1 @@ +select from_tz(cast(to_date('1999-12-01 11:00:00','yyyy-mm-dd hh:mi:ss') as timestamp), 'america/new_york') at time zone 'america/los_angeles' "west coast time" from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime02.sql new file mode 100644 index 0000000000..d001db41c1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime02.sql @@ -0,0 +1,30 @@ +select + dbin.db_name, + dbin.instance_name, + dbin.version, + case when s1.startup_time = s2.startup_time then 0 else 1 end as bounce, + cast(s1.end_interval_time as date) as begin_time, + cast(s2.end_interval_time as date) as end_time, + round((cast( (case when s2.end_interval_time > s1.end_interval_time then s2.end_interval_time else s1.end_interval_time end) as date) + - cast(s1.end_interval_time as date)) * 86400) as int_secs, + case when (s1.status <> 0 or s2.status <> 0) then 1 else 0 end as err_detect, + round( greatest( (extract(day from s2.flush_elapsed) * 86400) + + (extract(hour from s2.flush_elapsed) * 3600) + + (extract(minute from s2.flush_elapsed) * 60) + + extract(second from s2.flush_elapsed), + (extract(day from s1.flush_elapsed) * 86400) + + (extract(hour from s1.flush_elapsed) * 3600) + + (extract(minute from s1.flush_elapsed) * 60) + + extract(second from s1.flush_elapsed),0 ) + ) as max_flush_secs +from wrm$_snapshot s1 , wrm$_database_instance dbin , wrm$_snapshot s2 +where s1.dbid = :dbid +and s2.dbid = :dbid +and s1.instance_number = :inst_num +and s2.instance_number = :inst_num +and s1.snap_id = :bid +and s2.snap_id = :eid +and dbin.dbid = s1.dbid +and dbin.instance_number = s1.instance_number +and dbin.startup_time = s1.startup_time + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime03.sql new file mode 100644 index 0000000000..1c9ccf5efe --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime03.sql @@ -0,0 +1,3 @@ +select +timestamp '2009-10-29 01:30:00' at time zone 'us/pacific'from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime04.sql new file mode 100644 index 0000000000..aae6733ab4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime04.sql @@ -0,0 +1,4 @@ +select +timestamp '2009-10-29 01:30:00' +from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime05.sql new file mode 100644 index 0000000000..4529544291 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/datetime05.sql @@ -0,0 +1 @@ +select date '1900-01-01' from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/dblink01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/dblink01.sql new file mode 100644 index 0000000000..77d3634a78 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/dblink01.sql @@ -0,0 +1,5 @@ +select last_name, department_name + from employees@remote, departments + where employees.department_id = departments.department_id + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/explain01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/explain01.sql new file mode 100644 index 0000000000..49537cb820 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/explain01.sql @@ -0,0 +1,8 @@ +explain plan + set statement_id = 'raise in tokyo' + into plan_table + for update employees + set salary = salary * 1.10 + where department_id = + (select department_id from departments + where location_id = 1700) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/flashback01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/flashback01.sql new file mode 100644 index 0000000000..52f945993c --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/flashback01.sql @@ -0,0 +1 @@ +select value(p$) from "XDB"."XDB$SCHEMA" as of snapshot(:2) p$ where SYS_NC_OID$ = :1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update01.sql new file mode 100644 index 0000000000..ad5980b24f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update01.sql @@ -0,0 +1,4 @@ +select employee_id from (select * from employees) + for update of employee_id + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update02.sql new file mode 100644 index 0000000000..6ea9a8d3e7 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update02.sql @@ -0,0 +1,4 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update03.sql new file mode 100644 index 0000000000..27a7ae027a --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update03.sql @@ -0,0 +1,4 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update of employee_id + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update04.sql new file mode 100644 index 0000000000..d41b216154 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update04.sql @@ -0,0 +1,3 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update of employee_id nowait + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update05.sql new file mode 100644 index 0000000000..0b83ea8e36 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update05.sql @@ -0,0 +1,3 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update of employee_id wait 10 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update06.sql new file mode 100644 index 0000000000..06a8e6fde5 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update06.sql @@ -0,0 +1,3 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update of employee_id skip locked + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update07.sql new file mode 100644 index 0000000000..7736043c41 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update07.sql @@ -0,0 +1,3 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update of a, b.c, d skip locked + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update08.sql new file mode 100644 index 0000000000..b1b2473789 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/for_update08.sql @@ -0,0 +1,5 @@ +select su.ttype ,su.cid ,su.s_id ,sessiontimezone +from sku su +where (nvl(su.up,'n')='n' and su.ttype=:b0) +for update of su.up +order by su.d diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function01.sql new file mode 100644 index 0000000000..4c8062645c --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function01.sql @@ -0,0 +1,2 @@ +select decode(decode(decode( (select count(1) from dual), a, 1, 0), 0, 1), 1, 0) from dual +-- select decode(decode(decode(decode(x, 0, 1) , 0, 1), 1, 0 ), 0, 1) from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function02.sql new file mode 100644 index 0000000000..492cb9d056 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function02.sql @@ -0,0 +1 @@ +select set(x) from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function03.sql new file mode 100644 index 0000000000..e8f8f02d3b --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function03.sql @@ -0,0 +1,4 @@ +select trim(both from con.ke) +from dual + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function04.sql new file mode 100644 index 0000000000..c65722f8aa --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function04.sql @@ -0,0 +1 @@ +select lnnvl( 2 > 1) from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function05.sql new file mode 100644 index 0000000000..105727cf4d --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/function05.sql @@ -0,0 +1,3 @@ +select count(*) + from employees + where lnnvl(commission_pct >= .2) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby01.sql new file mode 100644 index 0000000000..fb6f3619e7 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby01.sql @@ -0,0 +1,9 @@ +select :b3 as l_snap_id , :b2 as p_dbid , :b1 as p_instance_number , nvl(pid, -9) pid , nvl(serial#, -9) serial# , decode(pid, null, null, max(spid)) spid , + decode(pid, null, null, max(program)) program , decode(pid, null, null, max(background)) background , sum(pga_used_mem) pga_used_mem , + sum(pga_alloc_mem) pga_alloc_mem , sum(pga_freeable_mem) pga_freeable_mem , max(pga_alloc_mem) max_pga_alloc_mem , max(pga_max_mem) max_pga_max_mem , + decode(pid, null, avg(pga_alloc_mem), null) avg_pga_alloc_mem , decode(pid, null, stddev(pga_alloc_mem), null) stddev_pga_alloc_mem , + decode(pid, null, count(pid), null) num_processes + from v$process + where program != 'pseudo' + group by grouping sets ( (pid, serial#), () ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby02.sql new file mode 100644 index 0000000000..bb36a5680e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby02.sql @@ -0,0 +1,11 @@ +select + decode(pid, null, null, max(program)) program , decode(pid, null, null, max(background)) background , sum(pga_used_mem) pga_used_mem , + sum(pga_alloc_mem) pga_alloc_mem , sum(pga_freeable_mem) pga_freeable_mem , max(pga_alloc_mem) max_pga_alloc_mem , max(pga_max_mem) max_pga_max_mem , + decode(pid, null, avg(pga_alloc_mem), null) avg_pga_alloc_mem , decode(pid, null, stddev(pga_alloc_mem), null) stddev_pga_alloc_mem , + decode(pid, null, count(pid), null) num_processes +from v$process +where program != 'pseudo' +group by grouping sets ( (), ((pid+1), serial#) ) + + + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby03.sql new file mode 100644 index 0000000000..64b1783f43 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby03.sql @@ -0,0 +1,4 @@ +select * from x +group by grouping sets +( a, 1 ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby04.sql new file mode 100644 index 0000000000..1d37e20d14 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby04.sql @@ -0,0 +1,3 @@ +select * from x +group by grouping sets +( (a),1 ) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby05.sql new file mode 100644 index 0000000000..6a9f76bf5e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby05.sql @@ -0,0 +1,4 @@ +select * from x +group by grouping sets +( ((a),b), ((a),b) ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby06.sql new file mode 100644 index 0000000000..04330a875c --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby06.sql @@ -0,0 +1,15 @@ +select +prod_category, prod_subcategory, country_id, cust_city, count(*) + from products, sales, customers + where sales.prod_id = products.prod_id + and sales.cust_id=customers.cust_id + and sales.time_id = '01-oct-00' + and customers.cust_year_of_birth between 1960 and 1970 +group by grouping sets + ( + (prod_category, prod_subcategory, country_id, cust_city), + (prod_category, prod_subcategory, country_id), + (prod_category, prod_subcategory), + country_id + ) +order by prod_category, prod_subcategory, country_id, cust_city diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby07.sql new file mode 100644 index 0000000000..0c43829ad3 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/groupby07.sql @@ -0,0 +1,8 @@ +select decode((tt || tc), '56', count(distinct cn), '57', sum(nu)) as q +from t +where tt='500' + and tc in ('6','7') + and to_char(c,'mm') = '03' + having sum(nu) > 0 +group by tn, ui, (tt || tc) +order by 1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/index.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/index.sql new file mode 100644 index 0000000000..ced31bd9cd --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/index.sql @@ -0,0 +1,6 @@ +create index IDX on OBJ (CODE, DOCUMENT); + +ALTER INDEX supplier_idx + RENAME TO supplier_index_name; + +DROP INDEX index_name; \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval01.sql new file mode 100644 index 0000000000..e9ac9ec361 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval01.sql @@ -0,0 +1,2 @@ +select (systimestamp - order_date) day(9) to second from orders +where order_id = 2458 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval02.sql new file mode 100644 index 0000000000..1b82cc4fcc --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval02.sql @@ -0,0 +1 @@ +select interval '42' day from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval03.sql new file mode 100644 index 0000000000..ce2f815688 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval03.sql @@ -0,0 +1,21 @@ +select + interval '4 5:12:10.222' day to second(3) +,interval '4 5:12' day to minute +,interval '400 5' day(3) to hour +,interval '400' day(3) +,interval '11:12:10.2222222' hour to second(7) +,interval '11:20' hour to minute +,interval '10' hour +,interval '10:22' minute to second +,interval '10' minute +,interval '4' day +,interval '25' hour +,interval '40' minute +,interval '120' hour(3) +,interval '30.12345' second(2,4) +,interval :a day + +,interval '1' year +,interval '1' month + +from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval04.sql new file mode 100644 index 0000000000..e8b1e35cf6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/interval04.sql @@ -0,0 +1 @@ +select interval'20' day - interval'240' hour from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join01.sql new file mode 100644 index 0000000000..efee6caec8 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join01.sql @@ -0,0 +1,5 @@ +select d.department_id as d_dept_id, e.department_id as e_dept_id, e.last_name + from departments d full outer join employees e + on d.department_id = e.department_id + order by d.department_id, e.last_name + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join02.sql new file mode 100644 index 0000000000..33df17c7fa --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join02.sql @@ -0,0 +1,6 @@ +select department_id as d_e_dept_id, e.last_name + from departments d full outer join employees e + using (department_id) + order by department_id, e.last_name + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join03.sql new file mode 100644 index 0000000000..3d779a4916 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join03.sql @@ -0,0 +1,6 @@ +select d.department_id, e.last_name + from m.departments d right outer join n.employees e + on d.department_id = e.department_id + order by d.department_id, e.last_name + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join04.sql new file mode 100644 index 0000000000..e7f07cb0a6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join04.sql @@ -0,0 +1,6 @@ +select d.department_id, e.last_name + from departments d, employees e + where d.department_id = e.department_id(+) + order by d.department_id, e.last_name + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join05.sql new file mode 100644 index 0000000000..24bd795320 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join05.sql @@ -0,0 +1,8 @@ +select times.time_id, product, quantity from inventory + partition by (product) + right outer join times on (times.time_id = inventory.time_id) + where times.time_id between to_date('01/04/01', 'dd/mm/yy') + and to_date('06/04/01', 'dd/mm/yy') + order by 2,1 + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join06.sql new file mode 100644 index 0000000000..8a17093a09 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join06.sql @@ -0,0 +1,5 @@ +select * from dual d1 +join dual d2 on (d1.dummy = d2.dummy) +join dual d3 on(d1.dummy = d3.dummy) +join dual on(d1.dummy = dual.dummy) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join07.sql new file mode 100644 index 0000000000..5fcb6eef08 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join07.sql @@ -0,0 +1,5 @@ +select * from t1 +join t2 tt2 using(c) +join t3 tt3 using(d) +join t3 using(d) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join08.sql new file mode 100644 index 0000000000..cd1dc61788 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join08.sql @@ -0,0 +1,8 @@ +select * from dual t1 +join (select * from dual) tt2 using(dummy) +join (select * from dual) using(dummy) +join (select * from dual) d on(d.dummy=tt3.dummy) +inner join (select * from dual) tt2 using(dummy) +inner join (select * from dual) using(dummy) +inner join (select * from dual) d on(d.dummy=t1.dummy) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join09.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join09.sql new file mode 100644 index 0000000000..07eb7796c2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join09.sql @@ -0,0 +1,8 @@ +select * from dual t1 +left outer join (select * from dual) tt2 using(dummy) +left outer join (select * from dual) using(dummy) +left outer join (select * from dual) d on(d.dummy=tt3.dummy) +inner join (select * from dual) tt2 using(dummy) +inner join (select * from dual) using(dummy) +inner join (select * from dual) d on(d.dummy=t1.dummy) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join10.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join10.sql new file mode 100644 index 0000000000..d0c849794e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join10.sql @@ -0,0 +1,5 @@ +select * from dual t1, + ( + dual left outer join (select * from dual) tt2 using(dummy) + ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join11.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join11.sql new file mode 100644 index 0000000000..ca1db60508 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join11.sql @@ -0,0 +1 @@ +select * from t1, ( t2 left outer join t3 using(dummy) ) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join12.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join12.sql new file mode 100644 index 0000000000..88756517c2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join12.sql @@ -0,0 +1,2 @@ +select * from dual,( dual left outer join tt2 using(dummy) ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join13.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join13.sql new file mode 100644 index 0000000000..67fc99df77 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join13.sql @@ -0,0 +1,5 @@ +select * from t1, + (((( + t2 left outer join t3 using(dummy) + )))) + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join14.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join14.sql new file mode 100644 index 0000000000..89a995f77c --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join14.sql @@ -0,0 +1,10 @@ +select * from dual t1, +( + ( + ( + dual t2 join dual t3 using(dummy) ) + left outer join dual t4 using(dummy) ) + left outer join dual t5 using(dummy) ) + + + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join15.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join15.sql new file mode 100644 index 0000000000..7a7f708578 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join15.sql @@ -0,0 +1,4 @@ +select * from dual t1, ( dual t2 join dual t3 using(dummy)) left outer join dual t4 using (dummy) + + + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join16.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join16.sql new file mode 100644 index 0000000000..e1ef222800 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join16.sql @@ -0,0 +1,5 @@ +select * from dual t1, + dual t2 join dual t3 using(dummy) + left outer join dual t4 using(dummy) + left outer join dual t5 using(dummy) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join17.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join17.sql new file mode 100644 index 0000000000..24cfc6f215 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join17.sql @@ -0,0 +1,7 @@ +select * +from hdr a +inner join sh s +inner join ca c +on c.id = s.id +on a.va = s.va + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join18.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join18.sql new file mode 100644 index 0000000000..01aa0b4ce1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join18.sql @@ -0,0 +1,14 @@ +select department_id as d_e_dept_id, e.last_name + from departments + full outer join employees on (a=b) + left outer join employees on (a=b) + right outer join employees on (a=b) + join employees on (a=b) + inner join employees on (a=b) + cross join employees + natural join employees + + + + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join19.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join19.sql new file mode 100644 index 0000000000..6ac41ea065 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join19.sql @@ -0,0 +1 @@ +select d1.*, d2.* from dual d1 cross join dual d2 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join20.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join20.sql new file mode 100644 index 0000000000..c95dfae0b0 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join20.sql @@ -0,0 +1 @@ +select d1.*, d2.* from dual cross join dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join21.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join21.sql new file mode 100644 index 0000000000..918212b43e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/join21.sql @@ -0,0 +1,2 @@ +select * from sys.dual natural join sys.dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier01.sql new file mode 100644 index 0000000000..0628c08d03 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier01.sql @@ -0,0 +1 @@ +select timestamp, avg, cume_dist from nulls diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier02.sql new file mode 100644 index 0000000000..a2b6c0ae73 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier02.sql @@ -0,0 +1 @@ +select m.model from model diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier03.sql new file mode 100644 index 0000000000..c05b256403 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier03.sql @@ -0,0 +1,24 @@ +select ind.index_owner,ind.index_name,ind.uniqueness + , ind.status,ind.index_type,ind.temporary, ind.partitioned,ind.funcidx_status + , ind.join_index,ind.columns,ie.column_expression + , ind.index_name sdev_link_name,'INDEX' sdev_link_type, ind.index_owner sdev_link_owner +from +( + select index_owner,table_owner,index_name,uniqueness, status,index_type,temporary, partitioned,funcidx_status, join_index + , max(decode(position,1 ,column_name))|| max(decode(position,2 ,', '||column_name))|| max(decode(position,3 ,', '||column_name))|| max(decode(position,4 ,', '||column_name))|| max(decode(position,5 ,', '||column_name))|| max(decode(position,6 ,', '||column_name))|| max(decode(position,7 ,', '||column_name))|| max(decode(position,8 ,', '||column_name))|| max(decode(position,9 ,', '||column_name))|| max(decode(position,10,', '||column_name)) columns + + from + ( + select di.owner index_owner,dc.table_owner,dc.index_name,di.uniqueness, di.status, di.index_type, di.temporary, di.partitioned,di.funcidx_status, di.join_index + , dc.column_name,dc.column_position position + from all_ind_columns dc,all_indexes di + where dc.table_owner = :OBJECT_OWNER + and dc.table_name = :OBJECT_NAME + and dc.index_name = di.index_name + and dc.index_owner = di.owner + ) + group by index_owner,table_owner,index_name,uniqueness, status, index_type, temporary, partitioned,funcidx_status, join_index +) ind, +ALL_IND_EXPRESSIONS ie +where ind.index_name = ie.index_name(+) +and ind.index_owner = ie.index_owner(+) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier04.sql new file mode 100644 index 0000000000..009e71c0da --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier04.sql @@ -0,0 +1,6 @@ +select bs.keep keep, bs.keep_until keep_until +from v$backup_set bs +union all +select null keep, null keep_until +from v$backup_piece bp + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier05.sql new file mode 100644 index 0000000000..87e8391160 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/keywordasidentifier05.sql @@ -0,0 +1 @@ +select exception from exception \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/least_greatest.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/least_greatest.sql new file mode 100644 index 0000000000..e872787b45 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/least_greatest.sql @@ -0,0 +1 @@ +SELECT LEAST(1), LEAST(1, 2), LEAST(1, 2, 3), GREATES(1), GREATEST(1, 2), GREATEST(1, 2, 3) FROM DUAL \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer01.sql new file mode 100644 index 0000000000..f9eae8c007 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer01.sql @@ -0,0 +1,2 @@ +select * from dual where 1 < > 2 and 1 ! = 2 and 1 ^ /*aaa */ = 2 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer02.sql new file mode 100644 index 0000000000..15aaf848a4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer02.sql @@ -0,0 +1,2 @@ +select 'A' | | 'B' from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer03.sql new file mode 100644 index 0000000000..488fba03a1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer03.sql @@ -0,0 +1,2 @@ +select :1, :X, :1 + 1, 1 + :2 from A where A=:3 and b= : 4 and c= :5and :A = :b + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer04.sql new file mode 100644 index 0000000000..c3931e035d --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer04.sql @@ -0,0 +1 @@ +select tbl$or$idx$part$num("sys"."wrh$_seg_stat",0,4,0,"rowid") as c1 from t1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer05.sql new file mode 100644 index 0000000000..8dcc674cfa --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/lexer05.sql @@ -0,0 +1 @@ +select tbl$or$idx$part$num("sys"."wrh:_seg_stat",0,4,0,"rowid") as c1 from t1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/like01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/like01.sql new file mode 100644 index 0000000000..5b41b6d8ca --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/like01.sql @@ -0,0 +1,5 @@ +select last_name +from employees +where last_name +like '%a\_b%' escape '\' +order by last_name diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/max_001.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/max_001.sql new file mode 100644 index 0000000000..b06bda80e2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/max_001.sql @@ -0,0 +1,6 @@ +SELECT + + MAX (DISTINCT miles), + MAX (ALL miles) + +FROM Flights \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge01.sql new file mode 100644 index 0000000000..464bbcd649 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge01.sql @@ -0,0 +1,9 @@ +merge into bonuses d + using (select employee_id.* from employees) s + on (employee_id = a) + when matched then update set d.bonus = bonus + delete where (salary > 8000) + when not matched then insert (d.employee_id, d.bonus) + values (s.employee_id, s.salary) + where (s.salary <= 8000) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge02.sql new file mode 100644 index 0000000000..28baf2f423 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge02.sql @@ -0,0 +1,9 @@ +merge into bonuses d + using (select employee_id.* from employees) s + on (employee_id = a) + when not matched then insert (d.employee_id, d.bonus) + values (s.employee_id, s.salary) + where (s.salary <= 8000) + when matched then update set d.bonus = bonus + delete where (salary > 8000) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge03.sql new file mode 100644 index 0000000000..c8756c5322 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge03.sql @@ -0,0 +1,17 @@ +merge /*+ dynamic_sampling(mm 4) dynamic_sampling_est_cdn(mm) + dynamic_sampling(m 4) dynamic_sampling_est_cdn(m) */ + +into sys.mon_mods_all$ mm +using +( + select decode(grouping_id(tp.bo#,tsp.pobj#,m.obj#),3,tp.bo#,1,tsp.pobj#,m.obj#) obj#, sum(m.inserts) inserts, sum(m.updates) updates, sum(m.deletes) deletes, + decode(sum(bitand(m.flags,1)),0,0,1) +decode(sum(bitand(m.flags,2)),0,0,2) +decode(sum(bitand(m.flags,4)),0,0,4) flags, sum(m.drop_segments) drop_segments + from sys.mon_mods$ m, sys.tabcompart$ tp, sys.tabsubpart$ tsp + where m.obj# = tsp.obj# and tp.obj# = tsp.pobj# + group by rollup(tp.bo#,tsp.pobj#,m.obj#) having grouping_id(tp.bo#,tsp.pobj#,m.obj#) < 7 +) v on +(mm.obj# = v.obj#) +when matched then +update set mm.inserts = mm.inserts + v.inserts, mm.updates = mm.updates + v.updates, mm.deletes = mm.deletes + v.deletes, +mm.flags = mm.flags + v.flags - bitand(mm.flags,v.flags) , mm.drop_segments = mm.drop_segments + v.drop_segments +when not matched then insert values (v.obj#, v.inserts, v.updates, v.deletes, sysdate, v.flags, v.drop_segments) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge04.sql new file mode 100644 index 0000000000..53e3ccd3dc --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/merge04.sql @@ -0,0 +1,18 @@ +merge /*+ dynamic_sampling(mm 4) dynamic_sampling_est_cdn(mm) + dynamic_sampling(m 4) dynamic_sampling_est_cdn(m) */ + +into sys.mon_mods_all$ mm +using +( + select decode(grouping_id(tp.bo#,tsp.pobj#,m.obj#),3,tp.bo#,1,tsp.pobj#,m.obj#) obj#, sum(m.inserts) inserts, sum(m.updates) updates, sum(m.deletes) deletes, + decode(sum(bitand(m.flags,1)),0,0,1) +decode(sum(bitand(m.flags,2)),0,0,2) +decode(sum(bitand(m.flags,4)),0,0,4) flags, sum(m.drop_segments) drop_segments + from sys.mon_mods$ m, sys.tabcompart$ tp, sys.tabsubpart$ tsp + where m.obj# = tsp.obj# and tp.obj# = tsp.pobj# + group by rollup(tp.bo#,tsp.pobj#,m.obj#) having grouping_id(tp.bo#,tsp.pobj#,m.obj#) < 7 + order by 1, 2, 3 +) v on +(mm.obj# = v.obj#) +when matched then +update set mm.inserts = mm.inserts + v.inserts, mm.updates = mm.updates + v.updates, mm.deletes = mm.deletes + v.deletes, +mm.flags = mm.flags + v.flags - bitand(mm.flags,v.flags) , mm.drop_segments = mm.drop_segments + v.drop_segments +when not matched then insert values (v.obj#, v.inserts, v.updates, v.deletes, sysdate, v.flags, v.drop_segments) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause01.sql new file mode 100644 index 0000000000..300b0f6cf2 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause01.sql @@ -0,0 +1,18 @@ +select country,prod,year,s +from sales_view_ref +model +partition by (country) +dimension by (prod, year) +measures (sale s) +ignore nav +-- cell_reference_options +unique dimension +-- here starts model_rules_clause +rules upsert sequential order +( +s[prod='mouse pad', year=2001] = s['mouse pad', 1999] + s['mouse pad', 2000], +s['standard mouse', 2002] = s['standard mouse', 2001] +) +order by country, prod, year + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause02.sql new file mode 100644 index 0000000000..7559ebb547 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause02.sql @@ -0,0 +1,16 @@ +select country, year, sale, csum + from + (select country, year, sum(sale) sale + from sales_view_ref + group by country, year + ) + model dimension by (country, year) + measures (sale, 0 csum) + rules (csum[any, any]= + sum(sale) over (partition by country + order by year + rows unbounded preceding) + ) + order by country, year + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause03.sql new file mode 100644 index 0000000000..1459be944d --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause03.sql @@ -0,0 +1,15 @@ +select country,prod,year,s + from sales_view_ref + model + partition by (country) + dimension by (prod, year) + measures (sale s) + ignore nav + unique dimension + rules upsert sequential order + ( + s[prod='mouse pad'] = 1, + s['standard mouse'] = 2 + ) + order by country, prod, year + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause04.sql new file mode 100644 index 0000000000..cc40f38359 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause04.sql @@ -0,0 +1,15 @@ +select country, year, sale, csum + from + (select country, year, salex sale + from sales_view_ref + group by country, year + ) + model dimension by (country, year) + measures (sale, 0 csum) + rules + ( + s['standard mouse'] = 2 + ) + order by country, year + + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause05.sql new file mode 100644 index 0000000000..bb3b96ab52 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/model_clause05.sql @@ -0,0 +1,14 @@ +select country, year, sale, csum + from + (select country, year, salex sale + from sales_view_ref + group by country, year + ) m + model dimension by (country, year) + measures (sale, 0 csum) + rules + ( + s['standard mouse'] = 2 + ) + order by country, year + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/numbers01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/numbers01.sql new file mode 100644 index 0000000000..2991e12485 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/numbers01.sql @@ -0,0 +1,14 @@ +select 25 +, +6.34 +, 0.5 +, 25e-03 +, -1 -- Here are some valid floating-point number literals: +, 25f +, +6.34F +, 0.5d +, -1D +, (sysdate -1d) -- here we substract "one" in decimal format +, sysdate -1m -- here we substract "one" and "m" is column's alias +, sysdate -1dm +from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/nvl_001.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/nvl_001.sql new file mode 100644 index 0000000000..dc12104ef9 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/nvl_001.sql @@ -0,0 +1,4 @@ +SELECT last_name, +NVL(TO_CHAR(commission_pct), 'Not Applicable') "COMMISSION" FROM employees +WHERE last_name LIKE 'B%' +ORDER BY last_name \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/object_access01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/object_access01.sql new file mode 100644 index 0000000000..236c23bb8d --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/object_access01.sql @@ -0,0 +1,18 @@ +select +extractvalue(value(t), '/select_list_item/pos') + 1 pos, +extractvalue(value(t), '/select_list_item/value') res, +extractvalue(value(t), '/select_list_item/nonnulls') nonnulls, +extractvalue(value(t), '/select_list_item/ndv') ndv, +extractvalue(value(t), '/select_list_item/split') split, +extractvalue(value(t), '/select_list_item/rsize') rsize, +extractvalue(value(t), '/select_list_item/rowcnt') rowcnt, +extract(value(t), '/select_list_item/hash_val').getclobval() hashval +from +table +( + xmlsequence + ( + extract(:b1 , '/process_result/select_list_item') + ) +) t + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by01.sql new file mode 100644 index 0000000000..ab2a794fb6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by01.sql @@ -0,0 +1 @@ +select * from dual order by 1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by02.sql new file mode 100644 index 0000000000..2abe954fc1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by02.sql @@ -0,0 +1 @@ +select * from dual order by 1 asc diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by03.sql new file mode 100644 index 0000000000..517b05a535 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by03.sql @@ -0,0 +1 @@ +select * from dual order by m.year, m.title, f(a) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by04.sql new file mode 100644 index 0000000000..0c60c34043 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by04.sql @@ -0,0 +1 @@ +select * from dual order by a nulls first, b nulls last diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by05.sql new file mode 100644 index 0000000000..5ae8f42680 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by05.sql @@ -0,0 +1 @@ +select * from dual order siblings by a nulls first, b nulls last, c nulls last, d nulls last, e nulls last \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by06.sql new file mode 100644 index 0000000000..9127e62979 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/order_by06.sql @@ -0,0 +1 @@ +with a as (select * from dual order by 1) select * from a diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot01.sql new file mode 100644 index 0000000000..98db57467e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot01.sql @@ -0,0 +1,6 @@ +select * from pivot_table + unpivot (yearly_total for order_mode in (store as 'direct', + internet as 'online')) + order by year, order_mode + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot02.sql new file mode 100644 index 0000000000..a29895aef8 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot02.sql @@ -0,0 +1,12 @@ +select * from ( + select times_purchased as "puchase frequency", state_code + from customers t + ) + pivot xml + ( + count(state_code) + for state_code in (select state_code from preferred_states) + ) + order by 1 + + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot03.sql new file mode 100644 index 0000000000..27c9121473 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot03.sql @@ -0,0 +1,12 @@ +select * from ( + select times_purchased as "purchase frequency", state_code + from customers t + ) + pivot xml + ( + count(state_code) + for state_code in (any) + ) + order by 1 + + \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot04.sql new file mode 100644 index 0000000000..899d212122 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot04.sql @@ -0,0 +1,20 @@ +select value +from +( + ( + select + 'a' v1, + 'e' v2, + 'i' v3, + 'o' v4, + 'u' v5 + from dual + ) + unpivot + ( + value + for value_type in + (v1,v2,v3,v4,v5) + ) + ) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot05.sql new file mode 100644 index 0000000000..27c71a0040 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot05.sql @@ -0,0 +1,5 @@ +select * +from (select customer_id, product_code, quantity + from pivot_test) +pivot xml (sum(quantity) as sum_quantity for (product_code) in (select distinct product_code + from pivot_test)) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot06.sql new file mode 100644 index 0000000000..e2615075d0 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot06.sql @@ -0,0 +1,6 @@ +select * +from (select product_code, quantity + from pivot_test) +pivot xml (sum(quantity) as sum_quantity for (product_code) in (select distinct product_code + from pivot_test + where id < 10)) \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot07.sql new file mode 100644 index 0000000000..9ffa5ef90f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot07.sql @@ -0,0 +1,5 @@ +select * +from (select customer_id, product_code, quantity + from pivot_test) +pivot (sum(quantity) as sum_quantity for (product_code) in ('a' as a, 'b' as b, 'c' as c)) +order by customer_id diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot08.sql new file mode 100644 index 0000000000..28be7987de --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot08.sql @@ -0,0 +1,4 @@ +select * +from (select product_code, quantity + from pivot_test) +pivot (sum(quantity) as sum_quantity for (product_code) in ('a' as a, 'b' as b, 'c' as c)) \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot09.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot09.sql new file mode 100644 index 0000000000..b1ebd96aa4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot09.sql @@ -0,0 +1,19 @@ + select * + from (s join d using(c)) + pivot + ( + max(c_c_p) as max_ccp + , max(d_c_p) max_dcp + , max(d_x_p) dxp + , count(1) cnt + for (i, p) in + ( + (1,1) as one_one, + (1,2) as one_two, + (1,3) as one_three, + (2,1) as two_one, + (2,2) as two_two, + (2,3) as two_three + ) + ) + where d_t = 'p' diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot10.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot10.sql new file mode 100644 index 0000000000..82bf6359a4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot10.sql @@ -0,0 +1,19 @@ + select * + from s join d using(c) + pivot + ( + max(c_c_p) as max_ccp + , max(d_c_p) max_dcp + , max(d_x_p) dxp + , count(1) cnt + for (i, p) in + ( + (1,1) as one_one, + (1,2) as one_two, + (1,3) as one_three, + (2,1) as two_one, + (2,2) as two_two, + (2,3) as two_three + ) + ) + where d_t = 'p' diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot11.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot11.sql new file mode 100644 index 0000000000..dd9dff6ab4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot11.sql @@ -0,0 +1,20 @@ + select * + from s + pivot + ( + max(c_c_p) as max_ccp + , max(d_c_p) max_dcp + , max(d_x_p) dxp + , count(1) cnt + for (i, p) in + ( + (1,1) as one_one, + (1,2) as one_two, + (1,3) as one_three, + (2,1) as two_one, + (2,2) as two_two, + (2,3) as two_three + ) + ) + join d using(c) + where d_t = 'p' diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot12.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot12.sql new file mode 100644 index 0000000000..79387a433e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/pivot12.sql @@ -0,0 +1,18 @@ + select value from + ( + ( + select + 'a' v1, + 'e' v2, + 'i' v3, + 'o' v4, + 'u' v5 + from dual + ) + unpivot include nulls + ( + value + for value_type in + (v1, v2,v3,v4,v5) -- Also can give ANY here. + ) + ) \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring01.sql new file mode 100644 index 0000000000..c1503f104c --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring01.sql @@ -0,0 +1,16 @@ +with + reports_to_101 (eid, emp_last, mgr_id, reportlevel) as + ( + select employee_id, last_name, manager_id, 0 reportlevel + from employees + where employee_id = 101 + union all + select e.employee_id, e.last_name, e.manager_id, reportlevel+1 + from reports_to_101 r, employees e + where r.eid = e.manager_id + ) +select eid, emp_last, mgr_id, reportlevel +from reports_to_101 r, auto a +where r.c1 = a.c2 +order by reportlevel, eid + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring02.sql new file mode 100644 index 0000000000..20cd2e5fae --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring02.sql @@ -0,0 +1,18 @@ +with + reports_to_101 (eid, emp_last, mgr_id, reportlevel, mgr_list) + as + ( + select employee_id, last_name, manager_id, 0 reportlevel + , cast(manager_id as varchar2(2000)) + from employees + where employee_id = 101 + union all + select e.employee_id, e.last_name, e.manager_id, reportlevel+1 + , cast(mgr_list || ',' || manager_id as varchar2(2000)) + from reports_to_101 r, employees e + where r.eid = e.manager_id + ) +select eid, emp_last, mgr_id, reportlevel, mgr_list +from reports_to_101 +order by reportlevel, eid + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring03.sql new file mode 100644 index 0000000000..d735e4395e --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring03.sql @@ -0,0 +1,16 @@ +with + reports_to_101 (eid, emp_last, mgr_id, reportlevel) as + ( + select employee_id, last_name, manager_id, 0 reportlevel + from employees + where employee_id = 101 + union all + select e.employee_id, e.last_name, e.manager_id, reportlevel+1 + from reports_to_101 r, employees e + where r.eid = e.manager_id + ) +select eid, emp_last, mgr_id, reportlevel +from reports_to_101 +where reportlevel <= 1 +order by reportlevel, eid + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring04.sql new file mode 100644 index 0000000000..cba5b5c4a6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring04.sql @@ -0,0 +1,18 @@ +with + org_chart (eid, emp_last, mgr_id, reportlevel, salary, job_id) as + ( + select employee_id, last_name, manager_id, 0 reportlevel, salary, job_id + from employees + where manager_id is null + union all + select e.employee_id, e.last_name, e.manager_id, + r.reportlevel+1 reportlevel, e.salary, e.job_id + from org_chart r, employees e + where r.eid = e.manager_id + ) + search depth first by emp_last set order1 +select lpad(' ',2*reportlevel)||emp_last emp_name, eid, mgr_id, salary, job_id +from org_chart +order by order1 + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring05.sql new file mode 100644 index 0000000000..099548ca60 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring05.sql @@ -0,0 +1,27 @@ +with +x1 as (select max(y1) from klm1), +x2 as (select max(y2) from klm2), +x3 as (select max(y3) from klm3), +x4 as (select max(y4) from klm4) +select + distinct + -1, + +1, + a + b * (a * d) as aaa, + t1.region_name, + t2.division_name, + t1.region_name as a, + t2.division_name as aaaa, + a.*, + sum(t3.amount), + sum(count(1)) + count(*) + , sum(1) + (select count(1) from ddd) a +from dual, fff +where a is null +or b is not null +and ( a like 'd') +and 1 = 0 +and a.b is a set +union +select a from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring06.sql new file mode 100644 index 0000000000..7858876f24 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring06.sql @@ -0,0 +1,15 @@ +with + dept_costs as ( + select department_name, sum(salary) dept_total + from employees e, departments d + where e.department_id = d.department_id + group by department_name), + avg_cost as ( + select sum(dept_total)/count(*) avg + from dept_costs) +select * from dept_costs + where dept_total > + (select avvg from avg_cost) + order by department_name + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring07.sql new file mode 100644 index 0000000000..7c568a3f19 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring07.sql @@ -0,0 +1,78 @@ +with timegrouped_rawdata +as +( + select /*+ leading(sn di md sh ot) cardinality(ot 1000) */ + sh.metric_id as metric_id , + ot.bsln_guid as bsln_guid , + ot.timegroup as timegroup , + sh.value as obs_value + from + dba_hist_snapshot sn , + dba_hist_database_instance di , + sys.wrh$_sysmetric_history sh , + bsln_metric_defaults md , + table(:b1 ) ot + where sn.dbid = :b6 + and sn.snap_id between :b5 and :b4 + and di.dbid = sn.dbid + and di.instance_number = sn.instance_number + and di.startup_time = sn.startup_time + and di.instance_name = :b3 + and sh.snap_id = sn.snap_id + and sh.dbid = sn.dbid + and sh.instance_number = sn.instance_number + and sh.group_id = 2 + and sh.metric_id = md.metric_id + and md.status = :b2 + and ot.obs_time = trunc(sh.end_time, 'hh24') +) +( +select + bsln_statistics_t + ( + bsln_guid ,metric_id ,:b11 ,:b10 ,timegroup ,sample_count ,average ,minimum ,maximum ,sdev , + pctile_25 ,pctile_50 ,pctile_75 ,pctile_90 ,pctile_95 ,pctile_99 ,est_sample_count ,est_slope ,est_intercept , + case when est_slope = 0 then 0 else greatest(0,nvl(100-(25*power((1-est_mu1/est_slope), 2)*(est_sample_count-1) ),0)) end , + ln( 1000) * est_slope + est_intercept , + ln(10000) * est_slope + est_intercept + ) + from + ( + select metric_id ,bsln_guid ,timegroup ,est_mu as est_slope ,est_mu * ln(alpha) + x_m as est_intercept ,to_number(null) as est_fit_quality , + case when count_below_x_j > 0 then (sum_below_x_j + (n-m+1)*(x_j-x_m))/count_below_x_j - x_j else to_number(null) end as est_mu1 , + est_sample_count ,n as sample_count ,average ,minimum ,maximum ,sdev ,pctile_25 ,pctile_50 ,pctile_75 ,pctile_90 ,pctile_95 ,pctile_99 + from + ( + select metric_id ,bsln_guid ,timegroup ,max(n) as n ,count(rrank) as est_sample_count , + case when count(rrank) > 3 then ( sum(obs_value) + ( max(n) - max(rrank) ) * max(obs_value) - (max(n) - min(rrank) + 1) * min(obs_value) ) / (count(rrank)-1) + else to_number(null) end as est_mu , + (max(n) - min(rrank) + 1) / (max(n) + 1) as alpha , + min(obs_value) as x_m ,max(obs_value) as x_l ,max(rrank) as l ,min(rrank) as m ,max(mid_tail_value) as x_j , + sum(case when obs_value < mid_tail_value then obs_value else 0 end ) as sum_below_x_j , + sum(case when cume_dist < :b7 then 1 else 0 end ) as count_below_x_j , + max(max_val) as maximum ,max(min_val) as minimum ,max(avg_val) as average ,max(sdev_val) as sdev ,max(pctile_25) as pctile_25 ,max(pctile_50) as pctile_50 , + max(pctile_75) as pctile_75 ,max(pctile_90) as pctile_90 ,max(pctile_95) as pctile_95 ,max(pctile_99) as pctile_99 + from + ( + select metric_id ,bsln_guid ,timegroup ,obs_value as obs_value, + cume_dist () over (partition by metric_id, bsln_guid, timegroup order by obs_value ) as cume_dist , + count(1) over (partition by metric_id, bsln_guid, timegroup ) as n , + row_number () over (partition by metric_id, bsln_guid, timegroup order by obs_value) as rrank , + percentile_disc(:b7 ) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as mid_tail_value , + max(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as max_val , + min(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as min_val , + avg(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as avg_val , + stddev(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as sdev_val , + percentile_cont(0.25) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_25 , + percentile_cont(0.5) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_50 , + percentile_cont(0.75) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_75 , + percentile_cont(0.90) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_90 , + percentile_cont(0.95) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_95 , + percentile_cont(0.99) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_99 + from timegrouped_rawdata d + ) x + where x.cume_dist >= :b9 and x.cume_dist <= :b8 + group by metric_id ,bsln_guid ,timegroup + ) + ) +) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring08.sql new file mode 100644 index 0000000000..ac42cc80f1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring08.sql @@ -0,0 +1,10 @@ +with -- qf + x1 as ( select * from t1 ), + x2 as ( select * from t2 join t3 on (t2.a2 = t3.a3)) +select + * +from + x1 +join x2 on (x1.a1 = x2.a2) +join t4 on (x1.a1 = t4.a4) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring09.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring09.sql new file mode 100644 index 0000000000..b7a1f36579 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring09.sql @@ -0,0 +1,8 @@ +with rn as ( + select rownum rn + from dual + connect by level <= (select max(cases) from t1)) +select pname +from t1, rn +where rn <= cases +order by pname diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring10.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring10.sql new file mode 100644 index 0000000000..c20131da89 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring10.sql @@ -0,0 +1,33 @@ +with o(obj,link) as +( +select 'a', 'b' from dual union all +select 'a', 'c' from dual union all +select 'c', 'd' from dual union all +select 'd', 'c' from dual union all +select 'd', 'e' from dual union all +select 'e', 'e' from dual +), +t(root,lev,obj,link,path) as ( +select obj,1,obj,link,cast(obj||'->'||link +as varchar2(4000)) +from o +where obj='a' -- start with +union all +select + t.root,t.lev+1,o.obj,o.link, + t.path||', '||o.obj|| + '->' + ||o.link +from t, o +where t.link=o.obj +) +search depth first by obj set ord +cycle obj set cycle to 1 default 0 +select root,lev,obj,link,path,cycle, + case + when (lev - lead(lev) over (order by ord)) < 0 + then 0 + else 1 + end is_leaf + from t + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring11.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring11.sql new file mode 100644 index 0000000000..36b47aa78f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/query_factoring11.sql @@ -0,0 +1,9 @@ +with col_generator as ( +select t1.batch_id, decode(t1.action, 'sent', t1.actdate) sent, +decode(t2.action,'recv', t2.actdate) received +from test t1, test t2 +where t2.batch_id(+) = t1.batch_id) +select batch_id, max(sent) sent, max(received) received +from col_generator +group by batch_id +order by 1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/round_001.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/round_001.sql new file mode 100644 index 0000000000..269816cab9 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/round_001.sql @@ -0,0 +1,8 @@ +SELECT +round( + decode( + a.attribute_name, n.col, + a.attribute_num_value * n.scale + n.shift, + a.attribute_num_value), 4 + ) + FROM employees \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/round_decode_001.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/round_decode_001.sql new file mode 100644 index 0000000000..c29d8a3e27 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/round_decode_001.sql @@ -0,0 +1,11 @@ + SELECT + nvl( + a.attribute_str_value, + round( + decode( + a.attribute_name, n.col, + a.attribute_num_value * n.scale + n.shift, + a.attribute_num_value), 4 + ) + ) val + from employees \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/row_number_001.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/row_number_001.sql new file mode 100644 index 0000000000..b3e7473e0f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/row_number_001.sql @@ -0,0 +1,4 @@ +SELECT department_id, last_name, employee_id, +ROW_NUMBER() +OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id +FROM employees diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/sample01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/sample01.sql new file mode 100644 index 0000000000..605b0338db --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/sample01.sql @@ -0,0 +1,4 @@ +select * from +( +select 1 as c1 from "sys"."obj$" sample block (14.285714 , 1) seed (1) "o" +) samplesub diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/select_package_function.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/select_package_function.sql new file mode 100644 index 0000000000..38f5d51155 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/select_package_function.sql @@ -0,0 +1 @@ +SELECT DBMS_LOB.SUBSTR(FIELD_1,4000,1) AS FIELD_1, 'ABC' AS FIELD_2 FROM TABLE_1 \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple02.sql new file mode 100644 index 0000000000..459fb20595 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple02.sql @@ -0,0 +1,3 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple03.sql new file mode 100644 index 0000000000..3ca7d89279 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple03.sql @@ -0,0 +1,3 @@ +select employee_id from (select employee_id+1 as employee_id from employees) + for update of employee_id + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple04.sql new file mode 100644 index 0000000000..07aacdcb58 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple04.sql @@ -0,0 +1,11 @@ +select * from +( + ( + select * from dual + ) + unpivot + ( + value for value_type in (dummy) + ) +) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple05.sql new file mode 100644 index 0000000000..b1d5077aea --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple05.sql @@ -0,0 +1,9 @@ +select * from +( +select * from a + unpivot + ( + value for value_type in (dummy) + ) +) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple06.sql new file mode 100644 index 0000000000..3a44380479 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple06.sql @@ -0,0 +1,2 @@ +select * from (( select * from dual)) a + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple07.sql new file mode 100644 index 0000000000..c5a6036276 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple07.sql @@ -0,0 +1,3 @@ +select * from dual for update +of dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple08.sql new file mode 100644 index 0000000000..d9980f3b92 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple08.sql @@ -0,0 +1,2 @@ +select a, b, c, d, e, 1, 2, f(a,b,c,1+1) from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple09.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple09.sql new file mode 100644 index 0000000000..d2637f4b80 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple09.sql @@ -0,0 +1,7 @@ +select a||last_name, + employee_id + from employees + start with job_id = 'ad_vp' + connect by prior employee_id = manager_id + + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple10.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple10.sql new file mode 100644 index 0000000000..753ad3ad27 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple10.sql @@ -0,0 +1 @@ +select a as over from over diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple11.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple11.sql new file mode 100644 index 0000000000..ed2205330f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple11.sql @@ -0,0 +1 @@ +select a.* from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple12.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple12.sql new file mode 100644 index 0000000000..33f65c6b6a --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple12.sql @@ -0,0 +1,7 @@ +select + +1, + t2.division_name as aaaa, + a.*, + sum(t3.amount) +from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple13.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple13.sql new file mode 100644 index 0000000000..e09eef0cbe --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/simple13.sql @@ -0,0 +1 @@ +select * from (dual), (dual d), (dual) d diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char.sql new file mode 100644 index 0000000000..e3c54a18e6 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char.sql @@ -0,0 +1 @@ +SELECT TO_CHAR(SYSDATE), TO_CHAR(SYSDATE, 'D'), TO_CHAR(SYSDATE, 'D', 'NLS_DATE_LANGUAGE = RUSSIAN') FROM DUAL \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char_001.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char_001.sql new file mode 100644 index 0000000000..58e5a13153 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char_001.sql @@ -0,0 +1 @@ +SELECT TO_CHAR("date", 'YYYY-MM') || '-01' as "month" FROM employes \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char_002.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char_002.sql new file mode 100644 index 0000000000..68afcbdccf --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_char_002.sql @@ -0,0 +1 @@ +select TO_CHAR(commission_pct) as "commission" from employees \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_date.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_date.sql new file mode 100644 index 0000000000..042a86dd43 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/to_date.sql @@ -0,0 +1,6 @@ +SELECT TO_DATE('01.01.2012') FROM DUAL +SELECT TO_DATE('01.01.2012', 'dd.mm.yyyy') FROM DUAL +SELECT TO_DATE('01' || '.01.2012', 'dd.mm.yyyy') FROM DUAL +SELECT TO_DATE('01.' || (NQUATER*3 - 2) || '.' || NRYEAR, 'DD.MM.YYYY') FROM DUAL +SELECT LAST_DAY(TO_DATE('01.' || (NQUATER*3 - 2) || '.' || NRYEAR, 'DD.MM.YYYY')) FROM DUAL +SELECT TO_CHAR(LAST_DAY(TO_DATE('01.' || (NQUATER*3 - 2) || '.' || NRYEAR, 'DD.MM.YYYY')),'DD') FROM DUAL \ No newline at end of file diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union01.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union01.sql new file mode 100644 index 0000000000..72afaeb84d --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union01.sql @@ -0,0 +1,7 @@ +select 'a' obj, 'b' link from dual union all +select 'a', 'c' from dual union all +select 'c', 'd' from dual union all +select 'd', 'c' from dual union all +select 'd', 'e' from dual union all +select 'e', 'e' from dual + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union02.sql new file mode 100644 index 0000000000..41659845f1 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union02.sql @@ -0,0 +1,4 @@ +select distinct job_id from hr.jobs +union all +select distinct job_id from hr.job_history + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union03.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union03.sql new file mode 100644 index 0000000000..e119602a3f --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union03.sql @@ -0,0 +1,6 @@ +select distinct job_id from hr.jobs +union all +( + select distinct job_id from hr.job_history +) + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union04.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union04.sql new file mode 100644 index 0000000000..911f952bcd --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union04.sql @@ -0,0 +1,45 @@ +( + select distinct job_id from hr.jobs +) +union all +( + select distinct job_id from hr.job_history + union all + (((( + select distinct job_id from hr.job_history + union all + ( + select distinct job_id from hr.job_history + ) + ))) + union all + select distinct job_id from hr.job_history + ) +) +union all +( + select distinct job_id from hr.job_history + union all + ( + select distinct job_id from hr.job_history + union all + ( + select distinct job_id from hr.job_history + ) + ) +) +union all +( + select distinct job_id from hr.job_history + union all + select distinct job_id from hr.job_history +) +union all + select distinct job_id from hr.job_history +union all + select distinct job_id from hr.job_history +union all + select distinct job_id from hr.job_history +union all + select distinct job_id from hr.job_history + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union05.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union05.sql new file mode 100644 index 0000000000..04b1a857c4 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union05.sql @@ -0,0 +1,30 @@ +select * from dual +union all +( + select * from dual +) +union all +( + select * from dual +) +union all +( + select * from dual +) +union all +( + select * from dual +) +union all +( + select * from dual +) +union all +( + select * from dual +) +union all +( + select * from dual +) +order by 1 asc, 2 asc diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union06.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union06.sql new file mode 100644 index 0000000000..bc4a548c8a --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union06.sql @@ -0,0 +1,35 @@ +( select "x"."r_no", + "x"."i_id", + "x"."ind", + "x"."item", + '0' "o" + from "x" + where ("x"."r_no" = :a) + minus + select "y"."r_no", + "y"."i_id", + "y"."ind", + "y"."item", + '0' "o" + from "y" + where ("y"."r_no" = :a) +) +union +( select "y"."r_no", + "y"."i_id", + "y"."ind", + "y"."item", + '1' "o" + from "y" + where ("y"."r_no" = :a) + minus + select "x"."r_no", + "x"."i_id", + "x"."ind", + "x"."item", + '1' "o" + from "x" + where ("x"."r_no" = :a) +) +order by 4,3,1 + diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union07.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union07.sql new file mode 100644 index 0000000000..32c3aa2f88 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union07.sql @@ -0,0 +1,47 @@ +-- +-- note: this query was copied from the druid project +-- http://code.alibabatech.com/wiki/display/druid/home +-- +select * from ( + select row_.*, rownum rownum_ + from ( + select * + from + ( + select results.*,row_number() over ( partition by results.object_id order by results.gmt_modified desc) rn + from + ( + ( + select sus.id id, sus.gmt_create gmt_create, + sus.gmt_modified gmt_modified, sus.company_id company_id, + sus.object_id object_id, sus.object_type object_type, + sus.confirm_type confirm_type, sus.operator operator, + sus.filter_type filter_type, sus.member_id member_id, + sus.member_fuc_q member_fuc_q, sus.risk_type risk_type , 'y' is_draft + from f_u_c_ sus , a_b_c_draft p , + member m + where 1=1 and p.company_id = m.company_id + and m.login_id=? + and p.sale_type in( ? ) + and p.id=sus.object_id + ) + union + ( + select sus.id id, sus.gmt_create gmt_create, + sus.gmt_modified gmt_modified, sus.company_id company_id, + sus.object_id object_id, sus.object_type object_type, + sus.confirm_type confirm_type, sus.operator operator, + sus.filter_type filter_type, sus.member_id member_id, + sus.member_fuc_q member_fuc_q, sus.risk_type risk_type , 'n' is_draft + from f_u_c_ sus , a_b_c p ,member m + where 1=1 + and p.company_id = m.company_id + and m.login_id=? + and p.sale_type in( ? ) + and p.id=sus.object_id + ) + ) results + ) where rn = 1 order by gmt_modified desc + )row_ where rownum <= ? + ) +where rownum_ >= ? diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union08.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union08.sql new file mode 100644 index 0000000000..97ed5d5e39 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union08.sql @@ -0,0 +1,5 @@ +select * from dual where exists ( + select * from dual + union all + select * from dual +) diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union09.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union09.sql new file mode 100644 index 0000000000..a63f499350 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union09.sql @@ -0,0 +1,27 @@ +select * from ( + select row_.* + from ( + select * + from + ( + select results.*, 1 rn + from + ( + ( + select dummy + from dual + where 1=1 + ) + union + ( + select dummy + from dual + where 1=1 + ) + ) results + ) + where rn = 1 order by dummy desc + )row_ + where rownum <= 1 + ) +where rownum >= 1 diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union10.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union10.sql new file mode 100644 index 0000000000..a697a08abb --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/union10.sql @@ -0,0 +1,14 @@ +select +( + ( + select 'y' from dual + where exists ( select 1 from dual where 1 = 0 ) + ) + union + ( + select 'n' from dual + where not exists ( select 1 from dual where 1 = 0 ) + ) +) +as yes_no +from dual diff --git a/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/xmltable02.sql b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/xmltable02.sql new file mode 100644 index 0000000000..c5f5440911 --- /dev/null +++ b/src/test/resources/bvt/parser/antlr_grammers_v4_plsql/examples/xmltable02.sql @@ -0,0 +1,2 @@ +select xmlelement("other_attrs", xmlelement("parsing_user_id", parsing_user_id)).getClobVal() other +from f