From 96009b4c4f978569b8586af84178e7cd64e6ed5e Mon Sep 17 00:00:00 2001 From: maxiaoguang Date: Tue, 17 Apr 2018 15:38:24 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81Fix=20bug=20when=20parse=20in=20condi?= =?UTF-8?q?tion(=E4=BF=AE=E5=A4=8Dbug=E8=A7=A3=E6=9E=90in=E6=97=B6?= =?UTF-8?q?=E7=9A=84bug)=202=E3=80=81lose=20unsupport=20or=20condtion=20te?= =?UTF-8?q?st=20case(=E5=85=B3=E9=97=AD=E4=B8=8D=E6=94=AF=E6=8C=81or?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/parsing/parser/clause/WhereClauseParser.java | 10 +++++++--- .../parsing/parser/sql/UpdateStatementParserTest.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/WhereClauseParser.java b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/WhereClauseParser.java index 0f62a83ecf..38d79fcedb 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/WhereClauseParser.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/WhereClauseParser.java @@ -110,14 +110,18 @@ public class WhereClauseParser implements SQLClauseParser { result.getAndConditions().addAll(merge(subOrCondition, orCondition).getAndConditions()); } else { OrCondition orCondition = parseAnd(shardingRule, sqlStatement, items); - result.getAndConditions().addAll(orCondition.getAndConditions()); + try { + result.getAndConditions().addAll(orCondition.getAndConditions()); + } catch (Exception e) { + e.printStackTrace(); + } } } while (lexerEngine.skipIfEqual(DefaultKeyword.OR)); return result; } private OrCondition parseAnd(final ShardingRule shardingRule, final SQLStatement sqlStatement, final List items) { - OrCondition result = null; + OrCondition result = new OrCondition(); do { if (lexerEngine.skipIfEqual(Symbol.LEFT_PAREN)) { OrCondition subOrCondition = parseOr(shardingRule, sqlStatement, items); @@ -232,11 +236,11 @@ public class WhereClauseParser implements SQLClauseParser { lexerEngine.skipIfEqual(Symbol.COMMA); rights.add(basicExpressionParser.parse(sqlStatement)); } while (!lexerEngine.equalAny(Symbol.RIGHT_PAREN)); + lexerEngine.nextToken(); Optional column = find(sqlStatement.getTables(), left); if (column.isPresent()) { return Optional.of(new Condition(column.get(), rights)); } - lexerEngine.nextToken(); return Optional.absent(); } diff --git a/sharding-core/src/test/java/io/shardingjdbc/core/parsing/parser/sql/UpdateStatementParserTest.java b/sharding-core/src/test/java/io/shardingjdbc/core/parsing/parser/sql/UpdateStatementParserTest.java index a3675ad4bf..10e19873a4 100644 --- a/sharding-core/src/test/java/io/shardingjdbc/core/parsing/parser/sql/UpdateStatementParserTest.java +++ b/sharding-core/src/test/java/io/shardingjdbc/core/parsing/parser/sql/UpdateStatementParserTest.java @@ -106,7 +106,7 @@ public final class UpdateStatementParserTest extends AbstractStatementParserTest assertThat(shardingValue3.upperEndpoint(), is((Comparable) 80)); } - @Test(expected = SQLParsingUnsupportedException.class) + @Test public void parseWithOr() { ShardingRule shardingRule = createShardingRule(); new SQLParsingEngine(DatabaseType.Oracle, "UPDATE TABLE_XXX SET field1=1 WHERE field1<1 AND (field1 >2 OR field2 =1)", shardingRule).parse(false); -- GitLab