Skip to content

Commit

Permalink
Fix of normalize for column names in insert, batchInsert, upsert, upd…
Browse files Browse the repository at this point in the history
…ate (#139)
  • Loading branch information
darkdef committed Dec 30, 2022
1 parent 436782c commit 7867bc0
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
14 changes: 11 additions & 3 deletions src/DMLQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,16 @@ public function batchInsert(string $table, array $columns, iterable|Generator $r
$columnSchemas = [];
}

$mappedNames = $this->getNormalizeColumnNames($table, $columns);
$values = [];

/** @psalm-var array<array-key, array<array-key, string>> $rows */
foreach ($rows as $row) {
$placeholders = [];
foreach ($row as $index => $value) {
if (isset($columns[$index], $columnSchemas[$columns[$index]])) {
if (isset($columns[$index], $mappedNames[$columns[$index]], $columnSchemas[$mappedNames[$columns[$index]]])) {
/** @var mixed $value */
$value = $this->getTypecastValue($value, $columnSchemas[$columns[$index]]);
$value = $this->getTypecastValue($value, $columnSchemas[$mappedNames[$columns[$index]]]);
}

if ($value instanceof ExpressionInterface) {
Expand All @@ -73,7 +74,6 @@ public function batchInsert(string $table, array $columns, iterable|Generator $r
return '';
}

/** @psalm-var string[] $columns */
foreach ($columns as $i => $name) {
$columns[$i] = $this->quoter->quoteColumnName($name);
}
Expand All @@ -95,6 +95,14 @@ public function upsert(
array|bool $updateColumns,
array &$params = []
): string {
if (!$insertColumns instanceof QueryInterface) {
$insertColumns = $this->normalizeColumnNames($table, $insertColumns);
}

if (!is_bool($updateColumns)) {
$updateColumns = $this->normalizeColumnNames($table, $updateColumns);
}

$usingValues = null;
$constraints = [];

Expand Down
8 changes: 4 additions & 4 deletions tests/Provider/QueryBuilderProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -157,20 +157,20 @@ public function upsert(): array
'values and expressions' => [
1 => ['{{%T_upsert}}.[[email]]' => 'dynamic@example.com', '[[ts]]' => new Expression('ROUND((SYSDATE - DATE \'1970-01-01\')*24*60*60)')],
3 => <<<SQL
MERGE INTO {{%T_upsert}} USING (SELECT :qp0 AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS [[ts]] FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN MATCHED THEN UPDATE SET [[ts]]="EXCLUDED".[[ts]] WHEN NOT MATCHED THEN INSERT ("email", [[ts]]) VALUES ("EXCLUDED"."email", "EXCLUDED".[[ts]])
MERGE INTO {{%T_upsert}} USING (SELECT :qp0 AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS "ts" FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN MATCHED THEN UPDATE SET "ts"="EXCLUDED"."ts" WHEN NOT MATCHED THEN INSERT ("email", "ts") VALUES ("EXCLUDED"."email", "EXCLUDED"."ts")
SQL,
],
'values and expressions with update part' => [
1 => ['{{%T_upsert}}.[[email]]' => 'dynamic@example.com', '[[ts]]' => new Expression('ROUND((SYSDATE - DATE \'1970-01-01\')*24*60*60)')],
2 => ['[[orders]]' => new Expression('"T_upsert"."orders" + 1')],
3 => <<<SQL
MERGE INTO {{%T_upsert}} USING (SELECT :qp0 AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS [[ts]] FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN MATCHED THEN UPDATE SET [[orders]]="T_upsert"."orders" + 1 WHEN NOT MATCHED THEN INSERT ("email", [[ts]]) VALUES ("EXCLUDED"."email", "EXCLUDED".[[ts]])
MERGE INTO {{%T_upsert}} USING (SELECT :qp0 AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS "ts" FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN MATCHED THEN UPDATE SET "orders"="T_upsert"."orders" + 1 WHEN NOT MATCHED THEN INSERT ("email", "ts") VALUES ("EXCLUDED"."email", "EXCLUDED"."ts")
SQL,
],
'values and expressions without update part' => [
1 => ['{{%T_upsert}}.[[email]]' => 'dynamic@example.com', '[[ts]]' => new Expression('ROUND((SYSDATE - DATE \'1970-01-01\')*24*60*60)')],
3 => <<<SQL
MERGE INTO {{%T_upsert}} USING (SELECT :qp0 AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS [[ts]] FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN NOT MATCHED THEN INSERT ("email", [[ts]]) VALUES ("EXCLUDED"."email", "EXCLUDED".[[ts]])
MERGE INTO {{%T_upsert}} USING (SELECT :qp0 AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS "ts" FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN NOT MATCHED THEN INSERT ("email", "ts") VALUES ("EXCLUDED"."email", "EXCLUDED"."ts")
SQL,
],
'query, values and expressions with update part' => [
Expand All @@ -183,7 +183,7 @@ public function upsert(): array
)->from('DUAL'),
2 => ['ts' => 0, '[[orders]]' => new Expression('"T_upsert"."orders" + 1')],
3 => <<<SQL
MERGE INTO {{%T_upsert}} USING (SELECT :phEmail AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS [[ts]] FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN MATCHED THEN UPDATE SET "ts"=:qp1, [[orders]]="T_upsert"."orders" + 1 WHEN NOT MATCHED THEN INSERT ("email", [[ts]]) VALUES ("EXCLUDED"."email", "EXCLUDED".[[ts]])
MERGE INTO {{%T_upsert}} USING (SELECT :phEmail AS "email", ROUND((SYSDATE - DATE '1970-01-01')*24*60*60) AS [[ts]] FROM "DUAL") "EXCLUDED" ON ({{%T_upsert}}."email"="EXCLUDED"."email") WHEN MATCHED THEN UPDATE SET "ts"=:qp1, "orders"="T_upsert"."orders" + 1 WHEN NOT MATCHED THEN INSERT ("email", [[ts]]) VALUES ("EXCLUDED"."email", "EXCLUDED".[[ts]])
SQL,
],
'query, values and expressions without update part' => [
Expand Down

0 comments on commit 7867bc0

Please sign in to comment.