Oracle支持Partition Clause

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@150 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-05-19 16:34:29 +00:00
parent 7cf8fbfa9c
commit 0b5436712f
8 changed files with 144 additions and 14 deletions
@@ -0,0 +1,47 @@
package com.alibaba.druid.sql.dialect.oracle.ast.clause;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleASTVisitor;
public class PartitionExtensionClause extends OracleSQLObject {
private static final long serialVersionUID = 1L;
private boolean subPartition;
private SQLName partition;
private final List<SQLName> target = new ArrayList<SQLName>();
public boolean isSubPartition() {
return subPartition;
}
public void setSubPartition(boolean subPartition) {
this.subPartition = subPartition;
}
public SQLName getPartition() {
return partition;
}
public void setPartition(SQLName partition) {
this.partition = partition;
}
public List<SQLName> getFor() {
return target;
}
@Override
protected void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, partition);
acceptChild(visitor, target);
}
visitor.endVisit(this);
}
}
@@ -16,23 +16,33 @@
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.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleSelectTableReference extends SQLExprTableSource implements OracleSelectTableSource {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private boolean only = false;
protected OracleSelectPivotBase pivot;
private boolean only = false;
protected OracleSelectPivotBase pivot;
protected SampleClause sampleClause;
protected PartitionExtensionClause partition;
protected SampleClause sampleClause;
public OracleSelectTableReference(){
}
public PartitionExtensionClause getPartition() {
return partition;
}
public void setPartition(PartitionExtensionClause partition) {
this.partition = partition;
}
public boolean isOnly() {
return this.only;
}
@@ -65,6 +75,7 @@ public class OracleSelectTableReference extends SQLExprTableSource implements Or
protected void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.expr);
acceptChild(visitor, this.partition);
acceptChild(visitor, this.sampleClause);
acceptChild(visitor, this.pivot);
}
@@ -19,6 +19,7 @@ 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.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic;
@@ -313,4 +314,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
boolean visit(OracleSelectTableReference x);
void endVisit(OracleSelectTableReference x);
boolean visit(PartitionExtensionClause x);
void endVisit(PartitionExtensionClause x);
}
@@ -31,6 +31,7 @@ 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.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic;
@@ -712,9 +713,20 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
if (x.isOnly()) {
print("ONLY (");
x.getExpr().accept(this);
if (x.getPartition() != null) {
print(" ");
x.getPartition().accept(this);
}
print(")");
} else {
x.getExpr().accept(this);
if (x.getPartition() != null) {
print(" ");
x.getPartition().accept(this);
}
}
if (x.getSampleClause() != null) {
@@ -1486,4 +1498,29 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(PartitionExtensionClause x) {
if (x.isSubPartition()) {
print("SUBPARTITION ");
} else {
print("PARTITION ");
}
if (x.getPartition() != null) {
print("(");
x.getPartition().accept(this);
print(")");
} else {
print("FOR (");
printAndAccept(x.getFor(), ",");
print(")");
}
return false;
}
@Override
public void endVisit(PartitionExtensionClause x) {
}
}
@@ -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.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
@@ -327,10 +328,39 @@ public class OracleSelectParser extends SQLSelectParser {
if (identifierEquals("PARTITION")) {
lexer.nextToken();
throw new ParserException("TODO");
PartitionExtensionClause partition = new PartitionExtensionClause();
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
partition.setPartition(createExprParser().name());
accept(Token.RPAREN);
} else {
accept(Token.FOR);
accept(Token.LPAREN);
createExprParser().names(partition.getFor());
accept(Token.RPAREN);
}
tableReference.setPartition(partition);
}
if (identifierEquals("SUBPARTITION")) {
throw new ParserException("TODO");
lexer.nextToken();
PartitionExtensionClause partition = new PartitionExtensionClause();
partition.setSubPartition(true);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
partition.setPartition(createExprParser().name());
accept(Token.RPAREN);
} else {
accept(Token.FOR);
accept(Token.LPAREN);
createExprParser().names(partition.getFor());
accept(Token.RPAREN);
}
tableReference.setPartition(partition);
}
}