]> granicus.if.org Git - php/commitdiff
Implemented FR #72633 Postgres PDO lastInsertId() should work without specifying...
authorroot <phackwer@gmail.com>
Tue, 19 Jul 2016 19:28:25 +0000 (15:28 -0400)
committerAnatol Belski <ab@php.net>
Wed, 27 Jul 2016 21:00:12 +0000 (23:00 +0200)
ext/pdo_pgsql/pgsql_driver.c
ext/pdo_pgsql/php_pdo_pgsql_int.h
ext/pdo_pgsql/tests/bug_last_insert_id.phpt [new file with mode: 0644]
ext/pdo_pgsql/tests/common.phpt

index 3f92525506cbef84a3787cacf220ffcfff729963..6bc1976161bc88c85c89586c854b9abc367cd2e0 100644 (file)
@@ -361,31 +361,30 @@ static char *pdo_pgsql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *
 {
        pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
        char *id = NULL;
+       PGresult *res;
+       ExecStatusType status;
+       const char *q[1];
+       q[0] = name;
 
-       if (name == NULL) {
-               if (H->pgoid == InvalidOid) {
-                       return NULL;
-               }
-               *len = spprintf(&id, 0, ZEND_LONG_FMT, (zend_long) H->pgoid);
+       if (PHP_PDO_PGSQL_LASTVAL_PG_VERSION <= PQserverVersion(H->server) && name == NULL) {
+               res = PQexec(H->server, "SELECT LASTVAL()");
        } else {
-               PGresult *res;
-               ExecStatusType status;
-               const char *q[1];
-               q[0] = name;
                res = PQexecParams(H->server, "SELECT CURRVAL($1)", 1, NULL, q, NULL, NULL, 0);
-               status = PQresultStatus(res);
+       }
+       status = PQresultStatus(res);
 
-               if (res && (status == PGRES_TUPLES_OK)) {
-                       id = estrdup((char *)PQgetvalue(res, 0, 0));
-                       *len = PQgetlength(res, 0, 0);
-               } else {
-                       pdo_pgsql_error(dbh, status, pdo_pgsql_sqlstate(res));
-               }
+       if (res && (status == PGRES_TUPLES_OK)) {
+               id = estrdup((char *)PQgetvalue(res, 0, 0));
+               *len = PQgetlength(res, 0, 0);
+       } else {
+               pdo_pgsql_error(dbh, status, pdo_pgsql_sqlstate(res));
+               *len = spprintf(&id, 0, ZEND_LONG_FMT, (zend_long) H->pgoid);
+       }
 
-               if (res) {
-                       PQclear(res);
-               }
+       if (res) {
+               PQclear(res);
        }
+
        return id;
 }
 
index 30c2cc2d5223f705fd0444279f79ca493cd23782..86fc847633b7f2c0226b5aafab883b3af5627e66 100644 (file)
@@ -29,6 +29,8 @@
 
 #define PHP_PDO_PGSQL_CONNECTION_FAILURE_SQLSTATE "08006"
 
+#define PHP_PDO_PGSQL_LASTVAL_PG_VERSION 80100
+
 typedef struct {
        const char *file;
        int line;
diff --git a/ext/pdo_pgsql/tests/bug_last_insert_id.phpt b/ext/pdo_pgsql/tests/bug_last_insert_id.phpt
new file mode 100644 (file)
index 0000000..24e889b
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+currval() vs lastval() - PDO PgSQL Bug #1134 [BUG] New record, PostgreSQL and the Primary key https://github.com/phalcon/cphalcon/issues/1134
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+
+$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+@$db->query('CREATE TABLE test_last_id (id SERIAL NOT NULL, field1 VARCHAR(10))');
+
+$stmt = $db->prepare("INSERT INTO test_last_id (field1) VALUES ('test')");
+
+$stmt->execute();
+
+/**
+ * No sequence name informed
+ */
+var_dump($db->lastInsertId());
+/**
+ * Sequence name informed
+ */
+var_dump($db->lastInsertId('test_last_id_id_seq'));
+?>
+--EXPECTREGEX--
+string\([0-9]*\)\ \"[0-9]*\"
+string\([0-9]*\)\ \"[0-9]*\"
index e764b39839215eb9613252de7fab6fc337999263..a484e69ea3fe4eb940fd55033af4c7ebfb2a48ea 100644 (file)
@@ -5,7 +5,7 @@ Postgres
 if (!extension_loaded('pdo_pgsql')) print 'skip'; ?>
 --REDIRECTTEST--
 # magic auto-configuration
-# Also update config.inc if you make changes here... 
+# Also update config.inc if you make changes here...
 
 $config = array(
        'TESTS' => __DIR__ . '/ext/pdo/tests'
@@ -20,5 +20,5 @@ if (false !== getenv('PDO_PGSQL_TEST_DSN')) {
 } else {
        $config['ENV']['PDOTEST_DSN'] = 'pgsql:host=localhost port=5432 dbname=test user= password=';
 }
-       
+
 return $config;