improve sql parser

This commit is contained in:
wenshao
2013-09-02 22:06:58 +08:00
parent 6571e4f198
commit df53aa4275
6 changed files with 119 additions and 4 deletions
@@ -15,7 +15,6 @@
*/
package com.alibaba.druid.sql.ast.expr;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExprImpl;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -58,8 +57,8 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName {
this.lowerName = lowerName;
}
public String toString() {
return SQLUtils.toSQLString(this);
public void output(StringBuffer buf) {
buf.append(this.name);
}
protected void accept0(SQLASTVisitor visitor) {
@@ -21,14 +21,27 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLCallStatement extends SQLStatementImpl {
private boolean brace = false;
private SQLVariantRefExpr outParameter;
private SQLName procedureName;
private final List<SQLExpr> parameters = new ArrayList<SQLExpr>();
public SQLVariantRefExpr getOutParameter() {
return outParameter;
}
public void setOutParameter(SQLVariantRefExpr outParameter) {
this.outParameter = outParameter;
}
public SQLName getProcedureName() {
return procedureName;
}
@@ -41,11 +54,21 @@ public class SQLCallStatement extends SQLStatementImpl {
return parameters;
}
public boolean isBrace() {
return brace;
}
public void setBrace(boolean brace) {
this.brace = brace;
}
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.outParameter);
acceptChild(visitor, this.procedureName);
acceptChild(visitor, this.parameters);
}
visitor.endVisit(this);
}
}
@@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLListExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex;
@@ -1115,10 +1116,18 @@ public class SQLStatementParser extends SQLParser {
lexer.nextToken();
brace = true;
}
SQLCallStatement stmt = new SQLCallStatement();
if (lexer.token() == Token.QUES) {
lexer.nextToken();
accept(Token.EQ);
stmt.setOutParameter(new SQLVariantRefExpr("?"));
}
acceptIdentifier("CALL");
SQLCallStatement stmt = new SQLCallStatement();
stmt.setProcedureName(exprParser.name());
if (lexer.token() == Token.LPAREN) {
@@ -1129,6 +1138,7 @@ public class SQLStatementParser extends SQLParser {
if (brace) {
accept(Token.RBRACE);
stmt.setBrace(true);
}
return stmt;
@@ -1141,11 +1141,23 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
@Override
public boolean visit(SQLCallStatement x) {
if (x.isBrace()) {
print("{");
}
if (x.getOutParameter() != null) {
x.getOutParameter().accept(this);
print(" = ");
}
print("CALL ");
x.getProcedureName().accept(this);
print('(');
printAndAccept(x.getParameters(), ", ");
print(')');
if (x.isBrace()) {
print("}");
}
return false;
}
@@ -1,3 +1,18 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.visitor.functions;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;