improve sql parser

This commit is contained in:
wenshao
2013-08-03 20:52:07 +08:00
parent 29d3f93e6b
commit 32a43cc549
29 changed files with 811 additions and 57 deletions
@@ -75,6 +75,7 @@ public class SQLCreateTableParser extends SQLDDLParser {
createTable.getTableElementList().add(column);
} else if (lexer.token == Token.PRIMARY //
|| lexer.token == Token.UNIQUE //
|| lexer.token == Token.CHECK //
|| lexer.token == Token.CONSTRAINT) {
OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint();
constraint.setParent(createTable);
@@ -62,6 +62,7 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.NotNullConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
@@ -241,6 +242,7 @@ public class SQLExprParser extends SQLParser {
case COMPUTE:
case ENABLE:
case DISABLE:
case INITIALLY:
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextToken();
break;
@@ -1347,18 +1349,51 @@ public class SQLExprParser extends SQLParser {
column.getConstaints().add(ref);
return parseColumnRest(column);
}
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
NotNullConstraint notNull = new NotNullConstraint();
notNull.setName(name);
column.getConstaints().add(notNull);
return parseColumnRest(column);
}
if (lexer.token == Token.CHECK) {
SQLColumnCheck check = parseColumnCheck();
check.setName(name);
check.setParent(column);
column.getConstaints().add(check);
return parseColumnRest(column);
}
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
if (lexer.token == Token.CHECK) {
lexer.nextToken();
SQLExpr expr = this.expr();
column.getConstaints().add(new SQLColumnCheck(expr));
SQLColumnCheck check = parseColumnCheck();
column.getConstaints().add(check);
return parseColumnRest(column);
}
return column;
}
protected SQLColumnCheck parseColumnCheck() {
lexer.nextToken();
SQLExpr expr = this.expr();
SQLColumnCheck check = new SQLColumnCheck(expr);
if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
check.setEnable(false);
} else if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
check.setEnable(true);
}
return check;
}
public SQLPrimaryKey parsePrimaryKey() {
accept(Token.PRIMARY);
accept(Token.KEY);
@@ -1430,6 +1465,8 @@ public class SQLExprParser extends SQLParser {
constraint = parseUnique();
} else if (lexer.token() == Token.FOREIGN) {
constraint = parseForeignKey();
} else if (lexer.token() == Token.CHECK) {
constraint = parseCheck();
} else {
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
@@ -1438,6 +1475,19 @@ public class SQLExprParser extends SQLParser {
return constraint;
}
public SQLCheck parseCheck() {
accept(Token.CHECK);
SQLCheck check = createCheck();
accept(Token.LPAREN);
check.setExpr(this.expr());
accept(Token.RPAREN);
return check;
}
protected SQLCheck createCheck() {
return new SQLCheck();
}
public SQLForeignKeyConstraint parseForeignKey() {
accept(Token.FOREIGN);
@@ -93,6 +93,11 @@ public class SQLParser {
case NOCOMPRESS:
case KEEP_DUPLICATES:
case EXCEPTIONS:
case INITIALLY:
case END:
case COMMENT:
case ENABLE:
case DISABLE:
alias = lexer.stringVal();
lexer.nextToken();
return alias;
@@ -171,6 +171,7 @@ public enum Token {
PCTFREE("PCTFREE"),
INITRANS("INITRANS"),
MAXTRANS("MAXTRANS"),
INITIALLY("INITIALLY"),
ENABLE("ENABLE"),
DISABLE("DISABLE"),
SEGMENT("SEGMENT"),