18
18
use Yiisoft \Db \Exception \NotSupportedException ;
19
19
use Yiisoft \Db \Expression \Expression ;
20
20
use Yiisoft \Db \Helper \DbArrayHelper ;
21
- use Yiisoft \Db \Pgsql \Column \ArrayColumnSchema ;
22
21
use Yiisoft \Db \Pgsql \Column \ColumnFactory ;
23
22
use Yiisoft \Db \Pgsql \Column \SequenceColumnSchemaInterface ;
24
23
use Yiisoft \Db \Schema \Builder \ColumnInterface ;
44
43
* Implements the PostgreSQL Server specific schema, supporting PostgreSQL Server version 9.6 and above.
45
44
*
46
45
* @psalm-type ColumnArray = array{
47
- * table_schema: string,
48
- * table_name: string,
49
46
* column_name: string,
50
47
* data_type: string,
51
48
* type_type: string|null,
60
57
* size: int|string|null,
61
58
* scale: int|string|null,
62
59
* contype: string|null,
63
- * dimension: int|string
60
+ * dimension: int|string,
61
+ * schema: string,
62
+ * table: string
64
63
* }
65
64
* @psalm-type ConstraintArray = array<
66
65
* array-key,
@@ -621,8 +620,6 @@ protected function findColumns(TableSchemaInterface $table): bool
621
620
622
621
$ sql = <<<SQL
623
622
SELECT
624
- d.nspname AS table_schema,
625
- c.relname AS table_name,
626
623
a.attname AS column_name,
627
624
COALESCE(td.typname, tb.typname, t.typname) AS data_type,
628
625
COALESCE(td.typtype, tb.typtype, t.typtype) AS type_type,
@@ -687,9 +684,12 @@ protected function findColumns(TableSchemaInterface $table): bool
687
684
a.attnum;
688
685
SQL ;
689
686
687
+ $ schemaName = $ table ->getSchemaName ();
688
+ $ tableName = $ table ->getName ();
689
+
690
690
$ columns = $ this ->db ->createCommand ($ sql , [
691
- ':schemaName ' => $ table -> getSchemaName () ,
692
- ':tableName ' => $ table -> getName () ,
691
+ ':schemaName ' => $ schemaName ,
692
+ ':tableName ' => $ tableName ,
693
693
])->queryAll ();
694
694
695
695
if (empty ($ columns )) {
@@ -698,9 +698,12 @@ protected function findColumns(TableSchemaInterface $table): bool
698
698
699
699
/** @psalm-var ColumnArray $info */
700
700
foreach ($ columns as $ info ) {
701
- /** @psalm-var ColumnArray $info */
702
701
$ info = array_change_key_case ($ info );
703
702
703
+ $ info ['schema ' ] = $ schemaName ;
704
+ $ info ['table ' ] = $ tableName ;
705
+
706
+ /** @psalm-var ColumnArray $info */
704
707
$ column = $ this ->loadColumnSchema ($ info );
705
708
706
709
$ table ->column ($ info ['column_name ' ], $ column );
@@ -733,40 +736,43 @@ private function loadColumnSchema(array $info): ColumnSchemaInterface
733
736
$ dbType = $ info ['type_scheme ' ] . '. ' . $ dbType ;
734
737
}
735
738
736
- $ columns = [];
739
+ $ columnInfo = [
740
+ 'autoIncrement ' => (bool ) $ info ['is_autoinc ' ],
741
+ 'comment ' => $ info ['column_comment ' ],
742
+ 'dbType ' => $ dbType ,
743
+ 'enumValues ' => $ info ['enum_values ' ] !== null
744
+ ? explode (', ' , str_replace (["'' " ], ["' " ], $ info ['enum_values ' ]))
745
+ : null ,
746
+ 'name ' => $ info ['column_name ' ],
747
+ 'notNull ' => !$ info ['is_nullable ' ],
748
+ 'primaryKey ' => $ info ['contype ' ] === 'p ' ,
749
+ 'scale ' => $ info ['scale ' ] !== null ? (int ) $ info ['scale ' ] : null ,
750
+ 'schema ' => $ info ['schema ' ],
751
+ 'size ' => $ info ['size ' ] !== null ? (int ) $ info ['size ' ] : null ,
752
+ 'table ' => $ info ['table ' ],
753
+ 'unique ' => $ info ['contype ' ] === 'u ' ,
754
+ ];
737
755
738
756
if ($ info ['type_type ' ] === 'c ' ) {
739
757
$ structured = $ this ->resolveTableName ($ dbType );
740
758
741
759
if ($ this ->findColumns ($ structured )) {
742
- $ columns = $ structured ->getColumns ();
760
+ $ columnInfo [ ' columns ' ] = $ structured ->getColumns ();
743
761
}
744
762
745
- /** @psalm-suppress ArgumentTypeCoercion */
746
- $ column = $ columnFactory
747
- ->fromType (ColumnType::STRUCTURED , [
748
- 'columns ' => $ columns ,
749
- 'dbType ' => $ dbType ,
750
- 'dimension ' => (int ) $ info ['dimension ' ],
751
- ]);
763
+ $ column = $ columnFactory ->fromType (ColumnType::STRUCTURED , $ columnInfo );
752
764
} else {
753
- /** @psalm-suppress ArgumentTypeCoercion */
754
- $ column = $ columnFactory
755
- ->fromDbType ($ dbType , ['dimension ' => (int ) $ info ['dimension ' ]]);
765
+ $ column = $ columnFactory ->fromDbType ($ dbType , $ columnInfo );
756
766
}
757
767
758
- /** @psalm-suppress DeprecatedMethod */
759
- $ column ->name ($ info ['column_name ' ]);
760
- $ column ->notNull (!$ info ['is_nullable ' ]);
761
- $ column ->autoIncrement ((bool ) $ info ['is_autoinc ' ]);
762
- $ column ->comment ($ info ['column_comment ' ]);
763
- $ column ->enumValues ($ info ['enum_values ' ] !== null
764
- ? explode (', ' , str_replace (["'' " ], ["' " ], $ info ['enum_values ' ]))
765
- : null );
766
- $ column ->primaryKey ($ info ['contype ' ] === 'p ' );
767
- $ column ->unique ($ info ['contype ' ] === 'u ' );
768
- $ column ->scale ($ info ['scale ' ] !== null ? (int ) $ info ['scale ' ] : null );
769
- $ column ->size ($ info ['size ' ] !== null ? (int ) $ info ['size ' ] : null );
768
+ $ dimension = (int ) $ info ['dimension ' ];
769
+
770
+ if ($ dimension > 0 ) {
771
+ $ columnInfo ['column ' ] = $ column ;
772
+ $ columnInfo ['dimension ' ] = $ dimension ;
773
+
774
+ $ column = $ columnFactory ->fromType (ColumnType::ARRAY , $ columnInfo );
775
+ }
770
776
771
777
/**
772
778
* pg_get_serial_sequence() doesn't track DEFAULT value change.
@@ -783,12 +789,6 @@ private function loadColumnSchema(array $info): ColumnSchemaInterface
783
789
} elseif ($ info ['sequence_name ' ] !== null ) {
784
790
$ column ->sequenceName ($ this ->resolveTableName ($ info ['sequence_name ' ])->getFullName ());
785
791
}
786
- } elseif ($ column instanceof ArrayColumnSchema) {
787
- /** @var ColumnSchemaInterface $arrayColumn */
788
- $ arrayColumn = $ column ->getColumn ();
789
- $ arrayColumn ->enumValues ($ column ->getEnumValues ());
790
- $ arrayColumn ->scale ($ column ->getScale ());
791
- $ arrayColumn ->size ($ column ->getSize ());
792
792
}
793
793
794
794
$ column ->defaultValue ($ this ->normalizeDefaultValue ($ defaultValue , $ column ));
@@ -799,7 +799,9 @@ private function loadColumnSchema(array $info): ColumnSchemaInterface
799
799
800
800
if (is_array ($ defaultValue )) {
801
801
foreach ($ column ->getColumns () as $ structuredColumnName => $ structuredColumn ) {
802
- $ structuredColumn ->defaultValue ($ defaultValue [$ structuredColumnName ] ?? null );
802
+ if (isset ($ defaultValue [$ structuredColumnName ])) {
803
+ $ structuredColumn ->defaultValue ($ defaultValue [$ structuredColumnName ]);
804
+ }
803
805
}
804
806
}
805
807
}
0 commit comments