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
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 ||
strpos($exception->getMessage(), 'NOT NULL constraint failed') !== false
) {
......
......@@ -64,6 +64,9 @@ class AbstractSQLiteDriverTest extends AbstractDriverTest
[0, null, 'is not unique'],
[0, null, 'are not unique'],
],
self::EXCEPTION_FOREIGN_KEY_CONSTRAINT_VIOLATION => [
[0, null, 'FOREIGN KEY constraint failed'],
],
self::EXCEPTION_LOCK_WAIT_TIMEOUT => [
[0, null, 'database is locked'],
],
......
......@@ -78,7 +78,11 @@ class ExceptionTest extends DbalFunctionalTestCase
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.');
}
......@@ -112,7 +116,11 @@ class ExceptionTest extends DbalFunctionalTestCase
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.');
}
......@@ -146,7 +154,11 @@ class ExceptionTest extends DbalFunctionalTestCase
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.');
}
......@@ -182,7 +194,9 @@ class ExceptionTest extends DbalFunctionalTestCase
{
$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.');
}
......
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