Skip to content

Commit 16dfed0

Browse files
authored
Merge pull request #5981 from kenjis/feat-getFieldData-add-nullable-on-postgre
feat: `getFieldData()` returns nullable data on PostgreSQL
2 parents c740fbf + cca471a commit 16dfed0

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

system/Database/Postgre/Connection.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,9 @@ protected function _listColumns(string $table = ''): string
234234
*/
235235
protected function _fieldData(string $table): array
236236
{
237-
$sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default"
238-
FROM "information_schema"."columns"
239-
WHERE LOWER("table_name") = '
237+
$sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default", "is_nullable"
238+
FROM "information_schema"."columns"
239+
WHERE LOWER("table_name") = '
240240
. $this->escape(strtolower($table))
241241
. ' ORDER BY "ordinal_position"';
242242

@@ -252,6 +252,7 @@ protected function _fieldData(string $table): array
252252

253253
$retVal[$i]->name = $query[$i]->column_name;
254254
$retVal[$i]->type = $query[$i]->data_type;
255+
$retVal[$i]->nullable = $query[$i]->is_nullable === 'YES';
255256
$retVal[$i]->default = $query[$i]->column_default;
256257
$retVal[$i]->max_length = $query[$i]->character_maximum_length > 0 ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision;
257258
}

tests/system/Database/Live/ForgeTest.php

+16-4
Original file line numberDiff line numberDiff line change
@@ -835,31 +835,43 @@ public function testAddFields()
835835

836836
$this->assertNull($fieldsData[0]->default);
837837
$this->assertNull($fieldsData[1]->default);
838+
838839
$this->assertSame(1, (int) $fieldsData[0]->primary_key);
840+
839841
$this->assertSame(255, (int) $fieldsData[1]->max_length);
840842
} elseif ($this->db->DBDriver === 'Postgre') {
841843
$this->assertSame('integer', $fieldsData[0]->type);
842844
$this->assertSame('character varying', $fieldsData[1]->type);
845+
846+
$this->assertFalse($fieldsData[0]->nullable);
847+
$this->assertFalse($fieldsData[1]->nullable);
848+
843849
$this->assertSame(32, (int) $fieldsData[0]->max_length);
844-
$this->assertNull($fieldsData[1]->default);
845850
$this->assertSame(255, (int) $fieldsData[1]->max_length);
851+
852+
$this->assertNull($fieldsData[1]->default);
846853
} elseif ($this->db->DBDriver === 'SQLite3') {
847854
$this->assertSame('integer', strtolower($fieldsData[0]->type));
848855
$this->assertSame('varchar', strtolower($fieldsData[1]->type));
856+
849857
$this->assertNull($fieldsData[1]->default);
850858
} elseif ($this->db->DBDriver === 'SQLSRV') {
851859
$this->assertSame('int', $fieldsData[0]->type);
852-
$this->assertSame(10, (int) $fieldsData[0]->max_length);
853860
$this->assertSame('varchar', $fieldsData[1]->type);
854-
$this->assertNull($fieldsData[1]->default);
861+
862+
$this->assertSame(10, (int) $fieldsData[0]->max_length);
855863
$this->assertSame(255, (int) $fieldsData[1]->max_length);
864+
865+
$this->assertNull($fieldsData[1]->default);
856866
} elseif ($this->db->DBDriver === 'OCI8') {
857867
// Check types
858868
$this->assertSame('NUMBER', $fieldsData[0]->type);
859869
$this->assertSame('VARCHAR2', $fieldsData[1]->type);
870+
860871
$this->assertSame('11', $fieldsData[0]->max_length);
861-
$this->assertSame('', $fieldsData[1]->default);
862872
$this->assertSame('255', $fieldsData[1]->max_length);
873+
874+
$this->assertSame('', $fieldsData[1]->default);
863875
} else {
864876
$this->fail(sprintf('DB driver "%s" is not supported.', $this->db->DBDriver));
865877
}

0 commit comments

Comments
 (0)