Skip to content

Commit

Permalink
It turns out that SQLite 3.7.11+ implements multi-inserts!
Browse files Browse the repository at this point in the history
Version 3.8 is the minimum sqlite version fro php 5.5
  • Loading branch information
lorenzo committed Mar 26, 2016
1 parent 799c7c2 commit 3cbb89c
Showing 1 changed file with 0 additions and 53 deletions.
53 changes: 0 additions & 53 deletions src/Database/Dialect/SqliteDialectTrait.php
Expand Up @@ -149,59 +149,6 @@ protected function _transformFunctionExpression(FunctionExpression $expression)
}
}

/**
* Transforms an insert query that is meant to insert multiple rows at a time,
* otherwise it leaves the query untouched.
*
* The way SQLite works with multi insert is by having multiple select statements
* joined with UNION.
*
* @param \Cake\Database\Query $query The query to translate
* @return \Cake\Database\Query
*/
protected function _insertQueryTranslator($query)
{
$v = $query->clause('values');
if (count($v->values()) === 1 || $v->query()) {
return $query;
}

$newQuery = $query->connection()->newQuery();
$cols = $v->columns();
$placeholder = 0;
$replaceQuery = false;

foreach ($v->values() as $k => $val) {
$fillLength = count($cols) - count($val);
if ($fillLength > 0) {
$val = array_merge($val, array_fill(0, $fillLength, null));
}

foreach ($val as $col => $attr) {
if (!($attr instanceof ExpressionInterface)) {
$val[$col] = sprintf(':c%d', $placeholder);
$placeholder++;
}
}

$select = array_combine($cols, $val);
if ($k === 0) {
$replaceQuery = true;
$newQuery->select($select);
continue;
}

$q = $newQuery->connection()->newQuery();
$newQuery->unionAll($q->select($select));
}

if ($replaceQuery) {
$v->query($newQuery);
}

return $query;
}

/**
* Get the schema dialect.
*
Expand Down

0 comments on commit 3cbb89c

Please sign in to comment.