improve sql parser

This commit is contained in:
wenshao
2013-04-25 22:52:49 +08:00
parent 5833a45cb6
commit 4cee372295
9 changed files with 195 additions and 25 deletions
@@ -15,7 +15,9 @@
*/
package com.alibaba.druid.sql.dialect.sqlserver.parser;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
@@ -106,4 +108,28 @@ public class SQLServerSelectParser extends SQLSelectParser {
protected SQLServerExprParser createExprParser() {
return new SQLServerExprParser(lexer);
}
protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) {
if (lexer.token() == Token.WITH) {
lexer.nextToken();
accept(Token.LPAREN);
for (;;) {
SQLExpr expr = this.expr();
SQLExprHint hint = new SQLExprHint(expr);
hint.setParent(tableSource);
tableSource.getHints().add(hint);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
} else {
break;
}
}
accept(Token.RPAREN);
}
return super.parseTableSourceRest(tableSource);
}
}
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.dialect.sqlserver.visitor;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr;
@@ -210,4 +211,21 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe
public void endVisit(SQLServerUpdateStatement x) {
}
public boolean visit(SQLExprTableSource x) {
x.getExpr().accept(this);
if (x.getHints() != null && x.getHints().size() > 0) {
print(" WITH (");
printAndAccept(x.getHints(), ", ");
print(")");
}
if (x.getAlias() != null) {
print(' ');
print(x.getAlias());
}
return false;
}
}