Skip to content

Commit

Permalink
优化any/some/all函数解析逻辑 alibaba#5891
Browse files Browse the repository at this point in the history
优化any/some/all函数解析逻辑 alibaba#5891
  • Loading branch information
lizongbo committed May 10, 2024
1 parent c81f364 commit 70c3bcf
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -1468,6 +1468,17 @@ protected SQLExpr parseAll() {
SQLAllExpr allExpr = new SQLAllExpr();

accept(Token.LPAREN);
if (lexer.token != Token.SELECT && lexer.token != Token.VALUES && lexer.token != Token.LPAREN) {
SQLExpr expr = this.expr();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr("ALL");
methodInvokeExpr.addArgument(expr);
while (lexer.token == Token.COMMA) {
lexer.nextToken();
methodInvokeExpr.addArgument(expr());
}
accept(Token.RPAREN);
return methodInvokeExpr;
}
SQLSelect allSubQuery = createSelectParser().select();
allExpr.setSubQuery(allSubQuery);
accept(Token.RPAREN);
Expand All @@ -1488,6 +1499,18 @@ protected SQLExpr parseSome() {
}
lexer.nextToken();

if (lexer.token != Token.SELECT && lexer.token != Token.VALUES && lexer.token != Token.LPAREN) {
SQLExpr expr = this.expr();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr("SOME");
methodInvokeExpr.addArgument(expr);
while (lexer.token == Token.COMMA) {
lexer.nextToken();
methodInvokeExpr.addArgument(expr());
}
accept(Token.RPAREN);
return methodInvokeExpr;
}

SQLSomeExpr someExpr = new SQLSomeExpr();
SQLSelect someSubQuery = createSelectParser().select();
someExpr.setSubQuery(someSubQuery);
Expand All @@ -1505,10 +1528,14 @@ protected SQLExpr parseAny() {
if (lexer.token == Token.LPAREN) {
accept(Token.LPAREN);

if (lexer.token == Token.ARRAY || lexer.token == Token.IDENTIFIER) {
if (lexer.token != Token.SELECT && lexer.token != Token.VALUES && lexer.token != Token.LPAREN) {
SQLExpr expr = this.expr();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr("ANY");
methodInvokeExpr.addArgument(expr);
while (lexer.token == Token.COMMA) {
lexer.nextToken();
methodInvokeExpr.addArgument(expr());
}
accept(Token.RPAREN);
return methodInvokeExpr;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.alibaba.druid.bvt.sql.oracle.issues;

import java.util.List;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLParseAssertUtil;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;

import org.junit.Test;

import static org.junit.Assert.assertEquals;

/**
* @author lizongbo
* @see <a href="https://github.com/alibaba/druid/issues/5891>Issue来源</a>
* @see <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Comparison-Conditions.html">Comparison Conditions</a>
*/
public class Issue5891 {

@Test
public void test_parse_any() {
for (DbType dbType : new DbType[]{DbType.oracle}) {
for (String sql : new String[]{
//"SELECT * FROM tbl_name WHERE col > ANY (1, 5, 10);",
"SELECT * FROM tbl_name WHERE col > SOME (1, 5, 10);",
"SELECT * FROM tbl_name WHERE col = ANY ('1', '5', '10');",
"SELECT * FROM tbl_name WHERE col = SOME ('1', '5', '10');",

"SELECT * FROM employees\n"
+ " WHERE salary = ANY\n"
+ " (SELECT salary \n"
+ " FROM employees\n"
+ " WHERE department_id = 30)\n"
+ " ORDER BY employee_id;",
"SELECT * FROM employees\n"
+ " WHERE salary >= ALL\n"
+ " (SELECT salary \n"
+ " FROM employees\n"
+ " WHERE department_id = 30)\n"
+ " ORDER BY employee_id;",
"SELECT * FROM employees\n"
+ " WHERE salary >=\n"
+ " ALL (1400, 3000)\n"
+ " ORDER BY employee_id;",
}) {
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
List<SQLStatement> statementList = parser.parseStatementList();
assertEquals(1, statementList.size());
SQLParseAssertUtil.assertParseSql(sql, dbType);
}
}
}
}

0 comments on commit 70c3bcf

Please sign in to comment.