[ 
https://issues.apache.org/jira/browse/NIFI-4924?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Marcio Sugar updated NIFI-4924:
-------------------------------
    Description: 
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.

  was:
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.


> 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
>            Priority: Major
>
> 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