/*
* 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.v7;
import static org.junit.Assert.assertEquals;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.query.parser.TeiidNodeFactory.ASTNodes;
import org.teiid.query.parser.v7.Teiid7Parser;
import org.teiid.query.sql.AbstractTestQueryParser;
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.CriteriaOperator;
import org.teiid.query.sql.lang.CriteriaOperator.Operator;
import org.teiid.query.sql.lang.CriteriaSelector;
import org.teiid.query.sql.lang.Drop;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.HasCriteria;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.TranslateCriteria;
import org.teiid.query.sql.proc.AssignmentStatement;
import org.teiid.query.sql.proc.Block;
import org.teiid.query.sql.proc.BranchingStatement.BranchingMode;
import org.teiid.query.sql.proc.CommandStatement;
import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
import org.teiid.query.sql.proc.IfStatement;
import org.teiid.query.sql.proc.LoopStatement;
import org.teiid.query.sql.proc.RaiseErrorStatement;
import org.teiid.query.sql.proc.Statement;
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;
/**
* Unit testing for the Query Parser for teiid version 7
*/
@SuppressWarnings( {"nls", "javadoc"} )
public class TestQuery7Parser extends AbstractTestQueryParser {
private Test7Factory factory;
/**
*
*/
public TestQuery7Parser() {
super(Version.TEIID_7_7);
}
@Override
protected Test7Factory getFactory() {
if (factory == null)
factory = new Test7Factory(parser);
return factory;
}
private void helpCriteriaSelectorTest(String selector, String expectedString, CriteriaSelector expectedSelector)
throws Exception {
// Don't use query parser as criteriaSelector is not part of the interface
Teiid7Parser teiid7Parser = new Teiid7Parser(new StringReader(selector));
CriteriaSelector actualSelector = teiid7Parser.criteriaSelector();
assertEquals("CriteriaSelector does not match: ", expectedSelector, actualSelector);
}
/** SELECT 1.3e8 FROM a.g1 */
@Test
public void testFloatWithE() {
GroupSymbol g = getFactory().newGroupSymbol("a.g1");
From from = getFactory().newFrom();
from.addGroup(g);
Select select = getFactory().newSelect();
select.addSymbol(getFactory().wrapExpression(getFactory().newConstant(new Double(1.3e8))));
Query query = getFactory().newQuery(select, from);
helpTest("SELECT 1.3e8 FROM a.g1",
"SELECT 1.3E8 FROM a.g1",
query);
}
/** SELECT -1.3e-6 FROM a.g1 */
@Test
public void testFloatWithMinusE() {
GroupSymbol g = getFactory().newGroupSymbol("a.g1");
From from = getFactory().newFrom();
from.addGroup(g);
Select select = getFactory().newSelect();
select.addSymbol(getFactory().wrapExpression(getFactory().newConstant(new Double(-1.3e-6))));
Query query = getFactory().newQuery(select, from);
helpTest("SELECT -1.3e-6 FROM a.g1",
"SELECT -1.3E-6 FROM a.g1",
query);
}
/** SELECT -1.3e+8 FROM a.g1 */
@Test
public void testFloatWithPlusE() {
GroupSymbol g = getFactory().newGroupSymbol("a.g1");
From from = getFactory().newFrom();
from.addGroup(g);
Select select = getFactory().newSelect();
select.addSymbol(getFactory().wrapExpression(getFactory().newConstant(new Double(-1.3e+8))));
Query query = getFactory().newQuery(select, from);
helpTest("SELECT -1.3e+8 FROM a.g1",
"SELECT -1.3E8 FROM a.g1",
query);
}
@Test
public void testLikeWithEscapeException() {
helpException("SELECT a from db.g where b like '#String' escape '#1'", null);
}
@Test
public void testFailsWildcardInSelect1() {
helpException("SELECT % from xx.yy", null);
}
@Test
public void testInvalidToken() {
helpException("%", null);
}
@Test
public void testErrorStatement() throws Exception {
RaiseErrorStatement errStmt = getFactory().newNode(ASTNodes.RAISE_ERROR_STATEMENT);
errStmt.setExpression(getFactory().newConstant("Test only"));
helpStmtTest("ERROR 'Test only';", "ERROR 'Test only';",
errStmt);
}
@Test
public void testCriteriaSelector0() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IS_NULL);
critSelector.addElement(a);
helpCriteriaSelectorTest("IS NULL CRITERIA ON (a)", "IS NULL CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector1() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.EQ);
critSelector.addElement(a);
helpCriteriaSelectorTest("= CRITERIA ON (a)", "= CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector2() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.NE);
critSelector.addElement(a);
helpCriteriaSelectorTest("<> CRITERIA ON (a)", "<> CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector3() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LT);
critSelector.addElement(a);
helpCriteriaSelectorTest("< CRITERIA ON (a)", "< CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector4() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.GT);
critSelector.addElement(a);
helpCriteriaSelectorTest("> CRITERIA ON (a)", "> CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector5() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.GE);
critSelector.addElement(a);
helpCriteriaSelectorTest(">= CRITERIA ON (a)", ">= CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector6() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LE);
critSelector.addElement(a);
helpCriteriaSelectorTest("<= CRITERIA ON (a)", "<= CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector7() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LIKE);
critSelector.addElement(a);
helpCriteriaSelectorTest("LIKE CRITERIA ON (a)", "LIKE CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector8() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IN);
critSelector.addElement(a);
helpCriteriaSelectorTest("IN CRITERIA ON (a)", "IN CRITERIA ON (a)", critSelector);
}
@Test
public void testCriteriaSelector9() throws Exception {
//ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
//critSelector.setSelectorType(Operator.IS_NULL);
//critSelector.addElement(a);
helpCriteriaSelectorTest("CRITERIA", "CRITERIA", critSelector);
}
@Test
public void testCriteriaSelector10() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.BETWEEN);
critSelector.addElement(a);
helpCriteriaSelectorTest("BETWEEN CRITERIA ON (a)", "BETWEEN CRITERIA ON (a)", critSelector);
}
/**HAS IS NULL CRITERIA ON (a)*/
@Test
public void testHasIsNullCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IS_NULL);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS IS NULL CRITERIA ON (a)", "HAS IS NULL CRITERIA ON (a)",
hasSelector);
}
/**HAS LIKE CRITERIA ON (a)*/
@Test
public void testHasLikeCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LIKE);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS LIKE CRITERIA ON (a)", "HAS LIKE CRITERIA ON (a)",
hasSelector);
}
@Test
public void testHasEQCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.EQ);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS = CRITERIA ON (a)", "HAS = CRITERIA ON (a)",
hasSelector);
}
@Test
public void testHasNECriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.NE);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS <> CRITERIA ON (a)", "HAS <> CRITERIA ON (a)",
hasSelector);
}
/**HAS IN CRITERIA ON (a)*/
@Test
public void testHasInCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IN);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS IN CRITERIA ON (a)", "HAS IN CRITERIA ON (a)",
hasSelector);
}
/**HAS COMPARE_LT CRITERIA ON (a)*/
@Test
public void testHasLTCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LT);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS < CRITERIA ON (a)", "HAS < CRITERIA ON (a)",
hasSelector);
}
/**HAS COMPARE_LE CRITERIA ON (a)*/
@Test
public void testHasLECriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LE);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS <= CRITERIA ON (a)", "HAS <= CRITERIA ON (a)",
hasSelector);
}
/**HAS COMPARE_GT CRITERIA ON (a)*/
@Test
public void testHasGTCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.GT);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS > CRITERIA ON (a)", "HAS > CRITERIA ON (a)",
hasSelector);
}
/**HAS COMPARE_GE CRITERIA ON (a)*/
@Test
public void testHasGECriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.GE);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS >= CRITERIA ON (a)", "HAS >= CRITERIA ON (a)",
hasSelector);
}
/**HAS BETWEEN CRITERIA ON (a)*/
@Test
public void testHasBetweenCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.BETWEEN);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
helpCriteriaTest("HAS BETWEEN CRITERIA ON (a)", "HAS BETWEEN CRITERIA ON (a)",
hasSelector);
}
@Test
public void testTranslateCriteria() throws Exception {
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
Criteria crit = getFactory().newCompareCriteria(a, Operator.EQ, getFactory().newConstant(new Integer(5)));
List critList = new ArrayList();
critList.add(crit);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IS_NULL);
critSelector.setElements(elements);
TranslateCriteria transCriteria = getFactory().newTranslateCriteria(critSelector, critList);
helpCriteriaTest("TRANSLATE IS NULL CRITERIA ON (a) WITH (a = 5)",
"TRANSLATE IS NULL CRITERIA ON (a) WITH (a = 5)",
transCriteria);
//helpCriteriaTest("TRANSLATE IS NULL CRITERIA ON (a) USING transFuncEQ (a)",
//"TRANSLATE IS NULL CRITERIA ON (a) USING transFuncEQ (a)",
//transCriteria);
}
/** original test */
@Test
public void testCreateUpdateProcedureCommand() {
helpTestCreateUpdateProcedureCommandCase3025("CREATE PROCEDURE\nBEGIN\nDECLARE short var1;" +
"IF(HAS IS NULL CRITERIA ON (a))\nBEGIN\nvar1 = (SELECT a1 FROM g WHERE a2 = 5);\nEND\n"
+
"ELSE\nBEGIN\nDECLARE short var2;\nvar2 = (SELECT b1 FROM g WHERE a2 = 5);\nEND\n"
+
" END");
}
@Test
public void testCreateUpdateProcedureCommandCase3025_1() {
helpTestCreateUpdateProcedureCommandCase3025("CREATE PROCEDURE\nBEGIN\nDECLARE short var1;" +
"IF(HAS IS NULL CRITERIA ON (a))\nBEGIN\nvar1 = (SELECT a1 FROM g WHERE a2 = 5);\nEND\n"
+
"ELSE\nBEGIN\nDECLARE short var2;\nvar2 = (SELECT b1 FROM g WHERE a2 = 5);\nEND\n"
+
" END");
}
@Test
public void testCreateUpdateProcedureCommandCase3025_2() {
helpTestCreateUpdateProcedureCommandCase3025("CREATE PROCEDURE\nBEGIN\nDECLARE short var1;" +
"IF(HAS IS NULL CRITERIA ON (a))\nBEGIN\nvar1 = ((SELECT a1 FROM g WHERE a2 = 5) );\nEND\n"
+
"ELSE\nBEGIN\nDECLARE short var2;\nvar2 = (SELECT b1 FROM g WHERE a2 = 5);\nEND\n"
+
" END");
}
private void helpTestCreateUpdateProcedureCommandCase3025(String procedureString) {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List<ElementSymbol> elseSymbols = new ArrayList<ElementSymbol>();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IS_NULL);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest(procedureString, "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS IS NULL CRITERIA ON (a))"
+ "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
/** test an expression in parentheses in an assignment statement */
@Test
public void testCreateUpdateProcedureCommandCase3025_3() {
String procedureString = "CREATE PROCEDURE\nBEGIN\nDECLARE short var1;" +
"IF(HAS IS NULL CRITERIA ON (a))\nBEGIN\nvar1 = (concat('x', 'y') );\nEND\n" +
"ELSE\nBEGIN\nDECLARE short var2;\nvar2 = (SELECT b1 FROM g WHERE a2 = 5);\nEND\n" +
" END";
helpTestCreateUpdateProcedureCommandCase3025_Expression(procedureString);
}
/** test an expression in parentheses in an assignment statement */
@Test
public void testCreateUpdateProcedureCommandCase3025_4() {
String procedureString = "CREATE PROCEDURE\nBEGIN\nDECLARE short var1;" +
"IF(HAS IS NULL CRITERIA ON (a))\nBEGIN\nvar1 = ((concat('x', 'y') ));\nEND\n" +
"ELSE\nBEGIN\nDECLARE short var2;\nvar2 = (SELECT b1 FROM g WHERE a2 = 5);\nEND\n" +
" END";
helpTestCreateUpdateProcedureCommandCase3025_Expression(procedureString);
}
/** test an expression without parentheses in an assignment statement */
@Test
public void testCreateUpdateProcedureCommandCase3025_5() {
String procedureString = "CREATE PROCEDURE\nBEGIN\nDECLARE short var1;" +
"IF(HAS IS NULL CRITERIA ON (a))\nBEGIN\nvar1 = concat('x', 'y') ;\nEND\n" +
"ELSE\nBEGIN\nDECLARE short var2;\nvar2 = (SELECT b1 FROM g WHERE a2 = 5);\nEND\n" +
" END";
helpTestCreateUpdateProcedureCommandCase3025_Expression(procedureString);
}
/** test an expression in parentheses in an assignment statement */
private void helpTestCreateUpdateProcedureCommandCase3025_Expression(String procedureString) {
String expectedString = "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS IS NULL CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = concat('x', 'y');" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END";
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
Expression[] args = new Expression[] {getFactory().newConstant("x"), getFactory().newConstant("y")};
Function function = getFactory().newFunction("concat", args);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, function);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List<ElementSymbol> elseSymbols = new ArrayList<ElementSymbol>();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IS_NULL);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest(procedureString, expectedString, cmd);
}
/**IF statement with has criteria */
@Test
public void testCreateUpdateProcedureCommand1() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE a2 = 5; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
@Test
public void testCreateUpdateProcedureCommand0() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
//critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS CRITERIA) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE a2 = 5; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS CRITERIA)" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
/**IF statement with has LIKE criteria */
@Test
public void testCreateUpdateProcedureCommand2() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.LIKE);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS LIKE CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE a2 = 5; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS LIKE CRITERIA ON (a))"
+ "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
/**IF statement with has IN criteria */
@Test
public void testCreateUpdateProcedureCommand3() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.IN);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS IN CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE a2 = 5; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS IN CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
/**IF statement with has <> criteria */
@Test
public void testCreateUpdateProcedureCommand4() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
//has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
critSelector.setSelectorType(Operator.NE);
critSelector.setElements(elements);
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE a2 = 5; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
/**Has criteria in WHERE clause*/
@Test
public void testCreateUpdateProcedureCommand5() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
//element for has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
CriteriaSelector critSelector2 = getFactory().newCriteriaSelector();
//critSelector2.setSelectorType(Operator.NE);
critSelector2.setElements(elements);
HasCriteria hasSelector2 = getFactory().newHasCriteria(critSelector2);
//has criteria for else block
elseQuery.setCriteria(hasSelector2);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector1 = getFactory().newCriteriaSelector();
critSelector1.setSelectorType(Operator.NE);
critSelector1.setElements(elements);
HasCriteria hasSelector1 = getFactory().newHasCriteria(critSelector1);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector1);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE HAS CRITERIA ON (a); END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE HAS CRITERIA ON (a));" + "\n" + "END" + "\n" + "END", cmd);
}
/** Translate criteria (empty criteriaSelector in WHERE clause*/
@Test
public void testCreateUpdateProcedureCommand7() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
//element for has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
Criteria crit = getFactory().newCompareCriteria(a, Operator.EQ, getFactory().newConstant(new Integer(5)));
List critList = new ArrayList();
critList.add(crit);
CriteriaSelector critSelector2 = getFactory().newCriteriaSelector();
//critSelector2.setSelectorType(Operator.IS_NULL);
critSelector2.setElements(elements);
TranslateCriteria transCriteria = getFactory().newTranslateCriteria(critSelector2, critList);
elseQuery.setCriteria(transCriteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector1 = getFactory().newCriteriaSelector();
critSelector1.setSelectorType(Operator.NE);
critSelector1.setElements(elements);
HasCriteria hasSelector1 = getFactory().newHasCriteria(critSelector1);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector1);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = (SELECT b1 FROM g WHERE TRANSLATE CRITERIA ON (a) WITH (a = 5)); END" +
" END",
"CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE TRANSLATE CRITERIA ON (a) WITH (a = 5));" + "\n" + "END" + "\n" + "END", cmd);
}
/** Translate criteria (is null criteriaSelector in WHERE clause*/
@Test
public void testCreateUpdateProcedureCommand9() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
//element for has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
Criteria crit = getFactory().newCompareCriteria(a, Operator.EQ, getFactory().newConstant(new Integer(5)));
List critList = new ArrayList();
critList.add(crit);
CriteriaSelector critSelector2 = getFactory().newCriteriaSelector();
critSelector2.setSelectorType(Operator.IS_NULL);
critSelector2.setElements(elements);
TranslateCriteria transCriteria = getFactory().newTranslateCriteria(critSelector2, critList);
elseQuery.setCriteria(transCriteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector1 = getFactory().newCriteriaSelector();
critSelector1.setSelectorType(Operator.NE);
critSelector1.setElements(elements);
HasCriteria hasSelector1 = getFactory().newHasCriteria(critSelector1);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector1);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END"
+
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE TRANSLATE IS NULL CRITERIA ON (a) WITH (a = 5); END"
+
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE TRANSLATE IS NULL CRITERIA ON (a) WITH (a = 5));"
+ "\n" + "END" + "\n" + "END", cmd);
}
/** Translate criteria ( only with WHERE clause) */
@Test
public void testCreateUpdateProcedureCommand10() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
//element for has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
Criteria crit = getFactory().newCompareCriteria(a, Operator.EQ, getFactory().newConstant(new Integer(5)));
List critList = new ArrayList();
critList.add(crit);
TranslateCriteria transCriteria = getFactory().newTranslateCriteria();
CriteriaSelector critSelector2 = getFactory().newCriteriaSelector();
transCriteria.setTranslations(critList);
transCriteria.setSelector(critSelector2);
elseQuery.setCriteria(transCriteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector1 = getFactory().newCriteriaSelector();
critSelector1.setSelectorType(Operator.NE);
critSelector1.setElements(elements);
HasCriteria hasSelector1 = getFactory().newHasCriteria(critSelector1);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector1);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE TRANSLATE CRITERIA WITH (a = 5); END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE TRANSLATE CRITERIA WITH (a = 5));" + "\n" + "END" + "\n" + "END", cmd);
}
/** Translate criteria ( only with WHERE clause) */
@Test
public void testCreateUpdateProcedureCommand12() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
//element for has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
Criteria crit1 = getFactory().newCompareCriteria(a, Operator.EQ, getFactory().newConstant(new Integer(5)));
ElementSymbol m = getFactory().newElementSymbol("m");
Criteria crit2 = getFactory().newCompareCriteria(m, Operator.EQ, getFactory().newConstant(new Integer(6)));
List critList = new ArrayList();
critList.add(crit1);
critList.add(crit2);
TranslateCriteria transCriteria = getFactory().newTranslateCriteria();
CriteriaSelector critSelector2 = getFactory().newCriteriaSelector();
transCriteria.setTranslations(critList);
transCriteria.setSelector(critSelector2);
elseQuery.setCriteria(transCriteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector1 = getFactory().newCriteriaSelector();
critSelector1.setSelectorType(Operator.NE);
critSelector1.setElements(elements);
HasCriteria hasSelector1 = getFactory().newHasCriteria(critSelector1);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector1);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE TRANSLATE CRITERIA WITH (a = 5, m = 6); END" +
" END",
"CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE TRANSLATE CRITERIA WITH (a = 5, m = 6));" + "\n" + "END" + "\n" + "END", cmd);
}
/** Translate criteria (with only Criteria in WHERE clause) */
@Test
public void testCreateUpdateProcedureCommand11() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
//element for has criteria
ElementSymbol a = getFactory().newElementSymbol("a");
List elements = new ArrayList();
elements.add(a);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
Criteria crit = getFactory().newCompareCriteria(a, Operator.EQ, getFactory().newConstant(new Integer(5)));
List critList = new ArrayList();
critList.add(crit);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
TranslateCriteria transCrit = getFactory().newTranslateCriteria();
transCrit.setSelector(critSelector);
elseQuery.setCriteria(transCrit);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector1 = getFactory().newCriteriaSelector();
critSelector1.setSelectorType(Operator.NE);
critSelector1.setElements(elements);
HasCriteria hasSelector1 = getFactory().newHasCriteria(critSelector1);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector1);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS <> CRITERIA ON (a)) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE TRANSLATE CRITERIA; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS <> CRITERIA ON (a))" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE TRANSLATE CRITERIA);" + "\n" + "END" + "\n" + "END", cmd);
}
/**IF statement with has criteria no on */
@Test
public void testCreateUpdateProcedureCommand8() {
//declare var1
ElementSymbol var1 = getFactory().newElementSymbol("var1");
String shortType = new String("short");
Statement declStmt = getFactory().newDeclareStatement(var1, shortType);
//ifblock
List symbols = new ArrayList();
symbols.add(getFactory().newElementSymbol("a1"));
Select select = getFactory().newSelect(symbols);
From from = getFactory().newFrom();
from.addGroup(getFactory().newGroupSymbol("g"));
Criteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("a2"), Operator.EQ,
getFactory().newConstant(new Integer(5)));
Query query = getFactory().newQuery(select, from);
query.setCriteria(criteria);
AssignmentStatement queryStmt = getFactory().newAssignmentStatement(var1, query);
Block ifBlock = getFactory().newBlock();
ifBlock.addStatement(queryStmt);
//else block
ElementSymbol var2 = getFactory().newElementSymbol("var2");
Statement elseDeclStmt = getFactory().newDeclareStatement(var2, shortType);
List elseSymbols = new ArrayList();
elseSymbols.add(getFactory().newElementSymbol("b1"));
Select elseSelect = getFactory().newSelect(elseSymbols);
Query elseQuery = getFactory().newQuery(elseSelect, from);
elseQuery.setCriteria(criteria);
AssignmentStatement elseQueryStmt = getFactory().newAssignmentStatement(var2, elseQuery);
Block elseBlock = getFactory().newBlock();
List elseStmts = new ArrayList();
elseStmts.add(elseDeclStmt);
elseStmts.add(elseQueryStmt);
elseBlock.setStatements(elseStmts);
CriteriaSelector critSelector = getFactory().newCriteriaSelector();
HasCriteria hasSelector = getFactory().newHasCriteria(critSelector);
IfStatement stmt = getFactory().newIfStatement(ifBlock, elseBlock, hasSelector);
Block block = getFactory().newBlock();
block.addStatement(declStmt);
block.addStatement(stmt);
CreateUpdateProcedureCommand cmd = getFactory().newCreateUpdateProcedureCommand();
cmd.setBlock(block);
helpTest("CREATE PROCEDURE BEGIN DECLARE short var1;" +
" IF(HAS CRITERIA) BEGIN var1 = SELECT a1 FROM g WHERE a2 = 5; END" +
" ELSE BEGIN DECLARE short var2; var2 = SELECT b1 FROM g WHERE a2 = 5; END" +
" END", "CREATE PROCEDURE" + "\n" + "BEGIN" + "\n" + "DECLARE short var1;" + "\n" +
"IF(HAS CRITERIA)" + "\n" + "BEGIN" + "\n" + "var1 = (SELECT a1 FROM g WHERE a2 = 5);" + "\n" +
"END" + "\n" + "ELSE" + "\n" + "BEGIN" + "\n" + "DECLARE short var2;" + "\n" +
"var2 = (SELECT b1 FROM g WHERE a2 = 5);" + "\n" + "END" + "\n" + "END", cmd);
}
@Test
public void testVirtualProcedure() {
ElementSymbol x = getFactory().newElementSymbol("x");
String intType = new String("integer");
Statement dStmt = getFactory().newDeclareStatement(x, intType);
GroupSymbol g = getFactory().newGroupSymbol("m.g");
From from = getFactory().newFrom();
from.addGroup(g);
Select select = getFactory().newSelect();
ElementSymbol c1 = getFactory().newElementSymbol("c1");
select.addSymbol(c1);
select.addSymbol(getFactory().newElementSymbol("c2"));
Query query = getFactory().newQuery(select, from);
x = getFactory().newElementSymbol("x");
c1 = getFactory().newElementSymbol("mycursor.c1");
Statement assignmentStmt = getFactory().newAssignmentStatement(x, c1);
Block block = getFactory().newBlock();
block.addStatement(assignmentStmt);
Block ifBlock = getFactory().newBlock();
Statement continueStmt = getFactory().newBranchingStatement(BranchingMode.CONTINUE);
ifBlock.addStatement(continueStmt);
Criteria crit = getFactory().newCompareCriteria(x, Operator.GT, getFactory().newConstant(new Integer(5)));
IfStatement ifStmt = getFactory().newIfStatement(crit, ifBlock);
block.addStatement(ifStmt);
String cursor = "mycursor";
LoopStatement loopStmt = getFactory().newLoopStatement(block, query, cursor);
block = getFactory().newBlock();
block.addStatement(dStmt);
block.addStatement(loopStmt);
CommandStatement cmdStmt = getFactory().newCommandStatement(query);
block.addStatement(cmdStmt);
CreateUpdateProcedureCommand virtualProcedureCommand = getFactory().newCreateUpdateProcedureCommand();
virtualProcedureCommand.setBlock(block);
virtualProcedureCommand.setUpdateProcedure(false);
helpTest("CREATE VIRTUAL PROCEDURE BEGIN DECLARE integer x; LOOP ON (SELECT c1, c2 FROM m.g) AS mycursor BEGIN x=mycursor.c1; IF(x > 5) BEGIN CONTINUE; END END SELECT c1, c2 FROM m.g; END",
"CREATE VIRTUAL PROCEDURE\nBEGIN\nDECLARE integer x;\n"
+ "LOOP ON (SELECT c1, c2 FROM m.g) AS mycursor\nBEGIN\n"
+ "x = mycursor.c1;\nIF(x > 5)\nBEGIN\nCONTINUE;\nEND\nEND\n" + "SELECT c1, c2 FROM m.g;\nEND",
virtualProcedureCommand);
}
@Test
public void testDropTable() {
Drop drop = getFactory().newNode(ASTNodes.DROP);
drop.setTable(getFactory().newGroupSymbol("tempTable"));
helpTest("DROP table tempTable", "DROP TABLE tempTable", drop);
}
@Test
public void testBadCreate() {
helpException("create insert");
}
@Test
public void testIfElseWithoutBeginEnd() {
String sql = "CREATE PROCEDURE BEGIN IF (x > 1) select 1; IF (x > 1) select 1; ELSE select 1; END"; //$NON-NLS-1$
String expected = "CREATE PROCEDURE\nBEGIN\nIF(x > 1)\nBEGIN\nSELECT 1;\nEND\nIF(x > 1)\nBEGIN\nSELECT 1;\nEND\nELSE\nBEGIN\nSELECT 1;\nEND\nEND"; //$NON-NLS-1$
Query query = getFactory().newQuery();
Expression expr = getFactory().wrapExpression(getFactory().newConstant(1));
query.setSelect(getFactory().newSelect(Arrays.asList(expr))); //$NON-NLS-1$
CommandStatement commandStmt = getFactory().newCommandStatement(query);
CompareCriteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("x"), CriteriaOperator.Operator.GT, getFactory().newConstant(1)); //$NON-NLS-1$
Block block = getFactory().newBlock();
block.addStatement(commandStmt);
IfStatement ifStmt = getFactory().newIfStatement(criteria, block);
IfStatement ifStmt1 = ifStmt.clone();
Block block2 = getFactory().newBlock();
block2.addStatement(commandStmt);
ifStmt1.setElseBlock(block2);
Block block3 = getFactory().newBlock();
block3.addStatement(ifStmt);
block3.addStatement(ifStmt1);
CreateUpdateProcedureCommand command = getFactory().newCreateUpdateProcedureCommand();
command.setBlock(block3);
helpTest(sql, expected, command);
}
@Test
public void testCommentsSimple1() {
String sql = "/*+ cache(ttl:300000) */ " + // 25
"/* Comment 1 */ " + // 41
"SELECT " + // 48
"/*+ sh */ " + // 70 - note the space between the + and sh - this is parseable but removed!
"* " + // 72
"/* Comment 2 /* Comment 2.5 */ */ " + // 106
"FROM " + // 111
"/* Comment 3 */ " + "g1 INNER JOIN /*+ MAKEDEP */ g2 ON g1.a1 = g2.a2 " + "/* Comment 4 */";
String expectedSql = "/*+ cache(ttl:300000) */ " + // 25
"/* Comment 1 */ " + // 41
"SELECT " + // 48
"/*+sh */ " + // 70
"* " + // 72
"/* Comment 2 /* Comment 2.5 */ */ " + // 106
"FROM " + // 111
"/* Comment 3 */ " + "g1 INNER JOIN /*+ MAKEDEP */ g2 ON g1.a1 = g2.a2 " + "/* Comment 4 */";
helpTest(sql, expectedSql, null);
}
@Test
public void testCommentsSimple2() {
String sql = "/*+ cache(ttl:300000) */ " + "/* Comment 1 */ " + "SELECT " + "/*+sh */ " + "a1 "
+ "/* Comment 2 */ " + "FROM " + "/* Comment 3 */ " + "g1 INNER JOIN /*+ MAKEDEP */ g2 ON g1.a1 = g2.a2 "
+ "/* Comment 4 */";
helpTest(sql, sql, null);
}
}