/*
* 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.validator.v8;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.teiid.designer.query.metadata.IQueryMetadataInterface;
import org.teiid.designer.query.sql.lang.ICommand;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.metadata.Table;
import org.teiid.query.resolver.QueryResolver;
import org.teiid.query.sql.AbstractTestFactory;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.v8.Test8Factory;
import org.teiid.query.validator.AbstractTestValidator;
/**
*
*/
@SuppressWarnings( {"javadoc", "nls"} )
public class Test8Validator extends AbstractTestValidator {
private Test8Factory factory;
protected Test8Validator(Version teiidVersion) {
super(teiidVersion);
}
public Test8Validator() {
this(Version.TEIID_8_0);
}
@Override
protected AbstractTestFactory getFactory() {
if (factory == null)
factory = new Test8Factory(getQueryParser());
return factory;
}
// valid variable declared
@Test
public void testCreateUpdateProcedure4() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "DECLARE integer var1;\n";
procedure = procedure + "END\n";
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'";
helpValidateProcedure(procedure, userUpdateStr, Table.TriggerEvent.UPDATE);
}
// validating AssignmentStatement, more than one project symbol on the
// command
@Test
public void testCreateUpdateProcedure11() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "DECLARE integer var1;\n";
procedure = procedure + "var1 = Select pm1.g1.e2, pm1.g1.e1 from pm1.g1;\n";
procedure = procedure + "END\n";
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'";
helpFailProcedure(procedure, userUpdateStr, Table.TriggerEvent.UPDATE);
}
// validating AssignmentStatement, more than one project symbol on the
// command
@Test
public void testCreateUpdateProcedure12() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "DECLARE integer var1;\n";
procedure = procedure + "var1 = Select pm1.g1.e2, pm1.g1.e1 from pm1.g1;\n";
procedure = procedure + "END\n";
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'";
helpFailProcedure(procedure, userUpdateStr, Table.TriggerEvent.UPDATE);
}
// using aggregate function within a procedure - defect #8394
@Test
public void testCreateUpdateProcedure31() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "DECLARE string MaxTran;\n";
procedure = procedure + "MaxTran = SELECT MAX(e1) FROM pm1.g1;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpValidateProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
// assigning null values to known datatype variable
@Test
public void testCreateUpdateProcedure32() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "DECLARE string var;\n";
procedure = procedure + "var = null;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpValidateProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testDefect13643() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "DECLARE integer var1;\n";
procedure = procedure + "LOOP ON (SELECT * FROM pm1.g1) AS myCursor\n";
procedure = procedure + "BEGIN\n";
procedure = procedure + "var1 = SELECT COUNT(*) FROM myCursor;\n";
procedure = procedure + "END\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testSelectIntoTempGroup() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n";
procedure = procedure + "SELECT COUNT(*) FROM #myTempTable;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpValidateProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
/**
* Defect 24346
*/
@Test
public void testInvalidSelectIntoTempGroup() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n";
procedure = procedure + "SELECT e1, e2, e3 INTO #myTempTable FROM pm1.g2;\n";
procedure = procedure + "SELECT COUNT(*) FROM #myTempTable;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testInvalidSelectIntoTempGroup1() {
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "create local temporary table #myTempTable (e1 integer);\n";
procedure = procedure + "SELECT e1 INTO #myTempTable FROM pm1.g2;\n";
procedure = procedure + "SELECT COUNT(*) FROM #myTempTable;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testSelectIntoPhysicalGroup() {
helpValidate("SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2", new String[] {}, getMetadataFactory().example1Cached());
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpValidateProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testInvalidSelectIntoTooManyElements() {
helpValidate("SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2"}, getMetadataFactory().example1Cached()); //$NON-NLS-2$
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testInvalidSelectIntoTooFewElements() {
helpValidate("SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2"}, getMetadataFactory().example1Cached()); //$NON-NLS-2$
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testInvalidSelectIntoIncorrectTypes() {
helpValidate("SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2"}, getMetadataFactory().example1Cached()); //$NON-NLS-2$
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testInvalidSelectIntoWithStar() {
helpValidate("SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1", new String[] {"SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1"}, getMetadataFactory().example1Cached()); //$NON-NLS-2$
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpFailProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testSelectIntoVirtualGroup() {
helpValidate("SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2", new String[] {}, getMetadataFactory().example1Cached());
String procedure = "FOR EACH ROW ";
procedure = procedure + "BEGIN\n";
procedure = procedure + "SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2;\n";
procedure = procedure + "END\n";
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1";
helpValidateProcedure(procedure, userQuery, Table.TriggerEvent.UPDATE);
}
@Test
public void testValidateInModeler() throws Exception {
// SQL is same as pm1.vsp36() in example1
String sql = "CREATE VIRTUAL PROCEDURE BEGIN select 1, 2; END";
IQueryMetadataInterface metadata = getMetadataFactory().example1Cached();
Command command = getQueryParser().parseCommand(sql);
GroupSymbol group = getFactory().newGroupSymbol("pm1.vsp36");
QueryResolver queryResolver = new QueryResolver(getTeiidVersion());
queryResolver.resolveCommand(command, group, ICommand.TYPE_STORED_PROCEDURE, metadata, true);
assertEquals(2, command.getResultSetColumns().size());
}
@Test
public void testXMLSerializeEncoding() {
helpValidate("SELECT xmlserialize(? AS CLOB ENCODING \"UTF-8\")", new String[] {"XMLSERIALIZE(? AS CLOB ENCODING \"UTF-8\")"}, getMetadataFactory().example1Cached()); //$NON-NLS-1$
}
@Test
public void testXMLSerializeEncoding1() {
helpValidate("SELECT xmlserialize(? AS BLOB ENCODING \"UTF-8\" INCLUDING XMLDECLARATION)", new String[] {}, getMetadataFactory().example1Cached()); //$NON-NLS-1$
}
@Test
public void testXMLSerializeEncoding2() {
helpValidate("SELECT xmlserialize(? AS BLOB ENCODING \"UTF-75\" INCLUDING XMLDECLARATION)", new String[] {"XMLSERIALIZE(? AS BLOB ENCODING \"UTF-75\" INCLUDING XMLDECLARATION)"}, getMetadataFactory().example1Cached()); //$NON-NLS-1$
}
@Test
public void testUpdateError() {
String userUpdateStr = "UPDATE vm1.g2 SET e1='x'";
helpValidate(userUpdateStr, new String[] {"vm1.g2", "UPDATE vm1.g2 SET e1 = 'x'"}, getMetadataFactory().example1Cached());
}
@Test
public void testInsertError() {
String userUpdateStr = "INSERT into vm1.g2 (e1) values ('x')";
helpValidate(userUpdateStr,
new String[] {"vm1.g2", "INSERT INTO vm1.g2 (e1) VALUES ('x')"}, getMetadataFactory().example1Cached());
}
@Test
public void testMergeNoKey() {
String userUpdateStr = "MERGE into pm1.g2 (e1) values ('x')";
helpValidate(userUpdateStr, new String[] {"MERGE INTO pm1.g2 (e1) VALUES ('x')"}, getMetadataFactory().example1Cached());
}
@Test
public void testDeleteError() {
String userUpdateStr = "DELETE from vm1.g2 where e1='x'";
helpValidate(userUpdateStr, new String[] {"vm1.g2"}, getMetadataFactory().example1Cached());
}
@Test
public void testJsonArrayBlob() {
String sql = "select jsonArray(to_bytes('hello', 'us-ascii'))";
helpValidate(sql, new String[] {"jsonArray(to_bytes('hello', 'us-ascii'))"}, getMetadataFactory().example1Cached());
}
@Test
public void testJsonArrayClob() {
String sql = "select jsonArray(cast('hello' as clob))";
helpValidate(sql, new String[] {}, getMetadataFactory().example1Cached());
}
@Test
public void testJsonObject() {
String sql = "select jsonObject(to_bytes('hello', 'us-ascii'))";
helpValidate(sql, new String[] {"JSONOBJECT(to_bytes('hello', 'us-ascii'))"}, getMetadataFactory().example1Cached());
}
@Test
public void testWithValidation() {
String sql = "with a as (select jsonObject(to_bytes('hello', 'us-ascii')) as x) select a.x from a";
helpValidate(sql, new String[] {"JSONOBJECT(to_bytes('hello', 'us-ascii'))"}, getMetadataFactory().example1Cached());
}
@Test
public void testInsertIntoVirtualWithQueryExpression() {
IQueryMetadataInterface qmi = getMetadataFactory().example1();
String sql = "insert into vm1.g1 (e1, e2, e3, e4) select * from pm1.g1";
helpValidate(sql, new String[] {}, qmi);
}
@Test
public void testObjectTablePassing() {
helpValidate("select * from objecttable('x' passing 'a' columns c integer 'row') as x",
new String[] {"OBJECTTABLE('x' PASSING 'a' COLUMNS c integer 'row') AS x"},
getMetadataFactory().example1Cached());
}
@Test
public void testObjectTablePassingSameName() {
helpValidate("select * from objecttable('x' passing 'a' AS X, 'b' AS x columns c integer 'row') as x",
new String[] {"OBJECTTABLE('x' PASSING 'a' AS X, 'b' AS x COLUMNS c integer 'row') AS x"},
getMetadataFactory().example1Cached());
}
@Test
public void testObjectTableLanguage() {
helpValidate("select * from objecttable(language 'foo!' 'x' columns c integer 'row') as x",
new String[] {"OBJECTTABLE(LANGUAGE 'foo!' 'x' COLUMNS c integer 'row') AS x"},
getMetadataFactory().example1Cached());
}
@Test
public void testObjectTableScript() {
helpValidate("select * from objecttable('this. is not valid' columns c integer 'row') as x",
new String[] {"OBJECTTABLE('this. is not valid' COLUMNS c integer 'row') AS x"},
getMetadataFactory().example1Cached());
}
@Test
public void testTextTableFixedSelector() {
helpValidate("SELECT * from texttable(null SELECTOR 'a' columns x string width 1) as x",
new String[] {},
getMetadataFactory().exampleBQTCached());
}
}