Page 1 of 1

Postgres error 25P02

Posted: 28.01.2020, 09:36
by eversun
Hi all !

Trying to wotk with Zeos 7.3 (SVN, r6270) - important problem with Postgres driver (Postgres 11.0).

If an exception is raised in stored procedure, instead of a correct message the following error appears:
SQL Error: ERROR 25P02
current transaction is aborted, commands ignored until end of transaction block
source file: postgres.c
line: 1359
funtion: exec_parse_message

Re: Postgres error 25P02

Posted: 29.01.2020, 10:18
by marsupilami
Hello,

I had a similar error some years ago. This happens if you ignore a previous error message from PostgreSQL or if it gets hidden by some part of the code that raises another exception. As soon as a transaction in PostgreSQL has an error it seems to enter kinda faild state that only can be cleared by rolling back your transaction. The following codes should demonstrate the problem:

Code: Select all

  ZConnection.StartTransaction
  try
    ZConnection.ExecuteDirect('insert into testtable (primarykeyfield, datafield) values (1, 5000)');
    // this should create an error since 1 is already used in the primary key field.
    // it puts the transaction into the failed state.
    ZConnection.ExecuteDirect('insert into testtable (primarykeyfield, datafield) values (1, 5000)');
  except
    // even though 2 is not used, this will not work because the transaction is in a failed state
    // and needs to be rolled back.
    ZConnection.ExecuteDirect('insert into testtable (primarykeyfield, datafield) values (2, 5000)');
  end;
  ZConnection.Commit;
This example shows how a different exception can hide the previously generated exception so you don't know that anything went wrong in PostgreSQL:

Code: Select all

var
  SomeComponent: TComponent;
begin
  SomeComponent := nil;
  ZConnection.StartTransaction;
  try
    ZConnection.ExecuteDirect('insert into testtable (primarykeyfield, datafield) values (1, 5000)');
    // this should create an error since 1 is already used in the primary key field.
    // it puts the transaction into the failed state.
    ZConnection.ExecuteDirect('insert into testtable (primarykeyfield, datafield) values (1, 5000)');
    // commit is never executed because we generate an exception in the previous line.
    ZConnection.Commit;
  except
    // this code triggers another exception that will effectively hide the previous exception from PostgreSQL
    // by generating an access violation.
    SomeComponent.DoSomething;
    ZConnection.Rollback;
    raise;
  end;
Your best bet is to run the program and watch out for exceptions that get replaced by other exceptions or somehow don't get handeled correctly.

Best regards,

Jan