/*
* 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.ArrayList;
import java.util.List;
import org.junit.Test;
import org.teiid.core.types.DataTypeManagerService;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.language.SQLConstants.NonReserved;
import org.teiid.query.parser.TeiidNodeFactory.ASTNodes;
import org.teiid.query.sql.AbstractTestSQLStringVisitor;
import org.teiid.query.sql.lang.Delete;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.Insert;
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.CommandStatement;
import org.teiid.query.sql.proc.CreateProcedureCommand;
import org.teiid.query.sql.proc.RaiseStatement;
import org.teiid.query.sql.proc.Statement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.Array;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
/**
*
*/
@SuppressWarnings( {"nls", "javadoc"} )
public class Test8SQLStringVisitor extends AbstractTestSQLStringVisitor {
private Test8Factory factory;
protected Test8SQLStringVisitor(Version teiidVersion) {
super(teiidVersion);
}
public Test8SQLStringVisitor() {
this(Version.TEIID_8_0);
}
@Override
protected Test8Factory getFactory() {
if (factory == null)
factory = new Test8Factory(parser);
return factory;
}
@Test
public void testMerge1() {
Insert insert = getFactory().newInsert();
insert.setMerge(true);
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, "MERGE INTO m.g1 (e1, e2) VALUES (5, 'abc')");
}
@Test
public void testAggregateSymbol1() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.COUNT, false, getFactory().newConstant("abc"));
helpTest(agg, "COUNT('abc')");
}
@Test
public void testAggregateSymbol2() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.COUNT, true, getFactory().newConstant("abc"));
helpTest(agg, "COUNT(DISTINCT 'abc')");
}
@Test
public void testAggregateSymbol3() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.COUNT, false, null);
helpTest(agg, "COUNT(*)");
}
@Test
public void testAggregateSymbol4() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.AVG, false, getFactory().newConstant("abc"));
helpTest(agg, "AVG('abc')");
}
@Test
public void testAggregateSymbol5() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.SUM, false, getFactory().newConstant("abc"));
helpTest(agg, "SUM('abc')");
}
@Test
public void testAggregateSymbol6() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.MIN, false, getFactory().newConstant("abc"));
helpTest(agg, "MIN('abc')");
}
@Test
public void testAggregateSymbol7() {
AggregateSymbol agg = getFactory().newAggregateSymbol(NonReserved.MAX, false, getFactory().newConstant("abc"));
helpTest(agg, "MAX('abc')");
}
@Test
public void testRaiseErrorStatement() {
Statement errStmt = getFactory().newRaiseStatement(getFactory().newConstant("My Error"));
helpTest(errStmt, "RAISE 'My Error';");
}
@Test
public void testRaiseErrorStatementWithExpression() {
Statement errStmt = getFactory().newRaiseStatement(getFactory().newElementSymbol("a"));
helpTest(errStmt, "RAISE a;");
}
@Test
public void testCommandStatement1a() {
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);
cmdStmt.setReturnable(false);
helpTest(cmdStmt, "SELECT x FROM g WITHOUT RETURN;");
}
@Test
public void testBlock1() {
Delete d1 = getFactory().newNode(ASTNodes.DELETE);
d1.setGroup(getFactory().newGroupSymbol("g"));
CommandStatement cmdStmt = getFactory().newCommandStatement(d1);
AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), getFactory().newConstant(new Integer(1)));
Statement errStmt = getFactory().newRaiseStatement(getFactory().newConstant("My Error"));
Block b = getFactory().newBlock();
b.addStatement(cmdStmt);
b.addStatement(assigStmt);
b.addStatement(errStmt);
helpTest(b, "BEGIN\nDELETE FROM g;\na = 1;\nRAISE 'My Error';\nEND");
}
@Test
public void testCreateUpdateProcedure1() {
Delete d1 = getFactory().newNode(ASTNodes.DELETE);
d1.setGroup(getFactory().newGroupSymbol("g"));
CommandStatement cmdStmt = getFactory().newCommandStatement(d1);
AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), getFactory().newConstant(new Integer(1)));
RaiseStatement errStmt = getFactory().newRaiseStatement(getFactory().newConstant("My Error"));
Block b = getFactory().newBlock();
b.addStatement(cmdStmt);
b.addStatement(assigStmt);
b.addStatement(errStmt);
CreateProcedureCommand cup = getFactory().newCreateProcedureCommand(b);
helpTest(cup, "CREATE VIRTUAL PROCEDURE\nBEGIN\nDELETE FROM g;\na = 1;\nRAISE 'My Error';\nEND");
}
@Test
public void testCreateUpdateProcedure2() {
Delete d1 = getFactory().newNode(ASTNodes.DELETE);
d1.setGroup(getFactory().newGroupSymbol("g"));
CommandStatement cmdStmt = getFactory().newCommandStatement(d1);
AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), getFactory().newConstant(new Integer(1)));
RaiseStatement errStmt = getFactory().newRaiseStatement(getFactory().newConstant("My Error"));
Block b = getFactory().newBlock();
b.addStatement(cmdStmt);
b.addStatement(assigStmt);
b.addStatement(errStmt);
CreateProcedureCommand cup = getFactory().newCreateProcedureCommand(b);
helpTest(cup, "CREATE VIRTUAL PROCEDURE\nBEGIN\nDELETE FROM g;\na = 1;\nRAISE 'My Error';\nEND");
}
@Test
public void testCreateUpdateProcedure3() {
Delete d1 = getFactory().newNode(ASTNodes.DELETE);
d1.setGroup(getFactory().newGroupSymbol("g"));
CommandStatement cmdStmt = getFactory().newCommandStatement(d1);
AssignmentStatement assigStmt = getFactory().newAssignmentStatement(getFactory().newElementSymbol("a"), getFactory().newConstant(new Integer(1)));
Statement errStmt = getFactory().newRaiseStatement(getFactory().newConstant("My Error"));
Block b = getFactory().newBlock();
b.addStatement(cmdStmt);
b.addStatement(assigStmt);
b.addStatement(errStmt);
CreateProcedureCommand cup = getFactory().newCreateProcedureCommand(b);
helpTest(cup, "CREATE VIRTUAL PROCEDURE\nBEGIN\nDELETE FROM g;\na = 1;\nRAISE 'My Error';\nEND");
}
@Test
public void testArray() {
List<Expression> expr = new ArrayList<Expression>();
expr.add(getFactory().newElementSymbol("e1"));
expr.add(getFactory().newConstant(1));
Array array = getFactory().newArray(
DataTypeManagerService.DefaultDataTypes.INTEGER.getTypeClass(),
expr);
helpTest(array, "(e1, 1)");
}
@Test
public void testReturnStatement() throws Exception {
helpTest(parser.parseProcedure("begin if (true) return 1; return; end", false),
"CREATE VIRTUAL PROCEDURE\nBEGIN\nIF(TRUE)\nBEGIN\nRETURN 1;\nEND\nRETURN;\nEND");
}
@Test
public void testConditionNesting() throws Exception {
String sql = "select (intkey = intnum) is null, (intkey < intnum) in (true, false) from bqt1.smalla";
helpTest(parser.parseCommand(sql),
"SELECT (intkey = intnum) IS NULL, (intkey < intnum) IN (TRUE, FALSE) FROM bqt1.smalla");
}
@Test
public void testSubqueryNameEscaping() throws Exception {
helpTest(getFactory().newSubqueryFromClause("user", parser.parseCommand("select 1")),
"(SELECT 1) AS \"user\"");
}
}