[
https://issues.apache.org/jira/browse/PHOENIX-5467?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Lew Jackman updated PHOENIX-5467:
---------------------------------
Summary: Union w/PreparedStatement Causes Error Parameter value Unbound
within ParameterMetaData (was: Union w/PreparedStatement Parameter value
Unbound in ParameterMetaData)
> Union w/PreparedStatement Causes Error Parameter value Unbound within
> ParameterMetaData
> ---------------------------------------------------------------------------------------
>
> Key: PHOENIX-5467
> URL: https://issues.apache.org/jira/browse/PHOENIX-5467
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.14.3
> Reporter: Lew Jackman
> Priority: Major
>
> Using a Union in a PreparedStatement seems to cause issues with the
> ParameterMetaData.
> We believe this is the root cause of an issue we are encountering when using
> the
> thin client to execute such a query which causes an issue with such a query
> sent to PQS.
> This unit test should illustrate in the testUnionParameterMetaData method:
> {code:java}
> package org.apache.phoenix.compile;import static
> org.junit.Assert.assertEquals;
> import static org.junit.Assert.fail;import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.ParameterMetaData;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.util.Properties;import
> org.apache.phoenix.query.BaseConnectionlessQueryTest;
> import org.apache.phoenix.util.PropertiesUtil;
> import org.apache.phoenix.util.TestUtil;
> import org.junit.BeforeClass;
> import org.junit.Test;public class UnionPreparedStatementFailTest extends
> BaseConnectionlessQueryTest {
>
> @BeforeClass
> public static void setupClass() throws Exception {
> Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES);
> Connection conn = DriverManager.getConnection(getUrl(), props);
> try {
> conn.setAutoCommit(true);
> conn.createStatement().execute("CREATE TABLE TAB1 (ID VARCHAR NOT
> NULL CONSTRAINT PK PRIMARY KEY (ID))");
> conn.createStatement().execute("CREATE TABLE TAB2 (ID VARCHAR NOT
> NULL CONSTRAINT PK PRIMARY KEY (ID))");
> } finally {
> conn.close();
> }
> }
>
> @Test
> public void testNonUnionParameterMetaData() throws Exception {
> String query = "SELECT * FROM TAB1 WHERE (ID = ?) OR (ID = ?)";
> Connection conn = DriverManager.getConnection(getUrl(),
> PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES));
> PreparedStatement statement = conn.prepareStatement(query);
> try {
> ParameterMetaData pmd = statement.getParameterMetaData();
> assertEquals(2, pmd.getParameterCount());
> pmd.getParameterTypeName(1);
> } catch (SQLException e) {
> fail("getParameterTypeName failure : " + e.getMessage());
> }
> }
>
> @Test
> public void testJoinParameterMetaData() throws Exception {
> String query = "SELECT TAB1.ID FROM TAB1 INNER JOIN TAB2 ON TAB1.ID =
> TAB2.ID WHERE TAB1.ID = ? and TAB2.ID = ?";
> Connection conn = DriverManager.getConnection(getUrl(),
> PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES));
> PreparedStatement statement = conn.prepareStatement(query);
> try {
> ParameterMetaData pmd = statement.getParameterMetaData();
> assertEquals(2, pmd.getParameterCount());
> pmd.getParameterTypeName(1);
> } catch (SQLException e) {
> fail("getParameterTypeName failure : " + e.getMessage());
> }
> }
>
> /*
> * FAILED TEST :
> * java.lang.AssertionError: getParameterTypeName failure :
> * ERROR 2004 (INT05): Parameter value unbound. Parameter at index 1
> is unbound
> */
> @Test
> public void testUnionParameterMetaData() throws Exception {
> String query = "SELECT * FROM TAB1 WHERE ID = ? UNION ALL SELECT *
> FROM TAB2 WHERE ID = ?";
> Connection conn = DriverManager.getConnection(getUrl(),
> PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES));
> PreparedStatement statement = conn.prepareStatement(query);
> try {
> ParameterMetaData pmd = statement.getParameterMetaData();
> assertEquals(2, pmd.getParameterCount());
> pmd.getParameterTypeName(1);
> } catch (SQLException e) {
> fail("getParameterTypeName failure : " + e.getMessage());
> }
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.2#803003)