[ 
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)

Reply via email to