diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 627c9e28ec..ab56c124f9 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -68,6 +68,7 @@ Yii Framework 2 Change Log - Enh #11758: Implemented Dependency Injection Container configuration using Application configuration array (silverfire) - Enh: Added constants for specifying `yii\validators\CompareValidator::$type` (cebe) - Enh #12854: Added `RangeNotSatisfiableHttpException` to cover HTTP error 416 file request exceptions (zalatov) +- Enh #13122: Optimized query for information about foreign keys in `yii\db\oci` (zlakomanoff) 2.0.10 October 20, 2016 ----------------------- diff --git a/framework/db/oci/Schema.php b/framework/db/oci/Schema.php index 1f47207053..4231ba5518 100644 --- a/framework/db/oci/Schema.php +++ b/framework/db/oci/Schema.php @@ -121,17 +121,23 @@ class Schema extends \yii\db\Schema protected function findColumns($table) { $sql = <<db->createCommand($seq_name_sql, [':tableName' => $tableName])->queryScalar(); + $sequenceName = $this->db->createCommand($sequenceNameSql, [':tableName' => $tableName])->queryScalar(); return $sequenceName === false ? null : $sequenceName; } @@ -251,15 +259,23 @@ SQL; protected function findConstraints($table) { $sql = <<db->createCommand($sql, [ @@ -306,13 +322,12 @@ SQL; protected function findSchemaNames() { $sql = <<db->createCommand($sql)->queryColumn(); } @@ -324,20 +339,29 @@ SQL; { if ($schema === '') { $sql = <<db->createCommand($sql); } else { $sql = <<db->createCommand($sql, [':schema' => $schema]); } @@ -371,13 +395,16 @@ SQL; public function findUniqueIndexes($table) { $query = <<db->createCommand($query, [ diff --git a/tests/data/config.php b/tests/data/config.php index 8ba7b26ae0..107258621f 100644 --- a/tests/data/config.php +++ b/tests/data/config.php @@ -43,6 +43,12 @@ $config = [ 'password' => 'postgres', 'fixture' => __DIR__ . '/postgres.sql', ], + 'oci' => [ + 'dsn' => 'oci:dbname=LOCAL_XE;charset=AL32UTF8;', + 'username' => '', + 'password' => '', + 'fixture' => __DIR__ . '/oci.sql', + ], ], ]; diff --git a/tests/framework/db/QueryBuilderTest.php b/tests/framework/db/QueryBuilderTest.php index 719f3b15d8..a498ed35af 100644 --- a/tests/framework/db/QueryBuilderTest.php +++ b/tests/framework/db/QueryBuilderTest.php @@ -167,7 +167,6 @@ abstract class QueryBuilderTest extends DatabaseTestCase [ 'mysql' => 'char(1) CHECK (value LIKE "test%")', 'sqlite' => 'char(1) CHECK (value LIKE "test%")', - 'oci' => 'CHAR(1) CHECK (value LIKE "test%")', 'cubrid' => 'char(1) CHECK (value LIKE "test%")', ], ], @@ -188,7 +187,6 @@ abstract class QueryBuilderTest extends DatabaseTestCase [ 'mysql' => 'char(6) CHECK (value LIKE "test%")', 'sqlite' => 'char(6) CHECK (value LIKE "test%")', - 'oci' => 'CHAR(6) CHECK (value LIKE "test%")', 'cubrid' => 'char(6) CHECK (value LIKE "test%")', ], ], @@ -883,7 +881,6 @@ abstract class QueryBuilderTest extends DatabaseTestCase 'mysql' => 'timestamp NULL DEFAULT NULL', 'postgres' => 'timestamp(0) NULL DEFAULT NULL', 'sqlite' => 'timestamp NULL DEFAULT NULL', - 'oci' => 'TIMESTAMP NULL DEFAULT NULL', 'sqlsrv' => 'timestamp NULL DEFAULT NULL', 'cubrid' => 'timestamp NULL DEFAULT NULL', ], @@ -912,7 +909,6 @@ abstract class QueryBuilderTest extends DatabaseTestCase [ 'mysql' => "int(11) COMMENT 'test comment'", 'postgres' => 'integer', - 'oci' => "NUMBER(10)", 'sqlsrv' => 'int', 'cubrid' => "int COMMENT 'test comment'", ], @@ -923,7 +919,6 @@ abstract class QueryBuilderTest extends DatabaseTestCase [ 'mysql' => "int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'test comment'", 'postgres' => 'serial NOT NULL PRIMARY KEY', - 'oci' => 'NUMBER(10) NOT NULL PRIMARY KEY', 'sqlsrv' => 'int IDENTITY PRIMARY KEY', 'cubrid' => "int NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'test comment'", ], diff --git a/tests/framework/db/oci/ConnectionTest.php b/tests/framework/db/oci/ConnectionTest.php index d65b000fb3..b78c6c1789 100644 --- a/tests/framework/db/oci/ConnectionTest.php +++ b/tests/framework/db/oci/ConnectionTest.php @@ -9,4 +9,62 @@ namespace yiiunit\framework\db\oci; class ConnectionTest extends \yiiunit\framework\db\ConnectionTest { protected $driverName = 'oci'; + + public function testSerialize() + { + $connection = $this->getConnection(false, false); + $connection->open(); + $serialized = serialize($connection); + $unserialized = unserialize($serialized); + $this->assertInstanceOf('yii\db\Connection', $unserialized); + + $this->assertEquals(123, $unserialized->createCommand("SELECT 123 FROM DUAL")->queryScalar()); + } + + public function testQuoteTableName() + { + $connection = $this->getConnection(false); + $this->assertEquals('"table"', $connection->quoteTableName('table')); + $this->assertEquals('"table"', $connection->quoteTableName('"table"')); + $this->assertEquals('"schema"."table"', $connection->quoteTableName('schema.table')); + $this->assertEquals('"schema"."table"', $connection->quoteTableName('schema."table"')); + $this->assertEquals('"schema"."table"', $connection->quoteTableName('"schema"."table"')); + $this->assertEquals('{{table}}', $connection->quoteTableName('{{table}}')); + $this->assertEquals('(table)', $connection->quoteTableName('(table)')); + } + + public function testQuoteColumnName() + { + $connection = $this->getConnection(false); + $this->assertEquals('"column"', $connection->quoteColumnName('column')); + $this->assertEquals('"column"', $connection->quoteColumnName('"column"')); + $this->assertEquals('[[column]]', $connection->quoteColumnName('[[column]]')); + $this->assertEquals('{{column}}', $connection->quoteColumnName('{{column}}')); + $this->assertEquals('(column)', $connection->quoteColumnName('(column)')); + + $this->assertEquals('"column"', $connection->quoteSql('[[column]]')); + $this->assertEquals('"column"', $connection->quoteSql('{{column}}')); + } + + public function testQuoteFullColumnName() + { + $connection = $this->getConnection(false, false); + $this->assertEquals('"table"."column"', $connection->quoteColumnName('table.column')); + $this->assertEquals('"table"."column"', $connection->quoteColumnName('table."column"')); + $this->assertEquals('"table"."column"', $connection->quoteColumnName('"table".column')); + $this->assertEquals('"table"."column"', $connection->quoteColumnName('"table"."column"')); + + $this->assertEquals('[[table.column]]', $connection->quoteColumnName('[[table.column]]')); + $this->assertEquals('{{table}}."column"', $connection->quoteColumnName('{{table}}.column')); + $this->assertEquals('{{table}}."column"', $connection->quoteColumnName('{{table}}."column"')); + $this->assertEquals('{{table}}.[[column]]', $connection->quoteColumnName('{{table}}.[[column]]')); + $this->assertEquals('{{%table}}."column"', $connection->quoteColumnName('{{%table}}.column')); + $this->assertEquals('{{%table}}."column"', $connection->quoteColumnName('{{%table}}."column"')); + + $this->assertEquals('"table"."column"', $connection->quoteSql('[[table.column]]')); + $this->assertEquals('"table"."column"', $connection->quoteSql('{{table}}.[[column]]')); + $this->assertEquals('"table"."column"', $connection->quoteSql('{{table}}."column"')); + $this->assertEquals('"table"."column"', $connection->quoteSql('{{%table}}.[[column]]')); + $this->assertEquals('"table"."column"', $connection->quoteSql('{{%table}}."column"')); + } }