mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
支持Pivot
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@166 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -1,59 +0,0 @@
|
||||
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.expr.OracleAggregateExpr;
|
||||
|
||||
public class PivotClause {
|
||||
|
||||
private boolean xml;
|
||||
private final List<Entry> entries = new ArrayList<Entry>();
|
||||
private final List<SQLName> pivotFor = new ArrayList<SQLName>();
|
||||
private final List<SQLName> pivotIn = new ArrayList<SQLName>();
|
||||
|
||||
public List<Entry> getEntries() {
|
||||
return entries;
|
||||
}
|
||||
|
||||
public List<SQLName> getPivotFor() {
|
||||
return pivotFor;
|
||||
}
|
||||
|
||||
public List<SQLName> getPivotIn() {
|
||||
return pivotIn;
|
||||
}
|
||||
|
||||
public static class Entry {
|
||||
|
||||
private OracleAggregateExpr aggregateExpr;
|
||||
private String alias;
|
||||
|
||||
public OracleAggregateExpr getAggregateExpr() {
|
||||
return aggregateExpr;
|
||||
}
|
||||
|
||||
public void setAggregateExpr(OracleAggregateExpr aggregateExpr) {
|
||||
this.aggregateExpr = aggregateExpr;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return alias;
|
||||
}
|
||||
|
||||
public void setAlias(String alias) {
|
||||
this.alias = alias;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean isXml() {
|
||||
return xml;
|
||||
}
|
||||
|
||||
public void setXml(boolean xml) {
|
||||
this.xml = xml;
|
||||
}
|
||||
|
||||
}
|
||||
+1
@@ -1684,5 +1684,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(CycleClause x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ 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.OracleDateTimeUnit;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr;
|
||||
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.expr.OraclePriorExpr;
|
||||
@@ -97,6 +99,22 @@ public class OracleExprParser extends SQLExprParser {
|
||||
String alias = '"' + lexer.stringVal() + '"';
|
||||
lexer.nextToken();
|
||||
return primaryRest(new SQLIdentifierExpr(alias));
|
||||
case EXTRACT:
|
||||
lexer.nextToken();
|
||||
OracleExtractExpr extract = new OracleExtractExpr();
|
||||
|
||||
accept(Token.LPAREN);
|
||||
|
||||
extract.setUnit(OracleDateTimeUnit.valueOf(lexer.stringVal()));
|
||||
lexer.nextToken();
|
||||
|
||||
accept(Token.FROM);
|
||||
|
||||
extract.setFrom(expr());
|
||||
|
||||
accept(Token.RPAREN);
|
||||
|
||||
return primaryRest(extract);
|
||||
default:
|
||||
return super.primary();
|
||||
}
|
||||
|
||||
@@ -86,6 +86,7 @@ public class OracleLexer extends Lexer {
|
||||
map.put("CONNECT", Token.CONNECT);
|
||||
map.put("PRIOR", Token.PRIOR);
|
||||
map.put("WITH", Token.WITH);
|
||||
map.put("EXTRACT", Token.EXTRACT);
|
||||
|
||||
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
|
||||
}
|
||||
|
||||
@@ -638,7 +638,7 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
acceptIdentifier("FOR");
|
||||
accept(Token.FOR);
|
||||
|
||||
if (lexer.token() == (Token.LPAREN)) {
|
||||
lexer.nextToken();
|
||||
@@ -656,17 +656,26 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
acceptIdentifier("IN");
|
||||
accept(Token.IN);
|
||||
accept(Token.LPAREN);
|
||||
if (lexer.token() == (Token.LPAREN)) throw new ParserException("TODO");
|
||||
if (lexer.token() == (Token.SELECT)) throw new ParserException("TODO");
|
||||
while (true) {
|
||||
if (lexer.token() == (Token.LPAREN)) {
|
||||
throw new ParserException("TODO");
|
||||
}
|
||||
|
||||
if (lexer.token() == (Token.SELECT)) {
|
||||
throw new ParserException("TODO");
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
item = new OracleSelectPivot.Item();
|
||||
item.setExpr(this.createExprParser().expr());
|
||||
item.setAlias(as());
|
||||
pivot.getPivotIn().add(item);
|
||||
|
||||
if (!(lexer.token() == (Token.COMMA))) break;
|
||||
if (lexer.token() != Token.COMMA) {
|
||||
break;
|
||||
}
|
||||
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user