improved sql parser.

This commit is contained in:
wenshao
2017-06-14 17:17:38 +08:00
parent 2c978ff758
commit 1633a92603
19 changed files with 318 additions and 355 deletions
@@ -0,0 +1,80 @@
package com.alibaba.druid.sql.ast.expr;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLExprImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
/**
* Created by wenshao on 14/06/2017.
*/
public class SQLFlashbackExpr extends SQLExprImpl {
private Type type;
private SQLExpr expr;
public SQLFlashbackExpr() {
}
public SQLFlashbackExpr(Type type, SQLExpr expr) {
this.type = type;
this.setExpr(expr);
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public SQLExpr getExpr() {
return expr;
}
public void setExpr(SQLExpr expr) {
if (expr != null) {
expr.setParent(this);
}
this.expr = expr;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, expr);
}
visitor.endVisit(this);
}
public SQLFlashbackExpr clone() {
SQLFlashbackExpr x = new SQLFlashbackExpr();
x.type = this.type;
if (expr != null) {
x.setExpr(expr.clone());
}
return x;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SQLFlashbackExpr that = (SQLFlashbackExpr) o;
if (type != that.type) return false;
return expr != null ? expr.equals(that.expr) : that.expr == null;
}
@Override
public int hashCode() {
int result = type != null ? type.hashCode() : 0;
result = 31 * result + (expr != null ? expr.hashCode() : 0);
return result;
}
public static enum Type {
SCN, TIMESTAMP
}
}
@@ -18,6 +18,7 @@ package com.alibaba.druid.sql.ast.statement;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
@@ -27,6 +28,8 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab
protected List<SQLHint> hints;
protected SQLExpr flashback;
public SQLTableSourceImpl(){
}
@@ -71,4 +74,14 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab
return alias;
}
public SQLExpr getFlashback() {
return flashback;
}
public void setFlashback(SQLExpr flashback) {
if (flashback != null) {
flashback.setParent(this);
}
this.flashback = flashback;
}
}
@@ -1,115 +0,0 @@
/*
* 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.clause;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public abstract class FlashbackQueryClause extends OracleSQLObjectImpl {
private Type type;
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public static enum Type {
SCN, TIMESTAMP
}
public FlashbackQueryClause clone() {
throw new UnsupportedOperationException();
}
public static class VersionsFlashbackQueryClause extends FlashbackQueryClause {
private SQLExpr begin;
private SQLExpr end;
public SQLExpr getBegin() {
return begin;
}
public void setBegin(SQLExpr begin) {
this.begin = begin;
}
public SQLExpr getEnd() {
return end;
}
public void setEnd(SQLExpr end) {
this.end = end;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, begin);
acceptChild(visitor, end);
}
visitor.endVisit(this);
}
}
public static class AsOfFlashbackQueryClause extends FlashbackQueryClause {
private SQLExpr expr;
public SQLExpr getExpr() {
return expr;
}
public void setExpr(SQLExpr expr) {
this.expr = expr;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, expr);
}
visitor.endVisit(this);
}
}
public static class AsOfSnapshotClause extends FlashbackQueryClause {
private SQLExpr expr;
public SQLExpr getExpr() {
return expr;
}
public void setExpr(SQLExpr expr) {
this.expr = expr;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, expr);
}
visitor.endVisit(this);
}
}
}
@@ -18,14 +18,12 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelectTableSource {
protected OracleSelectPivotBase pivot;
protected FlashbackQueryClause flashback;
public OracleSelectJoin(String alias){
super(alias);
@@ -35,13 +33,6 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect
}
public FlashbackQueryClause getFlashback() {
return flashback;
}
public void setFlashback(FlashbackQueryClause flashback) {
this.flashback = flashback;
}
public OracleSelectPivotBase getPivot() {
return pivot;
@@ -16,9 +16,9 @@
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -26,19 +26,10 @@ public class OracleSelectSubqueryTableSource extends SQLSubqueryTableSource impl
protected OracleSelectPivotBase pivot;
protected FlashbackQueryClause flashback;
public OracleSelectSubqueryTableSource(){
}
public FlashbackQueryClause getFlashback() {
return flashback;
}
public void setFlashback(FlashbackQueryClause flashback) {
this.flashback = flashback;
}
public OracleSelectSubqueryTableSource(String alias){
super(alias);
}
@@ -17,8 +17,6 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
@@ -32,20 +30,10 @@ public class OracleSelectTableReference extends SQLExprTableSource implements Or
protected PartitionExtensionClause partition;
protected SampleClause sampleClause;
protected FlashbackQueryClause flashback;
public OracleSelectTableReference(){
}
public FlashbackQueryClause getFlashback() {
return flashback;
}
public void setFlashback(FlashbackQueryClause flashback) {
this.flashback = flashback;
}
public PartitionExtensionClause getPartition() {
return partition;
}
@@ -15,8 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
public interface OracleSelectTableSource extends SQLTableSource {
@@ -24,7 +24,7 @@ public interface OracleSelectTableSource extends SQLTableSource {
void setPivot(OracleSelectPivotBase pivot);
FlashbackQueryClause getFlashback();
SQLExpr getFlashback();
void setFlashback(FlashbackQueryClause flashback);
void setFlashback(SQLExpr flashback);
}
@@ -20,17 +20,9 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLListExpr;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem;
@@ -695,61 +687,47 @@ public class OracleSelectParser extends SQLSelectParser {
}
if (identifierEquals("VERSIONS")) {
SQLBetweenExpr betweenExpr = new SQLBetweenExpr();
betweenExpr.setTestExpr(new SQLIdentifierExpr("VERSIONS"));
lexer.nextToken();
if (lexer.token() == Token.BETWEEN) {
accept(Token.BETWEEN);
SQLFlashbackExpr start = new SQLFlashbackExpr();
if (identifierEquals("SCN")) {
lexer.nextToken();
VersionsFlashbackQueryClause clause = new VersionsFlashbackQueryClause();
if (identifierEquals("SCN")) {
clause.setType(AsOfFlashbackQueryClause.Type.SCN);
lexer.nextToken();
} else {
acceptIdentifier("TIMESTAMP");
clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP);
}
SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) exprParser.expr();
if (binaryExpr.getOperator() != SQLBinaryOperator.BooleanAnd) {
throw new ParserException("syntax error : " + binaryExpr.getOperator());
}
clause.setBegin(binaryExpr.getLeft());
clause.setEnd(binaryExpr.getRight());
tableReference.setFlashback(clause);
start.setType(SQLFlashbackExpr.Type.SCN);
} else {
throw new ParserException("TODO");
acceptIdentifier("TIMESTAMP");
start.setType(SQLFlashbackExpr.Type.TIMESTAMP);
}
SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) exprParser.expr();
if (binaryExpr.getOperator() != SQLBinaryOperator.BooleanAnd) {
throw new ParserException("syntax error : " + binaryExpr.getOperator());
}
start.setExpr(binaryExpr.getLeft());
betweenExpr.setBeginExpr(start);
betweenExpr.setEndExpr(binaryExpr.getRight());
tableReference.setFlashback(betweenExpr);
}
}
private FlashbackQueryClause flashback() {
private SQLExpr flashback() {
accept(Token.OF);
if (identifierEquals("SCN")) {
AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause();
clause.setType(AsOfFlashbackQueryClause.Type.SCN);
lexer.nextToken();
clause.setExpr(exprParser.expr());
return clause;
return new SQLFlashbackExpr(SQLFlashbackExpr.Type.SCN, this.expr());
} else if (identifierEquals("SNAPSHOT")) {
lexer.nextToken();
accept(Token.LPAREN);
AsOfSnapshotClause clause = new AsOfSnapshotClause();
clause.setExpr(this.expr());
accept(Token.RPAREN);
return clause;
return this.expr();
} else {
AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause();
acceptIdentifier("TIMESTAMP");
clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP);
clause.setExpr(exprParser.expr());
return clause;
lexer.nextToken();
return new SQLFlashbackExpr(SQLFlashbackExpr.Type.TIMESTAMP, this.expr());
}
}
@@ -19,9 +19,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
@@ -129,14 +126,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
void endVisit(PartitionExtensionClause x);
boolean visit(VersionsFlashbackQueryClause x);
void endVisit(VersionsFlashbackQueryClause x);
boolean visit(AsOfFlashbackQueryClause x);
void endVisit(AsOfFlashbackQueryClause x);
boolean visit(OracleWithSubqueryEntry x);
void endVisit(OracleWithSubqueryEntry x);
@@ -353,10 +342,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
void endVisit(OracleAlterViewStatement x);
boolean visit(AsOfSnapshotClause x);
void endVisit(AsOfSnapshotClause x);
boolean visit(OracleAlterTableMoveTablespace x);
void endVisit(OracleAlterTableMoveTablespace x);
@@ -21,9 +21,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem;
@@ -263,28 +260,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(VersionsFlashbackQueryClause x) {
return true;
}
@Override
public void endVisit(VersionsFlashbackQueryClause x) {
}
@Override
public boolean visit(AsOfFlashbackQueryClause x) {
return true;
}
@Override
public void endVisit(AsOfFlashbackQueryClause x) {
}
@Override
public boolean visit(OracleWithSubqueryEntry x) {
@@ -840,16 +815,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(AsOfSnapshotClause x) {
return true;
}
@Override
public void endVisit(AsOfSnapshotClause x) {
}
@Override
public boolean visit(OracleAlterViewStatement x) {
return true;
@@ -18,20 +18,13 @@ package com.alibaba.druid.sql.dialect.oracle.visitor;
import java.util.List;
import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem;
@@ -308,10 +301,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print(')');
}
if (x.getFlashback() != null) {
println();
x.getFlashback().accept(this);
}
printFlashback(x.getFlashback());
}
return false;
@@ -489,10 +479,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
x.getPivot().accept(this);
}
if (x.getFlashback() != null) {
println();
x.getFlashback().accept(this);
}
printFlashback(x.getFlashback());
if ((x.getAlias() != null) && (x.getAlias().length() != 0)) {
print(' ');
@@ -536,16 +523,28 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
x.getPivot().accept(this);
}
if (x.getFlashback() != null) {
println();
x.getFlashback().accept(this);
}
printFlashback(x.getFlashback());
printAlias(x.getAlias());
return false;
}
private void printFlashback(SQLExpr flashback) {
if (flashback == null) {
return;
}
println();
if (flashback instanceof SQLBetweenExpr) {
flashback.accept(this);
} else {
print0(ucase ? "AS OF " : "as of ");
flashback.accept(this);
}
}
public boolean visit(OracleSelectUnPivot x) {
print0(ucase ? "UNPIVOT" : "unpivot");
if (x.getNullsIncludeType() != null) {
@@ -768,36 +767,36 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(VersionsFlashbackQueryClause x) {
print0(ucase ? "VERSIONS BETWEEN " : "versions between ");
print0(x.getType().name());
print(' ');
x.getBegin().accept(this);
print0(ucase ? " AND " : " and ");
x.getEnd().accept(this);
return false;
}
@Override
public void endVisit(VersionsFlashbackQueryClause x) {
}
@Override
public boolean visit(AsOfFlashbackQueryClause x) {
print0(ucase ? "AS OF " : "as of ");
print0(x.getType().name());
print0(" (");
x.getExpr().accept(this);
print(')');
return false;
}
@Override
public void endVisit(AsOfFlashbackQueryClause x) {
}
// @Override
// public boolean visit(VersionsFlashbackQueryClause x) {
// print0(ucase ? "VERSIONS BETWEEN " : "versions between ");
// print0(x.getType().name());
// print(' ');
// x.getBegin().accept(this);
// print0(ucase ? " AND " : " and ");
// x.getEnd().accept(this);
// return false;
// }
//
// @Override
// public void endVisit(VersionsFlashbackQueryClause x) {
//
// }
//
// @Override
// public boolean visit(AsOfFlashbackQueryClause x) {
// print0(ucase ? "AS OF " : "as of ");
// print0(x.getType().name());
// print0(" (");
// x.getExpr().accept(this);
// print(')');
// return false;
// }
//
// @Override
// public void endVisit(AsOfFlashbackQueryClause x) {
//
// }
@Override
public boolean visit(OracleWithSubqueryEntry x) {
@@ -2288,18 +2287,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(AsOfSnapshotClause x) {
print0(ucase ? "AS OF SNAPSHOT(" : "as of snapshot(");
x.getExpr().accept(this);
print(')');
return false;
}
@Override
public void endVisit(AsOfSnapshotClause x) {
}
// @Override
// public boolean visit(AsOfSnapshotClause x) {
// print0(ucase ? "AS OF SNAPSHOT(" : "as of snapshot(");
// x.getExpr().accept(this);
// print(')');
// return false;
// }
//
// @Override
// public void endVisit(AsOfSnapshotClause x) {
//
// }
@Override
public boolean visit(OracleAlterViewStatement x) {
@@ -35,9 +35,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem;
@@ -492,28 +489,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
@Override
public boolean visit(VersionsFlashbackQueryClause x) {
return true;
}
@Override
public void endVisit(VersionsFlashbackQueryClause x) {
}
@Override
public boolean visit(AsOfFlashbackQueryClause x) {
return true;
}
@Override
public void endVisit(AsOfFlashbackQueryClause x) {
}
@Override
public boolean visit(OracleWithSubqueryEntry x) {
Map<String, String> aliasMap = getAliasMap();
@@ -1184,16 +1159,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
@Override
public boolean visit(AsOfSnapshotClause x) {
return false;
}
@Override
public void endVisit(AsOfSnapshotClause x) {
}
@Override
public boolean visit(OracleAlterViewStatement x) {
return false;
@@ -4485,4 +4485,18 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
return false;
}
public boolean visit(SQLFlashbackExpr x) {
print0(x.getType().name());
print(' ');
SQLExpr expr = x.getExpr();
if (expr instanceof SQLBinaryOpExpr) {
print('(');
expr.accept(this);
print(')');
} else {
expr.accept(this);
}
return false;
}
}
@@ -726,4 +726,10 @@ public interface SQLASTVisitor {
boolean visit(SQLCommitStatement x);
void endVisit(SQLCommitStatement x);
boolean visit(SQLFlashbackExpr x);
void endVisit(SQLFlashbackExpr x);
//
}
@@ -1643,7 +1643,6 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
}
@Override
public boolean visit(SQLCommitStatement x) {
return true;
@@ -1653,4 +1652,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
public void endVisit(SQLCommitStatement x) {
}
@Override
public boolean visit(SQLFlashbackExpr x) {
return true;
}
@Override
public void endVisit(SQLFlashbackExpr x) {
}
}
@@ -0,0 +1,55 @@
/*
* 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;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import junit.framework.TestCase;
import org.junit.Assert;
import java.util.List;
public class MySqlSetTest_3 extends TestCase {
public void test_0() throws Exception {
String sql = "SET sql_mode=?,NAMES ?,CHARACTER SET utf8,CHARACTER_SET_RESULTS=utf8,COLLATION_CONNECTION=?";
MySqlStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLStatement stmt = stmtList.get(0);
// print(stmtList);
Assert.assertEquals(1, stmtList.size());
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmt.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
// System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(0, visitor.getTables().size());
Assert.assertEquals(0, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
String text = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("SET sql_mode = ?, NAMES ?, CHARACTER SET utf8, CHARACTER_SET_RESULTS = utf8, COLLATION_CONNECTION = ?", text);
}
}
@@ -31,7 +31,7 @@ public class OracleFlashbackQueryTest2 extends TestCase {
String expect = "SELECT salary\n"
+ "FROM employees\n"
+ "VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '10' MINUTE AND SYSTIMESTAMP - INTERVAL '1' MINUTE\n"
+ "VERSIONS BETWEEN TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE) AND SYSTIMESTAMP - INTERVAL '1' MINUTE\n"
+ "WHERE last_name = 'Chung';";
OracleStatementParser parser = new OracleStatementParser(sql);
@@ -0,0 +1,46 @@
/*
* 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.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.test.TestUtils;
import junit.framework.TestCase;
import org.junit.Assert;
public class OracleFlashbackQueryTest4 extends TestCase {
public void test_isEmpty() throws Exception {
String sql = "SELECT * FROM employees\n" +
"AS OF TIMESTAMP\n" +
"TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')\n" +
"WHERE last_name = 'Chung';";
String expect = "SELECT *\n" +
"FROM employees\n" +
"AS OF TIMESTAMP TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')\n" +
"WHERE last_name = 'Chung';";
OracleStatementParser parser = new OracleStatementParser(sql);
SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0);
String text = TestUtils.outputOracle(stmt);
Assert.assertEquals(expect, text);
System.out.println(text);
}
}
@@ -10,9 +10,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem;
@@ -105,9 +102,6 @@ public class OracleASTVisitorAdapterTest extends TestCase {
new OracleSelectUnPivot().accept(adapter);
new SQLTimestampExpr().accept(adapter);
new PartitionExtensionClause().accept(adapter);
new VersionsFlashbackQueryClause().accept(adapter);
new VersionsFlashbackQueryClause().accept(adapter);
new AsOfFlashbackQueryClause().accept(adapter);
new SQLGroupingSetExpr().accept(adapter);
new OracleWithSubqueryEntry().accept(adapter);
new OracleFileSpecification().accept(adapter);
@@ -188,7 +182,6 @@ public class OracleASTVisitorAdapterTest extends TestCase {
new SQLCommitStatement().accept(adapter);
new OracleAlterTriggerStatement().accept(adapter);
new OracleAlterSynonymStatement().accept(adapter);
new AsOfSnapshotClause().accept(adapter);
new OracleAlterViewStatement().accept(adapter);
new OracleAlterTableMoveTablespace().accept(adapter);
new OracleSizeExpr().accept(adapter);