ECPG ignores SAVEPOINT if it's the first statement of a transaction:
% cat foo.pgc
int
main(void)
{ EXEC SQL WHENEVER SQLERROR SQLPRINT; EXEC SQL WHENEVER SQLWARNING SQLPRINT;
EXEC SQL CONNECT TO test;
EXEC SQL SAVEPOINT foo; EXEC SQL DROP TABLE nosuch_1; EXEC SQL ROLLBACK TO foo; EXEC SQL DROP TABLE nosuch_2;
EXEC SQL COMMIT; EXEC SQL DISCONNECT;
return 0;
}
% ./foo
sql error 'table "nosuch_1" does not exist' in line 10.
sql error 'current transaction is aborted, commands ignored until end of transa
The SAVEPOINT code is generated but apparently ECPGtrans() doesn't
execute it. A sniff of the connection doesn't show it, and the
sniff shows the ROLLBACK TO failing with "no such savepoint."
If I execute a command before the SAVEPOINT then I get the following,
which is what I was expecting:
% ./foo
sql error 'table "nosuch_1" does not exist' in line 11.
sql error 'table "nosuch_2" does not exist' in line 13.
A sniff of this connection shows both the SAVEPOINT and ROLLBACK TO
being executed and succeeding.
--
Michael Fuhr
http://www.fuhr.org/~mfuhr/