diff --git includes/database/pgsql/database.inc includes/database/pgsql/database.inc index dbb3286..c4f948a 100644 --- includes/database/pgsql/database.inc +++ includes/database/pgsql/database.inc @@ -188,6 +188,30 @@ class DatabaseConnection_pgsql extends DatabaseConnection { return $id; } + + /** + * Overrides PDO::lastInsertId(). + * + * Catchs and handles the exception in case currval() fails. + */ + public function lastInsertId($name = null) { + try { + return parent::lastInsertId($name); + } catch(PDOException $e) { + if ($e->getCode() == 55000) { + // This fail if a value was inserted into the serial column and + // nextval() was never called. In that case, the last_insert_id is known + // by the caller and NULL is returned. + $last_insert_id = NULL; + } + else { + // If it is a different exception, re-throw it. + throw $e; + } + } + return $last_insert_id; + } + } /** diff --git includes/database/pgsql/query.inc includes/database/pgsql/query.inc index 8825229..5ed92ed 100644 --- includes/database/pgsql/query.inc +++ includes/database/pgsql/query.inc @@ -69,6 +69,16 @@ class InsertQuery_pgsql extends InsertQuery { } $last_insert_id = $this->connection->query($stmt, array(), $options); + // If a value was inserted into a serial column, update the sequence. + if (!empty($table_information->serial_fields)) { + foreach ($table_information->serial_fields as $index => $serial_field) { + if (in_array($serial_field, $this->insertFields)) { + $curval = $this->connection->query("SELECT MAX(" . $serial_field . ") FROM {" . $this->table . "}")->fetchField(); + $this->connection->query("SELECT SETVAL('" . $table_information->sequences[$index] . "', :curval)", array(':curval' => $curval)); + } + } + } + // Re-initialize the values array so that we can re-use this query. $this->insertValues = array(); diff --git modules/simpletest/tests/database_test.test modules/simpletest/tests/database_test.test index c6c61df..e4518cb 100644 --- modules/simpletest/tests/database_test.test +++ modules/simpletest/tests/database_test.test @@ -561,6 +561,17 @@ class DatabaseInsertTestCase extends DatabaseTestCase { ->execute(); $this->assertIdentical($id, '5', t('Auto-increment ID returned successfully.')); + + // Test a manual insert. + $id = db_insert('test') + ->fields(array( + 'id' => '7', + 'name' => 'Curly', + 'age' => '29', + )) + ->execute(); + + $this->assertIdentical($id, '7', t('Auto-increment ID returned properly for a manual ID insert.')); } /**