mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Oracle支持Flashback Clause
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@152 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
+7
-3
@@ -6,7 +6,9 @@ import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleASTVisitor;
|
||||
|
||||
public abstract class FlashbackQueryClause extends OracleSQLObject {
|
||||
|
||||
private Type type;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Type type;
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
@@ -21,7 +23,8 @@ public abstract class FlashbackQueryClause extends OracleSQLObject {
|
||||
}
|
||||
|
||||
public static class VersionsFlashbackQueryClause extends FlashbackQueryClause {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLExpr begin;
|
||||
private SQLExpr end;
|
||||
|
||||
@@ -52,7 +55,8 @@ public abstract class FlashbackQueryClause extends OracleSQLObject {
|
||||
}
|
||||
|
||||
public static class AsOfFlashbackQueryClause extends FlashbackQueryClause {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLExpr expr;
|
||||
|
||||
public SQLExpr getExpr() {
|
||||
|
||||
+7
-1
@@ -744,6 +744,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
decrementIndent();
|
||||
}
|
||||
|
||||
if (x.getFlashback() != null) {
|
||||
println();
|
||||
x.getFlashback().accept(this);
|
||||
}
|
||||
|
||||
printAlias(x.getAlias());
|
||||
|
||||
@@ -1545,8 +1550,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public boolean visit(AsOfFlashbackQueryClause x) {
|
||||
print("AS OF ");
|
||||
print(x.getType().name());
|
||||
print(" ");
|
||||
print(" (");
|
||||
x.getExpr().accept(this);
|
||||
print(")");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectOrderByItem;
|
||||
import com.alibaba.druid.sql.parser.Lexer;
|
||||
@@ -252,4 +253,24 @@ public class OracleExprParser extends SQLExprParser {
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
protected SQLExpr parseInterval() {
|
||||
accept(Token.INTERVAL);
|
||||
|
||||
OracleIntervalExpr interval = new OracleIntervalExpr();
|
||||
if (lexer.token() != Token.LITERAL_CHARS) {
|
||||
throw new ParserException("syntax error : " + lexer.token());
|
||||
}
|
||||
interval.setValue(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() != Token.IDENTIFIER) {
|
||||
throw new ParserException("syntax error : " + lexer.token());
|
||||
}
|
||||
OracleIntervalType type = OracleIntervalType.valueOf(lexer.stringVal());
|
||||
interval.setType(type);
|
||||
lexer.nextToken();
|
||||
|
||||
return interval;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.parser;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
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.statement.SQLSelectGroupByClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
|
||||
@@ -23,6 +25,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
|
||||
@@ -380,6 +383,34 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP);
|
||||
}
|
||||
clause.setExpr(createExprParser().primary());
|
||||
|
||||
tableReference.setFlashback(clause);
|
||||
} else {
|
||||
throw new SQLParseException("TODO");
|
||||
}
|
||||
} else if (identifierEquals("VERSIONS")) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.BETWEEN) {
|
||||
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) createExprParser().expr();
|
||||
if (binaryExpr.getOperator() != SQLBinaryOperator.BooleanAnd) {
|
||||
throw new SQLParseException("syntax error : " + binaryExpr.getOperator());
|
||||
}
|
||||
|
||||
clause.setBegin(binaryExpr.getLeft());
|
||||
clause.setEnd(binaryExpr.getRight());
|
||||
|
||||
tableReference.setFlashback(clause);
|
||||
} else {
|
||||
throw new SQLParseException("TODO");
|
||||
|
||||
Reference in New Issue
Block a user