Lew Jackman created PHOENIX-5467:
------------------------------------

             Summary: Union w/PreparedStatement Parameter value Unbound in 
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


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)

Reply via email to