improve sql parser for sql server

This commit is contained in:
wenshao
2013-08-05 21:48:47 +08:00
parent a55ea486b9
commit 8bf50f9179
12 changed files with 522 additions and 13 deletions
@@ -27,6 +27,8 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS
private List<ValuesClause> valuesList = new ArrayList<ValuesClause>();
private boolean defaultValues;
public ValuesClause getValues() {
if (valuesList.size() == 0) {
return null;
@@ -62,4 +64,13 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS
visitor.endVisit(this);
}
public boolean isDefaultValues() {
return defaultValues;
}
public void setDefaultValues(boolean defaultValues) {
this.defaultValues = defaultValues;
}
}
@@ -18,6 +18,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.parser;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition;
@@ -132,7 +133,7 @@ public class SQLServerExprParser extends SQLExprParser {
return null;
}
protected SQLColumnDefinition createColumnDefinition() {
SQLColumnDefinition column = new SQLServerColumnDefinition();
return column;
@@ -151,12 +152,18 @@ public class SQLServerExprParser extends SQLExprParser {
SQLServerColumnDefinition.Identity identity = new SQLServerColumnDefinition.Identity();
identity.setSeed((Integer) seed.getNumber());
identity.setIncrement((Integer) increment.getNumber());
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.FOR);
identifierEquals("REPLICATION ");
identity.setNotForReplication(true);
if (lexer.token() == Token.NULL) {
lexer.nextToken();
column.setDefaultExpr(new SQLNullExpr());
} else {
accept(Token.FOR);
identifierEquals("REPLICATION ");
identity.setNotForReplication(true);
}
}
SQLServerColumnDefinition sqlSreverColumn = (SQLServerColumnDefinition) column;
@@ -133,6 +133,10 @@ public class SQLServerStatementParser extends SQLStatementParser {
} else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) {
SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr();
insertStatement.setQuery(queryExpr.getSubQuery());
} else if (lexer.token() == Token.DEFAULT) {
lexer.nextToken();
accept(Token.VALUES);
insertStatement.setDefaultValues(true);
}
}
@@ -167,6 +167,10 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe
println();
x.getQuery().accept(this);
}
if (x.isDefaultValues()) {
print(" DEFAULT VALUES");
}
return false;
}
@@ -16,9 +16,9 @@
package com.alibaba.druid.sql.parser;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLConstaint;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
public class SQLCreateTableParser extends SQLDDLParser {
@@ -68,24 +68,30 @@ public class SQLCreateTableParser extends SQLDDLParser {
lexer.nextToken();
for (;;) {
if (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) {
if (lexer.token() == Token.IDENTIFIER //
|| lexer.token() == Token.LITERAL_ALIAS) {
SQLColumnDefinition column = this.exprParser.parseColumn();
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();
SQLConstaint constraint = this.exprParser.parseConstaint();
constraint.setParent(createTable);
createTable.getTableElementList().add(constraint);
createTable.getTableElementList().add((SQLTableElement) constraint);
} else if (lexer.token() == Token.TABLESPACE) {
throw new ParserException("TODO " + lexer.token());
} else {
throw new ParserException("TODO " + lexer.token());
SQLColumnDefinition column = this.exprParser.parseColumn();
createTable.getTableElementList().add(column);
}
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
if (lexer.token() == Token.RPAREN) { // compatible for sql server
break;
}
continue;
}
@@ -96,7 +96,7 @@ public class SQLExprParser extends SQLParser {
lexer.nextToken();
SQLExpr expr = new SQLAllColumnExpr();
if (lexer.token() == Token.DOT) {
lexer.nextToken();
accept(Token.STAR);
@@ -706,7 +706,52 @@ public class SQLExprParser extends SQLParser {
identName = lexer.stringVal();
lexer.nextToken();
} else {
throw new ParserException("error " + lexer.token());
switch (lexer.token()) {
case MODEL:
case PCTFREE:
case INITRANS:
case MAXTRANS:
case SEGMENT:
case CREATION:
case IMMEDIATE:
case DEFERRED:
case STORAGE:
case NEXT:
case MINEXTENTS:
case MAXEXTENTS:
case MAXSIZE:
case PCTINCREASE:
case FLASH_CACHE:
case CELL_FLASH_CACHE:
case KEEP:
case NONE:
case LOB:
case STORE:
case ROW:
case CHUNK:
case CACHE:
case NOCACHE:
case LOGGING:
case NOCOMPRESS:
case KEEP_DUPLICATES:
case EXCEPTIONS:
case PURGE:
case INITIALLY:
case END:
case COMMENT:
case ENABLE:
case DISABLE:
case SEQUENCE:
case USER:
case ANALYZE:
case OPTIMIZE:
case GRANT:
identName = lexer.stringVal();
lexer.nextToken();
break;
default:
throw new ParserException("error " + lexer.token());
}
}
SQLName name = new SQLIdentifierExpr(identName);
@@ -1382,6 +1427,13 @@ public class SQLExprParser extends SQLParser {
column.getConstaints().add(check);
return parseColumnRest(column);
}
if (lexer.token == Token.DEFAULT) {
lexer.nextToken();
SQLExpr expr = this.expr();
column.setDefaultExpr(expr);
return parseColumnRest(column);
}
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}