/* * 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.v8; import java.util.Arrays; import org.junit.Test; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version; import org.teiid.query.parser.TeiidNodeFactory.ASTNodes; import org.teiid.query.sql.AbstractTestCloning; import org.teiid.query.sql.lang.Criteria; import org.teiid.query.sql.lang.CriteriaOperator.Operator; import org.teiid.query.sql.lang.From; import org.teiid.query.sql.lang.MatchCriteria; import org.teiid.query.sql.lang.Query; import org.teiid.query.sql.lang.Select; 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.CreateProcedureCommand; import org.teiid.query.sql.proc.ExceptionExpression; import org.teiid.query.sql.proc.IfStatement; import org.teiid.query.sql.proc.LoopStatement; import org.teiid.query.sql.proc.RaiseStatement; 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; import org.teiid.query.sql.symbol.JSONObject; import org.teiid.query.sql.symbol.XMLSerialize; /** * Unit testing for the SQLStringVisitor for teiid version 8 */ @SuppressWarnings( {"nls", "javadoc"} ) public class Test8Cloning extends AbstractTestCloning { private Test8Factory factory; protected Test8Cloning(Version teiidVersion) { super(teiidVersion); } public Test8Cloning() { this(Version.TEIID_8_0); } @Override protected Test8Factory getFactory() { if (factory == null) factory = new Test8Factory(parser); return factory; } @Test public void testSignedExpression() { GroupSymbol g = getFactory().newGroupSymbol("g"); From from = getFactory().newFrom(); from.addGroup(g); Function f = getFactory().newFunction("*", new Expression[] {getFactory().newConstant(-1), getFactory().newElementSymbol("x")}); Select select = getFactory().newSelect(); select.addSymbol(f); select.addSymbol(getFactory().newElementSymbol("x")); select.addSymbol(getFactory().newConstant(5)); Query query = getFactory().newQuery(select, from); helpTest( "SELECT (-1 * x), x, 5 FROM g", query); } @Test public void testFloatWithE() { GroupSymbol g = getFactory().newGroupSymbol("a.g1"); From from = getFactory().newFrom(); from.addGroup(g); Select select = getFactory().newSelect(); select.addSymbol(getFactory().newConstant(new Double(1.3e8))); select.addSymbol(getFactory().newConstant(new Double(-1.3e+8))); select.addSymbol(getFactory().newConstant(new Double(+1.3e-8))); Query query = getFactory().newQuery(select, from); helpTest( "SELECT 1.3E8, -1.3E8, 1.3E-8 FROM a.g1", query); } @Test public void testPgLike() { GroupSymbol g = getFactory().newGroupSymbol("db.g"); From from = getFactory().newFrom(); from.addGroup(g); Select select = getFactory().newSelect(); ElementSymbol a = getFactory().newElementSymbol("a"); select.addSymbol(a); Expression string1 = getFactory().newConstant("\\_aString"); MatchCriteria crit = getFactory().newMatchCriteria(getFactory().newElementSymbol("b"), string1, '\\'); Query query = getFactory().newQuery(select, from); query.setCriteria(crit); helpTest("SELECT a FROM db.g WHERE b LIKE '\\_aString' ESCAPE '\\'", query); } @Test public void testErrorStatement() throws Exception { ExceptionExpression ee = getFactory().newExceptionExpression(); ee.setMessage(getFactory().newConstant("Test only")); RaiseStatement errStmt = getFactory().newNode(ASTNodes.RAISE_STATEMENT); errStmt.setExpression(ee); helpTest("RAISE SQLEXCEPTION 'Test only';", errStmt); } @Test public void testRaiseErrorStatement() throws Exception { ExceptionExpression ee = getFactory().newExceptionExpression(); ee.setMessage(getFactory().newConstant("Test only")); ee.setSqlState(getFactory().newConstant("100")); ee.setParent(getFactory().newElementSymbol("e")); RaiseStatement errStmt = getFactory().newNode(ASTNodes.RAISE_STATEMENT); errStmt.setExpression(ee); errStmt.setWarning(true); helpTest("RAISE SQLWARNING SQLEXCEPTION 'Test only' SQLSTATE '100' CHAIN e;", errStmt); } @Test public void testXmlSerialize2() throws Exception { XMLSerialize f = getFactory().newXMLSerialize(); f.setExpression(getFactory().newElementSymbol("x")); f.setTypeString("BLOB"); f.setDeclaration(Boolean.TRUE); f.setVersion("1.0"); f.setEncoding("UTF-8"); helpTest("XMLSERIALIZE(x AS BLOB ENCODING \"UTF-8\" VERSION '1.0' INCLUDING XMLDECLARATION)", f); } @Test public void testBlockExceptionHandling() throws Exception { Select select = getFactory().newSelectWithMultileElementSymbol(); From from = getFactory().newFrom(); from.setClauses(Arrays.asList(getFactory().newUnaryFromClause("x"))); Query query = getFactory().newQuery(select, from); CommandStatement cmdStmt = getFactory().newCommandStatement(query); AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), getFactory().newConstant(new Integer(1))); RaiseStatement errStmt = getFactory().newNode(ASTNodes.RAISE_STATEMENT); ExceptionExpression ee = getFactory().newExceptionExpression(); ee.setMessage(getFactory().newConstant("My Error")); errStmt.setExpression(ee); Block b = getFactory().newBlock(); b.setExceptionGroup("e"); b.addStatement(cmdStmt); b.addStatement(assigStmt); b.addStatement(errStmt, true); helpTest("BEGIN\nSELECT * FROM x;\na = 1;\nEXCEPTION e\nRAISE SQLEXCEPTION 'My Error';\nEND", b); } @Test public void testJSONObject() throws Exception { JSONObject f = getFactory().newJSONObject(Arrays.asList(getFactory().newDerivedColumn("table", getFactory().newElementSymbol("a")))); helpTest("JSONOBJECT(a AS \"table\")", f); } @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); CreateProcedureCommand virtualProcedureCommand = getFactory().newCreateProcedureCommand(); virtualProcedureCommand.setBlock(block); helpTest("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); } }