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