Committed by Greg Sabino Mullane <[email protected]>

Don't return quick on a ping() if we are inside a
transaction but idle: do a SELECT to the server as we do with an active
session. Per bug report #100648

---
 dbdimp.c       |  2 +-
 t/03dbmethod.t | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/dbdimp.c b/dbdimp.c
index 28882a5..1fa422e 100644
--- a/dbdimp.c
+++ b/dbdimp.c
@@ -472,7 +472,7 @@ int dbd_db_ping (SV * dbh)
                return -2;
        }
 
-       if (tstatus != 0) {/* 2=active, 3=intrans, 4=inerror */
+       if (tstatus != 0 && tstatus != 2) {/* 0=idle, 1=active, 2=intrans, 
3=error 4=unknown */
                if (TEND_slow) TRC(DBILOGFP, "%sEnd dbd_pg_ping (result: 
%d)\n", THEADER_slow, 1+tstatus);
                return 1+tstatus;
        }
diff --git a/t/03dbmethod.t b/t/03dbmethod.t
index 57da55b..f37f16f 100644
--- a/t/03dbmethod.t
+++ b/t/03dbmethod.t
@@ -1882,9 +1882,9 @@ $dbh2->disconnect();
 $t='DB handle method "ping" returns 1 on an idle connection';
 is ($dbh->ping(), 1, $t);
 
-$t='DB handle method "ping" returns 3 for a good connection inside a 
transaction';
+$t='DB handle method "ping" returns 1 for a good connection inside a 
transaction';
 $dbh->do('SELECT 123');
-$result = 3;
+$result = 1;
 is ($result, $dbh->ping(), $t);
 
 $t='DB handle method "ping" returns 1 on an idle connection';
@@ -1902,9 +1902,9 @@ $dbh->do('COPY dbd_pg_test(id,pname) TO STDOUT');
 is ($dbh->ping(), 2, $t);
 1 while $dbh->pg_getline($mtvar,1000);
 
-$t='DB handle method "ping" returns 3 for a good connection inside a 
transaction';
+$t='DB handle method "ping" returns 1 for a good connection inside a 
transaction';
 $dbh->do('SELECT 123');
-is ($dbh->ping(), 3, $t);
+is ($dbh->ping(), 1, $t);
 
 $t='DB handle method "ping" returns a 4 when inside a failed transaction';
 eval {
@@ -1927,9 +1927,9 @@ isnt ($dbh, undef, $t);
 $t='DB handle method "pg_ping" returns 1 on an idle connection';
 is ($dbh->pg_ping(), 1, $t);
 
-$t='DB handle method "pg_ping" returns 3 for a good connection inside a 
transaction';
+$t='DB handle method "pg_ping" returns 1 for a good connection inside a 
transaction';
 $dbh->do('SELECT 123');
-is ($dbh->pg_ping(), 3, $t);
+is ($dbh->pg_ping(), 1, $t);
 
 $t='DB handle method "pg_ping" returns 1 on an idle connection';
 $dbh->commit();
@@ -1944,9 +1944,9 @@ $t='DB handle method "pg_ping" returns 2 immediately 
after COPY IN state';
 1 while $dbh->pg_getline($mtvar,1000);
 is ($dbh->pg_ping(), 2, $t);
 
-$t='DB handle method "pg_ping" returns 3 for a good connection inside a 
transaction';
+$t='DB handle method "pg_ping" returns 1 for a good connection inside a 
transaction';
 $dbh->do('SELECT 123');
-is ($dbh->pg_ping(), 3, $t);
+is ($dbh->pg_ping(), 1, $t);
 
 $t='DB handle method "pg_ping" returns a 4 when inside a failed transaction';
 eval {
-- 
1.8.4

Reply via email to