From d454e3ae0ef3e37df668ba1b07320337d789cbe9 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 3 Aug 2012 14:02:22 +0800 Subject: [PATCH] add support sql {call ...} --- .../oracle/parser/OracleStatementParser.java | 2 +- .../druid/sql/parser/SQLStatementParser.java | 45 ++++++++++++------- .../druid/bvt/sql/oracle/MergeTest.java | 27 +++++++++++ 3 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index da3c1fbec2..3dcab87096 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -198,7 +198,7 @@ public class OracleStatementParser extends SQLStatementParser { continue; } - if (identifierEquals("CALL")) { + if (lexer.token() == Token.LBRACE || identifierEquals("CALL")) { statementList.add(this.parseCall()); continue; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 719038dfa8..02632ca53e 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -51,9 +51,9 @@ public class SQLStatementParser extends SQLParser { protected SQLExprParser exprParser; public SQLStatementParser(String sql){ - this (new SQLExprParser(sql)); + this(new SQLExprParser(sql)); } - + public SQLStatementParser(SQLExprParser exprParser){ super(exprParser.getLexer()); this.exprParser = exprParser; @@ -155,7 +155,7 @@ public class SQLStatementParser extends SQLParser { continue; } - if (identifierEquals("CALL")) { + if (lexer.token() == Token.LBRACE || identifierEquals("CALL")) { SQLCallStatement stmt = parseCall(); statementList.add(stmt); continue; @@ -185,17 +185,17 @@ public class SQLStatementParser extends SQLParser { statementList.add(stmt); continue; } - + if (identifierEquals("COMMIT")) { SQLStatement stmt = parseCommit(); - + statementList.add(stmt); continue; } - + if (identifierEquals("SHOW")) { SQLStatement stmt = parseShow(); - + statementList.add(stmt); continue; } @@ -211,11 +211,11 @@ public class SQLStatementParser extends SQLParser { continue; } } - + if (parseStatementListDialect(statementList)) { continue; } - + if (lexer.token() == Token.HINT) { lexer.nextToken(); continue; @@ -227,7 +227,7 @@ public class SQLStatementParser extends SQLParser { public SQLRollbackStatement parseRollback() { lexer.nextToken(); - + if (identifierEquals("WORK")) { lexer.nextToken(); } @@ -236,20 +236,20 @@ public class SQLStatementParser extends SQLParser { if (identifierEquals("TO")) { lexer.nextToken(); - + if (identifierEquals("SAVEPOINT")) { lexer.nextToken(); } - + stmt.setTo(this.exprParser.name()); } return stmt; } - + public SQLStatement parseCommit() { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } - + public SQLStatement parseShow() { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -422,6 +422,13 @@ public class SQLStatementParser extends SQLParser { } public SQLCallStatement parseCall() throws ParserException { + + boolean brace = false; + if (lexer.token() == Token.LBRACE) { + lexer.nextToken(); + brace = true; + } + acceptIdentifier("CALL"); SQLCallStatement stmt = new SQLCallStatement(); @@ -432,6 +439,10 @@ public class SQLStatementParser extends SQLParser { exprParser.exprList(stmt.getParameters()); accept(Token.RPAREN); } + + if (brace) { + accept(Token.RBRACE); + } return stmt; } @@ -490,14 +501,14 @@ public class SQLStatementParser extends SQLParser { throw new ParserException("TODO " + lexer.token()); } - + public SQLStatement parseCreateDatabase() { if (lexer.token() == Token.CREATE) { lexer.nextToken(); } - + accept(Token.DATABASE); - + SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(); stmt.setName(this.exprParser.name()); return stmt; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java new file mode 100644 index 0000000000..dccf0c748b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/MergeTest.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcUtils; + +import junit.framework.TestCase; + +public class MergeTest extends TestCase { + + public void test_mergeCall() throws Exception { + String sql = "{ call INTERFACE_DATA_EXTRACTION.INVOICE_INFO(?,?,?)}"; + + ParameterizedOutputVisitorUtils.parameterize(sql, null); + } + + public void test_mergeCall_oracle() throws Exception { + String sql = "{ call INTERFACE_DATA_EXTRACTION.INVOICE_INFO(?,?,?)}"; + + ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.ORACLE); + } + + public void test_mergeCall_mysql() throws Exception { + String sql = "{ call INTERFACE_DATA_EXTRACTION.INVOICE_INFO(?,?,?)}"; + + ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.MYSQL); + } +}