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@151 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
+74
@@ -0,0 +1,74 @@
|
||||
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.visitor.OracleASTVisitor;
|
||||
|
||||
public abstract class FlashbackQueryClause extends OracleSQLObject {
|
||||
|
||||
private Type type;
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(Type type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public static enum Type {
|
||||
SCN, TIMESTAMP
|
||||
}
|
||||
|
||||
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
|
||||
protected 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
|
||||
protected void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, expr);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -16,6 +16,7 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
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.ast.visitor.OracleASTVisitor;
|
||||
@@ -31,10 +32,20 @@ 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;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeInterval;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
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;
|
||||
@@ -318,4 +320,12 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(PartitionExtensionClause x);
|
||||
|
||||
void endVisit(PartitionExtensionClause x);
|
||||
|
||||
boolean visit(VersionsFlashbackQueryClause x);
|
||||
|
||||
void endVisit(VersionsFlashbackQueryClause x);
|
||||
|
||||
boolean visit(AsOfFlashbackQueryClause x);
|
||||
|
||||
void endVisit(AsOfFlashbackQueryClause x);
|
||||
}
|
||||
|
||||
+32
@@ -31,6 +31,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeInterval;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
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;
|
||||
@@ -1523,4 +1525,34 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(VersionsFlashbackQueryClause x) {
|
||||
print("VERSIONS BETWEEN ");
|
||||
print(x.getType().name());
|
||||
print(" ");
|
||||
x.getBegin().accept(this);
|
||||
print(" AND ");
|
||||
x.getEnd().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(VersionsFlashbackQueryClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(AsOfFlashbackQueryClause x) {
|
||||
print("AS OF ");
|
||||
print(x.getType().name());
|
||||
print(" ");
|
||||
x.getExpr().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(AsOfFlashbackQueryClause x) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
|
||||
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.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
|
||||
@@ -39,6 +40,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot;
|
||||
import com.alibaba.druid.sql.parser.Lexer;
|
||||
import com.alibaba.druid.sql.parser.ParserException;
|
||||
import com.alibaba.druid.sql.parser.SQLExprParser;
|
||||
import com.alibaba.druid.sql.parser.SQLParseException;
|
||||
import com.alibaba.druid.sql.parser.SQLSelectParser;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
@@ -362,6 +364,28 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
|
||||
tableReference.setPartition(partition);
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.AS) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (identifierEquals("OF")) {
|
||||
lexer.nextToken();
|
||||
|
||||
AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause();
|
||||
if (identifierEquals("SCN")) {
|
||||
clause.setType(AsOfFlashbackQueryClause.Type.SCN);
|
||||
lexer.nextToken();
|
||||
} else {
|
||||
acceptIdentifier("TIMESTAMP");
|
||||
clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP);
|
||||
}
|
||||
clause.setExpr(createExprParser().primary());
|
||||
tableReference.setFlashback(clause);
|
||||
} else {
|
||||
throw new SQLParseException("TODO");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) {
|
||||
|
||||
@@ -16,15 +16,16 @@ import com.alibaba.druid.util.JdbcUtils;
|
||||
public class OracleSQLParserResourceTest extends TestCase {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
exec_test("bvt/parser/oracle-0.txt");
|
||||
exec_test("bvt/parser/oracle-1.txt");
|
||||
exec_test("bvt/parser/oracle-2.txt");
|
||||
exec_test("bvt/parser/oracle-3.txt");
|
||||
exec_test("bvt/parser/oracle-4.txt");
|
||||
exec_test("bvt/parser/oracle-5.txt");
|
||||
exec_test("bvt/parser/oracle-6.txt"); // PARTITION
|
||||
exec_test("bvt/parser/oracle-7.txt");
|
||||
exec_test("bvt/parser/oracle-8.txt");
|
||||
// exec_test("bvt/parser/oracle-0.txt");
|
||||
// exec_test("bvt/parser/oracle-1.txt");
|
||||
// exec_test("bvt/parser/oracle-2.txt");
|
||||
// exec_test("bvt/parser/oracle-3.txt");
|
||||
// exec_test("bvt/parser/oracle-4.txt");
|
||||
// exec_test("bvt/parser/oracle-5.txt");
|
||||
// exec_test("bvt/parser/oracle-6.txt"); // PARTITION
|
||||
// exec_test("bvt/parser/oracle-7.txt");
|
||||
// exec_test("bvt/parser/oracle-8.txt");
|
||||
exec_test("bvt/parser/oracle-9.txt");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
SELECT salary FROM employees
|
||||
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' MINUTE)
|
||||
WHERE last_name = 'Chung';
|
||||
---------------------------
|
||||
SELECT salary FROM employees
|
||||
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' MINUTE)
|
||||
WHERE last_name = 'Chung';
|
||||
Reference in New Issue
Block a user