properly quote sequence name in Schema::getLastInsertId()

fixes #8483
close #8515
This commit is contained in:
John Was
2015-05-21 21:50:27 +02:00
committed by Carsten Brandt
parent 6ba1e9075b
commit a63fc2ff59
4 changed files with 16 additions and 2 deletions

View File

@@ -8,6 +8,7 @@ Yii Framework 2 Change Log
- Bug #7707: client-side `trim` validator now passes the trimmed value to subsequent validators (nkovacs) - Bug #7707: client-side `trim` validator now passes the trimmed value to subsequent validators (nkovacs)
- Bug #8322: `yii\behaviors\TimestampBehavior::touch()` now throws an exception if owner is new record (klimov-paul) - Bug #8322: `yii\behaviors\TimestampBehavior::touch()` now throws an exception if owner is new record (klimov-paul)
- Bug #8451: `yii\i18n\Formatter` did not allow negative unix timestamps as input for date formatting (cebe) - Bug #8451: `yii\i18n\Formatter` did not allow negative unix timestamps as input for date formatting (cebe)
- Bug #8483: sequence name in `Schema::getLastInsertId()` was not properly quoted (nineinchnick)
- Bug #8506: Cleaning of output buffer in `Widget::run()` conflicts with `Pjax` widget which did the cleanup itself (cebe, joester89) - Bug #8506: Cleaning of output buffer in `Widget::run()` conflicts with `Pjax` widget which did the cleanup itself (cebe, joester89)
- Bug: Fixed string comparison in `BaseActiveRecord::unlink()` which may result in wrong comparison result for hash valued primary keys starting with `0e` (cebe) - Bug: Fixed string comparison in `BaseActiveRecord::unlink()` which may result in wrong comparison result for hash valued primary keys starting with `0e` (cebe)
- Enh #7169: `yii\widgets\ActiveField` now uses corresponding methods for default parts rendering (klimov-paul) - Enh #7169: `yii\widgets\ActiveField` now uses corresponding methods for default parts rendering (klimov-paul)

View File

@@ -348,7 +348,7 @@ abstract class Schema extends Object
public function getLastInsertID($sequenceName = '') public function getLastInsertID($sequenceName = '')
{ {
if ($this->db->isActive) { if ($this->db->isActive) {
return $this->db->pdo->lastInsertId($sequenceName === '' ? null : $this->quoteSimpleTableName($sequenceName)); return $this->db->pdo->lastInsertId($sequenceName === '' ? null : $this->quoteTableName($sequenceName));
} else { } else {
throw new InvalidCallException('DB Connection is not active.'); throw new InvalidCallException('DB Connection is not active.');
} }

View File

@@ -37,6 +37,11 @@ CREATE TABLE "profile" (
description varchar(128) NOT NULL description varchar(128) NOT NULL
); );
CREATE TABLE "schema1"."profile" (
id serial not null primary key,
description varchar(128) NOT NULL
);
CREATE TABLE "customer" ( CREATE TABLE "customer" (
id serial not null primary key, id serial not null primary key,
email varchar(128) NOT NULL, email varchar(128) NOT NULL,
@@ -151,6 +156,9 @@ INSERT INTO "animal" (type) VALUES ('yiiunit\data\ar\Dog');
INSERT INTO "profile" (description) VALUES ('profile customer 1'); INSERT INTO "profile" (description) VALUES ('profile customer 1');
INSERT INTO "profile" (description) VALUES ('profile customer 3'); INSERT INTO "profile" (description) VALUES ('profile customer 3');
INSERT INTO "schema1"."profile" (description) VALUES ('profile customer 1');
INSERT INTO "schema1"."profile" (description) VALUES ('profile customer 3');
INSERT INTO "customer" (email, name, address, status, bool_status, profile_id) VALUES ('user1@example.com', 'user1', 'address1', 1, true, 1); INSERT INTO "customer" (email, name, address, status, bool_status, profile_id) VALUES ('user1@example.com', 'user1', 'address1', 1, true, 1);
INSERT INTO "customer" (email, name, address, status, bool_status) VALUES ('user2@example.com', 'user2', 'address2', 1, true); INSERT INTO "customer" (email, name, address, status, bool_status) VALUES ('user2@example.com', 'user2', 'address2', 1, true);
INSERT INTO "customer" (email, name, address, status, bool_status, profile_id) VALUES ('user3@example.com', 'user3', 'address3', 2, false, 2); INSERT INTO "customer" (email, name, address, status, bool_status, profile_id) VALUES ('user3@example.com', 'user3', 'address3', 2, false, 2);

View File

@@ -62,6 +62,11 @@ class PostgreSQLCommandTest extends CommandTest
$sql = 'INSERT INTO {{profile}}([[description]]) VALUES (\'non duplicate\')'; $sql = 'INSERT INTO {{profile}}([[description]]) VALUES (\'non duplicate\')';
$command = $db->createCommand($sql); $command = $db->createCommand($sql);
$command->execute(); $command->execute();
$this->assertEquals(3, $db->getSchema()->getLastInsertID('profile_id_seq')); $this->assertEquals(3, $db->getSchema()->getLastInsertID('public.profile_id_seq'));
$sql = 'INSERT INTO {{schema1.profile}}([[description]]) VALUES (\'non duplicate\')';
$command = $db->createCommand($sql);
$command->execute();
$this->assertEquals(3, $db->getSchema()->getLastInsertID('schema1.profile_id_seq'));
} }
} }