Oracle支持dblink

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@177 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-05-21 10:13:31 +00:00
parent a02c964a3d
commit b9f5e1d0c3
30 changed files with 210 additions and 46 deletions
@@ -693,6 +693,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print("(");
incrementIndent();
x.getSelect().accept(this);
println();
decrementIndent();
print(")");
@@ -31,6 +31,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateTimeUnit;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr;
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;
@@ -142,6 +143,9 @@ public class OracleExprParser extends SQLExprParser {
lexer.nextToken();
return primaryRest(doubleExpr);
case TABLE:
lexer.nextToken();
return primaryRest(new SQLIdentifierExpr("TABLE"));
case PLUS:
lexer.nextToken();
switch (lexer.token()) {
@@ -211,6 +215,24 @@ public class OracleExprParser extends SQLExprParser {
}
}
public SQLExpr primaryRest(SQLExpr expr) throws ParserException {
if (lexer.token() == Token.MONKEYS_AT) {
lexer.nextToken();
OracleDbLinkExpr dblink = new OracleDbLinkExpr();
dblink.setExpr(expr);
String link = lexer.stringVal();
accept(Token.IDENTIFIER);
dblink.setDbLink(link);
expr = dblink;
}
return super.primaryRest(expr);
}
public OracleDateExpr parseDate() {
accept(Token.DATE);
@@ -1,10 +1,13 @@
package com.alibaba.druid.sql.dialect.oracle.parser;
import static com.alibaba.druid.sql.parser.CharTypes.isIdentifierChar;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.druid.sql.parser.Keywords;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLParseException;
import com.alibaba.druid.sql.parser.Token;
public class OracleLexer extends Lexer {
@@ -102,6 +105,47 @@ public class OracleLexer extends Lexer {
super(input);
super.keywods = DEFAULT_ORACLE_KEYWORDS;
}
public void scanVariable() {
if (ch == '@') {
scanChar();
token = Token.MONKEYS_AT;
return;
}
if (ch != ':') {
throw new SQLParseException("illegal variable");
}
int hash = ch;
np = bp;
sp = 1;
char ch;
for (;;) {
ch = buf[++bp];
if (!isIdentifierChar(ch)) {
break;
}
hash = 31 * hash + ch;
sp++;
continue;
}
this.ch = buf[bp];
stringVal = symbolTable.addSymbol(buf, np, sp, hash);
Token tok = keywods.getKeyword(stringVal);
if (tok != null) {
token = tok;
} else {
token = Token.IDENTIFIER;
}
}
public void scanComment() {
if (ch != '/') {
@@ -248,7 +248,6 @@ public class Lexer {
throw new SQLParseException("TODO"); // TODO
case '@':
scanVariable();
token = Token.VARIANT;
return;
case '/':
int nextChar = buf[bp + 1];
@@ -508,12 +507,7 @@ public class Lexer {
this.ch = buf[bp];
stringVal = symbolTable.addSymbol(buf, np, sp, hash);
Token tok = keywods.getKeyword(stringVal);
if (tok != null) {
token = tok;
} else {
token = Token.IDENTIFIER;
}
token = Token.VARIANT;
}
public void scanComment() {
@@ -399,9 +399,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter {
} else {
print("(");
incrementIndent();
println();
x.getSubQuery().accept(this);
println();
decrementIndent();
print(")");
}
@@ -858,8 +858,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter {
print("(");
incrementIndent();
x.getSelect().accept(this);
println();
decrementIndent();
print(")");
if (x.getAlias() != null) {
print(' ');
print(x.getAlias());
}
return false;
}