@@ -3280,10 +3280,17 @@ innobase_build_col_map(
32803280 & INNOBASE_DEFAULTS));
32813281DBUG_ASSERT (!defaults || dtuple_get_n_fields (defaults)
32823282 == dict_table_get_n_cols (new_table));
3283+ DBUG_ASSERT (table->s ->stored_fields > 0 );
3284+
3285+ size_t old_n_v_cols = old_n_v_cols = table->s ->fields
3286+ - table->s ->stored_fields ;
3287+ DBUG_ASSERT (old_n_v_cols == old_table->n_v_cols
3288+ || table->s ->frm_version < FRM_VER_EXPRESSSIONS);
3289+ DBUG_ASSERT (!old_n_v_cols || table->s ->virtual_fields );
32833290
32843291ulint* col_map = static_cast <ulint*>(
32853292mem_heap_alloc (
3286- heap, unsigned ( old_table->n_cols + old_table-> n_v_cols )
3293+ heap, ( size_t ( old_table->n_cols ) + old_n_v_cols )
32873294* sizeof *col_map));
32883295
32893296List_iterator_fast<Create_field> cf_it (
@@ -3297,10 +3304,12 @@ innobase_build_col_map(
32973304col_map[old_i] = ULINT_UNDEFINED;
32983305}
32993306
3300- for (uint old_i = 0 ; old_i < old_table-> n_v_cols ; old_i++) {
3307+ for (uint old_i = 0 ; old_i < old_n_v_cols ; old_i++) {
33013308col_map[old_i + old_table->n_cols ] = ULINT_UNDEFINED;
33023309}
33033310
3311+ const bool omits_virtual = ha_innobase::omits_virtual_cols (*table->s );
3312+
33043313while (const Create_field* new_field = cf_it++) {
33053314bool is_v = !new_field->stored_in_db ();
33063315ulint num_old_v = 0 ;
@@ -3309,8 +3318,11 @@ innobase_build_col_map(
33093318const Field* field = table->field [old_i];
33103319if (!field->stored_in_db ()) {
33113320if (is_v && new_field->field == field) {
3312- col_map[old_table->n_cols + num_v]
3313- = num_old_v;
3321+ if (!omits_virtual) {
3322+ col_map[old_table->n_cols
3323+ + num_v]
3324+ = num_old_v;
3325+ }
33143326num_old_v++;
33153327goto found_col;
33163328}
@@ -3355,7 +3367,7 @@ innobase_build_col_map(
33553367
33563368DBUG_ASSERT (i == altered_table->s ->fields - num_v);
33573369
3358- i = table->s ->fields - old_table-> n_v_cols ;
3370+ i = table->s ->fields - old_n_v_cols ;
33593371
33603372/* Add the InnoDB hidden FTS_DOC_ID column, if any. */
33613373if (i + DATA_N_SYS_COLS < old_table->n_cols ) {
0 commit comments