/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.query.sql;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.teiid.core.types.DataTypeManagerService;
import org.teiid.designer.query.sql.lang.IOrderBy;
import org.teiid.designer.query.sql.lang.ISPParameter;
import org.teiid.designer.query.sql.lang.ISetQuery.Operation;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.query.parser.TeiidNodeFactory.ASTNodes;
import org.teiid.query.resolver.QueryResolver;
import org.teiid.query.sql.lang.BetweenCriteria;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.CompoundCriteria;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.CriteriaOperator.Operator;
import org.teiid.query.sql.lang.Delete;
import org.teiid.query.sql.lang.DynamicCommand;
import org.teiid.query.sql.lang.ExistsCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.GroupBy;
import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.JoinPredicate;
import org.teiid.query.sql.lang.JoinType;
import org.teiid.query.sql.lang.LanguageObject;
import org.teiid.query.sql.lang.Limit;
import org.teiid.query.sql.lang.MatchCriteria;
import org.teiid.query.sql.lang.NotCriteria;
import org.teiid.query.sql.lang.Option;
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.SPParameter;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.SetCriteria;
import org.teiid.query.sql.lang.SetQuery;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryCompareCriteria.PredicateQuantifier;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.SubquerySetCriteria;
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.lang.Update;
import org.teiid.query.sql.proc.AssignmentStatement;
import org.teiid.query.sql.proc.CommandStatement;
import org.teiid.query.sql.proc.DeclareStatement;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
import org.teiid.query.sql.symbol.Constant;
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.ScalarSubquery;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.visitor.SQLStringVisitor;
import org.teiid.query.unittest.RealMetadataFactory;
/**
*
*/
@SuppressWarnings( {"javadoc", "nls"} )
public abstract class AbstractTestSQLStringVisitor extends AbstractTest<Command> {
private RealMetadataFactory metadataFactory;
/**
* @param teiidVersion
*/
public AbstractTestSQLStringVisitor(Version teiidVersion) {
super(teiidVersion);
metadataFactory = new RealMetadataFactory(this.teiidVersion);
}
// ################################## TEST HELPERS ################################
protected void helpTest(LanguageObject obj, String expectedStr) {
String actualStr = SQLStringVisitor.getSQLString(obj);
assertEquals("Expected and actual strings don't match: ", expectedStr, actualStr);
}
protected Expression helpTestExpression(String sql, String expected) throws Exception {
Expression expr = parser.parseExpression(sql);
helpTest(expr, expected);
return expr;
}
protected List getWhenExpressions(int expressions) {
return getWhenExpressions(expressions, -1, false);
}
protected List getWhenExpressions(int expressions, int nullIndex, boolean includeNull) {
ArrayList list = new ArrayList();
for (int i = 0; i < expressions; i++) {
if(includeNull && i == nullIndex) {
list.add(getFactory().newConstant(null) );
}else {
list.add(getFactory().newConstant(String.valueOf((char)('a' + i))));
}
}
return list;
}
protected List getThenExpressions(int expressions) {
ArrayList list = new ArrayList();
for (int i = 0; i < expressions; i++) {
list.add(getFactory().newConstant(new Integer(i)));
}
return list;
}
protected CaseExpression example(int whens) {
ElementSymbol x = getFactory().newElementSymbol("x");
CaseExpression caseExpr = getFactory().newCaseExpression(x, getWhenExpressions(whens), getThenExpressions(whens));
caseExpr.setElseExpression(getFactory().newConstant(new Integer(9999)));
return caseExpr;
}
protected CaseExpression caseExample(int whens, int nullIndex, boolean includeNull) {
assertTrue("Null Index must be less than the number of When expressions", nullIndex < whens);
ElementSymbol x = getFactory().newElementSymbol("x");
CaseExpression caseExpr = getFactory().newCaseExpression(x, getWhenExpressions(whens, nullIndex, includeNull), getThenExpressions(whens));
caseExpr.setElseExpression(getFactory().newConstant(new Integer(9999)));
return caseExpr;
}
protected List getWhenCriteria(int criteria) {
ArrayList list = new ArrayList();
ElementSymbol x = getFactory().newElementSymbol("x");
for (int i = 0; i < criteria; i++) {
list.add(getFactory().newCompareCriteria(x, Operator.EQ, getFactory().newConstant(new Integer(i))));
}
return list;
}
protected List getAlphaWhenCriteria(int criteria) {
ArrayList list = new ArrayList();
ElementSymbol x = getFactory().newElementSymbol("x");
for (int i = 0; i < criteria; i++) {
list.add(getFactory().newCompareCriteria(x, Operator.EQ, getFactory().newConstant(String.valueOf((char)('a' + i)))));
}
return list;
}
protected SearchedCaseExpression searchedCaseExample(int whens) {
SearchedCaseExpression caseExpr = getFactory().newSearchedCaseExpression(getWhenCriteria(whens), getThenExpressions(whens));
caseExpr.setElseExpression(getFactory().newConstant(new Integer(9999)));
return caseExpr;
}
protected SearchedCaseExpression searchedCaseExample2(int whens) {
SearchedCaseExpression caseExpr = getFactory().newSearchedCaseExpression(getAlphaWhenCriteria(whens), getThenExpressions(whens));
caseExpr.setElseExpression(getFactory().newConstant(new Integer(9999)));
return caseExpr;
}
// ################################## ACTUAL TESTS ################################
@Test
public void testNull() {
String sql = SQLStringVisitor.getSQLString(null);
assertEquals("Incorrect string for null object", SQLStringVisitor.UNDEFINED, sql);
}
@Test
public void testBetweenCriteria1() {
BetweenCriteria bc = getFactory().newBetweenCriteria(getFactory().newElementSymbol("m.g.c1"),
getFactory().newConstant(new Integer(1000)),
getFactory().newConstant(new Integer(2000)));
helpTest(bc, "m.g.c1 BETWEEN 1000 AND 2000");
}
@Test
public void testBetweenCriteria2() {
BetweenCriteria bc = getFactory().newBetweenCriteria(getFactory().newElementSymbol("m.g.c1"),
getFactory().newConstant(new Integer(1000)),
getFactory().newConstant(new Integer(2000)));
bc.setNegated(true);
helpTest(bc, "m.g.c1 NOT BETWEEN 1000 AND 2000");
}
@Test
public void testCompareCriteria1() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
helpTest(cc, "m.g.c1 = 'abc'");
}
@Test
public void testCompareCriteria2() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.NE,
getFactory().newConstant("abc"));
helpTest(cc, "m.g.c1 <> 'abc'");
}
@Test
public void testCompareCriteria3() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.GT,
getFactory().newConstant("abc"));
helpTest(cc, "m.g.c1 > 'abc'");
}
@Test
public void testCompareCriteria4() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.GE,
getFactory().newConstant("abc"));
helpTest(cc, "m.g.c1 >= 'abc'");
}
@Test
public void testCompareCriteria5() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.LT,
getFactory().newConstant("abc"));
helpTest(cc, "m.g.c1 < 'abc'");
}
@Test
public void testCompareCriteria6() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.LE,
getFactory().newConstant("abc"));
helpTest(cc, "m.g.c1 <= 'abc'");
}
@Test
public void testCompareCriteria7() {
CompareCriteria cc = getFactory().newCompareCriteria((Expression)null, Operator.EQ, (Expression)null);
helpTest(cc, "<undefined> = <undefined>");
}
@Test
public void testCompoundCriteria1() {
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
List<Criteria> crits = new ArrayList<Criteria>();
crits.add(cc);
CompoundCriteria comp = getFactory().newNode(ASTNodes.COMPOUND_CRITERIA);
comp.setOperator(CompoundCriteria.AND);
comp.setCriteria(crits);
helpTest(comp, "m.g.c1 = 'abc'");
}
@Test
public void testCompoundCriteria2() {
CompareCriteria cc1 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
CompareCriteria cc2 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c2"),
Operator.EQ,
getFactory().newConstant("abc"));
List<Criteria> crits = new ArrayList<Criteria>();
crits.add(cc1);
crits.add(cc2);
CompoundCriteria comp = getFactory().newNode(ASTNodes.COMPOUND_CRITERIA);
comp.setOperator(CompoundCriteria.AND);
comp.setCriteria(crits);
helpTest(comp, "(m.g.c1 = 'abc') AND (m.g.c2 = 'abc')");
}
@Test
public void testCompoundCriteria3() {
CompareCriteria cc1 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
CompareCriteria cc2 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c2"),
Operator.EQ,
getFactory().newConstant("abc"));
CompareCriteria cc3 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c3"),
Operator.EQ,
getFactory().newConstant("abc"));
List<Criteria> crits = new ArrayList<Criteria>();
crits.add(cc1);
crits.add(cc2);
crits.add(cc3);
CompoundCriteria comp = getFactory().newNode(ASTNodes.COMPOUND_CRITERIA);
comp.setOperator(CompoundCriteria.OR);
comp.setCriteria(crits);
helpTest(comp, "(m.g.c1 = 'abc') OR (m.g.c2 = 'abc') OR (m.g.c3 = 'abc')");
}
@Test
public void testCompoundCriteria4() {
CompareCriteria cc1 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
List<Criteria> crits = new ArrayList<Criteria>();
crits.add(cc1);
crits.add(null);
CompoundCriteria comp = getFactory().newNode(ASTNodes.COMPOUND_CRITERIA);
comp.setOperator(CompoundCriteria.OR);
comp.setCriteria(crits);
helpTest(comp, "(m.g.c1 = 'abc') OR (<undefined>)");
}
@Test
public void testCompoundCriteria5() {
CompareCriteria cc1 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
List<Criteria> crits = new ArrayList<Criteria>();
crits.add(null);
crits.add(cc1);
CompoundCriteria comp = getFactory().newNode(ASTNodes.COMPOUND_CRITERIA);
comp.setOperator(CompoundCriteria.OR);
comp.setCriteria(crits);
helpTest(comp, "(<undefined>) OR (m.g.c1 = 'abc')");
}
@Test
public void testCompoundCriteria6() {
CompareCriteria cc1 = getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc"));
List<Criteria> crits = new ArrayList<Criteria>();
crits.add(cc1);
crits.add(null);
CompoundCriteria comp = getFactory().newNode(ASTNodes.COMPOUND_CRITERIA);
comp.setOperator(CompoundCriteria.OR);
comp.setCriteria(crits);
helpTest(comp, "(m.g.c1 = 'abc') OR (<undefined>)");
}
@Test
public void testDelete1() {
Delete delete = getFactory().newNode(ASTNodes.DELETE);
delete.setGroup(getFactory().newGroupSymbol("m.g"));
helpTest(delete, "DELETE FROM m.g");
}
@Test
public void testDelete2() {
Delete delete = getFactory().newNode(ASTNodes.DELETE);
delete.setGroup(getFactory().newGroupSymbol("m.g"));
delete.setCriteria(getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g.c1"),
Operator.EQ,
getFactory().newConstant("abc")));
helpTest(delete, "DELETE FROM m.g WHERE m.g.c1 = 'abc'");
}
@Test
public void testFrom1() {
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g1"));
from.addGroup(getFactory().newGroupSymbol("m.g2"));
helpTest(from, "FROM m.g1, m.g2");
}
@Test
public void testFrom2() {
From from = getFactory().newFrom();
from.addClause(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g1")));
from.addClause(getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_CROSS));
helpTest(from, "FROM m.g1, m.g2 CROSS JOIN m.g3");
}
@Test
public void testGroupBy1() {
GroupBy gb = getFactory().newGroupBy();
gb.addSymbol(getFactory().newElementSymbol("m.g.e1"));
helpTest(gb, "GROUP BY m.g.e1");
}
@Test
public void testGroupBy2() {
GroupBy gb = getFactory().newGroupBy();
gb.addSymbol(getFactory().newElementSymbol("m.g.e1"));
gb.addSymbol(getFactory().newElementSymbol("m.g.e2"));
gb.addSymbol(getFactory().newElementSymbol("m.g.e3"));
helpTest(gb, "GROUP BY m.g.e1, m.g.e2, m.g.e3");
}
@Test
public void testInsert1() {
Insert insert = getFactory().newInsert();
insert.setGroup(getFactory().newGroupSymbol("m.g1"));
List<ElementSymbol> vars = new ArrayList<ElementSymbol>();
vars.add(getFactory().newElementSymbol("e1"));
vars.add(getFactory().newElementSymbol("e2"));
insert.setVariables(vars);
List<Constant> values = new ArrayList<Constant>();
values.add(getFactory().newConstant(new Integer(5)));
values.add(getFactory().newConstant("abc"));
insert.setValues(values);
helpTest(insert, "INSERT INTO m.g1 (e1, e2) VALUES (5, 'abc')");
}
@Test
public void testIsNullCriteria1() {
IsNullCriteria inc = getFactory().newNode(ASTNodes.IS_NULL_CRITERIA);
inc.setExpression(getFactory().newConstant("abc"));
helpTest(inc, "'abc' IS NULL");
}
@Test
public void testIsNullCriteria2() {
IsNullCriteria inc = getFactory().newNode(ASTNodes.IS_NULL_CRITERIA);
inc.setExpression(getFactory().newElementSymbol("m.g.e1"));
helpTest(inc, "m.g.e1 IS NULL");
}
@Test
public void testIsNullCriteria3() {
IsNullCriteria inc = getFactory().newNode(ASTNodes.IS_NULL_CRITERIA);
helpTest(inc, "<undefined> IS NULL");
}
@Test
public void testIsNullCriteria4() {
IsNullCriteria inc = getFactory().newNode(ASTNodes.IS_NULL_CRITERIA);
inc.setExpression(getFactory().newElementSymbol("m.g.e1"));
inc.setNegated(true);
helpTest(inc, "m.g.e1 IS NOT NULL");
}
@Test
public void testJoinPredicate1() {
JoinPredicate jp = getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_CROSS);
helpTest(jp, "m.g2 CROSS JOIN m.g3");
}
@Test
public void testOptionalJoinPredicate1() {
JoinPredicate jp = getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_CROSS);
jp.setOptional(true);
helpTest(jp, "/*+ optional */ (m.g2 CROSS JOIN m.g3)");
}
@Test
public void testJoinPredicate2() {
ArrayList<Criteria> crits = new ArrayList<Criteria>();
crits.add(getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g2.e1"), Operator.EQ, getFactory().newElementSymbol("m.g3.e1")));
JoinPredicate jp = getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_INNER,
crits);
helpTest(jp, "m.g2 INNER JOIN m.g3 ON m.g2.e1 = m.g3.e1");
}
@Test
public void testJoinPredicate3() {
ArrayList<Criteria> crits = new ArrayList<Criteria>();
crits.add(getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g2.e1"), Operator.EQ, getFactory().newElementSymbol("m.g3.e1")));
crits.add(getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g2.e2"), Operator.EQ, getFactory().newElementSymbol("m.g3.e2")));
JoinPredicate jp = getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_INNER,
crits);
helpTest(jp, "m.g2 INNER JOIN m.g3 ON m.g2.e1 = m.g3.e1 AND m.g2.e2 = m.g3.e2");
}
@Test
public void testJoinPredicate4() {
ArrayList<Criteria> crits = new ArrayList<Criteria>();
crits.add(getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g2.e1"), Operator.EQ, getFactory().newElementSymbol("m.g3.e1")));
JoinPredicate jp = getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_INNER,
crits);
JoinPredicate jp2 = getFactory().newJoinPredicate(jp,
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g1")),
JoinType.Types.JOIN_CROSS);
helpTest(jp2, "(m.g2 INNER JOIN m.g3 ON m.g2.e1 = m.g3.e1) CROSS JOIN m.g1");
}
@Test
public void testJoinPredicate5() {
ArrayList<Criteria> crits = new ArrayList<Criteria>();
crits.add(getFactory().newNotCriteria(getFactory().newCompareCriteria(getFactory().newElementSymbol("m.g2.e1"), Operator.EQ, getFactory().newElementSymbol("m.g3.e1"))));
JoinPredicate jp = getFactory().newJoinPredicate(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g2")),
getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g3")),
JoinType.Types.JOIN_INNER,
crits);
helpTest(jp, "m.g2 INNER JOIN m.g3 ON NOT (m.g2.e1 = m.g3.e1)");
}
@Test
public void testJoinType1() {
helpTest(getFactory().newJoinType(JoinType.Types.JOIN_CROSS), "CROSS JOIN");
}
@Test
public void testJoinType2() {
helpTest(getFactory().newJoinType(JoinType.Types.JOIN_INNER), "INNER JOIN");
}
@Test
public void testJoinType3() {
helpTest(getFactory().newJoinType(JoinType.Types.JOIN_RIGHT_OUTER), "RIGHT OUTER JOIN");
}
@Test
public void testJoinType4() {
helpTest(getFactory().newJoinType(JoinType.Types.JOIN_LEFT_OUTER), "LEFT OUTER JOIN");
}
@Test
public void testJoinType5() {
helpTest(getFactory().newJoinType(JoinType.Types.JOIN_FULL_OUTER), "FULL OUTER JOIN");
}
@Test
public void testMatchCriteria1() {
MatchCriteria mc = getFactory().newNode(ASTNodes.MATCH_CRITERIA);
mc.setLeftExpression(getFactory().newElementSymbol("m.g.e1"));
mc.setRightExpression(getFactory().newConstant("abc"));
helpTest(mc, "m.g.e1 LIKE 'abc'");
}
@Test
public void testMatchCriteria2() {
MatchCriteria mc = getFactory().newNode(ASTNodes.MATCH_CRITERIA);
mc.setLeftExpression(getFactory().newElementSymbol("m.g.e1"));
mc.setRightExpression(getFactory().newConstant("%"));
mc.setEscapeChar('#');
helpTest(mc, "m.g.e1 LIKE '%' ESCAPE '#'");
}
@Test
public void testMatchCriteria3() {
MatchCriteria mc = getFactory().newNode(ASTNodes.MATCH_CRITERIA);
mc.setLeftExpression(getFactory().newElementSymbol("m.g.e1"));
mc.setRightExpression(getFactory().newConstant("abc"));
mc.setNegated(true);
helpTest(mc, "m.g.e1 NOT LIKE 'abc'");
}
@Test
public void testNotCriteria1() {
NotCriteria not = getFactory().newNotCriteria(getFactory().newIsNullCriteria(getFactory().newElementSymbol("m.g.e1")));
helpTest(not, "NOT (m.g.e1 IS NULL)");
}
@Test
public void testNotCriteria2() {
NotCriteria not = getFactory().newNode(ASTNodes.NOT_CRITERIA);
helpTest(not, "NOT (<undefined>)");
}
@Test
public void testOption1() {
Option option = getFactory().newNode(ASTNodes.OPTION);
helpTest(option, "OPTION");
}
@Test
public void testOption5() {
Option option = getFactory().newNode(ASTNodes.OPTION);
option.addDependentGroup("abc");
option.addDependentGroup("def");
option.addDependentGroup("xyz");
helpTest(option, "OPTION MAKEDEP abc, def, xyz");
}
@Test
public void testOption6() {
Option option = getFactory().newNode(ASTNodes.OPTION);
option.addDependentGroup("abc");
option.addDependentGroup("def");
option.addDependentGroup("xyz");
helpTest(option, "OPTION MAKEDEP abc, def, xyz");
}
@Test
public void testOption8() {
Option option = getFactory().newNode(ASTNodes.OPTION);
option.addNoCacheGroup("abc");
option.addNoCacheGroup("def");
option.addNoCacheGroup("xyz");
helpTest(option, "OPTION NOCACHE abc, def, xyz");
}
// related to defect 14423
@Test
public void testOption9() {
Option option = getFactory().newNode(ASTNodes.OPTION);
option.setNoCache(true);
helpTest(option, "OPTION NOCACHE");
}
@Test
public void testOrderBy1() {
OrderBy ob = getFactory().newOrderBy();
ob.addVariable(getFactory().newElementSymbol("e1"));
helpTest(ob, "ORDER BY e1");
}
@Test
public void testOrderBy2() {
OrderBy ob = getFactory().newOrderBy();
ob.addVariable(getFactory().newElementSymbol("e1"));
ob.addVariable(getFactory().newAliasSymbol("x", getFactory().newElementSymbol("e2")));
helpTest(ob, "ORDER BY e1, x");
}
@Test
public void testOrderBy3() {
OrderBy ob = getFactory().newOrderBy();
ob.addVariable(getFactory().newElementSymbol("e1"), IOrderBy.DESC);
ob.addVariable(getFactory().newElementSymbol("x"), IOrderBy.DESC);
helpTest(ob, "ORDER BY e1 DESC, x DESC");
}
@Test
public void testQuery1() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
helpTest(query, "SELECT * FROM m.g");
}
@Test
public void testQuery2() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.EQ, getFactory().newConstant(new Integer(5)));
GroupBy groupBy = getFactory().newGroupBy();
groupBy.addSymbol(getFactory().newElementSymbol("e1"));
CompareCriteria having = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.GT, getFactory().newConstant(new Integer(0)));
OrderBy orderBy = getFactory().newOrderBy();
orderBy.addVariable(getFactory().newElementSymbol("e1"));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(cc);
query.setGroupBy(groupBy);
query.setHaving(having);
query.setOrderBy(orderBy);
helpTest(query, "SELECT * FROM m.g WHERE e1 = 5 GROUP BY e1 HAVING e1 > 0 ORDER BY e1");
}
@Test
public void testQuery3() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
GroupBy groupBy = getFactory().newGroupBy();
groupBy.addSymbol(getFactory().newElementSymbol("e1"));
CompareCriteria having = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.GT, getFactory().newConstant(new Integer(0)));
OrderBy orderBy = getFactory().newOrderBy();
orderBy.addVariable(getFactory().newElementSymbol("e1"));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
query.setGroupBy(groupBy);
query.setHaving(having);
query.setOrderBy(orderBy);
helpTest(query, "SELECT * FROM m.g GROUP BY e1 HAVING e1 > 0 ORDER BY e1");
}
@Test
public void testQuery4() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.EQ, getFactory().newConstant(new Integer(5)));
CompareCriteria having = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.GT, getFactory().newConstant(new Integer(0)));
OrderBy orderBy = getFactory().newOrderBy();
orderBy.addVariable(getFactory().newElementSymbol("e1"));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(cc);
query.setHaving(having);
query.setOrderBy(orderBy);
helpTest(query, "SELECT * FROM m.g WHERE e1 = 5 HAVING e1 > 0 ORDER BY e1");
}
@Test
public void testQuery5() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.EQ, getFactory().newConstant(new Integer(5)));
GroupBy groupBy = getFactory().newGroupBy();
groupBy.addSymbol(getFactory().newElementSymbol("e1"));
OrderBy orderBy = getFactory().newOrderBy();
orderBy.addVariable(getFactory().newElementSymbol("e1"));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(cc);
query.setGroupBy(groupBy);
query.setOrderBy(orderBy);
helpTest(query, "SELECT * FROM m.g WHERE e1 = 5 GROUP BY e1 ORDER BY e1");
}
@Test
public void testQuery6() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.EQ, getFactory().newConstant(new Integer(5)));
GroupBy groupBy = getFactory().newGroupBy();
groupBy.addSymbol(getFactory().newElementSymbol("e1"));
CompareCriteria having = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.GT, getFactory().newConstant(new Integer(0)));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(cc);
query.setGroupBy(groupBy);
query.setHaving(having);
helpTest(query, "SELECT * FROM m.g WHERE e1 = 5 GROUP BY e1 HAVING e1 > 0");
}
@Test
public void testQuery7() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newMultipleElementSymbol());
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("m.g"));
CompareCriteria cc = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.EQ, getFactory().newConstant(new Integer(5)));
GroupBy groupBy = getFactory().newGroupBy();
groupBy.addSymbol(getFactory().newElementSymbol("e1"));
CompareCriteria having = getFactory().newCompareCriteria(getFactory().newElementSymbol("e1"), Operator.GT, getFactory().newConstant(new Integer(0)));
OrderBy orderBy = getFactory().newOrderBy();
orderBy.addVariable(getFactory().newElementSymbol("e1"));
Query query = getFactory().newQuery();
query.setSelect(select);
query.setFrom(from);
query.setCriteria(cc);
query.setGroupBy(groupBy);
query.setHaving(having);
query.setOrderBy(orderBy);
helpTest(query, "SELECT * FROM m.g WHERE e1 = 5 GROUP BY e1 HAVING e1 > 0 ORDER BY e1");
}
@Test
public void testSelect1() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newElementSymbol("e1"));
helpTest(select, "e1");
}
@Test
public void testSelect2() {
Select select = getFactory().newSelect();
select.setDistinct(true);
select.addSymbol(getFactory().newElementSymbol("e1"));
helpTest(select, "DISTINCT e1");
}
@Test
public void testSelect3() {
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newElementSymbol("e1"));
select.addSymbol(getFactory().newElementSymbol("e2"));
helpTest(select, "e1, e2");
}
@Test
public void testSetCriteria1() {
SetCriteria sc = getFactory().newNode(ASTNodes.SET_CRITERIA);
sc.setExpression(getFactory().newElementSymbol("e1"));
sc.setValues(new ArrayList<Expression>());
helpTest(sc, "e1 IN ()");
}
@Test
public void testSetCriteria2() {
SetCriteria sc = getFactory().newNode(ASTNodes.SET_CRITERIA);
sc.setExpression(getFactory().newElementSymbol("e1"));
ArrayList<Expression> values = new ArrayList<Expression>();
values.add(getFactory().newElementSymbol("e2"));
values.add(getFactory().newConstant("abc"));
sc.setValues(values);
helpTest(sc, "e1 IN (e2, 'abc')");
}
@Test
public void testSetCriteria3() {
SetCriteria sc = getFactory().newNode(ASTNodes.SET_CRITERIA);
sc.setExpression(getFactory().newElementSymbol("e1"));
ArrayList<Expression> values = new ArrayList<Expression>();
values.add(null);
values.add(getFactory().newConstant("b"));
sc.setValues(values);
helpTest(sc, "e1 IN (<undefined>, 'b')");
}
@Test
public void testSetCriteria4() {
SetCriteria sc = getFactory().newNode(ASTNodes.SET_CRITERIA);
sc.setExpression(getFactory().newElementSymbol("e1"));
ArrayList<Expression> values = new ArrayList<Expression>();
values.add(getFactory().newElementSymbol("e2"));
values.add(getFactory().newConstant("abc"));
sc.setValues(values);
sc.setNegated(true);
helpTest(sc, "e1 NOT IN (e2, 'abc')");
}
@Test
public void testSetQuery1() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newElementSymbol("e1"));
From f2 = getFactory().newFrom();
f2.addGroup(getFactory().newGroupSymbol("m.g2"));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
q2.setFrom(f2);
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, false);
helpTest(sq, "SELECT e1 FROM m.g1 UNION SELECT e1 FROM m.g2");
}
@Test
public void testSetQuery2() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newElementSymbol("e1"));
From f2 = getFactory().newFrom();
f2.addGroup(getFactory().newGroupSymbol("m.g2"));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
q2.setFrom(f2);
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, true);
helpTest(sq, "SELECT e1 FROM m.g1 UNION ALL SELECT e1 FROM m.g2");
}
@Test
public void testSetQuery3() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newElementSymbol("e1"));
From f2 = getFactory().newFrom();
f2.addGroup(getFactory().newGroupSymbol("m.g2"));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
q2.setFrom(f2);
OrderBy orderBy = getFactory().newOrderBy();
orderBy.addVariable(getFactory().newElementSymbol("e1"));
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, false);
sq.setOrderBy(orderBy);
helpTest(sq, "SELECT e1 FROM m.g1 UNION SELECT e1 FROM m.g2 ORDER BY e1");
}
@Test
public void testSetQuery4() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newElementSymbol("e1"));
From f2 = getFactory().newFrom();
f2.addGroup(getFactory().newGroupSymbol("m.g2"));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
q2.setFrom(f2);
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, false);
helpTest(sq, "SELECT e1 FROM m.g1 UNION SELECT e1 FROM m.g2");
}
@Test
public void testSetQuery5() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newElementSymbol("e1"));
From f2 = getFactory().newFrom();
f2.addGroup(getFactory().newGroupSymbol("m.g2"));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
q2.setFrom(f2);
Select s3 = getFactory().newSelect();
s3.addSymbol(getFactory().newElementSymbol("e3"));
From f3 = getFactory().newFrom();
f3.addGroup(getFactory().newGroupSymbol("m.g3"));
Query q3 = getFactory().newQuery();
q3.setSelect(s3);
q3.setFrom(f3);
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, false);
SetQuery sq2 = getFactory().newSetQuery(q3, Operation.UNION, sq, true);
helpTest(sq2, "SELECT e3 FROM m.g3 UNION ALL (SELECT e1 FROM m.g1 UNION SELECT e1 FROM m.g2)");
}
@Test
public void testSubqueryFromClause1() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
SubqueryFromClause sfc = getFactory().newSubqueryFromClause("temp", q1);
helpTest(sfc, "(SELECT e1 FROM m.g1) AS temp");
}
@Test
public void testOptionalSubqueryFromClause1() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
SubqueryFromClause sfc = getFactory().newSubqueryFromClause("temp", q1);
sfc.setOptional(true);
helpTest(sfc, "/*+ optional */ (SELECT e1 FROM m.g1) AS temp");
}
@Test
public void testSubquerySetCriteria1() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
ElementSymbol expr = getFactory().newElementSymbol("e2");
SubquerySetCriteria ssc = getFactory().newSubquerySetCriteria(expr, q1);
helpTest(ssc, "e2 IN (SELECT e1 FROM m.g1)");
}
@Test
public void testSubquerySetCriteria2() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
ElementSymbol expr = getFactory().newElementSymbol("e2");
SubquerySetCriteria ssc = getFactory().newSubquerySetCriteria(expr, q1);
ssc.setNegated(true);
helpTest(ssc, "e2 NOT IN (SELECT e1 FROM m.g1)");
}
@Test
public void testUnaryFromClause() {
helpTest(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g1")), "m.g1");
}
@Test
public void testOptionalUnaryFromClause() {
UnaryFromClause unaryFromClause = getFactory().newUnaryFromClause(getFactory().newGroupSymbol("m.g1"));//$NON-NLS-1$
unaryFromClause.setOptional(true);
helpTest(unaryFromClause, "/*+ optional */ m.g1");
}
@Test
public void testUpdate1() {
Update update = getFactory().newUpdate();
update.setGroup(getFactory().newGroupSymbol("m.g1"));
update.addChange(getFactory().newElementSymbol("e1"), getFactory().newConstant("abc"));
helpTest(update, "UPDATE m.g1 SET e1 = 'abc'");
}
@Test
public void testUpdate2() {
Update update = getFactory().newUpdate();
update.setGroup(getFactory().newGroupSymbol("m.g1"));
update.addChange(getFactory().newElementSymbol("e1"), getFactory().newConstant("abc"));
update.addChange(getFactory().newElementSymbol("e2"), getFactory().newConstant("xyz"));
helpTest(update, "UPDATE m.g1 SET e1 = 'abc', e2 = 'xyz'");
}
@Test
public void testUpdate3() {
Update update = getFactory().newUpdate();
update.setGroup(getFactory().newGroupSymbol("m.g1"));
update.addChange(getFactory().newElementSymbol("e1"), getFactory().newConstant("abc"));
update.setCriteria(getFactory().newCompareCriteria(getFactory().newElementSymbol("e2"),
Operator.EQ,
getFactory().newConstant("abc")));
helpTest(update, "UPDATE m.g1 SET e1 = 'abc' WHERE e2 = 'abc'");
}
@Test
public void testAliasSymbol1() {
AliasSymbol as = getFactory().newAliasSymbol("x", getFactory().newElementSymbol("y"));
helpTest(as, "y AS x");
}
// Test alias symbol with reserved word
@Test
public void testAliasSymbol2() {
AliasSymbol as = getFactory().newAliasSymbol("select", getFactory().newElementSymbol("y"));
helpTest(as, "y AS \"select\"");
}
@Test
public void testAllSymbol() {
helpTest(getFactory().newMultipleElementSymbol(), "*");
}
@Test
public void testAllInGroupSymbol() {
helpTest(getFactory().newMultipleElementSymbol("m.g"), "m.g.*");
}
@Test
public void testConstantNull() {
helpTest(getFactory().newConstant(null), "null");
}
@Test
public void testConstantString() {
helpTest(getFactory().newConstant("abc"), "'abc'");
}
@Test
public void testConstantInteger() {
helpTest(getFactory().newConstant(new Integer(5)), "5");
}
@Test
public void testConstantBigDecimal() {
helpTest(getFactory().newConstant(new BigDecimal("5.4")), "5.4");
}
@Test
public void testConstantStringWithTick() {
helpTest(getFactory().newConstant("O'Leary"), "'O''Leary'");
}
@Test
public void testConstantStringWithTicks() {
helpTest(getFactory().newConstant("'abc'"), "'''abc'''");
}
@Test
public void testConstantStringWithMoreTicks() {
helpTest(getFactory().newConstant("a'b'c"), "'a''b''c'");
}
@Test
public void testConstantStringWithDoubleTick() {
helpTest(getFactory().newConstant("group=\"x\""), "'group=\"x\"'");
}
@Test
public void testConstantBooleanTrue() {
helpTest(getFactory().newConstant(Boolean.TRUE), "TRUE");
}
@Test
public void testConstantBooleanFalse() {
helpTest(getFactory().newConstant(Boolean.FALSE), "FALSE");
}
@Test
public void testConstantDate() {
helpTest(getFactory().newConstant(java.sql.Date.valueOf("2002-10-02")), "{d'2002-10-02'}");
}
@Test
public void testConstantTime() {
helpTest(getFactory().newConstant(java.sql.Time.valueOf("5:00:00")), "{t'05:00:00'}");
}
@Test
public void testConstantTimestamp() {
helpTest(getFactory().newConstant(java.sql.Timestamp.valueOf("2002-10-02 17:10:35.0234")), "{ts'2002-10-02 17:10:35.0234'}");
}
@Test
public void testElementSymbol1() {
ElementSymbol es = getFactory().newElementSymbol("elem");
helpTest(es, "elem");
}
@Test
public void testElementSymbol2() {
ElementSymbol es = getFactory().newElementSymbol("elem");
es.setDisplayFullyQualified(false);
es.setGroupSymbol(getFactory().newGroupSymbol("m.g"));
helpTest(es, "elem");
}
@Test
public void testElementSymbol3() {
ElementSymbol es = getFactory().newElementSymbol("m.g.elem");
es.setDisplayFullyQualified(true);
es.setGroupSymbol(getFactory().newGroupSymbol("m.g"));
helpTest(es, "m.g.elem");
}
@Test
public void testElementSymbol4() {
ElementSymbol es = getFactory().newElementSymbol("vdb.m.g.elem");
es.setDisplayFullyQualified(true);
helpTest(es, "vdb.m.g.elem");
}
@Test
public void testElementSymbol5() {
ElementSymbol es = getFactory().newElementSymbol("m.g.select");
es.setDisplayFullyQualified(false);
es.setGroupSymbol(getFactory().newGroupSymbol("m.g"));
helpTest(es, "\"select\"");
}
@Test
public void testExpressionSymbol1() {
Expression expr = getFactory().wrapExpression(getFactory().newConstant("abc"), "abc");
helpTest(expr, "'abc'");
}
@Test public void testFunction1() {
Function func = getFactory().newFunction("concat", new Expression[] {
getFactory().newConstant("a"), null
});
helpTest(func, "concat('a', <undefined>)");
}
@Test public void testFunction2() {
Function func = getFactory().newFunction("now", new Expression[] {});
helpTest(func, "now()");
}
@Test public void testFunction3() {
Function func = getFactory().newFunction("concat", new Expression[] {null, null});
helpTest(func, "concat(<undefined>, <undefined>)");
}
@Test public void testFunction4() {
Function func1 = getFactory().newFunction("power", new Expression[] {
getFactory().newConstant(new Integer(5)),
getFactory().newConstant(new Integer(3)) });
Function func2 = getFactory().newFunction("power", new Expression[] {
func1,
getFactory().newConstant(new Integer(3)) });
Function func3 = getFactory().newFunction("+", new Expression[] {
getFactory().newConstant(new Integer(1000)),
func2 });
helpTest(func3, "(1000 + power(power(5, 3), 3))");
}
@Test public void testFunction5() {
Function func1 = getFactory().newFunction("concat", new Expression[] {
getFactory().newElementSymbol("elem2"),
null });
Function func2 = getFactory().newFunction("concat", new Expression[] {
getFactory().newElementSymbol("elem1"),
func1 });
helpTest(func2, "concat(elem1, concat(elem2, <undefined>))");
}
@Test public void testConvertFunction1() {
Function func = getFactory().newFunction("convert", new Expression[] {
getFactory().newConstant("5"),
getFactory().newConstant("integer")
});
helpTest(func, "convert('5', integer)");
}
@Test public void testConvertFunction2() {
Function func = getFactory().newFunction("convert", new Expression[] {
null,
getFactory().newConstant("integer")
});
helpTest(func, "convert(<undefined>, integer)");
}
@Test public void testConvertFunction3() {
Function func = getFactory().newFunction("convert", new Expression[] {
getFactory().newConstant(null),
getFactory().newConstant("integer")
});
helpTest(func, "convert(null, integer)");
}
@Test public void testConvertFunction4() {
Function func = getFactory().newFunction("convert", new Expression[] {
getFactory().newConstant("abc"),
null
});
helpTest(func, "convert('abc', <undefined>)");
}
@Test
public void testConvertFunction5() {
Function func = getFactory().newFunction("convert");
helpTest(func, "convert()");
}
@Test
public void testConvertFunction6() {
Function func = getFactory().newFunction("convert", new Expression[0]);
helpTest(func, "convert()");
}
@Test public void testConvertFunction7() {
Function func = getFactory().newFunction("convert", new Expression[] {getFactory().newConstant("abc")});
helpTest(func, "convert('abc', <undefined>)");
}
@Test public void testCastFunction1() {
Function func = getFactory().newFunction("cast", new Expression[] {
getFactory().newConstant("5"),
getFactory().newConstant("integer")
});
helpTest(func, "cast('5' AS integer)");
}
@Test public void testCastFunction2() {
Function func = getFactory().newFunction("cast", new Expression[] {
null,
getFactory().newConstant("integer")
});
helpTest(func, "cast(<undefined> AS integer)");
}
@Test public void testCastFunction3() {
Function func = getFactory().newFunction("cast", new Expression[] {
getFactory().newConstant(null),
getFactory().newConstant("integer")
});
helpTest(func, "cast(null AS integer)");
}
@Test public void testCastFunction4() {
Function func = getFactory().newFunction("cast", new Expression[] {
getFactory().newConstant("abc"),
null
});
helpTest(func, "cast('abc' AS <undefined>)");
}
@Test public void testArithemeticFunction1() {
Function func = getFactory().newFunction("-", new Expression[] {
getFactory().newConstant(new Integer(-2)),
getFactory().newConstant(new Integer(-1))});
helpTest(func, "(-2 - -1)");
}
@Test
public void testGroupSymbol1() {
GroupSymbol gs = getFactory().newGroupSymbol("g");
helpTest(gs, "g");
}
@Test
public void testGroupSymbol2() {
GroupSymbol gs = getFactory().newGroupSymbol("x", "g");
helpTest(gs, "g AS x");
}
@Test
public void testGroupSymbol3() {
GroupSymbol gs = getFactory().newGroupSymbol("vdb.g");
helpTest(gs, "vdb.g");
}
@Test
public void testGroupSymbol4() {
GroupSymbol gs = getFactory().newGroupSymbol("x", "vdb.g");
helpTest(gs, "vdb.g AS x");
}
@Test
public void testGroupSymbol5() {
GroupSymbol gs = getFactory().newGroupSymbol("from", "m.g");
helpTest(gs, "m.g AS \"from\"");
}
@Test
public void testGroupSymbol6() {
GroupSymbol gs = getFactory().newGroupSymbol("x", "on.select");
helpTest(gs, "\"on\".\"select\" AS x");
}
@Test
public void testExecNoParams() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setProcedureName("myproc");
helpTest(proc, "EXEC myproc()");
}
@Test
public void testExecInputParam() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setProcedureName("myproc");
SPParameter param = getFactory().newSPParameter(1, getFactory().newReference(0));
proc.setParameter(param);
helpTest(proc, "EXEC myproc(?)");
}
@Test
public void testExecInputOutputParam() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setProcedureName("myproc");
SPParameter param1 = getFactory().newSPParameter(1, getFactory().newConstant(new Integer(5)));
param1.setParameterType(ISPParameter.ParameterInfo.IN);
proc.setParameter(param1);
SPParameter param2 = getFactory().newSPParameter(2, ISPParameter.ParameterInfo.OUT, "x");
proc.setParameter(param2);
helpTest(proc, "EXEC myproc(5)");
}
@Test
public void testExecOutputInputParam() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setProcedureName("myproc");
SPParameter param2 = getFactory().newSPParameter(2, ISPParameter.ParameterInfo.OUT, "x");
proc.setParameter(param2);
SPParameter param1 = getFactory().newSPParameter(1, getFactory().newConstant(new Integer(5)));
param1.setParameterType(ISPParameter.ParameterInfo.IN);
proc.setParameter(param1);
helpTest(proc, "EXEC myproc(5)");
}
@Test
public void testExecReturnParam() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setProcedureName("myproc");
SPParameter param = getFactory().newSPParameter(1, ISPParameter.ParameterInfo.RETURN_VALUE, "ret");
proc.setParameter(param);
helpTest(proc, "EXEC myproc()");
}
@Test
public void testExecNamedParam() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setDisplayNamedParameters(true);
proc.setProcedureName("myproc");
SPParameter param = getFactory().newSPParameter(1, getFactory().newReference(0));
param.setName("p1");//$NON-NLS-1$
proc.setParameter(param);
helpTest(proc, "EXEC myproc(p1 => ?)");
}
@Test
public void testExecNamedParams() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setDisplayNamedParameters(true);
proc.setProcedureName("myproc");
SPParameter param = getFactory().newSPParameter(1, getFactory().newReference(0));
param.setName("p1");//$NON-NLS-1$
proc.setParameter(param);
SPParameter param2 = getFactory().newSPParameter(2, getFactory().newReference(0));
param2.setName("p2");//$NON-NLS-1$
proc.setParameter(param2);
helpTest(proc, "EXEC myproc(p1 => ?, p2 => ?)");
}
/**
* Test when a parameter's name is a reserved word.
* (Note: parameters should always have short names, not
* multiple period-delimited name components.)
*
* @since 4.3
*/
@Test
public void testExecNamedParamsReservedWord() {
StoredProcedure proc = getFactory().newStoredProcedure();
proc.setDisplayNamedParameters(true);
proc.setProcedureName("myproc");
SPParameter param = getFactory().newSPParameter(1, getFactory().newReference(0));
param.setName("in");//$NON-NLS-1$
proc.setParameter(param);
SPParameter param2 = getFactory().newSPParameter(2, getFactory().newReference(0));
param2.setName("in2");//$NON-NLS-1$
proc.setParameter(param2);
helpTest(proc, "EXEC myproc(\"in\" => ?, in2 => ?)");
}
// Test methods for Update Procedure Language Objects
@Test
public void testDeclareStatement() {
DeclareStatement dclStmt = getFactory().newDeclareStatement(getFactory().newElementSymbol("a"), "String");
helpTest(dclStmt, "DECLARE String a;");
}
@Test
public void testAssignmentStatement1() {
AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), getFactory().newConstant(new Integer(1)));
helpTest(assigStmt, "a = 1;");
}
@Test
public void testAssignmentStatement2() {
Query q1 = getFactory().newQuery();
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newElementSymbol("x"));
q1.setSelect(select);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
q1.setFrom(from);
AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), q1);
helpTest(assigStmt, "a = (SELECT x FROM g);");
}
@Test
public void testCommandStatement1() {
Query q1 = getFactory().newQuery();
Select select = getFactory().newSelect();
select.addSymbol(getFactory().newElementSymbol("x"));
q1.setSelect(select);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
q1.setFrom(from);
CommandStatement cmdStmt = getFactory().newCommandStatement(q1);
helpTest(cmdStmt, "SELECT x FROM g;");
}
@Test
public void testCommandStatement2() {
Delete d1 = getFactory().newNode(ASTNodes.DELETE);
d1.setGroup(getFactory().newGroupSymbol("g"));
CommandStatement cmdStmt = getFactory().newCommandStatement(d1);
helpTest(cmdStmt, "DELETE FROM g;");
}
@Test
public void testSubqueryCompareCriteria1() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
ElementSymbol expr = getFactory().newElementSymbol("e2");
SubqueryCompareCriteria scc = getFactory().newSubqueryCompareCriteria(expr,
q1,
Operator.EQ,
PredicateQuantifier.ANY);
helpTest(scc, "e2 = ANY (SELECT e1 FROM m.g1)");
}
@Test
public void testSubqueryCompareCriteria2() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
ElementSymbol expr = getFactory().newElementSymbol("e2");
SubqueryCompareCriteria scc = getFactory().newSubqueryCompareCriteria(expr,
q1,
Operator.LE,
PredicateQuantifier.SOME);
helpTest(scc, "e2 <= SOME (SELECT e1 FROM m.g1)");
}
@Test
public void testExistsCriteria1() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
ExistsCriteria ec = getFactory().newExistsCriteria(q1);
helpTest(ec, "EXISTS (SELECT e1 FROM m.g1)");
}
@Test
public void testDynamicCommand() {
List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
ElementSymbol a1 = getFactory().newElementSymbol("a1");
a1.setType(DataTypeManagerService.DefaultDataTypes.STRING.getTypeClass());
symbols.add(a1);
DynamicCommand obj = getFactory().newDynamicCommand();
Expression sql = getFactory().newConstant("SELECT a1 FROM g WHERE a2 = 5");
obj.setSql(sql);
obj.setAsColumns(symbols);
obj.setAsClauseSet(true);
obj.setIntoGroup(getFactory().newGroupSymbol("#g"));
helpTest(obj, "EXECUTE IMMEDIATE 'SELECT a1 FROM g WHERE a2 = 5' AS a1 string INTO #g");
}
@Test
public void testScalarSubquery() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
ScalarSubquery obj = getFactory().newScalarSubquery(q1);
helpTest(obj, "(SELECT e1 FROM m.g1)");
}
@Test
public void testNewSubqueryObjects() {
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newElementSymbol("e1"));
From f1 = getFactory().newFrom();
f1.addGroup(getFactory().newGroupSymbol("m.g1"));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
q1.setFrom(f1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newElementSymbol("e1"));
s2.addSymbol(getFactory().wrapExpression(getFactory().newScalarSubquery(q1), "blargh"));
From f2 = getFactory().newFrom();
f2.addGroup(getFactory().newGroupSymbol("m.g2"));
Criteria left = getFactory().newSubqueryCompareCriteria(getFactory().newElementSymbol("e3"), q1, Operator.GE, PredicateQuantifier.ANY);
Criteria right = getFactory().newExistsCriteria(q1);
Criteria outer = getFactory().newCompoundCriteria(CompoundCriteria.AND, left, right);
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
q2.setFrom(f2);
q2.setCriteria(outer);
helpTest(q2,
"SELECT e1, (SELECT e1 FROM m.g1) FROM m.g2 WHERE (e3 >= ANY (SELECT e1 FROM m.g1)) AND (EXISTS (SELECT e1 FROM m.g1))");
}
@Test
public void testCaseExpression1() {
helpTest(example(2), "CASE x WHEN 'a' THEN 0 WHEN 'b' THEN 1 ELSE 9999 END");
}
@Test
public void testCaseExpression2() {
CaseExpression example = example(2);
example.setElseExpression(null);
helpTest(example, "CASE x WHEN 'a' THEN 0 WHEN 'b' THEN 1 END");
}
@Test
public void testCaseExpression3() {
CaseExpression example = caseExample(3, 0, true);
helpTest(example, "CASE x WHEN null THEN 0 WHEN 'b' THEN 1 WHEN 'c' THEN 2 ELSE 9999 END");
}
@Test
public void testCaseExpression4() {
CaseExpression example = caseExample(3, 2, true);
example.setElseExpression(null);
helpTest(example, "CASE x WHEN 'a' THEN 0 WHEN 'b' THEN 1 WHEN null THEN 2 END");
}
@Test
public void testSearchedCaseExpression1() {
helpTest(searchedCaseExample(2), "CASE WHEN x = 0 THEN 0 WHEN x = 1 THEN 1 ELSE 9999 END");
}
@Test
public void testSearchedCaseExpression2() {
SearchedCaseExpression example = searchedCaseExample(2);
example.setElseExpression(null);
helpTest(example, "CASE WHEN x = 0 THEN 0 WHEN x = 1 THEN 1 END");
}
/**
* For some reason this test was outputting
* SELECT 'A' AS FOO UNION SELECT 'A' AS FOO
*/
@Test
public void testSetQueryUnionOfLiteralsCase3102() {
String expected = "SELECT 'A' AS FOO UNION SELECT 'B' AS FOO";
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newAliasSymbol("FOO", getFactory().wrapExpression(getFactory().newConstant("A"), "xxx")));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newAliasSymbol("FOO", getFactory().wrapExpression(getFactory().newConstant("B"), "xxx")));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, false);
helpTest(sq, expected);
}
/**
* For some reason this test was outputting
* SELECT 'A' AS FOO UNION SELECT 'A' AS FOO
* Same as above except that ExpressionSymbols' internal names (which aren't visible
* in the query) are different
*/
@Test
public void testSetQueryUnionOfLiteralsCase3102a() {
String expected = "SELECT 'A' AS FOO UNION SELECT 'B' AS FOO";
Select s1 = getFactory().newSelect();
s1.addSymbol(getFactory().newAliasSymbol("FOO", getFactory().wrapExpression(getFactory().newConstant("A"), "xxx")));
Query q1 = getFactory().newQuery();
q1.setSelect(s1);
Select s2 = getFactory().newSelect();
s2.addSymbol(getFactory().newAliasSymbol("FOO", getFactory().wrapExpression(getFactory().newConstant("B"), "yyy")));
Query q2 = getFactory().newQuery();
q2.setSelect(s2);
SetQuery sq = getFactory().newSetQuery(q1, Operation.UNION, q2, false);
helpTest(sq, expected);
}
@Test
public void testLimit() {
Query query = getFactory().newQuery();
Select select = getFactory().newSelect(Arrays.asList(getFactory().newMultipleElementSymbol()));
From from = getFactory().newFrom(Arrays.asList(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("a"))));
query.setSelect(select);
query.setFrom(from);
Limit limit = getFactory().newNode(ASTNodes.LIMIT);
limit.setRowLimit(getFactory().newConstant(new Integer(100)));
query.setLimit(limit);
helpTest(query, "SELECT * FROM a LIMIT 100");
}
@Test
public void testLimitWithOffset() {
Query query = getFactory().newQuery();
Select select = getFactory().newSelect(Arrays.asList(getFactory().newMultipleElementSymbol()));
From from = getFactory().newFrom(Arrays.asList(getFactory().newUnaryFromClause(getFactory().newGroupSymbol("a"))));
query.setSelect(select);
query.setFrom(from);
Limit limit = getFactory().newNode(ASTNodes.LIMIT);
limit.setOffset(getFactory().newConstant(new Integer(50)));
limit.setRowLimit(getFactory().newConstant(new Integer(100)));
query.setLimit(limit);
helpTest(query, "SELECT * FROM a LIMIT 50, 100");
}
@Test
public void testUnionOrderBy() throws Exception {
Command command = parser.parseCommand("select pm1.g1.e1 from pm1.g1 union select e2 from pm1.g2 order by e1");
QueryResolver queryResolver = new QueryResolver(parser);
queryResolver.resolveCommand(command, metadataFactory.example1Cached());
helpTest(command, "SELECT pm1.g1.e1 FROM pm1.g1 UNION SELECT e2 FROM pm1.g2 ORDER BY e1");
}
@Test
public void testUnionBranchOrderBy() throws Exception {
Command command = parser.parseCommand("select pm1.g1.e1 from pm1.g1 union (select e2 from pm1.g2 order by e1)");
QueryResolver queryResolver = new QueryResolver(parser);
queryResolver.resolveCommand(command, metadataFactory.example1Cached());
helpTest(command, "SELECT pm1.g1.e1 FROM pm1.g1 UNION (SELECT e2 FROM pm1.g2 ORDER BY e1)");
}
@Test
public void testAliasedOrderBy() throws Exception {
Command command = parser.parseCommand("select pm1.g1.e1 as a from pm1.g1 order by a");
QueryResolver queryResolver = new QueryResolver(parser);
queryResolver.resolveCommand(command, metadataFactory.example1Cached());
helpTest(command, "SELECT pm1.g1.e1 AS a FROM pm1.g1 ORDER BY a");
}
@Test
public void testNumberOrderBy() throws Exception {
Command command = parser.parseCommand("select pm1.g1.e1 as a from pm1.g1 order by 1");
QueryResolver queryResolver = new QueryResolver(parser);
queryResolver.resolveCommand(command, metadataFactory.example1Cached());
helpTest(command, "SELECT pm1.g1.e1 AS a FROM pm1.g1 ORDER BY 1");
}
@Test
public void testLikeRegex() throws Exception {
helpTestExpression("x like_regex 'b'", "x LIKE_REGEX 'b'");
}
@Test
public void testSimilar() throws Exception {
helpTestExpression("x similar to 'b' escape 'c'", "x SIMILAR TO 'b' ESCAPE 'c'");
}
@Test
public void testTextTable() throws Exception {
String sql =
"SELECT * from texttable(file columns x string WIDTH 1 NO TRIM NO ROW DELIMITER) as x";
helpTest(parser.parseCommand(sql),
"SELECT * FROM TEXTTABLE(file COLUMNS x string WIDTH 1 NO ROW DELIMITER NO TRIM) AS x");
}
}