Skip to content

TPQConnection.Execute fixes

Ondrej Pokorny requested to merge fpc-ondrej/source:pg_execute into main

Replace possibly dangerous FreeAndNil(PChar) with assignment to nil

  • AFAIK FreeAndNil cannot be used on a PChar. Probably the reason why the code didn't fail, is that ar[i] was nil anyway.

Fix memory leak when ExecPrepared raises an exception

  • ExecPrepared can raise an exception when e.g. a row cannot be inserted because of UNIQUE index violation.
  • In this case TPQConnection.Execute leaks memory.

The stack trace for the exception that causes the memory leak:

#0 fpc_raiseexception(TOBJECT($0707F330), POINTER(nil), POINTER($07089AC0)) at seh32.inc:86
#1 TPGHANDLE.CHECKRESULTERROR(TPGHANDLE($07089AC0), PPGRESULT(nil), [], $0711977C^: 'Error executing prepared statement prepst130') at p:\software\FPC\src\packages\fcl-db\src\sqldb\postgres\pqconnection.pp:962
#2 TPGHANDLE.EXECPREPARED(TPGHANDLE($07089AC0), $070AD1CC^: 'prepst130', 38, $07090320^: '2', PLONGINT($07090210), PLONGINT($07090100), False) at p:\software\FPC\src\packages\fcl-db\src\sqldb\postgres\pqconnection.pp:858
#3 TPQCONNECTION.EXECUTE(TPQCONNECTION($07120DD8), TSQLCURSOR($0708F550), TSQLTRANSACTION($07108338), TPARAMS($0708ADE0)) at p:\software\FPC\src\packages\fcl-db\src\sqldb\postgres\pqconnection.pp:1319
#4 TCUSTOMSQLSTATEMENT.DOEXECUTE(TCUSTOMSQLSTATEMENT($07100520)) at p:\software\FPC\src\packages\fcl-db\src\sqldb\sqldb.pp:1070
#5 TCUSTOMSQLSTATEMENT.EXECUTE(TCUSTOMSQLSTATEMENT($07100520)) at p:\software\FPC\src\packages\fcl-db\src\sqldb\sqldb.pp:1330
#6 TCUSTOMSQLQUERY.INTERNALOPEN(TCUSTOMSQLQUERY($0601ACA0)) at p:\software\FPC\src\packages\fcl-db\src\sqldb\sqldb.pp:3160
#7 TDATASET.DOINTERNALOPEN(TDATASET($0601ACA0)) at p:\software\FPC\src\packages\fcl-db\src\base\dataset.inc:410
#8 TDATASET.OPENCURSOR(TDATASET($0601ACA0), False) at p:\software\FPC\src\packages\fcl-db\src\base\dataset.inc:964

Merge request reports