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 0f62a83ecfff5ef2e55de76f29360d30018d2a0e..38d79fcedbf3f988a89fc9238a6afbe2d079bbd8 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 a3675ad4bff5cb7beb53f1fc2d76101445f46b4b..10e19873a401c9a68540060d705dc4ef830fd6dd 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);