On Thu, Oct 14, 2010 at 6:53 AM, Michael Meskes<mes...@postgresql.org>  wrote:

You seem to be answering to an email that I didn't see and couldn't find in
the archive either. Was it send in private or to the list? If it went to the
list I might be lagging behind.

On 14/10/10 22:51, Robert Haas wrote:
I didn't get it either.  The original report was posted to pgsql-bugs
on October 10.

It might be lag; it'll probably turn up, about 6 seconds after I press *S

-------- Original Message --------
Subject:        Re: [BUGS] rollback to savepoint leads to transaction already
in progress
Date:   Thu, 14 Oct 2010 10:44:50 +0900
From:   Itagaki Takahiro<itagaki.takah...@gmail.com>
To:     David Newall<postgre...@davidnewall.com>, PostgreSQL Hackers
<pgsql-hackers@postgresql.org>
CC:     pgsql-b...@postgresql.org



On Mon, Oct 11, 2010 at 7:42 AM, David Newall
<postgre...@davidnewall.com>   wrote:
  Trivial program to demonstrate problem:

  main() {
      ECPGdebug(1,stderr);
      exec sql connect to postgres;
      exec sql set autocommit to off;
      exec sql start transaction;
      exec sql savepoint s;
      exec sql rollback to s;
      exec sql commit;
      return 0;
  }

  Output:
  [28397]: ECPGdebug: set to 1
  [28397]: ECPGconnect: opening database postgres on<DEFAULT>   port<DEFAULT>
  [28397]: ECPGsetcommit on line 4: action "off"; connection "postgres"
  [28397]: ECPGtrans on line 5: action "start transaction"; connection 
"postgres"
  [28397]: ECPGtrans on line 6: action "savepoint s"; connection "postgres"
  [28397]: ECPGtrans on line 7: action "rollback to s"; connection "postgres"
  [28397]: ECPGtrans on line 8: action "commit"; connection "postgres"
  [28397]: ECPGnoticeReceiver: there is already a transaction in progress
  [28397]: raising sqlcode -603

  Problem:
  It shouldn't raise "there is already a transaction in progress" error,
  particularly when doing a commit.  Remove "rollback to s" and no problem.

  Environment:
  ecpg (PostgreSQL 8.4.5) 4.5.0
  This appears to be a regression; it doesn't occur with ecpg (PostgreSQL
  8.3.8) 4.4.1

The bug comes from string-based transaction control in ECPGtrans().
The code cannot distinguish ROLLBACK TRANSACTION and ROLLBACK TO savepoint.
----
if (strncmp(transaction, "commit", 6) == 0 || strncmp(transaction,
"rollback", 8) == 0)
    con->committed = true;
else
    con->committed = false;
----

I think the string-comparison is unreliable. So, I'd like to replace
the code to use PQtransactionStatus(). I have two patches to do it:
The first one (ecpg-trans-quick_20101014.patch) is a quick fix
that replaces only the above test.
The second one (ecpg-trans-full_20101014.patch) replaces all of
struct connection->committed with PQtransactionStatus().

Which solution is better? Or, another idea?

--
Itagaki Takahiro


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to