/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.query.parser;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.teiid.api.exception.query.QueryParserException;
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.lang.SetQuery.Operation;
import org.teiid.query.sql.proc.Block;
import org.teiid.query.sql.proc.CreateProcedureCommand;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.translator.CacheDirective.Scope;
@SuppressWarnings("nls")
public class TestOptionsAndHints {
/*+* Select a From db.g1 MAKENOTDEP, db.g2 MAKENOTDEP WHERE a = b */
@Test public void testOptionMakeNotDepInline4(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("c", "db.g2"); //$NON-NLS-1$ //$NON-NLS-2$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
CompareCriteria crit = new CompareCriteria(a, CompareCriteria.EQ, b);
From from = new From();
FromClause clause = new UnaryFromClause(g1);
clause.setMakeNotDep(true);
from.addClause(clause);
FromClause clause1 = new UnaryFromClause(g2);
clause1.setMakeNotDep(true);
from.addClause(clause1);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(crit);
TestParser.helpTest("Select a From db.g1 MAKENOTDEP, db.g2 AS c MAKENOTDEP WHERE a = b", //$NON-NLS-1$
"SELECT a FROM /*+ MAKENOTDEP */ db.g1, /*+ MAKENOTDEP */ db.g2 AS c WHERE a = b", //$NON-NLS-1$
query);
}
/*+* Select a From db.g1 JOIN db.g2 MAKEDEP ON a = b */
@Test public void testOptionMakeDepInline1(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.getRightClause().setMakeDep(true);
From from = new From();
from.addClause(jp);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From db.g1 JOIN db.g2 MAKEDEP ON a = b", //$NON-NLS-1$
"SELECT a FROM db.g1 INNER JOIN /*+ MAKEDEP */ db.g2 ON a = b", //$NON-NLS-1$
query);
}
/*+* Select a From db.g1 MAKEDEP JOIN db.g2 ON a = b */
@Test public void testOptionMakeDepInline2(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.getLeftClause().setMakeDep(true);
From from = new From();
from.addClause(jp);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From db.g1 MAKEDEP JOIN db.g2 ON a = b", //$NON-NLS-1$
"SELECT a FROM /*+ MAKEDEP */ db.g1 INNER JOIN db.g2 ON a = b", //$NON-NLS-1$
query);
}
/*+* Select a From (db.g1 MAKEDEP JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 MAKEDEP ON a = c */
@Test public void testOptionMakeDepInline3(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
GroupSymbol g3 = new GroupSymbol("db.g3"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
ElementSymbol c = new ElementSymbol("c"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.getLeftClause().setMakeDep(true);
List<Object> crits2 = new ArrayList<Object>();
crits2.add(new CompareCriteria(a, CompareCriteria.EQ, c));
JoinPredicate jp2 = new JoinPredicate(jp, new UnaryFromClause(g3), JoinType.JOIN_LEFT_OUTER, crits2);
jp2.getRightClause().setMakeDep(true);
From from = new From();
from.addClause(jp2);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From (db.g1 MAKEDEP JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 MAKEDEP ON a = c", //$NON-NLS-1$
"SELECT a FROM (/*+ MAKEDEP */ db.g1 INNER JOIN db.g2 ON a = b) LEFT OUTER JOIN /*+ MAKEDEP */ db.g3 ON a = c", //$NON-NLS-1$
query);
}
/*+* Select a From db.g1 MAKEDEP, db.g2 MAKEDEP WHERE a = b */
@Test public void testOptionMakeDepInline4(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("c", "db.g2"); //$NON-NLS-1$ //$NON-NLS-2$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
CompareCriteria crit = new CompareCriteria(a, CompareCriteria.EQ, b);
From from = new From();
FromClause clause = new UnaryFromClause(g1);
clause.setMakeDep(true);
from.addClause(clause);
FromClause clause1 = new UnaryFromClause(g2);
clause1.setMakeDep(true);
from.addClause(clause1);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(crit);
TestParser.helpTest("Select a From db.g1 MAKEDEP, db.g2 AS c MAKEDEP WHERE a = b", //$NON-NLS-1$
"SELECT a FROM /*+ MAKEDEP */ db.g1, /*+ MAKEDEP */ db.g2 AS c WHERE a = b", //$NON-NLS-1$
query);
}
@Test public void testOptionMakedep() throws Exception {
String sql = "SELECT A.alert_id " + //$NON-NLS-1$
"FROM (FSK_ALERT AS A MAKEDEP INNER JOIN Core.FSC_PARTY_DIM AS C ON A.primary_entity_key = C.PARTY_KEY) " +//$NON-NLS-1$
"LEFT OUTER JOIN FSK_SCENARIO AS S ON A.scenario_id = S.scenario_id ";//$NON-NLS-1$
Query command = (Query)new QueryParser().parseCommand(sql);
JoinPredicate predicate = (JoinPredicate)command.getFrom().getClauses().get(0);
assertTrue(((JoinPredicate)predicate.getLeftClause()).getLeftClause().isMakeDep());
}
/*+* Select a From db.g1 JOIN db.g2 MAKENOTDEP ON a = b */
@Test public void testOptionMakeNotDepInline1(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.getRightClause().setMakeNotDep(true);
From from = new From();
from.addClause(jp);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From db.g1 JOIN db.g2 MAKENOTDEP ON a = b", //$NON-NLS-1$
"SELECT a FROM db.g1 INNER JOIN /*+ MAKENOTDEP */ db.g2 ON a = b", //$NON-NLS-1$
query);
}
/*+* Select a From db.g1 MAKENOTDEP JOIN db.g2 ON a = b */
@Test public void testOptionMakeNotDepInline2(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.getLeftClause().setMakeNotDep(true);
From from = new From();
from.addClause(jp);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From db.g1 MAKENOTDEP JOIN db.g2 ON a = b", //$NON-NLS-1$
"SELECT a FROM /*+ MAKENOTDEP */ db.g1 INNER JOIN db.g2 ON a = b", //$NON-NLS-1$
query);
}
/*+* Select a From (db.g1 MAKENOTDEP JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 MAKENOTDEP ON a = c */
@Test public void testOptionMakeNotDepInline3(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
GroupSymbol g3 = new GroupSymbol("db.g3"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
ElementSymbol c = new ElementSymbol("c"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.getLeftClause().setMakeNotDep(true);
List<Object> crits2 = new ArrayList<Object>();
crits2.add(new CompareCriteria(a, CompareCriteria.EQ, c));
JoinPredicate jp2 = new JoinPredicate(jp, new UnaryFromClause(g3), JoinType.JOIN_LEFT_OUTER, crits2);
jp2.getRightClause().setMakeNotDep(true);
From from = new From();
from.addClause(jp2);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From (db.g1 MAKENOTDEP JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 MAKENOTDEP ON a = c", //$NON-NLS-1$
"SELECT a FROM (/*+ MAKENOTDEP */ db.g1 INNER JOIN db.g2 ON a = b) LEFT OUTER JOIN /*+ MAKENOTDEP */ db.g3 ON a = c", //$NON-NLS-1$
query);
}
@Test public void testDepOptions2() {
GroupSymbol a = new GroupSymbol("a"); //$NON-NLS-1$
GroupSymbol b = new GroupSymbol("b"); //$NON-NLS-1$
ElementSymbol x = new ElementSymbol("a.x", true); //$NON-NLS-1$
ElementSymbol y = new ElementSymbol("b.y", true); //$NON-NLS-1$
Criteria criteria = new CompareCriteria(x, CompareCriteria.EQ, new Function("func", new Expression[] {y})); //$NON-NLS-1$
JoinPredicate predicate = new JoinPredicate(new UnaryFromClause(a), new UnaryFromClause(b), JoinType.JOIN_INNER, Arrays.asList(new Object[] {criteria}));
From from = new From(Arrays.asList(predicate));
predicate.getLeftClause().setMakeNotDep(true);
predicate.getRightClause().setMakeDep(true);
Select select = new Select(Arrays.asList(x, y));
Query query = new Query(select, from, null, null, null, null, null);
TestParser.helpTest("Select a.x, b.y From a MAKENOTDEP INNER JOIN b MAKEDEP ON a.x = func(b.y)", //$NON-NLS-1$
"SELECT a.x, b.y FROM /*+ MAKENOTDEP */ a INNER JOIN /*+ MAKEDEP */ b ON a.x = func(b.y)", //$NON-NLS-1$
query);
}
@Test public void testOptionNoCache1(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.setNoCache(true);
option.addNoCacheGroup("a.b.c"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option nocache a.b.c", //$NON-NLS-1$
"SELECT a FROM db.g OPTION NOCACHE a.b.c", //$NON-NLS-1$
query);
}
@Test public void testOptionNoCache2(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.setNoCache(true);
option.addNoCacheGroup("a.b.c"); //$NON-NLS-1$
option.addNoCacheGroup("d.e.f"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option nocache a.b.c, d.e.f", //$NON-NLS-1$
"SELECT a FROM db.g OPTION NOCACHE a.b.c, d.e.f", //$NON-NLS-1$
query);
}
// related to defect 14423
@Test public void testOptionNoCache3(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.setNoCache(true);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option nocache", //$NON-NLS-1$
"SELECT a FROM db.g OPTION NOCACHE", //$NON-NLS-1$
query);
}
/*+* SELECT a from g OPTION xyx */
@Test public void testFailsIllegalOption(){
TestParser.helpException("SELECT a from g OPTION xyx"); //$NON-NLS-1$
}
@Test public void testInsertWithOption() {
Insert insert = new Insert();
insert.setGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
List<ElementSymbol> vars = new ArrayList<ElementSymbol>();
vars.add(new ElementSymbol("a")); //$NON-NLS-1$
insert.setVariables(vars);
List<Reference> values = new ArrayList<Reference>();
values.add(new Reference(0));
insert.setValues(values);
Option option = new Option();
option.setNoCache(true);
insert.setOption(option);
TestParser.helpTest("INSERT INTO m.g (a) VALUES (?) OPTION NOCACHE", //$NON-NLS-1$
"INSERT INTO m.g (a) VALUES (?) OPTION NOCACHE", //$NON-NLS-1$
insert);
}
@Test public void testDeleteWithOption() {
Delete delete = new Delete();
delete.setGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
Option option = new Option();
option.setNoCache(true);
delete.setOption(option);
TestParser.helpTest("DELETE FROM m.g OPTION NOCACHE", //$NON-NLS-1$
"DELETE FROM m.g OPTION NOCACHE", //$NON-NLS-1$
delete);
}
@Test public void testUpdateWithOption() {
Update update = new Update();
update.setGroup(new GroupSymbol("m.g")); //$NON-NLS-1$
update.addChange(new ElementSymbol("a"), new Reference(0));
Option option = new Option();
option.setNoCache(true);
Criteria crit = new CompareCriteria(new ElementSymbol("b"), CompareCriteria.EQ, new Reference(1)); //$NON-NLS-1$
update.setCriteria(crit);
update.setOption(option);
TestParser.helpTest("UPDATE m.g SET a = ? WHERE b = ? OPTION NOCACHE", //$NON-NLS-1$
"UPDATE m.g SET a = ? WHERE b = ? OPTION NOCACHE", //$NON-NLS-1$
update);
}
@Test public void testOptionalFromClause1() {
String sql = "SELECT * FROM /*+ optional */ t1, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause1_1() {
String sql = "SELECT * FROM /*+ optional*/ t1, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause1_2() {
String sql = "SELECT * FROM /*+optional */ t1, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause1_3() {
String sql = "SELECT * FROM /*+ optional */ t1, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause1_4() {
String sql = "SELECT * /*+ optional */ FROM /*+ OptiOnal */ t1, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause1_5() {
String sql = "SELECT * FROM /*+ OptiOnal */ t1, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause2() {
String sql = "SELECT * FROM t1, /*+ optional */ t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t2")); //$NON-NLS-1$
ufc.setOptional(true);
from.addClause(ufc);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM t1, /*+ optional */ t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause3() {
String sql = "SELECT * FROM /*+ optional */ t1 AS a, t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("a", "t1")); //$NON-NLS-1$ //$NON-NLS-2$
ufc.setOptional(true);
from.addClause(ufc);
from.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM /*+ optional */ t1 AS a, t2", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause4() {
String sql = "SELECT * FROM t1, /*+ optional */ t2 as a"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("a", "t2")); //$NON-NLS-1$ //$NON-NLS-2$
ufc.setOptional(true);
from.addClause(ufc);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM t1, /*+ optional */ t2 AS a", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause5() {
String sql = "SELECT * FROM t1, /*+ optional */ (select * from t1, t2) as x"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
Query query2 = new Query();
select = new Select();
select.addSymbol(new MultipleElementSymbol());
query2.setSelect(select);
From from2 = new From();
from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from2.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query2.setFrom(from2);
SubqueryFromClause sfc = new SubqueryFromClause("x", query2);//$NON-NLS-1$
sfc.setOptional(true);
from.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from.addClause(sfc);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM t1, /*+ optional */ (SELECT * FROM t1, t2) AS x", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause6() {
String sql = "SELECT * FROM t1 INNER JOIN /*+ optional */ (select a from t1, t2) AS x ON t1.a=x.a"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
Query query2 = new Query();
select = new Select();
select.addSymbol(new ElementSymbol("a"));//$NON-NLS-1$
From from2 = new From();
from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from2.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query2.setSelect(select);
query2.setFrom(from2);
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
SubqueryFromClause sfc = new SubqueryFromClause("x", query2);//$NON-NLS-1$
sfc.setOptional(true);
List<Object> criteria = new ArrayList<Object>();
criteria.add(new CompareCriteria(new ElementSymbol("t1.a"), AbstractCompareCriteria.EQ, new ElementSymbol("x.a")));//$NON-NLS-1$//$NON-NLS-2$
JoinPredicate joinPredicate = new JoinPredicate(ufc, sfc, JoinType.JOIN_INNER, criteria);
from.addClause(joinPredicate);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT * FROM t1 INNER JOIN /*+ optional */ (SELECT a FROM t1, t2) AS x ON t1.a = x.a", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause7() {
String sql = "SELECT b FROM t1, /*+ optional */ (t2 INNER JOIN t3 ON t2.a = t3.a)"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new ElementSymbol("b"));//$NON-NLS-1$
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t2")); //$NON-NLS-1$
UnaryFromClause ufc2 = new UnaryFromClause();
ufc2.setGroup(new GroupSymbol("t3")); //$NON-NLS-1$
List<Object> criteria = new ArrayList<Object>();
criteria.add(new CompareCriteria(new ElementSymbol("t2.a"), AbstractCompareCriteria.EQ, new ElementSymbol("t3.a")));//$NON-NLS-1$//$NON-NLS-2$
JoinPredicate joinPredicate = new JoinPredicate(ufc, ufc2, JoinType.JOIN_INNER, criteria);
joinPredicate.setOptional(true);
UnaryFromClause ufc3 = new UnaryFromClause();
ufc3.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from.addClause(ufc3);
from.addClause(joinPredicate);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT b FROM t1, /*+ optional */ (t2 INNER JOIN t3 ON t2.a = t3.a)", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause8() {
String sql = "SELECT b FROM t1, /*+ optional */ (/*+ optional */ (SELECT * FROM t1, t2) AS x INNER JOIN t3 ON x.a = t3.a)"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new ElementSymbol("b"));//$NON-NLS-1$
query.setSelect(select);
From from = new From();
Query query2 = new Query();
select = new Select();
select.addSymbol(new MultipleElementSymbol());
From from2 = new From();
from2.addGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from2.addGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query2.setSelect(select);
query2.setFrom(from2);
SubqueryFromClause sfc = new SubqueryFromClause("x", query2);//$NON-NLS-1$
sfc.setOptional(true);
UnaryFromClause ufc2 = new UnaryFromClause();
ufc2.setGroup(new GroupSymbol("t3")); //$NON-NLS-1$
List<Object> criteria = new ArrayList<Object>();
criteria.add(new CompareCriteria(new ElementSymbol("x.a"), AbstractCompareCriteria.EQ, new ElementSymbol("t3.a")));//$NON-NLS-1$//$NON-NLS-2$
JoinPredicate joinPredicate = new JoinPredicate(sfc, ufc2, JoinType.JOIN_INNER, criteria);
joinPredicate.setOptional(true);
UnaryFromClause ufc3 = new UnaryFromClause();
ufc3.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
from.addClause(ufc3);
from.addClause(joinPredicate);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT b FROM t1, /*+ optional */ (/*+ optional */ (SELECT * FROM t1, t2) AS x INNER JOIN t3 ON x.a = t3.a)", query); //$NON-NLS-1$
}
@Test public void testOptionalFromClause9() {
String sql = "SELECT b FROM (t1 LEFT OUTER JOIN /*+ optional */t2 on t1.a = t2.a) LEFT OUTER JOIN /*+ optional */t3 on t1.a = t3.a"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new ElementSymbol("b"));//$NON-NLS-1$
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
UnaryFromClause ufc2 = new UnaryFromClause();
ufc2.setGroup(new GroupSymbol("t2")); //$NON-NLS-1$
ufc2.setOptional(true);
List<Object> criteria = new ArrayList<Object>();
criteria.add(new CompareCriteria(new ElementSymbol("t1.a"), AbstractCompareCriteria.EQ, new ElementSymbol("t2.a")));//$NON-NLS-1$//$NON-NLS-2$
JoinPredicate joinPredicate = new JoinPredicate(ufc, ufc2, JoinType.JOIN_LEFT_OUTER, criteria);
UnaryFromClause ufc3 = new UnaryFromClause();
ufc3.setGroup(new GroupSymbol("t3")); //$NON-NLS-1$
ufc3.setOptional(true);
criteria = new ArrayList<Object>();
criteria.add(new CompareCriteria(new ElementSymbol("t1.a"), AbstractCompareCriteria.EQ, new ElementSymbol("t3.a")));//$NON-NLS-1$//$NON-NLS-2$
JoinPredicate joinPredicate2 = new JoinPredicate(joinPredicate, ufc3, JoinType.JOIN_LEFT_OUTER, criteria);
from.addClause(joinPredicate2);
query.setFrom(from);
TestParser.helpTest(sql, "SELECT b FROM (t1 LEFT OUTER JOIN /*+ optional */ t2 ON t1.a = t2.a) LEFT OUTER JOIN /*+ optional */ t3 ON t1.a = t3.a", query); //$NON-NLS-1$
}
@Test public void testStoredQueryWithOption(){
StoredProcedure storedQuery = new StoredProcedure();
storedQuery.setProcedureName("proc1"); //$NON-NLS-1$
Option option = new Option();
option.setNoCache(true);
storedQuery.setOption(option);
TestParser.helpTest("exec proc1() option nocache", "EXEC proc1() OPTION NOCACHE", storedQuery); //$NON-NLS-1$ //$NON-NLS-2$
}
/*+* Select a From db.g Option SHOWPLAN */
/*+* Select a From db.g Option makedep a.b.c */
@Test public void testOptionMakeDependent1(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.addDependentGroup("a.b.c"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option makedep a.b.c", //$NON-NLS-1$
"SELECT a FROM db.g OPTION MAKEDEP a.b.c", //$NON-NLS-1$
query);
}
/*+* Select a From db.g Option makedep a.b.c, d.e.f showplan */
@Test public void testOptionMakeDependent2(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.addDependentGroup("a.b.c"); //$NON-NLS-1$
option.addDependentGroup("d.e.f"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option makedep a.b.c, d.e.f", //$NON-NLS-1$
"SELECT a FROM db.g OPTION MAKEDEP a.b.c, d.e.f", //$NON-NLS-1$
query);
}
/*+* Select a From db.g Option makedep a.b.c, d.e.f, x.y.z */
@Test public void testOptionMakeDependent3(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.addDependentGroup("a.b.c"); //$NON-NLS-1$
option.addDependentGroup("d.e.f"); //$NON-NLS-1$
option.addDependentGroup("x.y.z"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option makedep a.b.c, d.e.f, x.y.z", //$NON-NLS-1$
"SELECT a FROM db.g OPTION MAKEDEP a.b.c, d.e.f, x.y.z", //$NON-NLS-1$
query);
}
/*+* Select a From db.g Option makenotdep a.b.c */
@Test public void testOptionMakeNotDependent1(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.addNotDependentGroup("a.b.c"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option makenotdep a.b.c", //$NON-NLS-1$
"SELECT a FROM db.g OPTION MAKENOTDEP a.b.c", //$NON-NLS-1$
query);
}
/*+* Select a From db.g Option makenotdep a.b.c, d.e.f showplan */
@Test public void testOptionMakeNotDependent2(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.addNotDependentGroup("a.b.c"); //$NON-NLS-1$
option.addNotDependentGroup("d.e.f"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option makeNOTdep a.b.c, d.e.f", //$NON-NLS-1$
"SELECT a FROM db.g OPTION MAKENOTDEP a.b.c, d.e.f", //$NON-NLS-1$
query);
}
/*+* Select a From db.g Option makenotdep a.b.c, d.e.f, x.y.z */
@Test public void testOptionMakeNotDependent3(){
GroupSymbol g = new GroupSymbol("db.g"); //$NON-NLS-1$
From from = new From();
from.addGroup(g);
Select select = new Select();
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
select.addSymbol(a);
Option option = new Option();
option.addNotDependentGroup("a.b.c"); //$NON-NLS-1$
option.addNotDependentGroup("d.e.f"); //$NON-NLS-1$
option.addNotDependentGroup("x.y.z"); //$NON-NLS-1$
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
query.setOption(option);
TestParser.helpTest("Select a From db.g Option makenotdep a.b.c, d.e.f, x.y.z", //$NON-NLS-1$
"SELECT a FROM db.g OPTION MAKENOTDEP a.b.c, d.e.f, x.y.z", //$NON-NLS-1$
query);
}
@Test public void testDepOptions1() {
GroupSymbol a = new GroupSymbol("a"); //$NON-NLS-1$
GroupSymbol b = new GroupSymbol("b"); //$NON-NLS-1$
ElementSymbol x = new ElementSymbol("a.x", true); //$NON-NLS-1$
ElementSymbol y = new ElementSymbol("b.y", true); //$NON-NLS-1$
From from = new From(Arrays.asList(new UnaryFromClause(a), new UnaryFromClause(b)));
Option option = new Option();
option.addDependentGroup("a"); //$NON-NLS-1$
option.addNotDependentGroup("b"); //$NON-NLS-1$
Select select = new Select(Arrays.asList(x, y));
Criteria criteria = new CompareCriteria(x, CompareCriteria.EQ, y);
Query query = new Query(select, from, criteria, null, null, null, option);
TestParser.helpTest("Select a.x, b.y From a, b WHERE a.x = b.y option makedep a makenotdep b", //$NON-NLS-1$
"SELECT a.x, b.y FROM a, b WHERE a.x = b.y OPTION MAKEDEP a MAKENOTDEP b", //$NON-NLS-1$
query);
}
@Test public void testOptionMakeDepInline5(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
GroupSymbol g3 = new GroupSymbol("db.g3"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
ElementSymbol c = new ElementSymbol("c"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
jp.setMakeDep(true);
List<Object> crits2 = new ArrayList<Object>();
crits2.add(new CompareCriteria(a, CompareCriteria.EQ, c));
JoinPredicate jp2 = new JoinPredicate(jp, new UnaryFromClause(g3), JoinType.JOIN_LEFT_OUTER, crits2);
From from = new From();
from.addClause(jp2);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From (db.g1 JOIN db.g2 ON a = b) makedep LEFT OUTER JOIN db.g3 ON a = c", //$NON-NLS-1$
"SELECT a FROM /*+ MAKEDEP */ (db.g1 INNER JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 ON a = c", //$NON-NLS-1$
query);
//ensure that the new string form is parsable
TestParser.helpTest(query.toString(), query.toString(), query);
}
@Test public void testOptionMakeDepOptionsComment(){
GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$
GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$
GroupSymbol g3 = new GroupSymbol("db.g3"); //$NON-NLS-1$
ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$
ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$
ElementSymbol c = new ElementSymbol("c"); //$NON-NLS-1$
List<Object> crits = new ArrayList<Object>();
crits.add(new CompareCriteria(a, CompareCriteria.EQ, b));
JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits);
Option.MakeDep makeDep = new Option.MakeDep();
makeDep.setMax(5);
makeDep.setJoin(false);
jp.setMakeDep(makeDep);
List<Object> crits2 = new ArrayList<Object>();
crits2.add(new CompareCriteria(a, CompareCriteria.EQ, c));
JoinPredicate jp2 = new JoinPredicate(jp, new UnaryFromClause(g3), JoinType.JOIN_LEFT_OUTER, crits2);
From from = new From();
from.addClause(jp2);
Select select = new Select();
select.addSymbol(a);
Query query = new Query();
query.setSelect(select);
query.setFrom(from);
TestParser.helpTest("Select a From /*+ MAKEDEP(max:5 no join) */ (db.g1 JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 ON a = c", //$NON-NLS-1$
"SELECT a FROM /*+ MAKEDEP(MAX:5 NO JOIN) */ (db.g1 INNER JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 ON a = c", //$NON-NLS-1$
query);
//ensure that the new string form is parsable
TestParser.helpTest(query.toString(), query.toString(), query);
}
@Test public void testCache() {
String sql = "/*+ cache */ SELECT * FROM t1"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
from.addClause(ufc);
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
query.setFrom(from);
query.setCacheHint(new CacheHint());
TestParser.helpTest(sql, "/*+ cache */ SELECT * FROM t1", query); //$NON-NLS-1$
}
@Test public void testCacheMultipleComments() {
String sql = "/* hello */ /*+ cache */ /* world */ SELECT * FROM t1"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
from.addClause(ufc);
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
query.setFrom(from);
query.setCacheHint(new CacheHint());
TestParser.helpTest(sql, "/*+ cache */ SELECT * FROM t1", query); //$NON-NLS-1$
}
@Test public void testCacheProc() {
String sql = "/*+ cache */ CREATE VIRTUAL PROCEDURE BEGIN END"; //$NON-NLS-1$
CreateProcedureCommand command = new CreateProcedureCommand(new Block());
command.setCacheHint(new CacheHint());
TestParser.helpTest(sql, "/*+ cache */ BEGIN\nEND", command); //$NON-NLS-1$
}
@Test public void testCacheScope() {
String sql = "/*+ cache(pref_mem scope:session) */ SELECT * FROM t1"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
from.addClause(ufc);
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
query.setFrom(from);
CacheHint hint = new CacheHint();
hint.setScope(Scope.SESSION);
hint.setPrefersMemory(true);
query.setCacheHint(hint);
TestParser.helpTest(sql, "/*+ cache(pref_mem scope:SESSION) */ SELECT * FROM t1", query); //$NON-NLS-1$
}
@Test public void testCache1() {
String sql = "/*+ cache */ execute foo()"; //$NON-NLS-1$
StoredProcedure sp = new StoredProcedure();
sp.setCacheHint(new CacheHint());
sp.setProcedureName("foo"); //$NON-NLS-1$
TestParser.helpTest(sql, "/*+ cache */ EXEC foo()", sp); //$NON-NLS-1$
}
@Test public void testExpandedCacheHint() {
String sql = "/*+ cache( pref_mem ttl:2000) */ SELECT * FROM t1"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
from.addClause(ufc);
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
query.setFrom(from);
CacheHint hint = new CacheHint();
hint.setPrefersMemory(true);
hint.setTtl(Long.valueOf(2000));
query.setCacheHint(hint);
TestParser.helpTest(sql, "/*+ cache(pref_mem ttl:2000) */ SELECT * FROM t1", query); //$NON-NLS-1$
}
@Test public void testCacheHintUnion() {
String sql = "/*+ cache( pref_mem) */ SELECT * FROM t1 union select * from t2"; //$NON-NLS-1$
Query query = new Query();
Select select = new Select();
select.addSymbol(new MultipleElementSymbol());
query.setSelect(select);
From from = new From();
UnaryFromClause ufc = new UnaryFromClause();
from.addClause(ufc);
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
query.setFrom(from);
Query query1 = new Query();
select = new Select();
select.addSymbol(new MultipleElementSymbol());
query1.setSelect(select);
from = new From();
ufc = new UnaryFromClause();
from.addClause(ufc);
ufc.setGroup(new GroupSymbol("t2")); //$NON-NLS-1$
query1.setFrom(from);
SetQuery sq = new SetQuery(Operation.UNION, false, query, query1);
CacheHint hint = new CacheHint();
hint.setPrefersMemory(true);
sq.setCacheHint(hint);
TestParser.helpTest(sql, "/*+ cache(pref_mem) */ SELECT * FROM t1 UNION SELECT * FROM t2", sq); //$NON-NLS-1$
}
@Test public void testCacheHintCallableStatement() {
String sql = "/*+ cache */ { ? = call proc() }"; //$NON-NLS-1$
StoredProcedure sp = new StoredProcedure();
SPParameter param = new SPParameter(1, null);
param.setParameterType(SPParameter.RETURN_VALUE);
sp.setParameter(param);
sp.setProcedureName("proc");
sp.setCallableStatement(true);
CacheHint hint = new CacheHint();
sp.setCacheHint(hint);
TestParser.helpTest(sql, "/*+ cache */ ? = EXEC proc()", sp); //$NON-NLS-1$
}
@Test public void testMergeJoinHint() {
String sql = "SELECT e1 FROM m.g2 WHERE EXISTS /*+ MJ */ (SELECT e1 FROM m.g1)"; //$NON-NLS-1$
Query q = TestParser.exampleExists(true);
TestParser.helpTest(sql, "SELECT e1 FROM m.g2 WHERE EXISTS /*+ MJ */ (SELECT e1 FROM m.g1)", q); //$NON-NLS-1$
}
@Test public void testMergeJoinHint1() {
String sql = "SELECT a FROM db.g WHERE b IN /*+ MJ */ (SELECT a FROM db.g WHERE a2 = 5)"; //$NON-NLS-1$
Query q = TestParser.exampleIn(true);
TestParser.helpTest(sql, "SELECT a FROM db.g WHERE b IN /*+ MJ */ (SELECT a FROM db.g WHERE a2 = 5)", q); //$NON-NLS-1$
}
@Test public void testNoUnnest() throws QueryParserException {
String sql = "SELECT a FROM /*+ no_unnest */ (SELECT a FROM db.g WHERE a2 = 5) x"; //$NON-NLS-1$
assertEquals("SELECT a FROM /*+ NO_UNNEST */ (SELECT a FROM db.g WHERE a2 = 5) AS x", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
}
@Test public void testNoUnnest1() throws QueryParserException {
String sql = "SELECT a FROM db.g WHERE a2 = all /*+ no_unnest */ (select a from db.g)"; //$NON-NLS-1$
assertEquals("SELECT a FROM db.g WHERE a2 = ALL /*+ NO_UNNEST */ (SELECT a FROM db.g)", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
}
@Test public void testNoUnnest2() throws QueryParserException {
String sql = "SELECT a FROM db.g WHERE a2 = /*+ no_unnest */ (select a from db.g)"; //$NON-NLS-1$
assertEquals("SELECT a FROM db.g WHERE a2 = /*+ NO_UNNEST */ (SELECT a FROM db.g)", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
}
@Test public void testNonStrictLimit() throws QueryParserException {
String sql = "SELECT a FROM x /*+ non_strict */ limit 1"; //$NON-NLS-1$
assertEquals("SELECT a FROM x /*+ NON_STRICT */ LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
sql = "SELECT a FROM x /*+ non_strict */ offset 1 row"; //$NON-NLS-1$
assertEquals("SELECT a FROM x /*+ NON_STRICT */ OFFSET 1 ROWS", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
sql = "SELECT a FROM x /*+ non_strict */ fetch first 1 rows only"; //$NON-NLS-1$
assertEquals("SELECT a FROM x /*+ NON_STRICT */ LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
}
@Test public void testNestedComments() throws QueryParserException {
String sql = "/*+ /*nested*/ */ SELECT a FROM x limit 1"; //$NON-NLS-1$
assertEquals("SELECT a FROM x LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
}
@Test public void testSourceHint() throws QueryParserException {
String sql = "SELECT /*+ sh:'foo' oracle:'leading' */ a FROM x limit 1"; //$NON-NLS-1$
assertEquals("SELECT /*+sh:'foo' oracle:'leading' */ a FROM x LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$
sql = "(SELECT /*+ sh:'foo' oracle:'leading' */ a FROM x limit 1) union all select 1"; //$NON-NLS-1$
assertEquals("(SELECT /*+sh:'foo' oracle:'leading' */ a FROM x LIMIT 1) UNION ALL SELECT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString());
sql = "(SELECT /*+ sh keep aliases:'foo' oracle keep aliases:'leading' */ a FROM x limit 1) union all select 1"; //$NON-NLS-1$
assertEquals("(SELECT /*+sh KEEP ALIASES:'foo' oracle KEEP ALIASES:'leading' */ a FROM x LIMIT 1) UNION ALL SELECT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString());
sql = "(SELECT /*+ sh keep aliases oracle:'leading' */ a FROM x limit 1) union all select 1"; //$NON-NLS-1$
assertEquals("(SELECT /*+sh KEEP ALIASES oracle:'leading' */ a FROM x LIMIT 1) UNION ALL SELECT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString());
}
@Test public void testNestedSourceHint() throws QueryParserException {
String sql = "WITH x as (SELECT /*+ sh:'x' */ 1) SELECT /*+ sh:'foo' bar:'leading' */ e1 from pm1.g1 order by e1 limit 1"; //$NON-NLS-1$
assertEquals("WITH x AS (SELECT /*+sh:'x' */ 1) SELECT /*+sh:'foo' bar:'leading' */ e1 FROM pm1.g1 ORDER BY e1 LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString());
sql = "create virtual procedure begin loop on (select /*+ sh:'y' */ 1) as x begin end end"; //$NON-NLS-1$
assertEquals("BEGIN\nLOOP ON (SELECT /*+sh:'y' */ 1) AS x\nBEGIN\nEND\nEND", QueryParser.getQueryParser().parseDesignerCommand(sql).toString());
}
@Test public void testNoInline() throws QueryParserException {
String sql = "WITH x as /*+no_inline*/ (SELECT 1) SELECT e1 from pm1.g1 order by e1 limit 1"; //$NON-NLS-1$
assertEquals("WITH x AS /*+ no_inline */ (SELECT 1) SELECT e1 FROM pm1.g1 ORDER BY e1 LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString());
}
@Test public void testMakedepOptions() throws QueryParserException {
String sql = "Select a From db.g1 JOIN db.g2 MAKEDEP(max:300) ON a = b"; //$NON-NLS-1$
assertEquals("SELECT a FROM db.g1 INNER JOIN /*+ MAKEDEP(MAX:300) */ db.g2 ON a = b", QueryParser.getQueryParser().parseCommand(sql, new ParseInfo()).toString()); //$NON-NLS-1$
}
@Test public void testMakeindOptions() throws QueryParserException {
String sql = "Select a From db.g1 JOIN db.g2 MAKEIND(max:300 no join) ON a = b"; //$NON-NLS-1$
assertEquals("SELECT a FROM db.g1 INNER JOIN /*+ MAKEIND(MAX:300 NO JOIN) */ db.g2 ON a = b", QueryParser.getQueryParser().parseCommand(sql, new ParseInfo()).toString()); //$NON-NLS-1$
}
@Test public void testPreserve() throws QueryParserException {
String sql = "Select a From /*+ preserve */ db.g1 JOIN db.g2 ON a = b"; //$NON-NLS-1$
assertEquals("SELECT a FROM /*+ PRESERVE */ db.g1 INNER JOIN db.g2 ON a = b", QueryParser.getQueryParser().parseCommand(sql, new ParseInfo()).clone().toString()); //$NON-NLS-1$
}
}