|
|
@@ -150,59 +150,6 @@ trait SqliteDialectTrait
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 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.
|
|
|
*
|
|
|
* Used by Cake\Database\Schema package to reflect schema and
|