mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Oracle支持Partition Clause
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@150 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
+47
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+15
-4
@@ -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);
|
||||
}
|
||||
|
||||
+37
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user