diff --git a/src/Controllers/Import/SimulateDmlController.php b/src/Controllers/Import/SimulateDmlController.php index c43745797a..5b907db1b4 100644 --- a/src/Controllers/Import/SimulateDmlController.php +++ b/src/Controllers/Import/SimulateDmlController.php @@ -75,6 +75,12 @@ final class SimulateDmlController implements InvocableController private function process(Parser $parser): void { + if ($parser->errors !== []) { + $this->error = $parser->errors[0]->getMessage(); + + return; + } + foreach ($parser->statements as $statement) { if ( ! $statement instanceof UpdateStatement && ! $statement instanceof DeleteStatement diff --git a/tests/unit/Controllers/Import/SimulateDmlControllerTest.php b/tests/unit/Controllers/Import/SimulateDmlControllerTest.php index ba6af47423..d8f54d62ca 100644 --- a/tests/unit/Controllers/Import/SimulateDmlControllerTest.php +++ b/tests/unit/Controllers/Import/SimulateDmlControllerTest.php @@ -8,6 +8,7 @@ use PhpMyAdmin\Controllers\Import\SimulateDmlController; use PhpMyAdmin\Core; use PhpMyAdmin\Current; use PhpMyAdmin\Html\Generator; +use PhpMyAdmin\Http\Factory\ServerRequestFactory; use PhpMyAdmin\Import\SimulateDml; use PhpMyAdmin\SqlParser\Parser; use PhpMyAdmin\SqlParser\Statements\DeleteStatement; @@ -19,6 +20,7 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use function count; +use function json_decode; #[CoversClass(SimulateDmlController::class)] final class SimulateDmlControllerTest extends AbstractTestCase @@ -276,4 +278,31 @@ final class SimulateDmlControllerTest extends AbstractTestCase ], ]; } + + public function testStatementWithParsingError(): void + { + Current::$sqlQuery = 'UPDATE actor SET'; + + $request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/') + ->withParsedBody(['sql_delimiter' => ';']); + + $responseRenderer = new ResponseRenderer(); + $responseRenderer->setAjax(true); + $controller = new SimulateDmlController($responseRenderer, new SimulateDml($this->createDatabaseInterface())); + $response = $controller($request); + + $expectedMessage = <<<'HTML' + + + HTML; + + $body = (string) $response->getBody(); + self::assertJson($body); + self::assertSame( + ['message' => $expectedMessage, 'sql_data' => false, 'success' => true], + json_decode($body, true), + ); + } }