Skip to content

Commit 7b4feb0

Browse files
committed
Refactored Oracle Hint tests, added set selects
1 parent f7f8d03 commit 7b4feb0

File tree

2 files changed

+56
-52
lines changed

2 files changed

+56
-52
lines changed

src/test/java/net/sf/jsqlparser/test/TestUtils.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@
2727
import java.io.*;
2828

2929
import static junit.framework.Assert.assertEquals;
30+
import static junit.framework.TestCase.assertEquals;
31+
import static junit.framework.TestCase.assertNotNull;
32+
import net.sf.jsqlparser.statement.select.PlainSelect;
33+
import net.sf.jsqlparser.statement.select.Select;
34+
import net.sf.jsqlparser.statement.select.SelectBody;
35+
import net.sf.jsqlparser.statement.select.SetOperationList;
36+
import org.junit.Assert;
3037
import org.junit.Test;
3138

3239
/**
@@ -90,4 +97,32 @@ public static void assertExpressionCanBeDeparsedAs(final Expression parsed, Stri
9097

9198
assertEquals(expression, stringBuilder.toString());
9299
}
100+
101+
public static void assertOracleHintExists(String sql, boolean assertDeparser, String... hints) throws JSQLParserException {
102+
if (assertDeparser) {
103+
assertSqlCanBeParsedAndDeparsed(sql, true);
104+
}
105+
Select stmt = (Select) CCJSqlParserUtil.parse(sql);
106+
if (stmt.getSelectBody() instanceof PlainSelect) {
107+
PlainSelect ps = (PlainSelect) stmt.getSelectBody();
108+
OracleHint hint = ps.getOracleHint();
109+
assertNotNull(hint);
110+
assertEquals(hints[0], hint.getValue());
111+
} else {
112+
if (stmt.getSelectBody() instanceof SetOperationList) {
113+
SetOperationList setop = (SetOperationList) stmt.getSelectBody();
114+
for (int i = 0; i < setop.getSelects().size(); i++) {
115+
PlainSelect pselect = (PlainSelect) setop.getSelects().get(i);
116+
OracleHint hint = pselect.getOracleHint();
117+
if (hints[i] == null) {
118+
Assert.assertNull(hint);
119+
} else {
120+
assertNotNull(hint);
121+
assertEquals(hints[i], hint.getValue());
122+
}
123+
}
124+
}
125+
}
126+
}
127+
93128
}

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

Lines changed: 21 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,67 +1960,36 @@ public void testIssue77_singleQuoteEscape2() throws JSQLParserException {
19601960
}
19611961

19621962
public void testOracleHint() throws JSQLParserException {
1963-
String[][] sqls = new String[][] {
1964-
{"SOMEHINT", "SELECT /*+ SOMEHINT */ * FROM mytable",
1965-
"true"},
1966-
{"MORE HINTS POSSIBLE", "SELECT /*+ MORE HINTS POSSIBLE */ * FROM mytable",
1967-
"true"},
1968-
{"MORE\nHINTS\t\nPOSSIBLE", "SELECT /*+ MORE\nHINTS\t\nPOSSIBLE */ * FROM mytable",
1969-
"true"},
1970-
{"leading(sn di md sh ot) cardinality(ot 1000)", "SELECT /*+ leading(sn di md sh ot) cardinality(ot 1000) */ c, b FROM mytable",
1971-
"true"},
1972-
{"ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" +
1973-
" USE_NL (glcc glf) USE_MERGE (gp gsb)",
1974-
"SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" +
1963+
assertOracleHintExists("SELECT /*+ SOMEHINT */ * FROM mytable", true, "SOMEHINT");
1964+
assertOracleHintExists("SELECT /*+ MORE HINTS POSSIBLE */ * FROM mytable", true, "MORE HINTS POSSIBLE");
1965+
assertOracleHintExists("SELECT /*+ MORE\nHINTS\t\nPOSSIBLE */ * FROM mytable", true, "MORE\nHINTS\t\nPOSSIBLE");
1966+
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)");
1967+
assertOracleHintExists("SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" +
19751968
" USE_NL (glcc glf) USE_MERGE (gp gsb) */\n" +
1976-
" b.application_id ,\n" +
1977-
" b.set_of_books_id ,\n" +
1978-
" b.personnel_id,\n" +
1979-
" p.vendor_id Personnel,\n" +
1980-
" p.segment1 PersonnelNumber,\n" +
1981-
" p.vendor_name Name\n" +
1969+
" b.application_id\n" +
19821970
"FROM jl_br_journals j,\n" +
1983-
" jl_br_balances b,\n" +
1984-
" gl_code_combinations glcc,\n" +
1985-
" fnd_flex_values_vl glf,\n" +
1986-
" gl_periods gp,\n" +
1987-
" gl_sets_of_books gsb,\n" +
1988-
" po_vendors p",
1989-
"true" },
1990-
{"ROWID(emp)", "SELECT /*+ROWID(emp)*/ /*+ THIS IS NOT HINT! ***/ * \n" +
1971+
" po_vendors p", true, "ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" +
1972+
" USE_NL (glcc glf) USE_MERGE (gp gsb)");
1973+
assertOracleHintExists("SELECT /*+ROWID(emp)*/ /*+ THIS IS NOT HINT! ***/ * \n" +
19911974
"FROM emp \n" +
1992-
"WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND empno = 155",
1993-
"false"},
1994-
{"INDEX(patients sex_index) use sex_index because there are few\n" +
1995-
" male patients", "SELECT /*+ INDEX(patients sex_index) use sex_index because there are few\n" +
1975+
"WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND empno = 155", false, "ROWID(emp)");
1976+
assertOracleHintExists("SELECT /*+ INDEX(patients sex_index) use sex_index because there are few\n" +
19961977
" male patients */ name, height, weight\n" +
19971978
"FROM patients\n" +
1998-
"WHERE sex = 'm'",
1999-
"true"},
2000-
{"INDEX_COMBINE(emp sal_bmi hiredate_bmi)", "SELECT /*+INDEX_COMBINE(emp sal_bmi hiredate_bmi)*/ * \n" +
1979+
"WHERE sex = 'm'", true, "INDEX(patients sex_index) use sex_index because there are few\n male patients");
1980+
assertOracleHintExists("SELECT /*+INDEX_COMBINE(emp sal_bmi hiredate_bmi)*/ * \n" +
20011981
"FROM emp \n" +
2002-
"WHERE sal < 50000 AND hiredate < '01-JAN-1990'",
2003-
"true"},
2004-
{"CLUSTER", "SELECT --+ CLUSTER \n" +
1982+
"WHERE sal < 50000 AND hiredate < '01-JAN-1990'", true, "INDEX_COMBINE(emp sal_bmi hiredate_bmi)");
1983+
assertOracleHintExists("SELECT --+ CLUSTER \n" +
20051984
"emp.ename, deptno\n" +
20061985
"FROM emp, dept\n" +
20071986
"WHERE deptno = 10 \n" +
2008-
"AND emp.deptno = dept.deptno",
2009-
"true"},
2010-
{"CLUSTER", "SELECT --+ CLUSTER \n --+ some other comment, not hint\n /* even more comments */ * from dual",
2011-
"false"}
2012-
};
2013-
2014-
for (String[] sql: sqls) {
2015-
if (Boolean.parseBoolean(sql[2])) {
2016-
assertSqlCanBeParsedAndDeparsed(sql[1], true);
2017-
}
2018-
Select select = (Select) CCJSqlParserUtil.parse(sql[1]);
2019-
PlainSelect pselect = (PlainSelect) select.getSelectBody();
2020-
OracleHint hint = pselect.getOracleHint();
2021-
assertNotNull(hint);
2022-
assertEquals(sql[0], hint.getValue());
2023-
}
1987+
"AND emp.deptno = dept.deptno", true, "CLUSTER");
1988+
assertOracleHintExists("SELECT --+ CLUSTER \n --+ some other comment, not hint\n /* even more comments */ * from dual", false, "CLUSTER");
1989+
assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual)", true, null, "CLUSTER");
1990+
assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual) UNION (select * from dual)", true, null, "CLUSTER", null);
1991+
assertOracleHintExists("(SELECT --+ HINT1 HINT2 HINT3\n * from t1) UNION (select /*+ HINT4 HINT5 */ * from dual)", true, "HINT1 HINT2 HINT3", "HINT4 HINT5");
1992+
20241993
}
20251994

20261995
}

0 commit comments

Comments
 (0)