Skip to content

Commit 7f8b59b

Browse files
committed
fixes #240
fixes #241
1 parent 3dfae9c commit 7f8b59b

File tree

2 files changed

+103
-70
lines changed

2 files changed

+103
-70
lines changed

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ String RelObjectName() :
667667
| tk=<K_ROW> | tk=<K_ROWS> | tk=<K_SIBLINGS> | tk=<K_VALUE> | tk=<K_XML>
668668
| tk=<K_COLUMN> | tk=<K_REPLACE> | tk=<K_TRUNCATE> | tk=<K_KEY> | tk=<K_ANY>
669669
| tk=<K_OPEN> | tk=<K_OVER> | tk=<K_VALUES> | tk=<K_PERCENT> | tk=<K_PRIOR>
670-
| tk=<K_SEPARATOR> | tk=<K_NO> | tk=<K_ACTION> | tk=<K_CASCADE>
670+
| tk=<K_SEPARATOR> | tk=<K_NO> | tk=<K_ACTION> | tk=<K_CASCADE> | tk=<K_END>
671671
)
672672

673673
{ return tk.image; }
@@ -1577,12 +1577,14 @@ Expression AndExpression() :
15771577
Expression Condition():
15781578
{
15791579
Expression result;
1580+
Token token;
15801581
}
15811582
{
15821583
(LOOKAHEAD(SQLCondition()) result=SQLCondition()
15831584
| LOOKAHEAD(RegularCondition()) result=RegularCondition()
15841585
| LOOKAHEAD(Function()) result=Function()
15851586
| result=Column()
1587+
| LOOKAHEAD({ "0".equals(getToken(1).image) || "1".equals(getToken(1).image) }) token=<S_LONG> { result = new LongValue(token.image); }
15861588
)
15871589

15881590
{ return result; }

src/test/java/net/sf/jsqlparser/test/select/SelectTest.java

Lines changed: 100 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
import java.io.*;
1515
import java.util.*;
16+
import java.util.logging.Level;
17+
import java.util.logging.Logger;
1618

1719
import static net.sf.jsqlparser.test.TestUtils.*;
1820

@@ -879,7 +881,7 @@ public void testTime() throws JSQLParserException {
879881
(((TimeValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()).getValue()).toString());
880882
assertStatementCanBeDeparsedAs(select, statement);
881883
}
882-
884+
883885
public void testBetweenDate() throws JSQLParserException {
884886
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE col BETWEEN {d '2015-09-19'} AND {d '2015-09-24'}");
885887
}
@@ -1604,17 +1606,17 @@ public void testInterval3() throws JSQLParserException {
16041606
String stmt = "SELECT 5 + INTERVAL '3' day";
16051607
assertSqlCanBeParsedAndDeparsed(stmt);
16061608
}
1607-
1609+
16081610
public void testInterval4() throws JSQLParserException {
16091611
String stmt = "SELECT '2008-12-31 23:59:59' + INTERVAL 1 SECOND";
16101612
assertSqlCanBeParsedAndDeparsed(stmt);
16111613
}
1612-
1614+
16131615
public void testInterval5_Issue228() throws JSQLParserException {
16141616
assertSqlCanBeParsedAndDeparsed("SELECT ADDDATE(timeColumn1, INTERVAL 420 MINUTES) AS timeColumn1 FROM tbl");
16151617
assertSqlCanBeParsedAndDeparsed("SELECT ADDDATE(timeColumn1, INTERVAL -420 MINUTES) AS timeColumn1 FROM tbl");
16161618
}
1617-
1619+
16181620
public void testMultiValueIn() throws JSQLParserException {
16191621
String stmt = "SELECT * FROM mytable WHERE (a, b, c) IN (SELECT a, b, c FROM mytable2)";
16201622
assertSqlCanBeParsedAndDeparsed(stmt);
@@ -1766,7 +1768,7 @@ public void testOracleHierarchicalQuery4() throws JSQLParserException {
17661768
String stmt = "SELECT last_name, employee_id, manager_id, LEVEL FROM employees CONNECT BY PRIOR employee_id = manager_id START WITH employee_id = 100 ORDER SIBLINGS BY last_name";
17671769
assertSqlCanBeParsedAndDeparsed(stmt);
17681770
}
1769-
1771+
17701772
public void testOracleHierarchicalQueryIssue196() throws JSQLParserException {
17711773
String stmt = "SELECT num1, num2, level FROM carol_tmp START WITH num2 = 1008 CONNECT BY num2 = PRIOR num1 ORDER BY level DESC";
17721774
assertSqlCanBeParsedAndDeparsed(stmt);
@@ -1802,7 +1804,7 @@ public void testReservedKeyword2() throws JSQLParserException {
18021804
final String stmt = "SELECT open FROM tableName";
18031805
assertSqlCanBeParsedAndDeparsed(stmt);
18041806
}
1805-
1807+
18061808
public void testReservedKeyword3() throws JSQLParserException {
18071809
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable1 t JOIN mytable2 AS prior ON t.id = prior.id");
18081810
}
@@ -1856,7 +1858,7 @@ public void testSelectOracleColl() throws JSQLParserException {
18561858
public void testSelectInnerWith() throws JSQLParserException {
18571859
assertSqlCanBeParsedAndDeparsed("SELECT * FROM (WITH actor AS (SELECT 'a' aid FROM DUAL) SELECT aid FROM actor)");
18581860
}
1859-
1861+
18601862
public void testSelectWithinGroup() throws JSQLParserException {
18611863
assertSqlCanBeParsedAndDeparsed("SELECT LISTAGG(col1, '##') WITHIN GROUP (ORDER BY col1) FROM table1");
18621864
}
@@ -1944,68 +1946,68 @@ public void testIssue160_signedParameter() throws JSQLParserException {
19441946
public void testIssue160_signedParameter2() throws JSQLParserException {
19451947
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE -? = 5");
19461948
}
1947-
1949+
19481950
public void testIssue162_doubleUserVar() throws JSQLParserException {
19491951
assertSqlCanBeParsedAndDeparsed("SELECT @@SPID AS ID, SYSTEM_USER AS \"Login Name\", USER AS \"User Name\"");
19501952
}
1951-
1952-
public void testIssue167_singleQuoteEscape() throws JSQLParserException {
1953+
1954+
public void testIssue167_singleQuoteEscape() throws JSQLParserException {
19531955
assertSqlCanBeParsedAndDeparsed("SELECT 'a'");
1954-
assertSqlCanBeParsedAndDeparsed("SELECT ''''");
1955-
assertSqlCanBeParsedAndDeparsed("SELECT '\\''");
1956-
assertSqlCanBeParsedAndDeparsed("SELECT 'ab''ab'");
1957-
assertSqlCanBeParsedAndDeparsed("SELECT 'ab\\'ab'");
1958-
}
1959-
1960-
/**
1961-
* These are accepted due to reading one backslash and a double quote.
1962-
*/
1963-
public void testIssue167_singleQuoteEscape2() throws JSQLParserException {
1964-
assertSqlCanBeParsedAndDeparsed("SELECT '\\'''");
1965-
assertSqlCanBeParsedAndDeparsed("SELECT '\\\\''");
1966-
}
1967-
1968-
public void testIssue77_singleQuoteEscape2() throws JSQLParserException {
1969-
assertSqlCanBeParsedAndDeparsed("SELECT 'test\\'' FROM dual");
1970-
}
1971-
1956+
assertSqlCanBeParsedAndDeparsed("SELECT ''''");
1957+
assertSqlCanBeParsedAndDeparsed("SELECT '\\''");
1958+
assertSqlCanBeParsedAndDeparsed("SELECT 'ab''ab'");
1959+
assertSqlCanBeParsedAndDeparsed("SELECT 'ab\\'ab'");
1960+
}
1961+
1962+
/**
1963+
* These are accepted due to reading one backslash and a double quote.
1964+
*/
1965+
public void testIssue167_singleQuoteEscape2() throws JSQLParserException {
1966+
assertSqlCanBeParsedAndDeparsed("SELECT '\\'''");
1967+
assertSqlCanBeParsedAndDeparsed("SELECT '\\\\''");
1968+
}
1969+
1970+
public void testIssue77_singleQuoteEscape2() throws JSQLParserException {
1971+
assertSqlCanBeParsedAndDeparsed("SELECT 'test\\'' FROM dual");
1972+
}
1973+
19721974
public void testIssue223_singleQuoteEscape() throws JSQLParserException {
1973-
assertSqlCanBeParsedAndDeparsed("SELECT '\\'test\\''");
1974-
}
1975-
1975+
assertSqlCanBeParsedAndDeparsed("SELECT '\\'test\\''");
1976+
}
1977+
19761978
public void testOracleHint() throws JSQLParserException {
19771979
assertOracleHintExists("SELECT /*+ SOMEHINT */ * FROM mytable", true, "SOMEHINT");
19781980
assertOracleHintExists("SELECT /*+ MORE HINTS POSSIBLE */ * FROM mytable", true, "MORE HINTS POSSIBLE");
19791981
assertOracleHintExists("SELECT /*+ MORE\nHINTS\t\nPOSSIBLE */ * FROM mytable", true, "MORE\nHINTS\t\nPOSSIBLE");
19801982
assertOracleHintExists("SELECT /*+ leading(sn di md sh ot) cardinality(ot 1000) */ c, b FROM mytable", true, "leading(sn di md sh ot) cardinality(ot 1000)");
1981-
assertOracleHintExists("SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" +
1982-
" USE_NL (glcc glf) USE_MERGE (gp gsb) */\n" +
1983-
" b.application_id\n" +
1984-
"FROM jl_br_journals j,\n" +
1985-
" po_vendors p", true, "ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" +
1986-
" USE_NL (glcc glf) USE_MERGE (gp gsb)");
1987-
assertOracleHintExists("SELECT /*+ROWID(emp)*/ /*+ THIS IS NOT HINT! ***/ * \n" +
1988-
"FROM emp \n" +
1989-
"WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND empno = 155", false, "ROWID(emp)");
1990-
assertOracleHintExists("SELECT /*+ INDEX(patients sex_index) use sex_index because there are few\n" +
1991-
" male patients */ name, height, weight\n" +
1992-
"FROM patients\n" +
1993-
"WHERE sex = 'm'", true, "INDEX(patients sex_index) use sex_index because there are few\n male patients");
1994-
assertOracleHintExists("SELECT /*+INDEX_COMBINE(emp sal_bmi hiredate_bmi)*/ * \n" +
1995-
"FROM emp \n" +
1996-
"WHERE sal < 50000 AND hiredate < '01-JAN-1990'", true, "INDEX_COMBINE(emp sal_bmi hiredate_bmi)");
1997-
assertOracleHintExists("SELECT --+ CLUSTER \n" +
1998-
"emp.ename, deptno\n" +
1999-
"FROM emp, dept\n" +
2000-
"WHERE deptno = 10 \n" +
2001-
"AND emp.deptno = dept.deptno", true, "CLUSTER");
1983+
assertOracleHintExists("SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n"
1984+
+ " USE_NL (glcc glf) USE_MERGE (gp gsb) */\n"
1985+
+ " b.application_id\n"
1986+
+ "FROM jl_br_journals j,\n"
1987+
+ " po_vendors p", true, "ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n"
1988+
+ " USE_NL (glcc glf) USE_MERGE (gp gsb)");
1989+
assertOracleHintExists("SELECT /*+ROWID(emp)*/ /*+ THIS IS NOT HINT! ***/ * \n"
1990+
+ "FROM emp \n"
1991+
+ "WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND empno = 155", false, "ROWID(emp)");
1992+
assertOracleHintExists("SELECT /*+ INDEX(patients sex_index) use sex_index because there are few\n"
1993+
+ " male patients */ name, height, weight\n"
1994+
+ "FROM patients\n"
1995+
+ "WHERE sex = 'm'", true, "INDEX(patients sex_index) use sex_index because there are few\n male patients");
1996+
assertOracleHintExists("SELECT /*+INDEX_COMBINE(emp sal_bmi hiredate_bmi)*/ * \n"
1997+
+ "FROM emp \n"
1998+
+ "WHERE sal < 50000 AND hiredate < '01-JAN-1990'", true, "INDEX_COMBINE(emp sal_bmi hiredate_bmi)");
1999+
assertOracleHintExists("SELECT --+ CLUSTER \n"
2000+
+ "emp.ename, deptno\n"
2001+
+ "FROM emp, dept\n"
2002+
+ "WHERE deptno = 10 \n"
2003+
+ "AND emp.deptno = dept.deptno", true, "CLUSTER");
20022004
assertOracleHintExists("SELECT --+ CLUSTER \n --+ some other comment, not hint\n /* even more comments */ * from dual", false, "CLUSTER");
20032005
assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual)", true, null, "CLUSTER");
20042006
assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual) UNION (select * from dual)", true, null, "CLUSTER", null);
20052007
assertOracleHintExists("(SELECT --+ HINT1 HINT2 HINT3\n * from t1) UNION (select /*+ HINT4 HINT5 */ * from dual)", true, "HINT1 HINT2 HINT3", "HINT4 HINT5");
20062008

20072009
}
2008-
2010+
20092011
public void testOracleHintExpression() throws JSQLParserException {
20102012
String statement = "SELECT --+ HINT\n * FROM tab1";
20112013
Statement parsed = parserManager.parse(new StringReader(statement));
@@ -2076,56 +2078,85 @@ public void testTableFunctionWithAlias() throws Exception {
20762078
assertEquals("z", fromItem.getAlias().getName());
20772079
assertStatementCanBeDeparsedAs(select, statement);
20782080
}
2079-
2081+
20802082
public void testIssue151_tableFunction() throws JSQLParserException {
2081-
assertSqlCanBeParsedAndDeparsed("SELECT * FROM tables a LEFT JOIN getdata() b ON a.id = b.id");
2082-
}
2083-
2083+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM tables a LEFT JOIN getdata() b ON a.id = b.id");
2084+
}
2085+
20842086
public void testIssue217_keywordSeparator() throws JSQLParserException {
20852087
assertSqlCanBeParsedAndDeparsed("SELECT Separator");
20862088
}
2087-
2089+
20882090
public void testIssue215_possibleEndlessParsing() throws JSQLParserException {
20892091
assertSqlCanBeParsedAndDeparsed("SELECT (CASE WHEN ((value LIKE '%t1%') OR (value LIKE '%t2%')) THEN 't1s' WHEN ((((((((((((((((((((((((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%')) OR (value LIKE '%t6%')) OR (value LIKE '%t6%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t8%')) OR (value LIKE '%t8%')) OR (value LIKE '%CTO%')) OR (value LIKE '%cto%')) OR (value LIKE '%Cto%')) OR (value LIKE '%t9%')) OR (value LIKE '%t9%')) OR (value LIKE '%COO%')) OR (value LIKE '%coo%')) OR (value LIKE '%Coo%')) OR (value LIKE '%t10%')) OR (value LIKE '%t10%')) OR (value LIKE '%CIO%')) OR (value LIKE '%cio%')) OR (value LIKE '%Cio%')) OR (value LIKE '%t11%')) OR (value LIKE '%t11%')) THEN 't' WHEN ((((value LIKE '%t12%') OR (value LIKE '%t12%')) OR (value LIKE '%VP%')) OR (value LIKE '%vp%')) THEN 'Vice t12s' WHEN ((((((value LIKE '% IT %') OR (value LIKE '%t13%')) OR (value LIKE '%t13%')) OR (value LIKE '% it %')) OR (value LIKE '%tech%')) OR (value LIKE '%Tech%')) THEN 'IT' WHEN ((((value LIKE '%Analyst%') OR (value LIKE '%t14%')) OR (value LIKE '%Analytic%')) OR (value LIKE '%analytic%')) THEN 'Analysts' WHEN ((value LIKE '%Manager%') OR (value LIKE '%manager%')) THEN 't15' ELSE 'Other' END) FROM tab1");
20902092
}
2091-
2093+
20922094
public void testIssue215_possibleEndlessParsing2() throws JSQLParserException {
20932095
assertSqlCanBeParsedAndDeparsed("SELECT (CASE WHEN ((value LIKE '%t1%') OR (value LIKE '%t2%')) THEN 't1s' ELSE 'Other' END) FROM tab1");
20942096
}
2095-
2097+
20962098
public void testIssue215_possibleEndlessParsing3() throws JSQLParserException {
20972099
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE ((((((((((((((((((((((((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%')) OR (value LIKE '%t6%')) OR (value LIKE '%t6%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t8%')) OR (value LIKE '%t8%')) OR (value LIKE '%CTO%')) OR (value LIKE '%cto%')) OR (value LIKE '%Cto%')) OR (value LIKE '%t9%')) OR (value LIKE '%t9%')) OR (value LIKE '%COO%')) OR (value LIKE '%coo%')) OR (value LIKE '%Coo%')) OR (value LIKE '%t10%')) OR (value LIKE '%t10%')) OR (value LIKE '%CIO%')) OR (value LIKE '%cio%')) OR (value LIKE '%Cio%')) OR (value LIKE '%t11%')) OR (value LIKE '%t11%'))");
20982100
}
2099-
2101+
21002102
public void testIssue215_possibleEndlessParsing4() throws JSQLParserException {
21012103
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE ((value LIKE '%t3%') OR (value LIKE '%t3%'))");
2102-
}
2103-
2104+
}
2105+
21042106
public void testIssue215_possibleEndlessParsing5() throws JSQLParserException {
21052107
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE ((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%'))");
21062108
}
2107-
2109+
21082110
public void testIssue215_possibleEndlessParsing6() throws JSQLParserException {
21092111
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (((((((((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%')) OR (value LIKE '%t6%')) OR (value LIKE '%t6%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t8%')) OR (value LIKE '%t8%'))");
21102112
}
2111-
2113+
21122114
public void testIssue215_possibleEndlessParsing7() throws JSQLParserException {
21132115
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (((((((((((((((((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%')) OR (value LIKE '%t6%')) OR (value LIKE '%t6%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t8%')) OR (value LIKE '%t8%')) OR (value LIKE '%CTO%')) OR (value LIKE '%cto%')) OR (value LIKE '%Cto%')) OR (value LIKE '%t9%')) OR (value LIKE '%t9%')) OR (value LIKE '%COO%')) OR (value LIKE '%coo%')) OR (value LIKE '%Coo%'))");
21142116
}
2115-
2117+
21162118
public void testIssue230_cascadeKeyword() throws JSQLParserException {
21172119
assertSqlCanBeParsedAndDeparsed("SELECT t.cascade AS cas FROM t");
21182120
}
2119-
2121+
21202122
public void testBooleanValue() throws JSQLParserException {
21212123
assertSqlCanBeParsedAndDeparsed("SELECT col FROM t WHERE a");
21222124
}
2123-
2125+
21242126
public void testBooleanValue2() throws JSQLParserException {
21252127
assertSqlCanBeParsedAndDeparsed("SELECT col FROM t WHERE 3 < 5 AND a");
21262128
}
2127-
2129+
21282130
public void testNotWithoutParenthesisIssue234() throws JSQLParserException {
21292131
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM \"Persons\" WHERE NOT \"F_NAME\" = 'John'");
21302132
}
2133+
2134+
public void testWhereIssue240_1() throws JSQLParserException {
2135+
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE 1");
2136+
}
2137+
2138+
public void testWhereIssue240_0() throws JSQLParserException {
2139+
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE 0");
2140+
}
2141+
2142+
public void testWhereIssue240_notBoolean() {
2143+
try {
2144+
CCJSqlParserUtil.parse("SELECT count(*) FROM mytable WHERE 5");
2145+
fail("should not be parsed");
2146+
} catch (JSQLParserException ex) {
2147+
2148+
}
2149+
}
2150+
2151+
public void testWhereIssue240_true() throws JSQLParserException {
2152+
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE true");
2153+
}
2154+
2155+
public void testWhereIssue240_false() throws JSQLParserException {
2156+
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE false");
2157+
}
2158+
2159+
public void testWhereIssue241KeywordEnd() throws JSQLParserException {
2160+
assertSqlCanBeParsedAndDeparsed("SELECT l.end FROM lessons l");
2161+
}
21312162
}

0 commit comments

Comments
 (0)