Skip to content
This repository was archived by the owner on Jun 4, 2024. It is now read-only.

Commit 705714e

Browse files
committed
Fix escaping of default values
1 parent 71ed55d commit 705714e

File tree

30 files changed

+75
-82
lines changed

30 files changed

+75
-82
lines changed

src/lib/ColumnToCode.php

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public function getCode(bool $quoted = false):string
169169
$default = '';
170170
} elseif (ApiGenerator::isPostgres() && $this->isEnum()) {
171171
$default =
172-
$this->rawParts['default'] !== null ? ' DEFAULT ' . self::escapeQuotes(trim($this->rawParts['default'])) : '';
172+
$this->rawParts['default'] !== null ? ' DEFAULT ' . trim($this->rawParts['default']) : '';
173173
} else {
174174
$default = $this->rawParts['default'] !== null ? ' DEFAULT ' . trim($this->rawParts['default']) : '';
175175
}
@@ -178,13 +178,10 @@ public function getCode(bool $quoted = false):string
178178
if ((ApiGenerator::isMysql() || ApiGenerator::isMariaDb()) && $this->rawParts['position']) {
179179
$code .= ' ' . $this->rawParts['position'];
180180
}
181-
if ((ApiGenerator::isMysql() || ApiGenerator::isMariaDb()) && $this->isEnum()) {
182-
return $quoted ? "'" . $code . "'" : $code;
183-
}
184181
if (ApiGenerator::isPostgres() && $this->alterByXDbType) {
185-
return $quoted ? "'" . $this->rawParts['type'] . "'" : $this->rawParts['type'];
182+
return $quoted ? VarDumper::export($this->rawParts['type']) : $this->rawParts['type'];
186183
}
187-
return $quoted ? "'" . $code . "'" : $code;
184+
return $quoted ? VarDumper::export($code) : $code;
188185
}
189186

190187
public function getAlterExpression(bool $addUsingExpression = false):string
@@ -313,14 +310,14 @@ public static function mysqlEnumToString(array $enum):string
313310
private function defaultValueJson(array $value):string
314311
{
315312
if ($this->alter === true) {
316-
return "'" . str_replace('"', '\"', Json::encode($value)). "'";
313+
return "'" . str_replace('"', '\"', Json::encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT)) . "'";
317314
}
318-
return "\\'" . new Expression(Json::encode($value)) . "\\'";
315+
return "'" . Json::encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT) . "'";
319316
}
320317

321318
private function defaultValueArray(array $value):string
322319
{
323-
return "'{" . str_replace('"', "\"", trim(Json::encode($value), '[]')) . "}'";
320+
return "'{" . trim(Json::encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT), '[]') . "}'";
324321
}
325322

326323
private function resolve():void
@@ -442,10 +439,10 @@ private function resolveDefaultValue():void
442439
break;
443440
case 'object':
444441
if ($value instanceof JsonExpression) {
445-
$this->fluentParts['default'] = "defaultValue('" . Json::encode($value->getValue()) . "')";
442+
$this->fluentParts['default'] = "defaultValue('" . Json::encode($value->getValue(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT) . "')";
446443
$this->rawParts['default'] = $this->defaultValueJson($value->getValue());
447444
} elseif ($value instanceof ArrayExpression) {
448-
$this->fluentParts['default'] = "defaultValue('" . Json::encode($value->getValue()) . "')";
445+
$this->fluentParts['default'] = "defaultValue('" . Json::encode($value->getValue(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT) . "')";
449446
$this->rawParts['default'] = $this->defaultValueArray($value->getValue());
450447
} else {
451448
// $value instanceof \yii\db\Expression
@@ -454,19 +451,15 @@ private function resolveDefaultValue():void
454451
}
455452
break;
456453
case 'array':
457-
$this->fluentParts['default'] = "defaultValue('" . Json::encode($value) . "')";
454+
$this->fluentParts['default'] = "defaultValue('" . Json::encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT) . "')";
458455
$this->rawParts['default'] = $this->isJson()
459456
? $this->defaultValueJson($value)
460457
: $this->defaultValueArray($value);
461458
break;
462459
default:
463460
$this->fluentParts['default'] = $expectInteger
464-
? 'defaultValue(' . $value . ')' : 'defaultValue("' . self::escapeQuotes((string)$value) . '")';
465-
$this->rawParts['default'] = $expectInteger ? $value : self::wrapQuotes($value);
466-
467-
if ((ApiGenerator::isMysql() || ApiGenerator::isMariaDb()) && $this->isEnum()) {
468-
$this->rawParts['default'] = self::escapeQuotes($this->rawParts['default']);
469-
}
461+
? 'defaultValue(' . $value . ')' : 'defaultValue(' . VarDumper::export((string)$value) . ')';
462+
$this->rawParts['default'] = $expectInteger ? $value : VarDumper::export((string)$value);
470463
}
471464
}
472465

src/lib/migrations/MigrationRecordBuilder.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public function addColumn(string $tableAlias, ColumnSchema $column, ?string $pos
8888
if (is_string($column->xDbType) && !empty($column->xDbType)) {
8989
$converter = $this->columnToCode($tableAlias, $column, false, false, false, false, $position);
9090
$name = static::quote($column->name);
91-
return sprintf(self::ADD_COLUMN_RAW, $tableAlias, $name, $converter->getCode());
91+
return sprintf(self::ADD_COLUMN_RAW, $tableAlias, $name, ColumnToCode::escapeQuotes($converter->getCode()));
9292
}
9393

9494
$converter = $this->columnToCode($tableAlias, $column, false, false, false, false, $position);
@@ -103,7 +103,7 @@ public function addDbColumn(string $tableAlias, ColumnSchema $column, ?string $p
103103
if (property_exists($column, 'xDbType') && is_string($column->xDbType) && !empty($column->xDbType)) {
104104
$converter = $this->columnToCode($tableAlias, $column, true, false, false, false, $position);
105105
$name = static::quote($column->name);
106-
return sprintf(self::ADD_COLUMN_RAW, $tableAlias, $column->name, $converter->getCode());
106+
return sprintf(self::ADD_COLUMN_RAW, $tableAlias, $column->name, ColumnToCode::escapeQuotes($converter->getCode()));
107107
}
108108
$converter = $this->columnToCode($tableAlias, $column, true, false, false, false, $position);
109109
return sprintf(self::ADD_COLUMN, $tableAlias, $column->name, $converter->getCode(true));
@@ -120,7 +120,7 @@ public function alterColumn(string $tableAlias, ColumnSchema $column):string
120120
ApiGenerator::isPostgres() ? self::ALTER_COLUMN_RAW_PGSQL : self::ALTER_COLUMN_RAW,
121121
$tableAlias,
122122
$column->name,
123-
$converter->getCode()
123+
ColumnToCode::escapeQuotes($converter->getCode())
124124
);
125125
}
126126
$converter = $this->columnToCode($tableAlias, $column, true);
@@ -340,7 +340,7 @@ public static function makeString(array $codeColumns): string
340340
}
341341
}
342342

343-
$codeColumns = str_replace([PHP_EOL, "\\\'"], [PHP_EOL . self::INDENT.' ', "'"], $finalStr);
343+
$codeColumns = str_replace([PHP_EOL], [PHP_EOL . self::INDENT.' '], $finalStr);
344344
$codeColumns = trim($codeColumns);
345345
$codeColumns = '['.PHP_EOL.self::INDENT.' '.$codeColumns.PHP_EOL . self::INDENT.']';
346346
return $codeColumns;

tests/specs/blog/migrations/m200000_000001_create_table_users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function up()
1212
'username' => $this->string(200)->notNull(),
1313
'email' => $this->string(200)->notNull(),
1414
'password' => $this->string()->notNull(),
15-
'role' => $this->string(20)->null()->defaultValue("reader"),
15+
'role' => $this->string(20)->null()->defaultValue('reader'),
1616
'flags' => $this->integer()->null()->defaultValue(0),
1717
'created_at' => $this->timestamp()->null()->defaultExpression("(CURRENT_TIMESTAMP)"),
1818
]);

tests/specs/blog/migrations_maria_db/m200000_000001_create_table_users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function up()
1212
'username' => $this->string(200)->notNull(),
1313
'email' => $this->string(200)->notNull(),
1414
'password' => $this->string()->notNull(),
15-
'role' => $this->string(20)->null()->defaultValue("reader"),
15+
'role' => $this->string(20)->null()->defaultValue('reader'),
1616
'flags' => $this->integer()->null()->defaultValue(0),
1717
'created_at' => $this->timestamp()->null()->defaultExpression("(CURRENT_TIMESTAMP)"),
1818
]);

tests/specs/blog/migrations_mysql_db/m200000_000001_create_table_users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function up()
1212
'username' => $this->string(200)->notNull(),
1313
'email' => $this->string(200)->notNull(),
1414
'password' => $this->string()->notNull(),
15-
'role' => $this->string(20)->null()->defaultValue("reader"),
15+
'role' => $this->string(20)->null()->defaultValue('reader'),
1616
'flags' => $this->integer()->null()->defaultValue(0),
1717
'created_at' => $this->timestamp()->null()->defaultExpression("(CURRENT_TIMESTAMP)"),
1818
]);

tests/specs/blog/migrations_pgsql_db/m200000_000001_create_table_users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function safeUp()
1212
'username' => $this->string(200)->notNull(),
1313
'email' => $this->string(200)->notNull(),
1414
'password' => $this->string()->notNull(),
15-
'role' => $this->string(20)->null()->defaultValue("reader"),
15+
'role' => $this->string(20)->null()->defaultValue('reader'),
1616
'flags' => $this->integer()->null()->defaultValue(0),
1717
'created_at' => $this->timestamp()->null()->defaultExpression("(CURRENT_TIMESTAMP)"),
1818
]);

tests/specs/blog_v2/migrations/m200000_000005_create_table_v2_comments.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function up()
1212
'post_id' => $this->bigInteger()->notNull(),
1313
'user_id' => $this->bigInteger()->null()->defaultValue(null),
1414
'message' => $this->text()->notNull(),
15-
'meta_data' => $this->string(300)->null()->defaultValue(""),
15+
'meta_data' => $this->string(300)->null()->defaultValue(''),
1616
'created_at' => $this->timestamp()->notNull(),
1717
]);
1818
$this->addForeignKey('fk_v2_comments_post_id_v2_posts_id', '{{%v2_comments}}', 'post_id', '{{%v2_posts}}', 'id');

tests/specs/blog_v2/migrations_maria_db/m200000_000004_change_table_v2_users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function down()
2323
$this->dropIndex('v2_users_login_key', '{{%v2_users}}');
2424
$this->createIndex('v2_users_username_key', '{{%v2_users}}', 'username', true);
2525
$this->alterColumn('{{%v2_users}}', 'created_at', $this->timestamp()->null()->defaultExpression("current_timestamp()"));
26-
$this->alterColumn('{{%v2_users}}', 'role', $this->string(20)->null()->defaultValue("reader"));
26+
$this->alterColumn('{{%v2_users}}', 'role', $this->string(20)->null()->defaultValue('reader'));
2727
$this->alterColumn('{{%v2_users}}', 'email', $this->string(200)->notNull());
2828
$this->addColumn('{{%v2_users}}', 'username', $this->string(200)->notNull());
2929
$this->dropColumn('{{%v2_users}}', 'login');

tests/specs/blog_v2/migrations_maria_db/m200000_000005_change_table_v2_comments.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function up()
1212
$this->addColumn('{{%v2_comments}}', 'user_id', $this->bigInteger()->null()->defaultValue(null)->after('post_id'));
1313
$this->dropColumn('{{%v2_comments}}', 'author_id');
1414
$this->alterColumn('{{%v2_comments}}', 'message', $this->text()->notNull());
15-
$this->alterColumn('{{%v2_comments}}', 'meta_data', $this->string(300)->null()->defaultValue(""));
15+
$this->alterColumn('{{%v2_comments}}', 'meta_data', $this->string(300)->null()->defaultValue(''));
1616
$this->alterColumn('{{%v2_comments}}', 'created_at', $this->timestamp()->notNull());
1717
$this->addForeignKey('fk_v2_comments_post_id_v2_posts_id', '{{%v2_comments}}', 'post_id', '{{%v2_posts}}', 'id');
1818
$this->addForeignKey('fk_v2_comments_user_id_v2_users_id', '{{%v2_comments}}', 'user_id', '{{%v2_users}}', 'id');

tests/specs/blog_v2/migrations_mysql_db/m200000_000004_change_table_v2_users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function down()
2323
$this->dropIndex('v2_users_login_key', '{{%v2_users}}');
2424
$this->createIndex('v2_users_username_key', '{{%v2_users}}', 'username', true);
2525
$this->alterColumn('{{%v2_users}}', 'created_at', $this->timestamp()->null()->defaultExpression("CURRENT_TIMESTAMP"));
26-
$this->alterColumn('{{%v2_users}}', 'role', $this->string(20)->null()->defaultValue("reader"));
26+
$this->alterColumn('{{%v2_users}}', 'role', $this->string(20)->null()->defaultValue('reader'));
2727
$this->alterColumn('{{%v2_users}}', 'email', $this->string(200)->notNull());
2828
$this->addColumn('{{%v2_users}}', 'username', $this->string(200)->notNull());
2929
$this->dropColumn('{{%v2_users}}', 'login');

tests/specs/blog_v2/migrations_mysql_db/m200000_000005_change_table_v2_comments.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function up()
1212
$this->addColumn('{{%v2_comments}}', 'user_id', $this->bigInteger()->null()->defaultValue(null)->after('post_id'));
1313
$this->dropColumn('{{%v2_comments}}', 'author_id');
1414
$this->alterColumn('{{%v2_comments}}', 'message', $this->text()->notNull());
15-
$this->alterColumn('{{%v2_comments}}', 'meta_data', $this->string(300)->null()->defaultValue(""));
15+
$this->alterColumn('{{%v2_comments}}', 'meta_data', $this->string(300)->null()->defaultValue(''));
1616
$this->alterColumn('{{%v2_comments}}', 'created_at', $this->timestamp()->notNull());
1717
$this->addForeignKey('fk_v2_comments_post_id_v2_posts_id', '{{%v2_comments}}', 'post_id', '{{%v2_posts}}', 'id');
1818
$this->addForeignKey('fk_v2_comments_user_id_v2_users_id', '{{%v2_comments}}', 'user_id', '{{%v2_users}}', 'id');

tests/specs/enum/new_column/maria/app/migrations_maria_db/m200000_000001_change_table_newcolumns.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class m200000_000001_change_table_newcolumns extends \yii\db\Migration
77
{
88
public function up()
99
{
10-
$this->addColumn('{{%newcolumns}}', 'new_column', 'enum("ONE", "TWO", "THREE") NOT NULL DEFAULT \'ONE\'');
10+
$this->addColumn('{{%newcolumns}}', 'new_column', 'enum("ONE", "TWO", "THREE") NOT NULL DEFAULT \'ONE\' AFTER id');
1111
$this->db->createCommand('ALTER TABLE {{%newcolumns}} ADD COLUMN new_column_x varchar(10) NOT NULL DEFAULT \'ONE\'')->execute();
1212
$this->dropColumn('{{%newcolumns}}', 'delete_col');
1313
}

tests/specs/enum/new_column/pgsql/app/migrations_pgsql_db/m200000_000001_change_table_newcolumns.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public function safeUp()
99
{
1010
$this->execute('CREATE TYPE "enum_itt_newcolumns_new_column" AS ENUM(\'ONE\', \'TWO\', \'THREE\')');
1111
$this->addColumn('{{%newcolumns}}', 'new_column', '"enum_itt_newcolumns_new_column" NOT NULL DEFAULT \'ONE\'');
12-
$this->db->createCommand('ALTER TABLE {{%newcolumns}} ADD COLUMN new_column_x varchar(10) NOT NULL DEFAULT \'ONE\' AFTER id')->execute();
12+
$this->db->createCommand('ALTER TABLE {{%newcolumns}} ADD COLUMN "new_column_x" varchar(10) NOT NULL DEFAULT \'ONE\'')->execute();
1313
$this->dropColumn('{{%newcolumns}}', 'delete_col');
1414
$this->execute('DROP TYPE "enum_itt_newcolumns_delete_col"');
1515
}

tests/specs/x_db_default_expression/maria/edit/app/migrations_maria_db/m200000_000000_change_table_fruits.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ class m200000_000000_change_table_fruits extends \yii\db\Migration
88
public function up()
99
{
1010
$this->alterColumn('{{%fruits}}', 'ts', $this->timestamp()->null()->defaultExpression("(CURRENT_TIMESTAMP)"));
11-
$this->alterColumn('{{%fruits}}', 'ts2', $this->timestamp()->null()->defaultValue("2011-11-11 00:00:00"));
12-
$this->alterColumn('{{%fruits}}', 'ts3', $this->timestamp()->null()->defaultValue("2022-11-11 00:00:00"));
13-
$this->alterColumn('{{%fruits}}', 'ts4', $this->timestamp()->null()->defaultValue("2022-11-11 00:00:00"));
11+
$this->alterColumn('{{%fruits}}', 'ts2', $this->timestamp()->null()->defaultValue('2011-11-11 00:00:00'));
12+
$this->alterColumn('{{%fruits}}', 'ts3', $this->timestamp()->null()->defaultValue('2022-11-11 00:00:00'));
13+
$this->alterColumn('{{%fruits}}', 'ts4', $this->timestamp()->null()->defaultValue('2022-11-11 00:00:00'));
1414
$this->alterColumn('{{%fruits}}', 'ts5', $this->timestamp()->null()->defaultExpression("(CURRENT_TIMESTAMP)"));
15-
$this->alterColumn('{{%fruits}}', 'ts6', $this->timestamp()->null()->defaultValue("2000-11-11 00:00:00"));
15+
$this->alterColumn('{{%fruits}}', 'ts6', $this->timestamp()->null()->defaultValue('2000-11-11 00:00:00'));
1616
$this->alterColumn('{{%fruits}}', 'd', $this->date()->null()->defaultExpression("(CURRENT_DATE + INTERVAL 1 YEAR)"));
1717
$this->alterColumn('{{%fruits}}', 'd2', $this->text()->null()->defaultExpression("(CURRENT_DATE + INTERVAL 1 YEAR)"));
18-
$this->alterColumn('{{%fruits}}', 'd3', $this->text()->null()->defaultValue("text default"));
18+
$this->alterColumn('{{%fruits}}', 'd3', $this->text()->null()->defaultValue('text default'));
1919
$this->alterColumn('{{%fruits}}', 'ts7', $this->date()->null()->defaultExpression("(CURRENT_DATE + INTERVAL 1 YEAR)"));
2020
}
2121

@@ -25,8 +25,8 @@ public function down()
2525
$this->alterColumn('{{%fruits}}', 'd3', $this->text()->null()->defaultValue(null));
2626
$this->alterColumn('{{%fruits}}', 'd2', $this->text()->null()->defaultValue(null));
2727
$this->alterColumn('{{%fruits}}', 'd', $this->date()->null()->defaultValue(null));
28-
$this->alterColumn('{{%fruits}}', 'ts6', $this->timestamp()->notNull()->defaultValue("0000-00-00 00:00:00"));
29-
$this->alterColumn('{{%fruits}}', 'ts5', $this->timestamp()->notNull()->defaultValue("0000-00-00 00:00:00"));
28+
$this->alterColumn('{{%fruits}}', 'ts6', $this->timestamp()->notNull()->defaultValue('0000-00-00 00:00:00'));
29+
$this->alterColumn('{{%fruits}}', 'ts5', $this->timestamp()->notNull()->defaultValue('0000-00-00 00:00:00'));
3030
$this->alterColumn('{{%fruits}}', 'ts4', $this->timestamp()->notNull()->defaultExpression("current_timestamp()"));
3131
$this->alterColumn('{{%fruits}}', 'ts3', $this->datetime()->null()->defaultValue(null));
3232
$this->alterColumn('{{%fruits}}', 'ts2', $this->datetime()->null()->defaultValue(null));

0 commit comments

Comments
 (0)