@@ -93,72 +93,75 @@ class Forge extends BaseForge
9393 /**
9494 * ALTER TABLE
9595 *
96- * @param string $alterType ALTER type
97- * @param string $table Table name
98- * @param array|string $field Column definition
96+ * @param string $alterType ALTER type
97+ * @param string $table Table name
98+ * @param array|string $processedFields Processed column definitions
99+ * or column names to DROP
99100 *
100- * @return string|string[]
101+ * @return list<string>|string SQL string
102+ * @phpstan-return ($alterType is 'DROP' ? string : list<string>)
101103 */
102- protected function _alterTable (string $ alterType , string $ table , $ field )
104+ protected function _alterTable (string $ alterType , string $ table , $ processedFields )
103105 {
104106 $ sql = 'ALTER TABLE ' . $ this ->db ->escapeIdentifiers ($ table );
105107
106108 if ($ alterType === 'DROP ' ) {
107- $ fields = array_map (fn ($ field ) => $ this ->db ->escapeIdentifiers (trim ($ field )), is_string ($ field ) ? explode (', ' , $ field ) : $ field );
109+ $ fields = array_map (fn ($ field ) => $ this ->db ->escapeIdentifiers (trim ($ processedFields )), is_string ($ processedFields ) ? explode (', ' , $ processedFields ) : $ processedFields );
108110
109111 return $ sql . ' DROP ( ' . implode (', ' , $ fields ) . ') CASCADE CONSTRAINT INVALIDATE ' ;
110112 }
113+
111114 if ($ alterType === 'CHANGE ' ) {
112115 $ alterType = 'MODIFY ' ;
113116 }
114117
115118 $ nullableMap = array_column ($ this ->db ->getFieldData ($ table ), 'nullable ' , 'name ' );
116119 $ sqls = [];
117120
118- for ($ i = 0 , $ c = count ($ field ); $ i < $ c ; $ i ++) {
121+ for ($ i = 0 , $ c = count ($ processedFields ); $ i < $ c ; $ i ++) {
119122 if ($ alterType === 'MODIFY ' ) {
120123 // If a null constraint is added to a column with a null constraint,
121124 // ORA-01451 will occur,
122125 // so add null constraint is used only when it is different from the current null constraint.
123126 // If a not null constraint is added to a column with a not null constraint,
124127 // ORA-01442 will occur.
125- $ wantToAddNull = strpos ($ field [$ i ]['null ' ], ' NOT ' ) === false ;
126- $ currentNullable = $ nullableMap [$ field [$ i ]['name ' ]];
128+ $ wantToAddNull = strpos ($ processedFields [$ i ]['null ' ], ' NOT ' ) === false ;
129+ $ currentNullable = $ nullableMap [$ processedFields [$ i ]['name ' ]];
127130
128131 if ($ wantToAddNull === true && $ currentNullable === true ) {
129- $ field [$ i ]['null ' ] = '' ;
130- } elseif ($ field [$ i ]['null ' ] === '' && $ currentNullable === false ) {
132+ $ processedFields [$ i ]['null ' ] = '' ;
133+ } elseif ($ processedFields [$ i ]['null ' ] === '' && $ currentNullable === false ) {
131134 // Nullable by default
132- $ field [$ i ]['null ' ] = ' NULL ' ;
135+ $ processedFields [$ i ]['null ' ] = ' NULL ' ;
133136 } elseif ($ wantToAddNull === false && $ currentNullable === false ) {
134- $ field [$ i ]['null ' ] = '' ;
137+ $ processedFields [$ i ]['null ' ] = '' ;
135138 }
136139 }
137140
138- if ($ field [$ i ]['_literal ' ] !== false ) {
139- $ field [$ i ] = "\n\t" . $ field [$ i ]['_literal ' ];
141+ if ($ processedFields [$ i ]['_literal ' ] !== false ) {
142+ $ processedFields [$ i ] = "\n\t" . $ processedFields [$ i ]['_literal ' ];
140143 } else {
141- $ field [$ i ]['_literal ' ] = "\n\t" . $ this ->_processColumn ($ field [$ i ]);
144+ $ processedFields [$ i ]['_literal ' ] = "\n\t" . $ this ->_processColumn ($ processedFields [$ i ]);
142145
143- if (! empty ($ field [$ i ]['comment ' ])) {
146+ if (! empty ($ processedFields [$ i ]['comment ' ])) {
144147 $ sqls [] = 'COMMENT ON COLUMN '
145- . $ this ->db ->escapeIdentifiers ($ table ) . '. ' . $ this ->db ->escapeIdentifiers ($ field [$ i ]['name ' ])
146- . ' IS ' . $ field [$ i ]['comment ' ];
148+ . $ this ->db ->escapeIdentifiers ($ table ) . '. ' . $ this ->db ->escapeIdentifiers ($ processedFields [$ i ]['name ' ])
149+ . ' IS ' . $ processedFields [$ i ]['comment ' ];
147150 }
148151
149- if ($ alterType === 'MODIFY ' && ! empty ($ field [$ i ]['new_name ' ])) {
150- $ sqls [] = $ sql . ' RENAME COLUMN ' . $ this ->db ->escapeIdentifiers ($ field [$ i ]['name ' ])
151- . ' TO ' . $ this ->db ->escapeIdentifiers ($ field [$ i ]['new_name ' ]);
152+ if ($ alterType === 'MODIFY ' && ! empty ($ processedFields [$ i ]['new_name ' ])) {
153+ $ sqls [] = $ sql . ' RENAME COLUMN ' . $ this ->db ->escapeIdentifiers ($ processedFields [$ i ]['name ' ])
154+ . ' TO ' . $ this ->db ->escapeIdentifiers ($ processedFields [$ i ]['new_name ' ]);
152155 }
153156
154- $ field [$ i ] = "\n\t" . $ field [$ i ]['_literal ' ];
157+ $ processedFields [$ i ] = "\n\t" . $ processedFields [$ i ]['_literal ' ];
155158 }
156159 }
157160
158161 $ sql .= ' ' . $ alterType . ' ' ;
159- $ sql .= count ($ field ) === 1
160- ? $ field [0 ]
161- : '( ' . implode (', ' , $ field ) . ') ' ;
162+ $ sql .= count ($ processedFields ) === 1
163+ ? $ processedFields [0 ]
164+ : '( ' . implode (', ' , $ processedFields ) . ') ' ;
162165
163166 // RENAME COLUMN must be executed after MODIFY
164167 array_unshift ($ sqls , $ sql );
0 commit comments