Thread: Return Codes of BatchUpdateException in PostgreSql 9.6

Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
Hello

I am migrating PostgreSql 9.5 to 9.6.0 and I am using the newest JDBC driver (9.4.1211.jre6)
So I am not sure if this is an driver issue or a bug in postgres.

We are making batch updates in our Java application.
Our JUnit Tests fail on 9.6 when querying the return code of a partially failed Batch Update.

If a statement of a batch update fails, all updateCounts are marked as failed.

In 9.5 everything works fine.

I try to give an example:

Preparation, with SQL
-----------------------------
create table TESTTABLE(id integer PRIMARY KEY) ;

INSERT INTO TESTTABLE VALUES (5);


Java Code with Java JDBC Update
-----------------------------

try{
   for( int i = 0; i < 10;i++ )
      {
    stmt.addBatch("INSERT INTO TESTTABLE VALUES('"+i+"')"    );
   }
      stmt.executeBatch();
   con.commit();
}
catch( java.sql.BatchUpdateException x )
{
       final int[] updateCounts = x.getUpdateCounts();

     //==> in 9.5 only ther failed updates have return code  java.sql.Statement.EXECUTE_FAILED = -3.  This is CORRECT.

     //==> in 9.6 all updatecounts have status  java.sql.Statement.EXECUTE_FAILED = -3. This is NOT CORRECT.
}



In the sample, the 6th statement has an error, because the value 5 already exists in the database.

In this case in postgres 9.6 all fields updateCounts[0..9] are -3 (Statement.EXECUTE_FAILED)
The behavior prior 9.6 was, that only the specific entry in updateCounts[5] has the error code -3



Thank you for your help

Tillmann Schulz

Re: Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
Hello,

I made some test with different driver versions. The result seems to be that it is an issue in the newer driver
versionsand not in the postgresql database 


Postgres 9.5.0 with postgresql-jdbc41-9.4-1201.jar contains only updateCounts of first succeeded statements.

---------------------------------------------------------------------------------------------------------------

updateCounts[0]=1
updateCounts[1]=1
updateCounts[2]=1
updateCounts[3]=1
updateCounts[4]=1
-->correct



Postgres 9.6.0 with postgresql-jdbc41-9.4-1201.jar contains only updateCounts of first succeeded statements.
---------------------------------------------------------------------------------------------------------------
updateCounts[0]=1
updateCounts[1]=1
updateCounts[2]=1
updateCounts[3]=1
updateCounts[4]=1
-->correct but can't use this driver with postgressql 9.6



Postgres 9.6.0 with postgresql-jdbc41-9.4-1211.jar contains updateCounts of all elements.

---------------------------------------------------------------------------------------------------------------
updateCounts[0]=-3
updateCounts[1]=-3
updateCounts[2]=-3
updateCounts[3]=-3
updateCounts[4]=-3
updateCounts[5]=-3
updateCounts[6]=-3
updateCounts[7]=-3
updateCounts[8]=-3
updateCounts[9]=-3
-->Wrong.updateCounts[0..4] and updateCounts[6..9] contains wrong information.



> will need to set logLevel=2
How can I set the logLevel. Is it in postgresql.conf?


Bye,

Tillmann



>Hi,
>Can you check what is returned by the back end for 9.5 and 9.6. You
>will need to set
>
>logLevel=2
>
>That will help to narrow down the problem.
>
>Jeremy


Re: Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
Hello,


>With that enabled you can expect to see lots of low level protocol
>logging. Exposing driver (FE) to back end (BE) and responses (BE -> FE).
>
>It is the BE->FE that is helpful in this case.

thanks for the quick answer.


Here are the logs (see also http://pastebin.com/g6k46UEU)

Thanks

Tillmann



=========================================================================================================================================================================================================================
POSTGRES 9.5 logs

=========================================================================================================================================================================================================================

DriverManager.getConnection("jdbc:postgresql://localhost:9432/app5?charSet=UTF-8&user=xxxx&password=xxx&logLevel=2&loglevel=2")
trying org.postgresql.Driver
13:56:08.389 (1) PostgreSQL 9.4 JDBC4.1 (build 1201)
13:56:08.398 (1) Trying to establish a protocol version 3 connection to localhost:9432
13:56:08.427 (1) Receive Buffer Size is 8192
13:56:08.427 (1) Send Buffer Size is 8192
13:56:08.429 (1)  FE=> StartupPacket(user=, database=app, client_encoding=UTF8, DateStyle=ISO, TimeZone=Europe/Berlin,
extra_float_digits=2)
13:56:08.534 (1)  <=BE AuthenticationReqMD5(salt=f9d204ba)
13:56:08.541 (1)  FE=> Password(md5digest=md50d3fabec1f2d6d281c23820d1fa25c8e)
13:56:08.546 (1)  <=BE AuthenticationOk
13:56:08.556 (1)  <=BE NoticeResponse(DEBUG: CommitTransaction)
SQLWarning:
13:56:08.556 (1)  <=BE NoticeResponse(DEBUG: name: unnamed; blockState:       STARTED; state: INPROGR, xid/subid/cid:
0/1/0,nestlvl: 1, children: ) 
SQLWarning:
13:56:08.556 (1)  <=BE ParameterStatus(application_name = )
13:56:08.556 (1)  <=BE ParameterStatus(client_encoding = UTF8)
13:56:08.556 (1)  <=BE ParameterStatus(DateStyle = ISO, DMY)
13:56:08.556 (1)  <=BE ParameterStatus(integer_datetimes = on)
13:56:08.556 (1)  <=BE ParameterStatus(IntervalStyle = postgres)
13:56:08.556 (1)  <=BE ParameterStatus(is_superuser = on)
13:56:08.556 (1)  <=BE ParameterStatus(server_encoding = UTF8)
13:56:08.556 (1)  <=BE ParameterStatus(server_version = 9.5.0)
13:56:08.557 (1)  <=BE ParameterStatus(session_authorization = xxxx)
13:56:08.557 (1)  <=BE ParameterStatus(standard_conforming_strings = on)
13:56:08.557 (1)  <=BE ParameterStatus(TimeZone = Europe/Berlin)
13:56:08.557 (1)  <=BE BackendKeyData(pid=14144,ckey=2078122563)
13:56:08.557 (1)  <=BE ReadyForQuery(I)
13:56:08.560 (1) simple execute, handler=org.postgresql.core.SetupQueryRunner$SimpleResultHandler@36aa7bc2, maxRows=0,
fetchSize=0,flags=23 
13:56:08.561 (1)  FE=> Parse(stmt=null,query="SET extra_float_digits = 3",oids={})
13:56:08.562 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.562 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.562 (1)  FE=> Sync
13:56:08.562 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: SET extra_float_digits = 3)
SQLWarning:
13:56:08.562 (1)  <=BE NoticeResponse(DEBUG: StartTransactionCommand)
SQLWarning:
13:56:08.562 (1)  <=BE NoticeResponse(DEBUG: StartTransaction)
SQLWarning:
13:56:08.562 (1)  <=BE NoticeResponse(DEBUG: name: unnamed; blockState:       DEFAULT; state: INPROGR, xid/subid/cid:
0/1/0,nestlvl: 1, children: ) 
SQLWarning:
13:56:08.563 (1)  <=BE ParseComplete [null]
13:56:08.563 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.563 (1)  <=BE BindComplete [null]
13:56:08.563 (1)  <=BE NoticeResponse(DEBUG: ProcessUtility)
SQLWarning:
13:56:08.563 (1)  <=BE CommandStatus(SET)
13:56:08.563 (1)  <=BE NoticeResponse(DEBUG: CommitTransactionCommand)
SQLWarning:
13:56:08.564 (1)  <=BE NoticeResponse(DEBUG: CommitTransaction)
SQLWarning:
13:56:08.564 (1)  <=BE NoticeResponse(DEBUG: name: unnamed; blockState:       STARTED; state: INPROGR, xid/subid/cid:
0/1/0,nestlvl: 1, children: ) 
SQLWarning:
13:56:08.564 (1)  <=BE ReadyForQuery(I)
13:56:08.565 (1)     compatible = 90400
13:56:08.565 (1)     loglevel = 2
13:56:08.565 (1)     prepare threshold = 5
13:56:08.567 (1)     types using binary send =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
13:56:08.568 (1)     types using binary receive =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,DATE,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
13:56:08.568 (1)     integer date/time = true
getConnection returning org.postgresql.Driver
13:56:08.587 (1) batch execute 10 queries,
handler=org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler@2a33fae0,maxRows=0, fetchSize=0, flags=5 
13:56:08.587 (1)  FE=> Parse(stmt=null,query="BEGIN",oids={})
13:56:08.587 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.587 (1)  FE=> Execute(portal=null,limit=0)
13:56:08.588 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('0')",oids={})
13:56:08.588 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.588 (1)  FE=> Describe(portal=null)
13:56:08.588 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.588 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('1')",oids={})
13:56:08.588 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.588 (1)  FE=> Describe(portal=null)
13:56:08.588 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.588 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('2')",oids={})
13:56:08.588 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.588 (1)  FE=> Describe(portal=null)
13:56:08.588 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.589 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('3')",oids={})
13:56:08.589 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.589 (1)  FE=> Describe(portal=null)
13:56:08.589 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.589 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('4')",oids={})
13:56:08.589 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.589 (1)  FE=> Describe(portal=null)
13:56:08.589 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.589 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('5')",oids={})
13:56:08.589 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.589 (1)  FE=> Describe(portal=null)
13:56:08.589 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.589 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('6')",oids={})
13:56:08.589 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.589 (1)  FE=> Describe(portal=null)
13:56:08.589 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.589 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('7')",oids={})
13:56:08.589 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.590 (1)  FE=> Describe(portal=null)
13:56:08.590 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.590 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('8')",oids={})
13:56:08.590 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.590 (1)  FE=> Describe(portal=null)
13:56:08.590 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.590 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('9')",oids={})
13:56:08.590 (1)  FE=> Bind(stmt=null,portal=null)
13:56:08.590 (1)  FE=> Describe(portal=null)
13:56:08.590 (1)  FE=> Execute(portal=null,limit=1)
13:56:08.590 (1)  FE=> Sync
13:56:08.591 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: BEGIN)
SQLWarning:
13:56:08.591 (1)  <=BE NoticeResponse(DEBUG: StartTransactionCommand)
SQLWarning:
13:56:08.591 (1)  <=BE NoticeResponse(DEBUG: StartTransaction)
SQLWarning:
13:56:08.591 (1)  <=BE NoticeResponse(DEBUG: name: unnamed; blockState:       DEFAULT; state: INPROGR, xid/subid/cid:
0/1/0,nestlvl: 1, children: ) 
SQLWarning:
13:56:08.593 (1)  <=BE ParseComplete [null]
13:56:08.593 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.594 (1)  <=BE BindComplete [null]
13:56:08.594 (1)  <=BE NoticeResponse(DEBUG: ProcessUtility)
SQLWarning:
13:56:08.594 (1)  <=BE NoticeResponse(DEBUG: CommitTransactionCommand)
SQLWarning:
13:56:08.594 (1)  <=BE CommandStatus(BEGIN)
13:56:08.594 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: INSERT INTO TESTTABLE VALUES('0'))
SQLWarning:
13:56:08.594 (1)  <=BE NoticeResponse(DEBUG: StartTransactionCommand)
SQLWarning:
13:56:08.594 (1)  <=BE ParseComplete [null]
13:56:08.594 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.594 (1)  <=BE BindComplete [null]
13:56:08.594 (1)  <=BE NoData
13:56:08.594 (1)  <=BE NoticeResponse(DEBUG: ProcessQuery)
SQLWarning:
13:56:08.596 (1)  <=BE NoticeResponse(DEBUG: mapped win32 error code 2 to 2)
SQLWarning:
13:56:08.600 (1)  <=BE CommandStatus(INSERT 0 1)
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: INSERT INTO TESTTABLE VALUES('1'))
SQLWarning:
13:56:08.601 (1)  <=BE ParseComplete [null]
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.601 (1)  <=BE BindComplete [null]
13:56:08.601 (1)  <=BE NoData
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: ProcessQuery)
SQLWarning:
13:56:08.601 (1)  <=BE CommandStatus(INSERT 0 1)
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: INSERT INTO TESTTABLE VALUES('2'))
SQLWarning:
13:56:08.601 (1)  <=BE ParseComplete [null]
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.601 (1)  <=BE BindComplete [null]
13:56:08.601 (1)  <=BE NoData
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: ProcessQuery)
SQLWarning:
13:56:08.601 (1)  <=BE CommandStatus(INSERT 0 1)
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: INSERT INTO TESTTABLE VALUES('3'))
SQLWarning:
13:56:08.601 (1)  <=BE ParseComplete [null]
13:56:08.601 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.602 (1)  <=BE BindComplete [null]
13:56:08.602 (1)  <=BE NoData
13:56:08.602 (1)  <=BE NoticeResponse(DEBUG: ProcessQuery)
SQLWarning:
13:56:08.602 (1)  <=BE CommandStatus(INSERT 0 1)
13:56:08.602 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: INSERT INTO TESTTABLE VALUES('4'))
SQLWarning:
13:56:08.602 (1)  <=BE ParseComplete [null]
13:56:08.602 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.602 (1)  <=BE BindComplete [null]
13:56:08.602 (1)  <=BE NoData
13:56:08.602 (1)  <=BE NoticeResponse(DEBUG: ProcessQuery)
SQLWarning:
13:56:08.602 (1)  <=BE CommandStatus(INSERT 0 1)
13:56:08.602 (1)  <=BE NoticeResponse(DEBUG: Parsen <unnamed>: INSERT INTO TESTTABLE VALUES('5'))
SQLWarning:
13:56:08.602 (1)  <=BE ParseComplete [null]
13:56:08.602 (1)  <=BE NoticeResponse(DEBUG: Binden <unnamed> an <unnamed>)
SQLWarning:
13:56:08.602 (1)  <=BE BindComplete [null]
13:56:08.603 (1)  <=BE NoData
13:56:08.603 (1)  <=BE NoticeResponse(DEBUG: ProcessQuery)
SQLWarning:
13:56:08.608 (1)  <=BE ErrorMessage(FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint „testtable_pkey“
Detail: Schlüssel „(id)=(5)“ existiert bereits.)
org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint „testtable_pkey“
Detail: Schlüssel „(id)=(5)“ existiert bereits.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:421)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2929)




=========================================================================================================================================================================================================================
POSTGRES 9.6 logs

=========================================================================================================================================================================================================================


DriverManager.getConnection("jdbc:postgresql://localhost:10433/app?charSet=UTF-8&user=xxxx&password=xxxx&logLevel=2&loglevel=2")
trying org.postgresql.Driver
13:52:38.914 (1) PostgreSQL 9.4.1211
13:52:38.920 (1) Trying to establish a protocol version 3 connection to localhost:10433
13:52:38.934 (1) Receive Buffer Size is 8192
13:52:38.934 (1) Send Buffer Size is 8192
13:52:38.936 (1)  FE=> StartupPacket(user=xxxx, database=app, client_encoding=UTF8, DateStyle=ISO,
TimeZone=Europe/Berlin,extra_float_digits=2) 
13:52:38.978 (1)  <=BE AuthenticationReqMD5(salt=1b61dbea)
13:52:38.985 (1)  FE=> Password(md5digest=md557d9e4eaa7fd9cedc1141ad09145b449)
13:52:38.986 (1)  <=BE AuthenticationOk
13:52:39.003 (1)  <=BE ParameterStatus(application_name = )
13:52:39.003 (1)  <=BE ParameterStatus(client_encoding = UTF8)
13:52:39.004 (1)  <=BE ParameterStatus(DateStyle = ISO, DMY)
13:52:39.004 (1)  <=BE ParameterStatus(integer_datetimes = on)
13:52:39.004 (1)  <=BE ParameterStatus(IntervalStyle = postgres)
13:52:39.004 (1)  <=BE ParameterStatus(is_superuser = on)
13:52:39.004 (1)  <=BE ParameterStatus(server_encoding = UTF8)
13:52:39.004 (1)  <=BE ParameterStatus(server_version = 9.6.0)
13:52:39.004 (1)  <=BE ParameterStatus(session_authorization = xxxx)
13:52:39.004 (1)  <=BE ParameterStatus(standard_conforming_strings = on)
13:52:39.004 (1)  <=BE ParameterStatus(TimeZone = Europe/Berlin)
13:52:39.004 (1)  <=BE BackendKeyData(pid=9324,ckey=2044033931)
13:52:39.004 (1)  <=BE ReadyForQuery(I)
13:52:39.006 (1) simple execute, handler=org.postgresql.core.SetupQueryRunner$SimpleResultHandler@4aa8f0b4, maxRows=0,
fetchSize=0,flags=1047 
13:52:39.007 (1)  FE=> Parse(stmt=null,query="SET extra_float_digits = 3",oids={})
13:52:39.007 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.007 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.007 (1)  FE=> Sync
13:52:39.009 (1)  <=BE ParseComplete [null]
13:52:39.009 (1)  <=BE BindComplete [unnamed]
13:52:39.009 (1)  <=BE CommandStatus(SET)
13:52:39.010 (1)  <=BE ReadyForQuery(I)
13:52:39.010 (1)     compatible = 90400
13:52:39.010 (1)     loglevel = 2
13:52:39.010 (1)     prepare threshold = 5
13:52:39.012 (1)     types using binary send =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
13:52:39.013 (1)     types using binary receive =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,DATE,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
13:52:39.013 (1)     integer date/time = true
getConnection returning org.postgresql.Driver
13:52:39.023 (1) batch execute 10 queries, handler=org.postgresql.jdbc.BatchResultHandler@6d86b085, maxRows=0,
fetchSize=0,flags=5 
13:52:39.023 (1)  FE=> Parse(stmt=null,query="BEGIN",oids={})
13:52:39.023 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.024 (1)  FE=> Execute(portal=null,limit=0)
13:52:39.024 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('0')",oids={})
13:52:39.024 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.024 (1)  FE=> Describe(portal=null)
13:52:39.024 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.024 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('1')",oids={})
13:52:39.025 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.025 (1)  FE=> Describe(portal=null)
13:52:39.025 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.025 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('2')",oids={})
13:52:39.025 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.025 (1)  FE=> Describe(portal=null)
13:52:39.025 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.025 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('3')",oids={})
13:52:39.025 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.025 (1)  FE=> Describe(portal=null)
13:52:39.025 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.025 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('4')",oids={})
13:52:39.025 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.025 (1)  FE=> Describe(portal=null)
13:52:39.025 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.025 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('5')",oids={})
13:52:39.025 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.025 (1)  FE=> Describe(portal=null)
13:52:39.025 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.026 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('6')",oids={})
13:52:39.026 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.026 (1)  FE=> Describe(portal=null)
13:52:39.026 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.026 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('7')",oids={})
13:52:39.026 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.026 (1)  FE=> Describe(portal=null)
13:52:39.026 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.026 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('8')",oids={})
13:52:39.026 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.026 (1)  FE=> Describe(portal=null)
13:52:39.026 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.026 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('9')",oids={})
13:52:39.026 (1)  FE=> Bind(stmt=null,portal=null)
13:52:39.026 (1)  FE=> Describe(portal=null)
13:52:39.026 (1)  FE=> Execute(portal=null,limit=1)
13:52:39.026 (1)  FE=> Sync
13:52:39.030 (1)  <=BE ParseComplete [null]
13:52:39.030 (1)  <=BE BindComplete [unnamed]
13:52:39.030 (1)  <=BE CommandStatus(BEGIN)
13:52:39.030 (1)  <=BE ParseComplete [null]
13:52:39.030 (1)  <=BE BindComplete [unnamed]
13:52:39.030 (1)  <=BE NoData
13:52:39.030 (1)  <=BE CommandStatus(INSERT 0 1)
13:52:39.030 (1)  <=BE ParseComplete [null]
13:52:39.030 (1)  <=BE BindComplete [unnamed]
13:52:39.030 (1)  <=BE NoData
13:52:39.030 (1)  <=BE CommandStatus(INSERT 0 1)
13:52:39.031 (1)  <=BE ParseComplete [null]
13:52:39.031 (1)  <=BE BindComplete [unnamed]
13:52:39.031 (1)  <=BE NoData
13:52:39.031 (1)  <=BE CommandStatus(INSERT 0 1)
13:52:39.031 (1)  <=BE ParseComplete [null]
13:52:39.031 (1)  <=BE BindComplete [unnamed]
13:52:39.031 (1)  <=BE NoData
13:52:39.031 (1)  <=BE CommandStatus(INSERT 0 1)
13:52:39.031 (1)  <=BE ParseComplete [null]
13:52:39.031 (1)  <=BE BindComplete [unnamed]
13:52:39.031 (1)  <=BE NoData
13:52:39.031 (1)  <=BE CommandStatus(INSERT 0 1)
13:52:39.031 (1)  <=BE ParseComplete [null]
13:52:39.031 (1)  <=BE BindComplete [unnamed]
13:52:39.031 (1)  <=BE NoData
13:52:39.034 (1)  <=BE ErrorMessage(FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »testtable_pkey«
Detail: Schlüssel »(id)=(5)« existiert bereits.)
org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »testtable_pkey«
Detail: Schlüssel »(id)=(5)« existiert bereits.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2458)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2158)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:463)
at org.postgresql.jdbc.PgStatement.executeBatch(PgStatement.java:794)
at com.app.generator.TestDataGenerator.generateRecipients(TestDataGenerator.java:31)
at com.app.generator.TestReturnCodes.main(TestReturnCodes.java:66)
SQLException: SQLState(23505)
SQLState(23505) vendor code(0)
java.sql.BatchUpdateException: Batch entry 5 INSERT INTO TESTTABLE VALUES('5') was aborted: FEHLER: doppelter
Schlüsselwertverletzt Unique-Constraint »testtable_pkey« 
Detail: Schlüssel »(id)=(5)« existiert bereits.  Call getNextException to see other errors in the batch.
at org.postgresql.jdbc.BatchResultHandler.handleError(BatchResultHandler.java:151)
at org.postgresql.core.ResultHandlerDelegate.handleError(ResultHandlerDelegate.java:45)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2159)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:463)
at org.postgresql.jdbc.PgStatement.executeBatch(PgStatement.java:794)
at com.inxmail.generator.TestDataGenerator.generateRecipients(TestDataGenerator.java:31)
at com.inxmail.generator.TestReturnCodes.main(TestReturnCodes.java:66)
13:52:39.044 (1)  <=BE ReadyForQuery(E)


Re: Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
>> updateCounts[0]=1
>> updateCounts[1]=1
>> updateCounts[2]=1
>> updateCounts[3]=1
>> updateCounts[4]=1
>> -->correct
>The value 1 is the batched statement return code for
>j.s.Statement.SUCCESS_NO_INFO

I think the value 1 is the update count ( 1 statement successfully inserted)

Statement.SUCCESS_NO_INFO has code -2.


Re: Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
Hello,

here are the logs with postgres 9.50./9.6.0 and postgresql-jdbc41-9.4-1201.jar


Bye

Tillmann




=========================================================================================================================================
Postgres 9.5.0 / postgresql-jdbc41-9.4-1201.jar

=========================================================================================================================================

DriverManager.getConnection("jdbc:postgresql://localhost:9432/xxxx5?charSet=UTF-8&user=xxxx&password=xxxx&logLevel=2&loglevel=2")
trying org.postgresql.Driver
09:04:59.269 (1) PostgreSQL 9.4 JDBC4.1 (build 1201)
09:04:59.284 (1) Trying to establish a protocol version 3 connection to localhost:9432
09:04:59.318 (1) Receive Buffer Size is 8192
09:04:59.319 (1) Send Buffer Size is 8192
09:04:59.321 (1)  FE=> StartupPacket(user=xxxx, database=xxxx5, client_encoding=UTF8, DateStyle=ISO,
TimeZone=Europe/Berlin,extra_float_digits=2) 
09:04:59.389 (1)  <=BE AuthenticationReqMD5(salt=d5b8ec19)
09:04:59.395 (1)  FE=> Password(md5digest=md5d64a93fa4940047d56e0be735eaba6ec)
09:04:59.401 (1)  <=BE AuthenticationOk
09:04:59.412 (1)  <=BE ParameterStatus(application_name = )
09:04:59.412 (1)  <=BE ParameterStatus(client_encoding = UTF8)
09:04:59.412 (1)  <=BE ParameterStatus(DateStyle = ISO, DMY)
09:04:59.412 (1)  <=BE ParameterStatus(integer_datetimes = on)
09:04:59.412 (1)  <=BE ParameterStatus(IntervalStyle = postgres)
09:04:59.412 (1)  <=BE ParameterStatus(is_superuser = on)
09:04:59.412 (1)  <=BE ParameterStatus(server_encoding = UTF8)
09:04:59.412 (1)  <=BE ParameterStatus(server_version = 9.5.0)
09:04:59.412 (1)  <=BE ParameterStatus(session_authorization = xxxx)
09:04:59.412 (1)  <=BE ParameterStatus(standard_conforming_strings = on)
09:04:59.412 (1)  <=BE ParameterStatus(TimeZone = Europe/Berlin)
09:04:59.412 (1)  <=BE BackendKeyData(pid=10084,ckey=314920069)
09:04:59.412 (1)  <=BE ReadyForQuery(I)
09:04:59.414 (1) simple execute, handler=org.postgresql.core.SetupQueryRunner$SimpleResultHandler@123a439b, maxRows=0,
fetchSize=0,flags=23 
09:04:59.414 (1)  FE=> Parse(stmt=null,query="SET extra_float_digits = 3",oids={})
09:04:59.414 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.414 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.414 (1)  FE=> Sync
09:04:59.424 (1)  <=BE ParseComplete [null]
09:04:59.424 (1)  <=BE BindComplete [null]
09:04:59.424 (1)  <=BE CommandStatus(SET)
09:04:59.424 (1)  <=BE ReadyForQuery(I)
09:04:59.425 (1)     compatible = 90400
09:04:59.425 (1)     loglevel = 2
09:04:59.425 (1)     prepare threshold = 5
09:04:59.427 (1)     types using binary send =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
09:04:59.427 (1)     types using binary receive =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,DATE,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
09:04:59.427 (1)     integer date/time = true
getConnection returning org.postgresql.Driver
09:04:59.442 (1) batch execute 10 queries,
handler=org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler@311d617d,maxRows=0, fetchSize=0, flags=5 
09:04:59.442 (1)  FE=> Parse(stmt=null,query="BEGIN",oids={})
09:04:59.442 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.442 (1)  FE=> Execute(portal=null,limit=0)
09:04:59.442 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('0')",oids={})
09:04:59.442 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.442 (1)  FE=> Describe(portal=null)
09:04:59.442 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.442 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('1')",oids={})
09:04:59.443 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.443 (1)  FE=> Describe(portal=null)
09:04:59.443 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.443 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('2')",oids={})
09:04:59.443 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.443 (1)  FE=> Describe(portal=null)
09:04:59.443 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.443 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('3')",oids={})
09:04:59.443 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.443 (1)  FE=> Describe(portal=null)
09:04:59.443 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.443 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('4')",oids={})
09:04:59.443 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.443 (1)  FE=> Describe(portal=null)
09:04:59.443 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.443 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('5')",oids={})
09:04:59.443 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.443 (1)  FE=> Describe(portal=null)
09:04:59.443 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.443 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('6')",oids={})
09:04:59.443 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.443 (1)  FE=> Describe(portal=null)
09:04:59.443 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.444 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('7')",oids={})
09:04:59.444 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.444 (1)  FE=> Describe(portal=null)
09:04:59.444 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.444 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('8')",oids={})
09:04:59.444 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.444 (1)  FE=> Describe(portal=null)
09:04:59.444 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.444 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('9')",oids={})
09:04:59.444 (1)  FE=> Bind(stmt=null,portal=null)
09:04:59.444 (1)  FE=> Describe(portal=null)
09:04:59.444 (1)  FE=> Execute(portal=null,limit=1)
09:04:59.444 (1)  FE=> Sync
09:04:59.479 (1)  <=BE ParseComplete [null]
09:04:59.479 (1)  <=BE BindComplete [null]
09:04:59.479 (1)  <=BE CommandStatus(BEGIN)
09:04:59.479 (1)  <=BE ParseComplete [null]
09:04:59.479 (1)  <=BE BindComplete [null]
09:04:59.479 (1)  <=BE NoData
09:04:59.479 (1)  <=BE CommandStatus(INSERT 0 1)
09:04:59.479 (1)  <=BE ParseComplete [null]
09:04:59.479 (1)  <=BE BindComplete [null]
09:04:59.479 (1)  <=BE NoData
09:04:59.479 (1)  <=BE CommandStatus(INSERT 0 1)
09:04:59.479 (1)  <=BE ParseComplete [null]
09:04:59.479 (1)  <=BE BindComplete [null]
09:04:59.479 (1)  <=BE NoData
09:04:59.479 (1)  <=BE CommandStatus(INSERT 0 1)
09:04:59.479 (1)  <=BE ParseComplete [null]
09:04:59.479 (1)  <=BE BindComplete [null]
09:04:59.479 (1)  <=BE NoData
09:04:59.479 (1)  <=BE CommandStatus(INSERT 0 1)
09:04:59.479 (1)  <=BE ParseComplete [null]
09:04:59.479 (1)  <=BE BindComplete [null]
09:04:59.480 (1)  <=BE NoData
09:04:59.480 (1)  <=BE CommandStatus(INSERT 0 1)
09:04:59.480 (1)  <=BE ParseComplete [null]
09:04:59.480 (1)  <=BE BindComplete [null]
09:04:59.480 (1)  <=BE NoData
09:04:59.487 (1)  <=BE ErrorMessage(FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint „testtable_pkey“
Detail: Schlüssel „(id)=(5)“ existiert bereits.)
org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint „testtable_pkey“
Detail: Schlüssel „(id)=(5)“ existiert bereits.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:421)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2929)
at com.xxxx.generator.TestDataGenerator.generateRecipients(TestDataGenerator.java:31)
at com.xxxx.generator.TestReturnCodes.main(TestReturnCodes.java:66)
SQLException: SQLState(23505)
SQLState(23505) vendor code(0)

=========================================================================================================================================
Postgres 9.6.0 / postgresql-jdbc41-9.4-1201.jar

=========================================================================================================================================

DriverManager.getConnection("jdbc:postgresql://localhost:10433/xxxx5?charSet=UTF-8&user=xxxx&password=xxxx&logLevel=2&loglevel=2")
trying org.postgresql.Driver
09:06:57.267 (1) PostgreSQL 9.4 JDBC4.1 (build 1201)
09:06:57.272 (1) Trying to establish a protocol version 3 connection to localhost:10433
09:06:57.284 (1) Receive Buffer Size is 8192
09:06:57.284 (1) Send Buffer Size is 8192
09:06:57.285 (1)  FE=> StartupPacket(user=xxxx, database=xxxx5, client_encoding=UTF8, DateStyle=ISO,
TimeZone=Europe/Berlin,extra_float_digits=2) 
09:06:57.343 (1)  <=BE AuthenticationReqMD5(salt=6ec50370)
09:06:57.352 (1)  FE=> Password(md5digest=md5436a132216c8872a44464ed12bfef57f)
09:06:57.361 (1)  <=BE AuthenticationOk
09:06:57.371 (1)  <=BE ParameterStatus(application_name = )
09:06:57.371 (1)  <=BE ParameterStatus(client_encoding = UTF8)
09:06:57.371 (1)  <=BE ParameterStatus(DateStyle = ISO, DMY)
09:06:57.371 (1)  <=BE ParameterStatus(integer_datetimes = on)
09:06:57.371 (1)  <=BE ParameterStatus(IntervalStyle = postgres)
09:06:57.371 (1)  <=BE ParameterStatus(is_superuser = on)
09:06:57.371 (1)  <=BE ParameterStatus(server_encoding = UTF8)
09:06:57.371 (1)  <=BE ParameterStatus(server_version = 9.6.0)
09:06:57.371 (1)  <=BE ParameterStatus(session_authorization = xxxx)
09:06:57.372 (1)  <=BE ParameterStatus(standard_conforming_strings = on)
09:06:57.372 (1)  <=BE ParameterStatus(TimeZone = Europe/Berlin)
09:06:57.372 (1)  <=BE BackendKeyData(pid=1420,ckey=46619645)
09:06:57.372 (1)  <=BE ReadyForQuery(I)
09:06:57.374 (1) simple execute, handler=org.postgresql.core.SetupQueryRunner$SimpleResultHandler@123a439b, maxRows=0,
fetchSize=0,flags=23 
09:06:57.375 (1)  FE=> Parse(stmt=null,query="SET extra_float_digits = 3",oids={})
09:06:57.375 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.375 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.375 (1)  FE=> Sync
09:06:57.380 (1)  <=BE ParseComplete [null]
09:06:57.380 (1)  <=BE BindComplete [null]
09:06:57.380 (1)  <=BE CommandStatus(SET)
09:06:57.380 (1)  <=BE ReadyForQuery(I)
09:06:57.381 (1)     compatible = 90400
09:06:57.381 (1)     loglevel = 2
09:06:57.381 (1)     prepare threshold = 5
09:06:57.386 (1)     types using binary send =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
09:06:57.387 (1)     types using binary receive =
TIMESTAMPTZ,UUID,INT2_ARRAY,INT4_ARRAY,BYTEA,TEXT_ARRAY,TIMETZ,INT8,INT2,INT4,VARCHAR_ARRAY,INT8_ARRAY,POINT,DATE,TIMESTAMP,TIME,BOX,FLOAT4,FLOAT8,FLOAT4_ARRAY,FLOAT8_ARRAY
09:06:57.387 (1)     integer date/time = true
getConnection returning org.postgresql.Driver
09:06:57.406 (1) batch execute 10 queries,
handler=org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler@311d617d,maxRows=0, fetchSize=0, flags=5 
09:06:57.406 (1)  FE=> Parse(stmt=null,query="BEGIN",oids={})
09:06:57.406 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.406 (1)  FE=> Execute(portal=null,limit=0)
09:06:57.407 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('0')",oids={})
09:06:57.407 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.407 (1)  FE=> Describe(portal=null)
09:06:57.407 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.407 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('1')",oids={})
09:06:57.407 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.407 (1)  FE=> Describe(portal=null)
09:06:57.407 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.407 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('2')",oids={})
09:06:57.407 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.407 (1)  FE=> Describe(portal=null)
09:06:57.407 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.407 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('3')",oids={})
09:06:57.407 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.407 (1)  FE=> Describe(portal=null)
09:06:57.407 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.407 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('4')",oids={})
09:06:57.407 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.407 (1)  FE=> Describe(portal=null)
09:06:57.407 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.407 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('5')",oids={})
09:06:57.407 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.407 (1)  FE=> Describe(portal=null)
09:06:57.408 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.408 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('6')",oids={})
09:06:57.408 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.408 (1)  FE=> Describe(portal=null)
09:06:57.408 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.408 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('7')",oids={})
09:06:57.408 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.408 (1)  FE=> Describe(portal=null)
09:06:57.408 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.408 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('8')",oids={})
09:06:57.408 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.408 (1)  FE=> Describe(portal=null)
09:06:57.408 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.408 (1)  FE=> Parse(stmt=null,query="INSERT INTO TESTTABLE VALUES('9')",oids={})
09:06:57.408 (1)  FE=> Bind(stmt=null,portal=null)
09:06:57.408 (1)  FE=> Describe(portal=null)
09:06:57.408 (1)  FE=> Execute(portal=null,limit=1)
09:06:57.408 (1)  FE=> Sync
09:06:57.454 (1)  <=BE ParseComplete [null]
09:06:57.454 (1)  <=BE BindComplete [null]
09:06:57.454 (1)  <=BE CommandStatus(BEGIN)
09:06:57.454 (1)  <=BE ParseComplete [null]
09:06:57.454 (1)  <=BE BindComplete [null]
09:06:57.454 (1)  <=BE NoData
09:06:57.454 (1)  <=BE CommandStatus(INSERT 0 1)
09:06:57.454 (1)  <=BE ParseComplete [null]
09:06:57.454 (1)  <=BE BindComplete [null]
09:06:57.454 (1)  <=BE NoData
09:06:57.454 (1)  <=BE CommandStatus(INSERT 0 1)
09:06:57.455 (1)  <=BE ParseComplete [null]
09:06:57.455 (1)  <=BE BindComplete [null]
09:06:57.455 (1)  <=BE NoData
09:06:57.455 (1)  <=BE CommandStatus(INSERT 0 1)
09:06:57.455 (1)  <=BE ParseComplete [null]
09:06:57.455 (1)  <=BE BindComplete [null]
09:06:57.455 (1)  <=BE NoData
09:06:57.455 (1)  <=BE CommandStatus(INSERT 0 1)
09:06:57.455 (1)  <=BE ParseComplete [null]
09:06:57.455 (1)  <=BE BindComplete [null]
09:06:57.455 (1)  <=BE NoData
09:06:57.455 (1)  <=BE CommandStatus(INSERT 0 1)
09:06:57.455 (1)  <=BE ParseComplete [null]
09:06:57.455 (1)  <=BE BindComplete [null]
09:06:57.455 (1)  <=BE NoData
09:06:57.466 (1)  <=BE ErrorMessage(FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »testtable_pkey«
Detail: Schlüssel »(id)=(5)« existiert bereits.)
org.postgresql.util.PSQLException: FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »testtable_pkey«
Detail: Schlüssel »(id)=(5)« existiert bereits.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:421)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2929)
at com.xxxx.generator.TestDataGenerator.generateRecipients(TestDataGenerator.java:31)
at com.xxxx.generator.TestReturnCodes.main(TestReturnCodes.java:66)
SQLException: SQLState(23505)
SQLState(23505) vendor code(0)


Re: Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
Hi,

After debugging my problem with the updateCount in the 9.4.1211 JDBC Driver I found the line in the code which causes
theerror. 

It's

  org.postgresql.jdbc.BatchResultHandler, Line 138 , JDBC Driver postgresql-9.4.1211

 @Override
 public void handleError(SQLException newError) {
   if (getException() == null) {
      Arrays.fill(updateCounts, committedRows, updateCounts.length, Statement.EXECUTE_FAILED);  //138 <-- BUG
   //...



Before the line "Arrays.fill..." the updateCounts contain the information of the already successfully inserted records
[1,1,1,1,1,0,0,0,0,0]. 
After filling the array with Statement.EXECUTE_FAILED the array contains [-3,-3,-3,-3,-3,-3,-3,-3,-3,-3]
This is a not correct.
The correct result is [1,1,1,1,1] or [1,1,1,1,1,-3]

How to get this bug fixed? Can you rethink your implementation?

Thank you for your help,

Tillmann

Re: Return Codes of BatchUpdateException in PostgreSql 9.6

From
Tillmann Schulz
Date:
Hi,

thanks for the response.



I have a simple test program which first creates a testtable, fills it with one record and does a batch insert of 10
records. 

The 5th insert causes a BatchUpdateException at stmt.executeBatch() when the data is NOT commited.

The question is, which return codes should be in x.getUpdateCounts().


For better reading I placed the test programm on       http://pastebin.com/0P1S6zEc



Bye,

Tillmann







import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


public class TestUpdateCount
{

public static void main( String[] args ) throws SQLException, ClassNotFoundException, IOException
{
//////////////////////////////////////////////////////////////////////////////////////
// CHANGE THIS
String dbUrl = "jdbc:postgresql://localhost:5432/db?charSet=UTF-8";
String dbUser = "user";
String dbPassword = "xxxx";
//////////////////////////////////////////////////////////////////////////////////////

try
{
Connection con = openConnection( dbUrl, dbUser, dbPassword );
con.setAutoCommit( false );

try
{
// Prepare Table
Statement stmtDrop = con.createStatement();
stmtDrop.execute( "DROP TABLE IF EXISTS TESTTABLE " );
con.commit();
Statement stmtCreate = con.createStatement();
stmtCreate.execute( "CREATE TABLE TESTTABLE (id INTEGER PRIMARY KEY)" );
con.commit();
Statement stmtData = con.createStatement();
stmtData.execute( "INSERT INTO TESTTABLE VALUES (5)" );
con.commit();

// TestCase: Insert 10 statements via jdbc batch.
// 5h statement should fail because of duplicate key error
con = openConnection( dbUrl, dbUser, dbPassword );
con.setAutoCommit( false );

Statement stmt = con.createStatement();
for( int i = 0; i < 10; i++ )
{
stmt.addBatch( "INSERT INTO TESTTABLE VALUES('" + i + "')" );
}

stmt.executeBatch();

con.commit();
}
catch( java.sql.BatchUpdateException x )
{
final int[] updateCounts = x.getUpdateCounts();
for( int i = 0; i < updateCounts.length; i++ )
{
System.err.println( "updateCounts[" + i + "]=" + updateCounts[i] );
}
// First 5 statements are successfully, so update count should be 1
for( int i = 0; i < 5; i++ )
{
if( updateCounts[i] != 1 )
                        System.err.println( "Wrong information returned by driver for update Count " + i );
}
// 5th statement
if( updateCounts[5] == -3 )
                    System.err.println( "Correct information returned by driver for update Count " + 5 );

}
}
catch( SQLException s )
{

s.printStackTrace();

if( s.getNextException() != null )
{
s.getNextException().printStackTrace();
}

}
catch( Exception s )
{
            s.printStackTrace();
}
}


private static Connection openConnection( String url, String user, String password )
throws ClassNotFoundException, SQLException, IOException
{
try
{
Class.forName( "org.postgresql.Driver" );
}
catch( ClassNotFoundException e )
{
System.err.println( "Could not load driver!" );
throw e;
}
Properties props = new Properties();
// Activate for logging
// props.setProperty( "loglevel", "2" );
// FileWriter fw = new FileWriter( "C:\\temp\\test12345.txt" );
// DriverManager.setLogWriter( new PrintWriter( fw ) );

props.setProperty( "user", user );
props.setProperty( "password", password );
return DriverManager.getConnection( url, props );

}

}