[ 
https://issues.apache.org/jira/browse/PHOENIX-2765?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15196420#comment-15196420
 ] 

Thomas D'Silva commented on PHOENIX-2765:
-----------------------------------------

[~c...@salesforce.com]
I am unable to repro the exception using the steps you outlined. The test I ran 
is below, can you let me know if you are doing something else?

{code}
 @Test
    public void testManyDynamicCols() throws Exception {
        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
        try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
                conn.setAutoCommit(false);
                String ddl = "CREATE TABLE FOO_RECORD ("
                                + "KEY1 char(15) not null,"
                                + "KEY2 char(15) not null,"
                                + "KEY3 SMALLINT not null,"
                                + "STATUS TINYINT not null,     "
                                + "KEY4 varchar(30),    "
                                + "KEY5 char(15) not null,      "
                                + "FOO_RECORD_ID char(15),      "
                                + "SYSMODSTAMP TIMESTAMP,       "
                                + "\"fa\".\"_\" char(1),"
                                + "\"av\".\"_\" char(1),"
                                + "\"rv\".\"_\" char(1),        "
                                + "\"fd\".\"_\" char(1), "
                                + "CONSTRAINT PK PRIMARY KEY (KEY1, KEY2, KEY3, 
STATUS, KEY4, KEY5)"
                                + ") 
VERSIONS=1,MULTI_TENANT=true,REPLICATION_SCOPE=1";
                Statement stmt = conn.createStatement();
                stmt.execute(ddl);
                
                String upsert = "UPSERT INTO FOO_RECORD(KEY1, KEY2, KEY3, 
STATUS, KEY4, KEY5, SYSMODSTAMP, "
                                + "\"fa\".\"FIELD1\" VARCHAR, \"av\".\"FIELD2\" 
VARCHAR, \"av\".\"FIELD3\" VARCHAR, \"av\".\"FIELD4\" VARCHAR, 
\"rv\".\"FIELD1\" VARCHAR, "
                                + "\"rv\".\"FIELD2\" VARCHAR, \"rv\".\"FIELD3\" 
VARCHAR, \"rv\".\"FIELD4\" VARCHAR, \"rv\".\"FIELD5\" VARCHAR, 
\"rv\".\"FIELD6\" VARCHAR, "
                                + "\"rv\".\"FIELD7\" VARCHAR, \"rv\".\"FIELD8\" 
VARCHAR, \"rv\".\"FIELD9\" VARCHAR, \"rv\".\"FIELD10\" VARCHAR, 
\"rv\".\"FIELD11\" VARCHAR,"
                                + " \"rv\".\"FIELD12\" VARCHAR, 
\"rv\".\"FIELD13\" VARCHAR, \"rv\".\"FIELD14\" VARCHAR, \"rv\".\"FIELD15\" 
VARCHAR, \"fd\".\"FIELD1\" TINYINT, "
                                + "\"fd\".\"FIELD2\" TINYINT, \"fd\".\"FIELD3\" 
TINYINT, \"fd\".\"FIELD4\" TINYINT, \"fd\".\"FIELD5\" TINYINT, 
\"fd\".\"FIELD6\" TINYINT,"
                                + " \"fd\".\"FIELD7\" TINYINT, 
\"fd\".\"FIELD8\" TINYINT, \"fd\".\"FIELD9\" TINYINT, \"fd\".\"FIELD10\" 
TINYINT, \"fd\".\"FIELD11\" TINYINT,"
                                + " \"fd\".\"FIELD12\" TINYINT, 
\"fd\".\"FIELD13\" TINYINT, \"fd\".\"FIELD14\" TINYINT, \"fd\".\"FIELD15\" 
TINYINT) "
                                + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
?, ?, ?)";
                
                PreparedStatement pstmt = conn.prepareStatement(upsert);
                for (int i=0; i<1000; ++i) {
                        pstmt.setString(1, "000000000000000");
                        pstmt.setString(2, "000000000000000");
                        pstmt.setInt(3, i);
                        pstmt.setInt(4, 1);
                        pstmt.setString(5, "varchar");
                        pstmt.setString(6, "000000000000000");
                    Date date = DateUtil.parseDate("2015-01-01 00:00:00");
                    pstmt.setDate(7, date);
                    pstmt.setString(8, "varchar");
                    pstmt.setString(9, "varchar");
                    pstmt.setString(10, "varchar");
                    pstmt.setString(11, "varchar");
                    pstmt.setString(12, "varchar");
                    pstmt.setString(13, "varchar");
                    pstmt.setString(14, "varchar");
                    pstmt.setString(15, "varchar");
                    pstmt.setString(16, "varchar");
                    pstmt.setString(17, "varchar");
                    pstmt.setString(18, "varchar");
                    pstmt.setString(19, "varchar");
                    pstmt.setString(20, "varchar");
                    pstmt.setString(21, "varchar");
                    pstmt.setString(22, "varchar");
                    pstmt.setString(23, "varchar");
                    pstmt.setString(24, "varchar");
                    pstmt.setString(25, "varchar");
                    pstmt.setString(26, "varchar");
                    pstmt.setInt(27, 1);
                    pstmt.setInt(28, 1);
                    pstmt.setInt(29, 1);
                    pstmt.setInt(30, 1);
                    pstmt.setInt(31, 1);
                    pstmt.setInt(32, 1);
                    pstmt.setInt(33, 1);
                    pstmt.setInt(34, 1);
                    pstmt.setInt(35, 1);
                    pstmt.setInt(36, 1);
                    pstmt.setInt(37, 1);
                    pstmt.setInt(38, 1);
                    pstmt.setInt(39, 1);
                    pstmt.setInt(40, 1);
                    pstmt.setInt(41, 1);
                    pstmt.executeUpdate();
                }
                pstmt.close();
                conn.commit();
                
                ResultSet rs = conn.createStatement().executeQuery("SELECT 
COUNT(*) FROM FOO_RECORD");
            assertTrue(rs.next());
            assertEquals(1000,rs.getInt(1));
            assertFalse(rs.next());
        }
    }
{code}

> PhoenixConnection commit throws ArrayIndexOutOfBoundsException after 
> upserting multiple rows with dynamic columns
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-2765
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-2765
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 4.6.0
>            Reporter: Clifford Ker
>            Assignee: Thomas D'Silva
>
> 1. Create a Phoenix table with dynamic columns.
> 2. Obtain a PhoenixConnection and PreparedStatement.
> 3. Use the PreparedStatement to upsert multiple records using dynamic columns.
> 4. Commit the transaction.
> 5. Phoenix will throw ArrayIndexOutOfBoundException.
> java.lang.ArrayIndexOutOfBoundsException: 14
>     at 
> org.apache.phoenix.execute.MutationState.validate(MutationState.java:384)
>     at org.apache.phoenix.execute.MutationState.commit(MutationState.java:419)
>     at 
> org.apache.phoenix.jdbc.PhoenixConnection$3.call(PhoenixConnection.java:476)
>     at 
> org.apache.phoenix.jdbc.PhoenixConnection$3.call(PhoenixConnection.java:473)
>     at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
>     at 
> org.apache.phoenix.jdbc.PhoenixConnection.commit(PhoenixConnection.java:473)
>     at 
> phoenix.connection.ProtectedPhoenixConnection.commit(ProtectedPhoenixConnection.java:41
> Pseudo Code and DML
> CREATE TABLE IF NOT EXISTS FOO_RECORD
>     (
>     KEY1 char(15) not null,
>     KEY2 char(15) not null,
>     KEY3 SMALLINT not null,
>     STATUS TINYINT not null,  
>     KEY4 varchar(30), 
>     KEY5 char(15) not null,   
>     FOO_RECORD_ID char(15),   
>     SYSMODSTAMP TIMESTAMP,    
>     "av"."_" char(1),                         -- Column family av
>     "rv"."_" char(1),                         -- Column family rv
>     "fd"."_" char(1),                         -- Column family dv
>     CONSTRAINT PK PRIMARY KEY (
>       KEY1,
>       KEY2,
>       KEY3,
>       STATUS,
>       KEY4,
>         KEY5
>     )
> ) VERSIONS=1,MULTI_TENANT=true,REPLICATION_SCOPE=1
> try {
>                 PreparedStatement preparedStmt = 
> phoenixConnection.prepareStatement(upsertStatement);
>                 for (DARecord record : daRecords) {
>                     prepareToUpserFooRecord(preparedStmt, fieldInfo, record);
>                 }
>                 preparedStmt.close();
>                 phoenixConnection.commit();
>             } finally {
>                 phoenixConnection.close();
>             }
> UPSERT INTO FOO_RECORD(
> KEY1, KEY2, KEY3, STATUS, KEY4, KEY5, SYSMODSTAMP, "fa"."FIELD1" VARCHAR, 
> "av"."FIELD2" VARCHAR, "av"."FIELD3" VARCHAR, "av"."FIELD4" VARCHAR, 
> "rv"."FIELD1" VARCHAR, "rv"."FIELD2" VARCHAR, "rv"."FIELD3" VARCHAR, 
> "rv"."FIELD4" VARCHAR, "rv"."FIELD5" VARCHAR, "rv"."FIELD6" VARCHAR, 
> "rv"."FIELD7" VARCHAR, "rv"."FIELD8" VARCHAR, "rv"."FIELD9" VARCHAR, 
> "rv"."FIELD10" VARCHAR, "rv"."FIELD11" VARCHAR, "rv"."FIELD12" VARCHAR, 
> "rv"."FIELD13" VARCHAR, "rv"."FIELD14" VARCHAR, "rv"."FIELD15" VARCHAR, 
> "fd"."FIELD1" TINYINT, "fd"."FIELD2" TINYINT, "fd"."FIELD3" TINYINT, 
> "fd"."FIELD4" TINYINT, "fd"."FIELD5" TINYINT, "fd"."FIELD6" TINYINT, 
> "fd"."FIELD7" TINYINT, "fd"."FIELD8" TINYINT, "fd"."FIELD9" TINYINT, 
> "fd"."FIELD10" TINYINT, "fd"."FIELD11" TINYINT, "fd"."FIELD12" TINYINT, 
> "fd"."FIELD13" TINYINT, "fd"."FIELD13" TINYINT, "fd"."FIELD15" TINYINT) 
> VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
> ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to