diff --git a/packages/database/src/QueryStatements/InsertStatement.php b/packages/database/src/QueryStatements/InsertStatement.php index 803d4acc9..8b95d0c6f 100644 --- a/packages/database/src/QueryStatements/InsertStatement.php +++ b/packages/database/src/QueryStatements/InsertStatement.php @@ -46,12 +46,19 @@ public function compile(DatabaseDialect $dialect): string }) ->implode(', '); - $sql = sprintf( - 'INSERT INTO %s (%s) VALUES %s', - $this->table, - $columns->map(fn (string $column) => "`{$column}`")->implode(', '), - $entryPlaceholders, - ); + if ($columns->isEmpty()) { + $sql = match ($dialect) { + DatabaseDialect::MYSQL => sprintf('INSERT INTO %s () VALUES ()', $this->table), + default => sprintf('INSERT INTO %s DEFAULT VALUES', $this->table), + }; + } else { + $sql = sprintf( + 'INSERT INTO %s (%s) VALUES %s', + $this->table, + $columns->map(fn (string $column) => "`{$column}`")->implode(', '), + $entryPlaceholders, + ); + } if ($dialect === DatabaseDialect::POSTGRESQL) { $sql .= ' RETURNING *'; diff --git a/packages/database/tests/QueryStatements/InsertStatementTest.php b/packages/database/tests/QueryStatements/InsertStatementTest.php index b8050f864..7c8789822 100644 --- a/packages/database/tests/QueryStatements/InsertStatementTest.php +++ b/packages/database/tests/QueryStatements/InsertStatementTest.php @@ -31,6 +31,16 @@ public function test_insert_statement(): void $this->assertSame($expectedPostgres, $statement->compile(DatabaseDialect::POSTGRESQL)); } + public function test_insert_empty_row(): void + { + $tableDefinition = new TableDefinition('foo', 'bar'); + $statement = new InsertStatement($tableDefinition); + + $this->assertSame('INSERT INTO `foo` AS `bar` () VALUES ()', $statement->compile(DatabaseDialect::MYSQL)); + $this->assertSame('INSERT INTO `foo` AS `bar` DEFAULT VALUES', $statement->compile(DatabaseDialect::SQLITE)); + $this->assertSame('INSERT INTO `foo` AS `bar` DEFAULT VALUES RETURNING *', $statement->compile(DatabaseDialect::POSTGRESQL)); + } + public function test_exception_on_column_mismatch(): void { $tableDefinition = new TableDefinition('foo', 'bar');