Skip to content

Commit

Permalink
refactored outer not from sqlconditions, regularconditions to condition
Browse files Browse the repository at this point in the history
  • Loading branch information
wumpz committed Feb 3, 2019
1 parent ba3bf22 commit 1956b84
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 18 deletions.
30 changes: 17 additions & 13 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -2151,32 +2151,34 @@ Expression Condition():
{
Expression result;
Token token;
boolean not = false;
}
{
[ <K_NOT> { not = true; }]
(LOOKAHEAD(SQLCondition()) result=SQLCondition()
| LOOKAHEAD(RegularCondition()) result=RegularCondition()
| LOOKAHEAD(Function()) result=Function()
| <K_NOT> result=Column() { result = new NotExpression(result); }
/* | <K_NOT> result=Column() { result = new NotExpression(result); } */
| result=Column()
| LOOKAHEAD({ "0".equals(getToken(1).image) || "1".equals(getToken(1).image) }) token=<S_LONG> { result = new LongValue(token.image); }
)

{ return result; }
{ return not?new NotExpression(result):result; }
}

Expression RegularCondition() #RegularCondition:
{
Expression result = null;
Expression leftExpression;
Expression rightExpression;
boolean not = false;
//boolean not = false;
int oracleJoin=EqualsTo.NO_ORACLE_JOIN;
int oraclePrior=EqualsTo.NO_ORACLE_PRIOR;
boolean binary = false;
}
{
[ LOOKAHEAD(2) <K_PRIOR> { oraclePrior = EqualsTo.ORACLE_PRIOR_START; }]
[ <K_NOT> { not = true; } ]
//[ <K_NOT> { not = true; } ]
leftExpression=ComparisonItem() { result = leftExpression; }

[ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_RIGHT; } ]
Expand Down Expand Up @@ -2216,8 +2218,8 @@ Expression RegularCondition() #RegularCondition:
BinaryExpression regCond = (BinaryExpression) result;
regCond.setLeftExpression(leftExpression);
regCond.setRightExpression(rightExpression);
if (not)
regCond.setNot();
//if (not)
// regCond.setNot();

if (oracleJoin>0)
((SupportsOldOracleJoinSyntax)result).setOldOracleJoinSyntax(oracleJoin);
Expand Down Expand Up @@ -2300,18 +2302,19 @@ Expression LikeExpression() #LikeExpression:
Expression rightExpression = null;
}
{
(
LOOKAHEAD(3) (
//(
//LOOKAHEAD(3)
(
leftExpression=SimpleExpression()
[<K_NOT> { result.setNot(); } ] ( <K_LIKE> | <K_ILIKE> { result.setCaseInsensitive(true); } ) rightExpression=SimpleExpression()
[<K_ESCAPE> token=<S_CHAR_LITERAL> { result.setEscape((new StringValue(token.image)).getValue()); }]
)
|
/* |
(
[<K_NOT> { result.setNot(); } ] leftExpression=SimpleExpression() ( <K_LIKE> | <K_ILIKE> { result.setCaseInsensitive(true); } ) rightExpression=SimpleExpression()
[<K_ESCAPE> token=<S_CHAR_LITERAL> { result.setEscape((new StringValue(token.image)).getValue()); }]
)
)
)*/
{
result.setLeftExpression(leftExpression);
result.setRightExpression(rightExpression);
Expand All @@ -2327,9 +2330,9 @@ Expression IsNullExpression():
}
{
(
<K_NOT> { result.setNot(true); } leftExpression=SimpleExpression()
/* <K_NOT> { result.setNot(true); } leftExpression=SimpleExpression()
( <K_ISNULL> { result.setUseIsNull(true); } | <K_IS> <K_NULL> )
|
| */
leftExpression=SimpleExpression()
(<K_ISNULL> { result.setUseIsNull(true); } | <K_IS> [<K_NOT> { result.setNot(true); } ] <K_NULL> )
)
Expand All @@ -2346,7 +2349,8 @@ Expression ExistsExpression():
Expression rightExpression = null;
}
{
[<K_NOT> { result.setNot(true); } ] <K_EXISTS> rightExpression=SimpleExpression()
// [<K_NOT> { result.setNot(true); } ]
<K_EXISTS> rightExpression=SimpleExpression()
{
result.setRightExpression(rightExpression);
return result;
Expand Down
12 changes: 7 additions & 5 deletions src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1307,9 +1307,11 @@ public void testNotLikeWithNotBeforeExpression() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE NOT a LIKE 'test'";
Select select = (Select) parserManager.parse(new StringReader(statement));
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()).
assertTrue(plainSelect.getWhere() instanceof NotExpression);
NotExpression notExpr = (NotExpression) plainSelect.getWhere();
assertEquals("test", ((StringValue) ((LikeExpression) notExpr.getExpression()).
getRightExpression()).getValue());
assertEquals(true, (boolean) ((LikeExpression) plainSelect.getWhere()).isNot());
assertEquals(false, (boolean) ((LikeExpression) notExpr.getExpression()).isNot());
}

@Test
Expand Down Expand Up @@ -1664,7 +1666,7 @@ public void testIsNot2() throws JSQLParserException {
//the deparser delivers always a IS NOT NULL even for NOT a IS NULL
String stmt = "SELECT * FROM test WHERE NOT a IS NULL";
Statement parsed = parserManager.parse(new StringReader(stmt));
assertStatementCanBeDeparsedAs(parsed, "SELECT * FROM test WHERE a IS NOT NULL");
assertStatementCanBeDeparsedAs(parsed, "SELECT * FROM test WHERE NOT a IS NULL");
}

@Test
Expand Down Expand Up @@ -3316,12 +3318,12 @@ public void testTopKeyWord3() throws JSQLParserException {

@Test
public void testNotProblem1() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("select * from col where not v in (1,2,3,4,5,6,7)");
assertSqlCanBeParsedAndDeparsed("SELECT * FROM col WHERE NOT v IN (1, 2, 3, 4, 5, 6, 7)");
}

@Test
public void testNotProblem2() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("select * from col where not func(5)");
assertSqlCanBeParsedAndDeparsed("SELECT * FROM col WHERE NOT func(5)");
}

@Test
Expand Down

0 comments on commit 1956b84

Please sign in to comment.