@@ -277,8 +277,6 @@ private function get_column_definition( string $table_name, array $column_info )
277
277
* @return string The MySQL key definition.
278
278
*/
279
279
private function get_key_definition ( array $ key , array $ key_columns , array $ data_types ): string {
280
- $ key_length_limit = 100 ;
281
-
282
280
// Key definition.
283
281
$ definition = array ();
284
282
if ( $ key ['unique ' ] ) {
@@ -293,24 +291,40 @@ private function get_key_definition( array $key, array $key_columns, array $data
293
291
// Key columns.
294
292
$ cols = array ();
295
293
foreach ( $ key_columns as $ column ) {
296
- // Get data type and length.
297
- $ data_type = strtolower ( $ data_types [ $ column ['name ' ] ] );
298
- if ( 1 === preg_match ( '/^(\w+)\s*\(\s*(\d+)\s*\)/ ' , $ data_type , $ matches ) ) {
299
- $ data_type = $ matches [1 ]; // "varchar"
300
- $ data_length = min ( $ matches [2 ], $ key_length_limit ); // "255"
301
- }
302
-
303
- // Apply max length if needed.
294
+ /*
295
+ * Extract type and length from column data type definition.
296
+ *
297
+ * This is required when the column data type is inferred from the
298
+ * '_mysql_data_types_cache' table, which stores the data type in
299
+ * the format "type(length)", such as "varchar(255)".
300
+ */
301
+ $ max_prefix_length = 100 ;
302
+ $ type = strtolower ( $ data_types [ $ column ['name ' ] ] );
303
+ $ parts = explode ( '( ' , $ type );
304
+ $ column_type = $ parts [0 ];
305
+ $ column_length = isset ( $ parts [1 ] ) ? (int ) $ parts [1 ] : null ;
306
+
307
+ /*
308
+ * Add an index column prefix length, if needed.
309
+ *
310
+ * This is required for "text" and "blob" types for columns inferred
311
+ * directly from the SQLite schema, and for the following types for
312
+ * columns inferred from the '_mysql_data_types_cache' table:
313
+ * char, varchar
314
+ * text, tinytext, mediumtext, longtext
315
+ * blob, tinyblob, mediumblob, longblob
316
+ * varbinary
317
+ */
304
318
if (
305
- str_contains ( $ data_type , 'char ' )
306
- || str_starts_with ( $ data_type , 'var ' )
307
- || str_ends_with ( $ data_type , 'text ' )
308
- || str_ends_with ( $ data_type , 'blob ' )
319
+ str_ends_with ( $ column_type , 'char ' )
320
+ || str_ends_with ( $ column_type , 'text ' )
321
+ || str_ends_with ( $ column_type , 'blob ' )
322
+ || str_starts_with ( $ column_type , 'var ' )
309
323
) {
310
324
$ cols [] = sprintf (
311
325
'%s(%d) ' ,
312
326
$ this ->quote_sqlite_identifier ( $ column ['name ' ] ),
313
- $ data_length ?? $ key_length_limit
327
+ min ( $ column_length ?? $ max_prefix_length , $ max_prefix_length )
314
328
);
315
329
} else {
316
330
$ cols [] = $ this ->quote_sqlite_identifier ( $ column ['name ' ] );
0 commit comments