Unverified Commit e26ed0d7 authored by Sergei Morozov's avatar Sergei Morozov Committed by GitHub

Merge pull request #3794 from BenMorel/sqlite-fk

Support ForeignKeyConstraintViolationException in SQLite
parents 644531f3 d729f7bb
...@@ -39,6 +39,10 @@ abstract class AbstractSQLiteDriver implements Driver, ExceptionConverterDriver ...@@ -39,6 +39,10 @@ abstract class AbstractSQLiteDriver implements Driver, ExceptionConverterDriver
return new Exception\UniqueConstraintViolationException($message, $exception); return new Exception\UniqueConstraintViolationException($message, $exception);
} }
if (strpos($exception->getMessage(), 'FOREIGN KEY constraint failed') !== false) {
return new Exception\ForeignKeyConstraintViolationException($message, $exception);
}
if (strpos($exception->getMessage(), 'may not be NULL') !== false || if (strpos($exception->getMessage(), 'may not be NULL') !== false ||
strpos($exception->getMessage(), 'NOT NULL constraint failed') !== false strpos($exception->getMessage(), 'NOT NULL constraint failed') !== false
) { ) {
......
...@@ -64,6 +64,9 @@ class AbstractSQLiteDriverTest extends AbstractDriverTest ...@@ -64,6 +64,9 @@ class AbstractSQLiteDriverTest extends AbstractDriverTest
[0, null, 'is not unique'], [0, null, 'is not unique'],
[0, null, 'are not unique'], [0, null, 'are not unique'],
], ],
self::EXCEPTION_FOREIGN_KEY_CONSTRAINT_VIOLATION => [
[0, null, 'FOREIGN KEY constraint failed'],
],
self::EXCEPTION_LOCK_WAIT_TIMEOUT => [ self::EXCEPTION_LOCK_WAIT_TIMEOUT => [
[0, null, 'database is locked'], [0, null, 'database is locked'],
], ],
......
...@@ -78,7 +78,11 @@ class ExceptionTest extends DbalFunctionalTestCase ...@@ -78,7 +78,11 @@ class ExceptionTest extends DbalFunctionalTestCase
public function testForeignKeyConstraintViolationExceptionOnInsert() : void public function testForeignKeyConstraintViolationExceptionOnInsert() : void
{ {
if (! $this->connection->getDatabasePlatform()->supportsForeignKeyConstraints()) { $platform = $this->connection->getDatabasePlatform();
if ($platform instanceof SqlitePlatform) {
$this->connection->exec('PRAGMA foreign_keys = ON');
} elseif (! $platform->supportsForeignKeyConstraints()) {
$this->markTestSkipped('Only fails on platforms with foreign key constraints.'); $this->markTestSkipped('Only fails on platforms with foreign key constraints.');
} }
...@@ -112,7 +116,11 @@ class ExceptionTest extends DbalFunctionalTestCase ...@@ -112,7 +116,11 @@ class ExceptionTest extends DbalFunctionalTestCase
public function testForeignKeyConstraintViolationExceptionOnUpdate() : void public function testForeignKeyConstraintViolationExceptionOnUpdate() : void
{ {
if (! $this->connection->getDatabasePlatform()->supportsForeignKeyConstraints()) { $platform = $this->connection->getDatabasePlatform();
if ($platform instanceof SqlitePlatform) {
$this->connection->exec('PRAGMA foreign_keys = ON');
} elseif (! $platform->supportsForeignKeyConstraints()) {
$this->markTestSkipped('Only fails on platforms with foreign key constraints.'); $this->markTestSkipped('Only fails on platforms with foreign key constraints.');
} }
...@@ -146,7 +154,11 @@ class ExceptionTest extends DbalFunctionalTestCase ...@@ -146,7 +154,11 @@ class ExceptionTest extends DbalFunctionalTestCase
public function testForeignKeyConstraintViolationExceptionOnDelete() : void public function testForeignKeyConstraintViolationExceptionOnDelete() : void
{ {
if (! $this->connection->getDatabasePlatform()->supportsForeignKeyConstraints()) { $platform = $this->connection->getDatabasePlatform();
if ($platform instanceof SqlitePlatform) {
$this->connection->exec('PRAGMA foreign_keys = ON');
} elseif (! $platform->supportsForeignKeyConstraints()) {
$this->markTestSkipped('Only fails on platforms with foreign key constraints.'); $this->markTestSkipped('Only fails on platforms with foreign key constraints.');
} }
...@@ -182,7 +194,9 @@ class ExceptionTest extends DbalFunctionalTestCase ...@@ -182,7 +194,9 @@ class ExceptionTest extends DbalFunctionalTestCase
{ {
$platform = $this->connection->getDatabasePlatform(); $platform = $this->connection->getDatabasePlatform();
if (! $platform->supportsForeignKeyConstraints()) { if ($platform instanceof SqlitePlatform) {
$this->connection->exec('PRAGMA foreign_keys = ON');
} elseif (! $platform->supportsForeignKeyConstraints()) {
$this->markTestSkipped('Only fails on platforms with foreign key constraints.'); $this->markTestSkipped('Only fails on platforms with foreign key constraints.');
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment