bug fixed for oracle sql parser

This commit is contained in:
温少
2012-03-01 11:32:40 +08:00
65 changed files with 3868 additions and 412 deletions
@@ -66,7 +66,7 @@ public class SQLCreateTableParser extends SQLDDLParser {
lexer.nextToken();
while (lexer.token() == Token.IDENTIFIER) {
SQLColumnDefinition column = parseColumn();
SQLColumnDefinition column = this.exprParser.parseColumn();
createTable.getTableElementList().add(column);
// parseConstaint(column.getConstaints());
@@ -16,8 +16,6 @@
package com.alibaba.druid.sql.parser;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.NotNullConstraint;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLTableConstaint;
public class SQLDDLParser extends SQLStatementParser {
@@ -30,31 +28,6 @@ public class SQLDDLParser extends SQLStatementParser {
super(lexer);
}
protected SQLColumnDefinition parseColumn() {
SQLColumnDefinition column = new SQLColumnDefinition();
column.setName(this.exprParser.name());
column.setDataType(this.exprParser.parseDataType());
return parseColumnRest(column);
}
protected SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) {
if (lexer.token() == Token.DEFAULT) {
lexer.nextToken();
column.setDefaultExpr(this.exprParser.expr());
return parseColumnRest(column);
}
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
column.getConstaints().add(new NotNullConstraint());
return parseColumnRest(column);
}
return column;
}
protected SQLTableConstaint parseConstraint() {
SQLName name = null;
if (lexer.token() == Token.CONSTRAINT) {
@@ -53,7 +53,9 @@ import com.alibaba.druid.sql.ast.expr.SQLSomeExpr;
import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.NotNullConstraint;
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
@@ -375,6 +377,13 @@ public class SQLExprParser extends SQLParser {
case INTERVAL:
sqlExpr = parseInterval();
break;
case COLON:
lexer.nextToken();
if (lexer.token == Token.LITERAL_ALIAS) {
sqlExpr = new SQLVariantRefExpr(":\"" + lexer.stringVal() + "\"");
lexer.nextToken();
}
break;
case ANY:
lexer.nextToken();
if (lexer.token() == Token.LPAREN) {
@@ -440,6 +449,7 @@ public class SQLExprParser extends SQLParser {
if (lexer.token() == Token.DOT) {
lexer.nextToken();
expr = dotRest(expr);
return primaryRest(expr);
} else if (lexer.token() == Token.COLONEQ) {
@@ -448,44 +458,49 @@ public class SQLExprParser extends SQLParser {
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Assignment, rightExp);
} else {
if (lexer.token() == Token.LPAREN) {
if (expr instanceof SQLName || expr instanceof SQLDefaultExpr) {
String method_name;
SQLMethodInvokeExpr methodInvokeExpr;
if (expr instanceof SQLPropertyExpr) {
method_name = ((SQLPropertyExpr) expr).getName();
methodInvokeExpr = new SQLMethodInvokeExpr(method_name);
methodInvokeExpr.setOwner(((SQLPropertyExpr) expr).getOwner());
} else {
method_name = expr.toString();
methodInvokeExpr = new SQLMethodInvokeExpr(method_name);
}
lexer.nextToken();
if (isAggreateFunction(method_name)) {
SQLAggregateExpr aggregateExpr = parseAggregateExpr(method_name);
return aggregateExpr;
}
if (lexer.token() != Token.RPAREN) {
exprList(methodInvokeExpr.getParameters());
}
accept(Token.RPAREN);
return primaryRest(methodInvokeExpr);
}
throw new ParserException("not support token:" + lexer.token());
return methodRest(expr, true);
}
}
return expr;
}
protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) {
if (acceptLPAREN) {
accept(Token.LPAREN);
}
if (expr instanceof SQLName || expr instanceof SQLDefaultExpr) {
String method_name;
SQLMethodInvokeExpr methodInvokeExpr;
if (expr instanceof SQLPropertyExpr) {
method_name = ((SQLPropertyExpr) expr).getName();
methodInvokeExpr = new SQLMethodInvokeExpr(method_name);
methodInvokeExpr.setOwner(((SQLPropertyExpr) expr).getOwner());
} else {
method_name = expr.toString();
methodInvokeExpr = new SQLMethodInvokeExpr(method_name);
}
if (isAggreateFunction(method_name)) {
SQLAggregateExpr aggregateExpr = parseAggregateExpr(method_name);
return aggregateExpr;
}
if (lexer.token() != Token.RPAREN) {
exprList(methodInvokeExpr.getParameters());
}
accept(Token.RPAREN);
return primaryRest(methodInvokeExpr);
}
throw new ParserException("not support token:" + lexer.token());
}
protected SQLExpr dotRest(SQLExpr expr) {
if (lexer.token() == Token.STAR) {
lexer.nextToken();
@@ -578,9 +593,12 @@ public class SQLExprParser extends SQLParser {
} else if (lexer.token() == Token.IDENTIFIER) {
identName = lexer.stringVal();
lexer.nextToken();
} else if (lexer.token() == Token.REFERENCE || lexer.token() == Token.DATE || lexer.token() == Token.TIMESTAMP) {
identName = lexer.stringVal();
lexer.nextToken();
} else {
throw new ParserException("error");
throw new ParserException("error " + lexer.token());
}
SQLName name = new SQLIdentifierExpr(identName);
@@ -1009,19 +1027,20 @@ public class SQLExprParser extends SQLParser {
return expr;
} else {
throw new ParserException("TODO");
throw new ParserException("TODO " + lexer.token());
}
return expr;
}
public SQLDataType parseDataType() throws ParserException {
if (lexer.token() != Token.DATE && lexer.token() != Token.TIMESTAMP && lexer.token() != Token.IDENTIFIER) {
throw new ParserException("unexpect token : " + lexer.token() + " " + lexer.stringVal());
if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) {
return null;
}
SQLName typeExpr = name();
String typeName = typeExpr.toString();
String typeName = lexer.stringVal();
lexer.nextToken();
SQLDataType dataType = new SQLDataTypeImpl(typeName);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
@@ -1087,4 +1106,29 @@ public class SQLExprParser extends SQLParser {
throw new SQLParseException("syntax error, expect " + token + ", actual " + lexer.token());
}
}
public SQLColumnDefinition parseColumn() {
SQLColumnDefinition column = new SQLColumnDefinition();
column.setName(name());
column.setDataType(parseDataType());
return parseColumnRest(column);
}
public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) {
if (lexer.token() == Token.DEFAULT) {
lexer.nextToken();
column.setDefaultExpr(bitOr());
return parseColumnRest(column);
}
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
column.getConstaints().add(new NotNullConstraint());
return parseColumnRest(column);
}
return column;
}
}
@@ -287,10 +287,16 @@ public class SQLStatementParser extends SQLParser {
if (token == Token.TABLE) {
SQLCreateTableParser createTableParser = getSQLCreateTableParser();
return createTableParser.parseCrateTable(false);
} else if (token == Token.INDEX) {
return parseCreateIndex(false);
}
throw new ParserException("TODO " + lexer.token());
}
public SQLStatement parseCreateIndex(boolean acceptCreate) {
throw new ParserException("TODO " + lexer.token());
}
public SQLCreateTableParser getSQLCreateTableParser() {
return new SQLCreateTableParser(lexer);
@@ -23,6 +23,7 @@ package com.alibaba.druid.sql.parser;
*/
public enum Token {
FOR("FOR"),
IF("IF"),
INDEX("INDEX"),
PRIMARY("PRIMARY"),
KEY("KEY"),
@@ -159,6 +160,7 @@ public enum Token {
WAIT("WAIT"),
ADVISE("ADVISE"),
SESSION("SESSION"),
PROCEDURE("PROCEDURE"),
AT("AT"),
LOCAL("LOCAL"),
TIME("TIME"),
@@ -167,6 +169,7 @@ public enum Token {
DECLARE("DECLARE"),
EXCEPTION("EXCEPTION"),
GRANT("GRANT"),
LOOP("LOOP"),
// transact-sql
TOP("TOP"),