mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improve sql parser for sql server
This commit is contained in:
+11
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+12
-5
@@ -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;
|
||||
|
||||
+4
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user