Skip to content

Commit b6e3242

Browse files
committed
fix(database): prepend backslash when creating enum columns
1 parent 1b06332 commit b6e3242

File tree

5 files changed

+82
-0
lines changed

5 files changed

+82
-0
lines changed

packages/database/src/QueryStatements/CreateEnumTypeStatement.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public function compile(DatabaseDialect $dialect): string
2323
{
2424
$cases = arr($this->enumClass::cases())
2525
->map(fn (UnitEnum|BackedEnum $case) => ($case instanceof BackedEnum) ? $case->value : $case->name)
26+
->map(fn (string $value) => str_replace('\\', '\\\\', $value))
2627
->map(fn (string $value) => "'{$value}'");
2728

2829
return match ($dialect) {

packages/database/src/QueryStatements/EnumStatement.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public function compile(DatabaseDialect $dialect): string
2626
{
2727
$cases = arr($this->enumClass::cases())
2828
->map(fn (UnitEnum|BackedEnum $case) => ($case instanceof BackedEnum) ? $case->value : $case->name)
29+
->map(fn (string $value) => str_replace('\\', '\\\\', $value))
2930
->map(fn (string $value) => "'{$value}'");
3031

3132
if ($this->default !== null) {

tests/Integration/Database/Fixtures/EnumForCreateTable.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ enum EnumForCreateTable: string
66
{
77
case FOO = 'foo';
88
case BAR = 'bar';
9+
case SELF = self::class;
910
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\Database\QueryStatements;
4+
5+
use Tempest\Database\Config\DatabaseDialect;
6+
use Tempest\Database\QueryStatements\CreateEnumTypeStatement;
7+
use Tests\Tempest\Integration\Database\Fixtures\EnumForCreateTable;
8+
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
9+
10+
class CreateEnumTypeStatementTest extends FrameworkIntegrationTestCase
11+
{
12+
public function test_it_can_compile_create_enum_type_statement(): void
13+
{
14+
$enumStatement = new CreateEnumTypeStatement(
15+
enumClass: EnumForCreateTable::class,
16+
);
17+
18+
$this->assertSame(
19+
<<<SQL
20+
DO $$ BEGIN
21+
CREATE TYPE Tests\Tempest\Integration\Database\Fixtures\EnumForCreateTable AS ('foo', 'bar', 'Tests\\\\Tempest\\\\Integration\\\\Database\\\\Fixtures\\\\EnumForCreateTable');
22+
EXCEPTION
23+
WHEN duplicate_object THEN null;
24+
END $$;
25+
SQL,
26+
$enumStatement->compile(DatabaseDialect::POSTGRESQL),
27+
);
28+
}
29+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\Database\QueryStatements;
4+
5+
use Tempest\Database\Config\DatabaseDialect;
6+
use Tempest\Database\QueryStatements\EnumStatement;
7+
use Tests\Tempest\Integration\Database\Fixtures\EnumForCreateTable;
8+
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
9+
10+
class EnumStatementTest extends FrameworkIntegrationTestCase
11+
{
12+
public function test_it_can_compile_an_enum_statement_for_mysql(): void
13+
{
14+
$enumStatement = new EnumStatement(
15+
name: 'enum',
16+
enumClass: EnumForCreateTable::class,
17+
);
18+
19+
$this->assertSame(
20+
"`enum` ENUM('foo', 'bar', 'Tests\\\\Tempest\\\\Integration\\\\Database\\\\Fixtures\\\\EnumForCreateTable') NOT NULL",
21+
$enumStatement->compile(DatabaseDialect::MYSQL),
22+
);
23+
}
24+
25+
public function test_it_can_compile_an_enum_statement_for_sqlite(): void
26+
{
27+
$enumStatement = new EnumStatement(
28+
name: 'enum',
29+
enumClass: EnumForCreateTable::class,
30+
);
31+
32+
$this->assertSame(
33+
'`enum` TEXT NOT NULL',
34+
$enumStatement->compile(DatabaseDialect::SQLITE),
35+
);
36+
}
37+
38+
public function test_it_can_compile_an_enum_statement_for_postgresql(): void
39+
{
40+
$enumStatement = new EnumStatement(
41+
name: 'enum',
42+
enumClass: EnumForCreateTable::class,
43+
);
44+
45+
$this->assertSame(
46+
'`enum` Tests\Tempest\Integration\Database\Fixtures\EnumForCreateTable NOT NULL',
47+
$enumStatement->compile(DatabaseDialect::POSTGRESQL),
48+
);
49+
}
50+
}

0 commit comments

Comments
 (0)