Commit 1206eb56 authored by Steve Müller's avatar Steve Müller Committed by Marco Pivetta

fix foreign key constraint referential action NO ACTION and RESTRICT on Oracle

parent 167c4f42
......@@ -674,6 +674,44 @@ LEFT JOIN user_cons_columns r_cols
return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $foreignKey;
}
/**
* {@inheritdoc}
*/
public function getAdvancedForeignKeyOptionsSQL(ForeignKeyConstraint $foreignKey)
{
$referentialAction = null;
if ($foreignKey->hasOption('onDelete')) {
$referentialAction = $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onDelete'));
}
return $referentialAction ? ' ON DELETE ' . $referentialAction : '';
}
/**
* {@inheritdoc}
*/
public function getForeignKeyReferentialActionSQL($action)
{
$action = strtoupper($action);
switch ($action) {
case 'RESTRICT': // RESTRICT is not supported, therefore falling back to NO ACTION.
case 'NO ACTION':
// NO ACTION cannot be declared explicitly,
// therefore returning empty string to indicate to OMIT the referential clause.
return '';
case 'CASCADE':
case 'SET NULL':
return $action;
default:
// SET DEFAULT is not supported, throw exception instead.
throw new \InvalidArgumentException('Invalid foreign key action: ' . $action);
}
}
/**
* {@inheritDoc}
*/
......
......@@ -5,6 +5,7 @@ namespace Doctrine\Tests\DBAL\Platforms;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\Comparator;
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Types\Type;
......@@ -203,6 +204,47 @@ class OraclePlatformTest extends AbstractPlatformTestCase
return 'ALTER TABLE test ADD FOREIGN KEY (fk_name_id) REFERENCES other_table (id)';
}
/**
* @group DBAL-1097
*
* @dataProvider getGeneratesAdvancedForeignKeyOptionsSQLData
*/
public function testGeneratesAdvancedForeignKeyOptionsSQL(array $options, $expectedSql)
{
$foreignKey = new ForeignKeyConstraint(array('foo'), 'foreign_table', array('bar'), null, $options);
$this->assertSame($expectedSql, $this->_platform->getAdvancedForeignKeyOptionsSQL($foreignKey));
}
/**
* @return array
*/
public function getGeneratesAdvancedForeignKeyOptionsSQLData()
{
return array(
array(array(), ''),
array(array('onUpdate' => 'CASCADE'), ''),
array(array('onDelete' => 'CASCADE'), ' ON DELETE CASCADE'),
array(array('onDelete' => 'NO ACTION'), ''),
array(array('onDelete' => 'RESTRICT'), ''),
array(array('onUpdate' => 'SET NULL', 'onDelete' => 'SET NULL'), ' ON DELETE SET NULL'),
);
}
/**
* {@inheritdoc}
*/
public function getReturnsForeignKeyReferentialActionSQL()
{
return array(
array('CASCADE', 'CASCADE'),
array('SET NULL', 'SET NULL'),
array('NO ACTION', ''),
array('RESTRICT', ''),
array('CaScAdE', 'CASCADE'),
);
}
public function testModifyLimitQuery()
{
$sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0);
......
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