This commit is contained in:
kiki
2014-01-13 15:40:47 +08:00
parent 3b525e05fe
commit 9880fb4b85
38 changed files with 3858 additions and 1812 deletions
@@ -667,7 +667,6 @@ public class Lexer {
bufPos = 1;
char ch;
boolean mybatisFlag = false;
if (charAt(pos + 1) == '@') {
ch = charAt(++pos);
@@ -675,7 +674,29 @@ public class Lexer {
} else if (charAt(pos + 1) == '{') {
pos++;
bufPos++;
mybatisFlag = true;
for (;;) {
ch = charAt(++pos);
if (ch == '}') {
break;
}
bufPos++;
continue;
}
if (ch != '}') {
throw new ParserException("syntax error");
}
++pos;
bufPos++;
this.ch = charAt(pos);
stringVal = addSymbol();
token = Token.VARIANT;
return;
}
for (;;) {
@@ -689,14 +710,6 @@ public class Lexer {
continue;
}
if (mybatisFlag) {
if (ch != '}') {
throw new ParserException("syntax error");
}
++pos;
bufPos++;
}
this.ch = charAt(pos);
stringVal = addSymbol();
File diff suppressed because it is too large Load Diff
@@ -19,6 +19,7 @@ import com.alibaba.druid.sql.dialect.db2.parser.DB2ExprParser;
import com.alibaba.druid.sql.dialect.db2.parser.DB2StatementParser;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.odps.parser.OdpsExprParser;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.postgresql.parser.PGExprParser;
@@ -83,6 +84,10 @@ public class SQLParserUtils {
if (JdbcUtils.DB2.equals(dbType)) {
return new DB2ExprParser(sql);
}
if (JdbcUtils.ODPS.equals(dbType)) {
return new OdpsExprParser(sql);
}
return new SQLExprParser(sql);
}
@@ -270,22 +270,9 @@ public class SQLSelectParser extends SQLParser {
protected final void parseSelectList(SQLSelectQueryBlock queryBlock) {
final List<SQLSelectItem> selectList = queryBlock.getSelectList();
for (;;) {
SQLExpr expr;
if (lexer.token() == Token.IDENTIFIER) {
expr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextTokenComma();
if (lexer.token() != Token.COMMA) {
expr = this.exprParser.primaryRest(expr);
expr = this.exprParser.exprRest(expr);
}
} else {
expr = expr();
}
final String alias = as();
final SQLSelectItem selectItem = new SQLSelectItem(expr, alias);
final SQLSelectItem selectItem = parseSelectItem();
selectList.add(selectItem);
if (lexer.token() != Token.COMMA) {
break;
}
@@ -294,6 +281,24 @@ public class SQLSelectParser extends SQLParser {
}
}
protected SQLSelectItem parseSelectItem() {
SQLExpr expr;
if (lexer.token() == Token.IDENTIFIER) {
expr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextTokenComma();
if (lexer.token() != Token.COMMA) {
expr = this.exprParser.primaryRest(expr);
expr = this.exprParser.exprRest(expr);
}
} else {
expr = expr();
}
final String alias = as();
return new SQLSelectItem(expr, alias);
}
public void parseFrom(SQLSelectQueryBlock queryBlock) {
if (lexer.token() != Token.FROM) {
return;
@@ -79,6 +79,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.ast.statement.SQLUseStatement;
import com.alibaba.druid.sql.dialect.odps.parser.OdpsSelectParser;
public class SQLStatementParser extends SQLParser {
@@ -1357,7 +1358,7 @@ public class SQLStatementParser extends SQLParser {
}
public SQLSelectParser createSQLSelectParser() {
return new SQLSelectParser(this.exprParser);
return new OdpsSelectParser(this.exprParser);
}
public SQLUpdateStatement parseUpdateStatement() {
@@ -240,6 +240,11 @@ public enum Token {
// Oracle
BINARY_FLOAT,
BINARY_DOUBLE,
// odps,hive
PARTITION,
PARTITIONED,
OVERWRITE,
LPAREN("("),
RPAREN(")"),