/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.execution;
import com.facebook.presto.Session;
import com.facebook.presto.spi.PrestoException;
import com.facebook.presto.sql.analyzer.SemanticException;
import com.facebook.presto.sql.parser.SqlParser;
import com.facebook.presto.sql.tree.AllColumns;
import com.facebook.presto.sql.tree.Execute;
import com.facebook.presto.sql.tree.QualifiedName;
import com.facebook.presto.sql.tree.Statement;
import org.testng.annotations.Test;
import static com.facebook.presto.SessionTestUtils.TEST_SESSION;
import static com.facebook.presto.execution.SqlQueryManager.unwrapExecuteStatement;
import static com.facebook.presto.execution.SqlQueryManager.validateParameters;
import static com.facebook.presto.spi.StandardErrorCode.NOT_FOUND;
import static com.facebook.presto.sql.QueryUtil.selectList;
import static com.facebook.presto.sql.QueryUtil.simpleQuery;
import static com.facebook.presto.sql.QueryUtil.table;
import static com.facebook.presto.sql.analyzer.SemanticErrorCode.INVALID_PARAMETER_USAGE;
import static com.facebook.presto.testing.TestingSession.testSessionBuilder;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
public class TestUnwrapExecute
{
private static final SqlParser SQL_PARSER = new SqlParser();
@Test
public void testSelectStatement()
throws Exception
{
Statement statement = SQL_PARSER.createStatement("SELECT * FROM foo");
assertEquals(unwrapExecuteStatement(statement, SQL_PARSER, TEST_SESSION),
simpleQuery(selectList(new AllColumns()), table(QualifiedName.of("foo"))));
}
@Test
public void testExecuteStatement()
throws Exception
{
Session session = testSessionBuilder()
.addPreparedStatement("my_query", "SELECT * FROM foo")
.build();
Statement statement = SQL_PARSER.createStatement("EXECUTE my_query");
assertEquals(unwrapExecuteStatement(statement, SQL_PARSER, session),
simpleQuery(selectList(new AllColumns()), table(QualifiedName.of("foo"))));
}
@Test
public void testExecuteStatementDoesNotExist()
throws Exception
{
try {
Statement statement = SQL_PARSER.createStatement("execute my_query");
unwrapExecuteStatement(statement, SQL_PARSER, TEST_SESSION);
fail("expected exception");
}
catch (PrestoException e) {
assertEquals(e.getErrorCode(), NOT_FOUND.toErrorCode());
}
}
@Test
public void testTooManyParameters()
throws Exception
{
try {
Session session = testSessionBuilder()
.addPreparedStatement("my_query", "SELECT * FROM foo where col1 = ?")
.build();
Statement statement = SQL_PARSER.createStatement("EXECUTE my_query USING 1,2");
validateParameters(unwrapExecuteStatement(statement, SQL_PARSER, session), ((Execute) statement).getParameters());
fail("expected exception");
}
catch (SemanticException e) {
assertEquals(e.getCode(), INVALID_PARAMETER_USAGE);
}
}
@Test
public void testTooFewParameters()
throws Exception
{
try {
Session session = testSessionBuilder()
.addPreparedStatement("my_query", "SELECT ? FROM foo where col1 = ?")
.build();
Statement statement = SQL_PARSER.createStatement("EXECUTE my_query USING 1");
validateParameters(unwrapExecuteStatement(statement, SQL_PARSER, session), ((Execute) statement).getParameters());
fail("expected exception");
}
catch (SemanticException e) {
assertEquals(e.getCode(), INVALID_PARAMETER_USAGE);
}
}
}