TPQConnection.Execute fixes
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 thatar[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