From ebc3c27e898714530bed3becf8a2d6b55e6b3268 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 26 Jan 2024 15:15:09 +0900 Subject: [PATCH 1/4] test: add test for OCI8 getFieldData() --- .../Database/Live/OCI8/GetFieldDataTest.php | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/system/Database/Live/OCI8/GetFieldDataTest.php diff --git a/tests/system/Database/Live/OCI8/GetFieldDataTest.php b/tests/system/Database/Live/OCI8/GetFieldDataTest.php new file mode 100644 index 000000000000..ac9bf1ed8ab9 --- /dev/null +++ b/tests/system/Database/Live/OCI8/GetFieldDataTest.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Live\OCI8; + +use CodeIgniter\Database\Live\AbstractGetFieldDataTest; +use Config\Database; + +/** + * @group DatabaseLive + * + * @internal + */ +final class GetFieldDataTest extends AbstractGetFieldDataTest +{ + protected function createForge(): void + { + if ($this->db->DBDriver !== 'OCI8') { + $this->markTestSkipped('This test is only for OCI8.'); + } + + $this->forge = Database::forge($this->db); + } + + public function testGetFieldData(): void + { + $fields = $this->db->getFieldData('test1'); + + $data = []; + + foreach ($fields as $obj) { + $data[$obj->name] = $obj; + } + + $idDefault = $data['id']->default; + $this->assertMatchesRegularExpression('/"ORACLE"."ISEQ\$\$_[0-9]+".nextval/', $idDefault); + + $this->assertJsonStringEqualsJsonString( + json_encode([ + (object) [ + 'name' => 'id', + 'type' => 'NUMBER', + 'max_length' => '11', + 'default' => $idDefault, // The default value is not defined. + // 'primary_key' => 1, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_not_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => null, // The default value is not defined. + // 'primary_key' => 0, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => null, // The default value is not defined. + // 'primary_key' => 0, + 'nullable' => true, + ], + (object) [ + 'name' => 'int_default_0', + 'type' => 'NUMBER', + 'max_length' => '11', + 'default' => '0 ', // int 0 + // 'primary_key' => 0, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_default_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => 'NULL ', // NULL value + // 'primary_key' => 0, + 'nullable' => true, + ], + (object) [ + 'name' => 'text_default_text_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => "'null' ", // string "null" + // 'primary_key' => 0, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_default_abc', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => "'abc' ", // string "abc" + // 'primary_key' => 0, + 'nullable' => false, + ], + ]), + json_encode($fields) + ); + } +} From eec7a88e5693b1eeb7ff54240b55303a637ff726 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 26 Jan 2024 15:16:03 +0900 Subject: [PATCH 2/4] fix: OCI8 getFieldData() returns incorrect `default` value --- system/Database/OCI8/Connection.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/system/Database/OCI8/Connection.php b/system/Database/OCI8/Connection.php index 8cb7e3a4a766..58c33536a41c 100644 --- a/system/Database/OCI8/Connection.php +++ b/system/Database/OCI8/Connection.php @@ -315,11 +315,7 @@ protected function _fieldData(string $table): array $retval[$i]->max_length = $length; - $default = $query[$i]->DATA_DEFAULT; - if ($default === null && $query[$i]->NULLABLE === 'N') { - $default = ''; - } - $retval[$i]->default = $default; + $retval[$i]->default = $query[$i]->DATA_DEFAULT; $retval[$i]->nullable = $query[$i]->NULLABLE === 'Y'; } From 61bff7e9a271137d2588baeea222b983772ba610 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 26 Jan 2024 15:45:22 +0900 Subject: [PATCH 3/4] test: update assertion --- tests/system/Database/Live/ForgeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/Database/Live/ForgeTest.php b/tests/system/Database/Live/ForgeTest.php index 626660ee7246..1cb5c6e4d41b 100644 --- a/tests/system/Database/Live/ForgeTest.php +++ b/tests/system/Database/Live/ForgeTest.php @@ -1058,7 +1058,7 @@ public function testAddFields(): void 'name' => 'username', 'type' => 'VARCHAR2', 'max_length' => '255', - 'default' => '', + 'default' => null, 'nullable' => false, ], 2 => [ From c12aa141bba417f7ef2e88a33f88a8a681771947 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 26 Jan 2024 16:37:36 +0900 Subject: [PATCH 4/4] test: sort field data --- .../Database/Live/OCI8/GetFieldDataTest.php | 127 +++++++++--------- 1 file changed, 66 insertions(+), 61 deletions(-) diff --git a/tests/system/Database/Live/OCI8/GetFieldDataTest.php b/tests/system/Database/Live/OCI8/GetFieldDataTest.php index ac9bf1ed8ab9..fcb585842a0d 100644 --- a/tests/system/Database/Live/OCI8/GetFieldDataTest.php +++ b/tests/system/Database/Live/OCI8/GetFieldDataTest.php @@ -45,66 +45,71 @@ public function testGetFieldData(): void $idDefault = $data['id']->default; $this->assertMatchesRegularExpression('/"ORACLE"."ISEQ\$\$_[0-9]+".nextval/', $idDefault); - $this->assertJsonStringEqualsJsonString( - json_encode([ - (object) [ - 'name' => 'id', - 'type' => 'NUMBER', - 'max_length' => '11', - 'default' => $idDefault, // The default value is not defined. - // 'primary_key' => 1, - 'nullable' => false, - ], - (object) [ - 'name' => 'text_not_null', - 'type' => 'VARCHAR2', - 'max_length' => '64', - 'default' => null, // The default value is not defined. - // 'primary_key' => 0, - 'nullable' => false, - ], - (object) [ - 'name' => 'text_null', - 'type' => 'VARCHAR2', - 'max_length' => '64', - 'default' => null, // The default value is not defined. - // 'primary_key' => 0, - 'nullable' => true, - ], - (object) [ - 'name' => 'int_default_0', - 'type' => 'NUMBER', - 'max_length' => '11', - 'default' => '0 ', // int 0 - // 'primary_key' => 0, - 'nullable' => false, - ], - (object) [ - 'name' => 'text_default_null', - 'type' => 'VARCHAR2', - 'max_length' => '64', - 'default' => 'NULL ', // NULL value - // 'primary_key' => 0, - 'nullable' => true, - ], - (object) [ - 'name' => 'text_default_text_null', - 'type' => 'VARCHAR2', - 'max_length' => '64', - 'default' => "'null' ", // string "null" - // 'primary_key' => 0, - 'nullable' => false, - ], - (object) [ - 'name' => 'text_default_abc', - 'type' => 'VARCHAR2', - 'max_length' => '64', - 'default' => "'abc' ", // string "abc" - // 'primary_key' => 0, - 'nullable' => false, - ], - ]), - json_encode($fields) - ); + $expected = json_decode(json_encode([ + (object) [ + 'name' => 'id', + 'type' => 'NUMBER', + 'max_length' => '11', + 'default' => $idDefault, // The default value is not defined. + // 'primary_key' => 1, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_not_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => null, // The default value is not defined. + // 'primary_key' => 0, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => null, // The default value is not defined. + // 'primary_key' => 0, + 'nullable' => true, + ], + (object) [ + 'name' => 'int_default_0', + 'type' => 'NUMBER', + 'max_length' => '11', + 'default' => '0 ', // int 0 + // 'primary_key' => 0, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_default_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => 'NULL ', // NULL value + // 'primary_key' => 0, + 'nullable' => true, + ], + (object) [ + 'name' => 'text_default_text_null', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => "'null' ", // string "null" + // 'primary_key' => 0, + 'nullable' => false, + ], + (object) [ + 'name' => 'text_default_abc', + 'type' => 'VARCHAR2', + 'max_length' => '64', + 'default' => "'abc' ", // string "abc" + // 'primary_key' => 0, + 'nullable' => false, + ], + ]), true); + $names = array_column($expected, 'name'); + array_multisort($names, SORT_ASC, $expected); + + $fields = json_decode(json_encode($fields), true); + $names = array_column($fields, 'name'); + array_multisort($names, SORT_ASC, $fields); + + $this->assertSame($expected, $fields); } }