Fixes #13418: Fixed QueryBuilder::batchInsert() if $rows is \Generator

This commit is contained in:
Alex
2017-02-24 00:28:27 +03:00
committed by Alexander Makarov
parent 8582dc93f3
commit 6db6a2ddbe
7 changed files with 40 additions and 1 deletions

View File

@ -11,6 +11,7 @@ Yii Framework 2 Change Log
- Bug #13306: Wildcard in `reloadableScripts` in `yii.js` allows 0 characters (arogachev) - Bug #13306: Wildcard in `reloadableScripts` in `yii.js` allows 0 characters (arogachev)
- Bug #13340: Fixed `yii\db\Connection::useMaster()` - Exception within callback completely disables slaves (Vovan-VE) - Bug #13340: Fixed `yii\db\Connection::useMaster()` - Exception within callback completely disables slaves (Vovan-VE)
- Bug #13343: Fixed `yii\i18n\Formatter::asTime()` to process time-only values without time zone conversion (bizley) - Bug #13343: Fixed `yii\i18n\Formatter::asTime()` to process time-only values without time zone conversion (bizley)
- Bug #13418: Fixed `QueryBuilder::batchInsert()` if $rows is `\Generator` (lav45)
- Bug #13494: Fixed `yii\console\controllers\MessageConstroller::saveMessagesToDb()` to work on different DBMS correctly (silverfire) - Bug #13494: Fixed `yii\console\controllers\MessageConstroller::saveMessagesToDb()` to work on different DBMS correctly (silverfire)
- Bug #13513: Fixed RBAC migration to work correctly on Oracle DBMS (silverfire) - Bug #13513: Fixed RBAC migration to work correctly on Oracle DBMS (silverfire)
- Bug #13537: Fixed `yii\web\CacheSession::destroySession()` to work correctly when session is not written yet (silverfire, papalapa) - Bug #13537: Fixed `yii\web\CacheSession::destroySession()` to work correctly when session is not written yet (silverfire, papalapa)

View File

@ -268,6 +268,9 @@ class QueryBuilder extends \yii\base\Object
} }
$values[] = '(' . implode(', ', $vs) . ')'; $values[] = '(' . implode(', ', $vs) . ')';
} }
if (empty($values)) {
return '';
}
foreach ($columns as $i => $name) { foreach ($columns as $i => $name) {
$columns[$i] = $schema->quoteColumnName($name); $columns[$i] = $schema->quoteColumnName($name);

View File

@ -262,6 +262,9 @@ EOD;
} }
$values[] = '(' . implode(', ', $vs) . ')'; $values[] = '(' . implode(', ', $vs) . ')';
} }
if (empty($values)) {
return '';
}
foreach ($columns as $i => $name) { foreach ($columns as $i => $name) {
$columns[$i] = $schema->quoteColumnName($name); $columns[$i] = $schema->quoteColumnName($name);

View File

@ -316,6 +316,9 @@ class QueryBuilder extends \yii\db\QueryBuilder
} }
$values[] = '(' . implode(', ', $vs) . ')'; $values[] = '(' . implode(', ', $vs) . ')';
} }
if (empty($values)) {
return '';
}
foreach ($columns as $i => $name) { foreach ($columns as $i => $name) {
$columns[$i] = $schema->quoteColumnName($name); $columns[$i] = $schema->quoteColumnName($name);

View File

@ -106,6 +106,9 @@ class QueryBuilder extends \yii\db\QueryBuilder
} }
$values[] = implode(', ', $vs); $values[] = implode(', ', $vs);
} }
if (empty($values)) {
return '';
}
foreach ($columns as $i => $name) { foreach ($columns as $i => $name) {
$columns[$i] = $schema->quoteColumnName($name); $columns[$i] = $schema->quoteColumnName($name);

View File

@ -298,6 +298,15 @@ SQL;
$this->assertEquals(0, $command->execute()); $this->assertEquals(0, $command->execute());
} }
public function testBatchInsertWithYield()
{
if (version_compare(PHP_VERSION, '5.5', '<')) {
$this->markTestSkipped('The yield function is only supported with php 5.5 =< version');
} else {
include __DIR__ . '/testBatchInsertWithYield.php';
}
}
public function testInsert() public function testInsert()
{ {
$db = $this->getConnection(); $db = $this->getConnection();
@ -559,7 +568,6 @@ SQL;
], $records); ], $records);
} }
public function testDropTable() public function testDropTable()
{ {
$db = $this->getConnection(); $db = $this->getConnection();

View File

@ -0,0 +1,18 @@
<?php
/**
* @var $this \yiiunit\framework\db\CommandTest
*/
$rows = call_user_func(function () {
if (false) {
yield [];
}
});
$command = $this->getConnection()->createCommand();
$command->batchInsert(
'{{customer}}',
['email', 'name', 'address'],
$rows
);
$this->assertEquals(0, $command->execute());