Marcio Sugar created NIFI-4924:
----------------------------------

             Summary: PutDatabaseRecord throws ArrayIndexOutOfBoundsException 
where there is more than one table with the same name on the database (in 
different schemas)
                 Key: NIFI-4924
                 URL: https://issues.apache.org/jira/browse/NIFI-4924
             Project: Apache NiFi
          Issue Type: Bug
          Components: Extensions
    Affects Versions: 1.5.0
         Environment: ubuntu 16.04
nifi 1.5.0
db2 v10.5.0.7
            Reporter: Marcio Sugar


I'm trying to copy data from one table on DB2 database "A" to the same table on 
another DB2 database "B". Schemas are identical.

My flow is simply a QueryDatabaseTable reading from "A" and connected to a 
PutDatabaseRecord writing to "B". The latter uses and AvroReader controller. 
Each processor uses its own DBCPConnectionPool since "A" and "B" are on 
different instances.

When I set the AvroReader to use the 'Schema Text' property, I get errors like 
this:

 
{code:java}
PutDatabaseRecord[id=e3905091-0161-1000-028c-982c192bf16f] 
org.apache.nifi.processors.standard.PutDatabaseRecord$$Lambda$438/1366813796@deb42
 failed to process due to org.apache.nifi.processor.exception.ProcessException: 
Failed to process 
StandardFlowFileRecord[uuid=58ce220f-2b43-4875-bdb4-c704b093f9d7,claim=StandardContentClaim
 [resourceClaim=StandardResourceClaim[id=1519955790257-2, container=default, 
section=2], offset=175623, 
length=174960],offset=0,name=255478043043373,size=174960] due to 
java.lang.ArrayIndexOutOfBoundsException: -40; rolling back session: Failed to 
process 
StandardFlowFileRecord[uuid=58ce220f-2b43-4875-bdb4-c704b093f9d7,claim=StandardContentClaim
 [resourceClaim=StandardResourceClaim[id=1519955790257-2, container=default, 
section=2], offset=175623, 
length=174960],offset=0,name=255478043043373,size=174960] due to 
java.lang.ArrayIndexOutOfBoundsException: -40 
{code}
Debugging the code I found what I believe to be a typo. In 
PutDatabaseRecord.java, line 1031, the program is calling the getPrimaryKeys 
method but passing a null as the 2nd. parameter:

 
{code:java}
try (final ResultSet pkrs = dmd.getPrimaryKeys(catalog, null, tableName)) 
{{code}
 

So in fact it's getting the primary keys for all the tables with the same name 
found across all the schemas, which is wrong.

The proper call, I think, should set the schema name:

 
{code:java}
try (final ResultSet pkrs = dmd.getPrimaryKeys(catalog, schema, tableName)) 
{{code}
 

This is a subtle bug that can go unnoticed if the database doesn't have tables 
with the same name in different schemas.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to