diff --git a/cmake/print_warnings.cmake b/cmake/print_warnings.cmake index ea61085b5cc..7f6f9635d8e 100644 --- a/cmake/print_warnings.cmake +++ b/cmake/print_warnings.cmake @@ -22,6 +22,6 @@ IF(NOT WARN_MODE MATCHES "early") WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) ADD_CUSTOM_TARGET(print_warnings ALL COMMAND bash -c '[ -f compile.warnings ] && { echo "Warnings found:" \; cat compile.warnings \; echo "" \; } \; true' - DEPENDS mysql udf_example explain_filename-t rm_compile.warnings + DEPENDS mysql udf_example rm_compile.warnings WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") ENDIF() diff --git a/include/mysql_com.h b/include/mysql_com.h index 990a7160bd1..58c28f6d074 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -184,10 +184,10 @@ enum enum_indicator_type #define FIELD_FLAGS_COLUMN_FORMAT_MASK (3U << FIELD_FLAGS_COLUMN_FORMAT) #define FIELD_IS_DROPPED (1U << 26) /* Intern: Field is being dropped */ -#define GENERATED_ROW_START_FLAG (1 << 27) /* autogenerated column declared with +#define VERS_SYS_START_FLAG (1 << 27) /* autogenerated column declared with `generated always at row start` (see II.a SQL Standard) */ -#define GENERATED_ROW_END_FLAG (1 << 28) /* autogenerated column declared with +#define VERS_SYS_END_FLAG (1 << 28) /* autogenerated column declared with `generated always at row end` (see II.a SQL Standard).*/ #define VERS_OPTIMIZED_UPDATE_FLAG (1 << 29) /* column that doesn't support diff --git a/mysql-test/suite/versioning/r/create.result b/mysql-test/suite/versioning/r/create.result index ea3c791cc23..8f69b9c2fac 100644 --- a/mysql-test/suite/versioning/r/create.result +++ b/mysql-test/suite/versioning/r/create.result @@ -9,8 +9,8 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `XNo` int(10) unsigned DEFAULT NULL, - `Sys_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `Sys_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `Sys_start` timestamp(6) NOT NULL GENERATED ALWAYS AS ROW START, + `Sys_end` timestamp(6) NOT NULL GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`Sys_start`, `Sys_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING # Implicit fields test @@ -21,8 +21,8 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `XNo` int(10) unsigned DEFAULT NULL, - `sys_trx_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `sys_trx_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `sys_trx_start` timestamp(6) GENERATED ALWAYS AS ROW START, + `sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING create or replace table t1 ( @@ -126,8 +126,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `A` int(11) DEFAULT NULL, `B` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, - `sys_trx_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `sys_trx_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `sys_trx_start` timestamp(6) GENERATED ALWAYS AS ROW START, + `sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING create or replace table t1 ( @@ -139,8 +139,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `A` int(11) DEFAULT NULL, `B` int(11) DEFAULT NULL, - `sys_trx_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `sys_trx_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `sys_trx_start` timestamp(6) GENERATED ALWAYS AS ROW START, + `sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING create or replace table t1 ( @@ -157,8 +157,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `A` int(11) DEFAULT NULL, `B` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, - `sys_trx_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `sys_trx_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `sys_trx_start` timestamp(6) GENERATED ALWAYS AS ROW START, + `sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING create or replace table t1 ( @@ -170,8 +170,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `A` int(11) DEFAULT NULL, `B` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, - `sys_trx_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `sys_trx_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `sys_trx_start` timestamp(6) GENERATED ALWAYS AS ROW START, + `sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING create or replace table t1 ( @@ -183,8 +183,8 @@ Table Create Table t1 CREATE TABLE `t1` ( `A` int(11) DEFAULT NULL, `B` int(11) DEFAULT NULL WITHOUT SYSTEM VERSIONING, - `sys_trx_start` timestamp(6) NOT NULL GENERATED AS ROW START, - `sys_trx_end` timestamp(6) NOT NULL GENERATED AS ROW END, + `sys_trx_start` timestamp(6) GENERATED ALWAYS AS ROW START, + `sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING create or replace table t1 ( diff --git a/mysql-test/suite/versioning/r/insert.result b/mysql-test/suite/versioning/r/insert.result index fdac34f6759..8527f763c4e 100644 --- a/mysql-test/suite/versioning/r/insert.result +++ b/mysql-test/suite/versioning/r/insert.result @@ -188,9 +188,9 @@ x y sys_end 1002 2002 2038-01-19 03:14:07.000000 3001 4001 2038-01-19 03:14:07.000000 insert into t1(x, y, sys_end) values(8001, 9001, '2015-1-1 1:1:1'); -ERROR HY000: Generated field for System Versioning cannot be set by user +ERROR HY000: System field `sys_end` is read-only insert into vt1_2 values(3002, 4002, '2015-2-2 2:2:2'); -ERROR HY000: Generated field for System Versioning cannot be set by user +ERROR HY000: System field `sys_end` is read-only drop table t1; drop view vt1_1; drop view vt1_2; @@ -211,9 +211,9 @@ x y vtq_commit_ts(sys_end) 1002 2002 2038-01-19 03:14:07.000000 3001 4001 2038-01-19 03:14:07.000000 insert into t1(x, y, sys_end) values(8001, 9001, 1111111); -ERROR HY000: Generated field for System Versioning cannot be set by user +ERROR HY000: System field `sys_end` is read-only insert into vt1_2 values(3002, 4002, 2222222); -ERROR HY000: Generated field for System Versioning cannot be set by user +ERROR HY000: System field `sys_end` is read-only drop table t1; drop view vt1_1; drop view vt1_2; diff --git a/mysql-test/suite/versioning/r/optimized_fields.result b/mysql-test/suite/versioning/r/optimized_fields.result index 3fbc8017931..4d7878e8b9e 100644 --- a/mysql-test/suite/versioning/r/optimized_fields.result +++ b/mysql-test/suite/versioning/r/optimized_fields.result @@ -17,50 +17,50 @@ a b b+0 1 NULL NULL 3 NULL NULL Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select * from t for system_time as of timestamp now(6); a b 1 NULL 3 NULL Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select count(*) from t group by b for system_time as of timestamp now(6); count(*) 2 Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select * from t for system_time as of timestamp now(6) order by b asc; a b 1 NULL 3 NULL Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select * from t for system_time as of timestamp now(6) order by b desc; a b 1 NULL 3 NULL Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select * from t group by a having a=2 for system_time as of timestamp now(6); a b Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select * from t group by b having b=2 for system_time as of timestamp now(6); a b Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select a from t where b=2 for system_time as of timestamp now(6); a Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select a from t where b=NULL for system_time as of timestamp now(6); a Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select count(*), b from t group by b having b=NULL for system_time as of timestamp now(6); count(*) b Warnings: -Warning 4055 Attempt to read unversioned field 'b' in historical query +Warning 4075 Attempt to read unversioned field `b` in historical query select a, b from t; a b 1 2 diff --git a/mysql-test/suite/versioning/t/insert.test b/mysql-test/suite/versioning/t/insert.test index 80eded07d2c..6b9ebeef708 100644 --- a/mysql-test/suite/versioning/t/insert.test +++ b/mysql-test/suite/versioning/t/insert.test @@ -150,18 +150,18 @@ call test_02('timestamp(6)', 'myisam', 'sys_end'); call test_02('bigint unsigned', 'innodb', 'vtq_commit_ts(sys_end)'); call test_03('timestamp(6)', 'myisam', 'sys_end'); ---ERROR ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER +--ERROR ER_VERS_READONLY_FIELD insert into t1(x, y, sys_end) values(8001, 9001, '2015-1-1 1:1:1'); ---ERROR ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER +--ERROR ER_VERS_READONLY_FIELD insert into vt1_2 values(3002, 4002, '2015-2-2 2:2:2'); drop table t1; drop view vt1_1; drop view vt1_2; call test_03('bigint unsigned', 'innodb', 'vtq_commit_ts(sys_end)'); ---ERROR ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER +--ERROR ER_VERS_READONLY_FIELD insert into t1(x, y, sys_end) values(8001, 9001, 1111111); ---ERROR ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER +--ERROR ER_VERS_READONLY_FIELD insert into vt1_2 values(3002, 4002, 2222222); drop table t1; drop view vt1_1; diff --git a/sql/field.cc b/sql/field.cc index a7108924f57..295b22ad8ec 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4359,6 +4359,7 @@ void Field_longlong::sql_type(String &res) const bool Field_longlong::set_max() { ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; + set_notnull(); int8store(ptr, unsigned_flag ? ULONGLONG_MAX : LONGLONG_MAX); return FALSE; } @@ -5448,6 +5449,7 @@ bool Field_timestampf::set_max() DBUG_ENTER("Field_timestampf::set_max"); ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; + set_notnull(); mi_int4store(ptr, TIMESTAMP_MAX_VALUE); memset(ptr + 4, 0x0, value_length() - 4); diff --git a/sql/field.h b/sql/field.h index f3c29c29cac..a479ec569ff 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1407,54 +1407,9 @@ public: FIELD_FLAGS_COLUMN_FORMAT; } - /* - System versioning support. - */ - - bool is_generated() + bool vers_sys_field() { - return flags & (GENERATED_ROW_START_FLAG | GENERATED_ROW_END_FLAG); - } - - bool is_generated_row_start() - { - return flags & GENERATED_ROW_START_FLAG; - } - - bool is_generated_row_end() - { - return flags & GENERATED_ROW_END_FLAG; - } - - bool is_versioning_disabled() - { - return flags & VERS_OPTIMIZED_UPDATE_FLAG; - } - - /* Mark a field as auto-generated row start column. */ - void set_generated_row_start() - { - //DBUG_ASSERT((flags & GENERATED_ROW_END_FLAG) == 0); - flags |= GENERATED_ROW_START_FLAG; - } - - /* Mark a field as auto-generated row start column. */ - void set_generated_row_end() - { - //DBUG_ASSERT((flags & GENERATED_ROW_START_FLAG) == 0); - flags |= GENERATED_ROW_END_FLAG; - } - - /* Disable a field versioning for a versioned table. */ - void disable_versioning() - { - flags |= VERS_OPTIMIZED_UPDATE_FLAG; - } - - /* Inherit a field versioning status from the table. */ - void inherit_versioning() - { - flags &= ~VERS_OPTIMIZED_UPDATE_FLAG; + return flags & (VERS_SYS_START_FLAG | VERS_SYS_END_FLAG); } /* diff --git a/sql/handler.cc b/sql/handler.cc index c62dcb067be..14b751c0628 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -6561,6 +6561,7 @@ static bool create_string(MEM_ROOT *mem_root, String **s, const char *value) static bool create_sys_trx_field(THD *thd, const char *field_name, Alter_info *alter_info, String **s, + int flags, bool integer_fields) { Create_field *f= new (thd->mem_root) Create_field(); @@ -6570,12 +6571,12 @@ static bool create_sys_trx_field(THD *thd, const char *field_name, memset(f, 0, sizeof(*f)); f->field_name= field_name; f->charset= system_charset_info; - f->flags= NOT_NULL_FLAG | HIDDEN_FLAG; + f->flags= flags | HIDDEN_FLAG; if (integer_fields) { f->sql_type= MYSQL_TYPE_LONGLONG; f->flags|= UNSIGNED_FLAG; - f->length= MY_INT64_NUM_DECIMAL_DIGITS; + f->length= MY_INT64_NUM_DECIMAL_DIGITS - 1; } else { @@ -6610,8 +6611,8 @@ bool Vers_parse_info::fix_implicit( !strncmp(name, generated_as_row.end->c_ptr(), len)) continue; - if (f->versioning == Column_definition::VERSIONING_NOT_SET && - !declared_system_versioning || + if ((f->versioning == Column_definition::VERSIONING_NOT_SET && + !declared_system_versioning) || f->versioning == Column_definition::WITHOUT_VERSIONING) { f->flags|= VERS_OPTIMIZED_UPDATE_FLAG; @@ -6623,10 +6624,12 @@ bool Vers_parse_info::fix_implicit( period_for_system_time.start || period_for_system_time.end) return false; - return create_sys_trx_field(thd, "sys_trx_start", alter_info, - &generated_as_row.start, integer_fields) || + return create_sys_trx_field(thd,"sys_trx_start", alter_info, + &generated_as_row.start, VERS_SYS_START_FLAG, + integer_fields) || create_sys_trx_field(thd, "sys_trx_end", alter_info, - &generated_as_row.end, integer_fields) || + &generated_as_row.end, VERS_SYS_END_FLAG, + integer_fields) || create_string(thd->mem_root, &period_for_system_time.start, "sys_trx_start") || create_string(thd->mem_root, &period_for_system_time.end, diff --git a/sql/item.cc b/sql/item.cc index ec4ed9ab07f..e36fadea957 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2760,7 +2760,7 @@ void Item_field::set_field(Field *field_par) if (field->table->s->tmp_table == SYSTEM_TMP_TABLE) any_privileges= 0; - if (field->is_versioning_disabled() && context && context->select_lex && + if (field->flags & VERS_OPTIMIZED_UPDATE_FLAG && context && context->select_lex && context->select_lex->vers_conditions.type != FOR_SYSTEM_TIME_UNSPECIFIED && !field->force_null) diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index c8615943ff2..19bda09cc39 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7488,10 +7488,10 @@ ER_UNKNOWN_VIEW 42S02 # MariaDB error numbers related to System Versioning ER_TABLE_DOESNT_SUPPORT_SYSTEM_VERSIONING - eng "Table '%s' doesn't support system versioning" + eng "Table %`s doesn't support system versioning" -ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER - eng "Generated field for System Versioning cannot be set by user" +ER_VERS_READONLY_FIELD + eng "System field %`s is read-only" ER_UPDATE_INFO_WITH_SYSTEM_VERSIONING eng "Rows matched: %ld Changed: %ld Inserted: %ld Warnings: %ld" @@ -7509,4 +7509,4 @@ ER_VERS_RANGE_UNITS_MISMATCH eng "Range units mismatch" ER_NON_VERSIONED_FIELD_IN_VERSIONED_QUERY - eng "Attempt to read unversioned field '%s' in historical query" + eng "Attempt to read unversioned field %`s in historical query" diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 6d288483818..eb8bcf2148f 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7971,10 +7971,10 @@ fill_record(THD *thd, TABLE *table_arg, List &fields, List &values, ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_VIRTUAL_COLUMN), rfield->field_name, table->s->table_name.str); } - if (table->versioned() && rfield->is_generated() && + if (table->versioned() && rfield->vers_sys_field() && !ignore_errors) { - my_error(ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER, MYF(0)); + my_error(ER_VERS_READONLY_FIELD, MYF(0), rfield->field_name); goto err; } @@ -8225,10 +8225,10 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List &values, } } - if (table->versioned() && field->is_generated() && + if (table->versioned() && field->vers_sys_field() && !ignore_errors) { - my_error(ER_GENERATED_FIELD_CANNOT_BE_SET_BY_USER, MYF(0)); + my_error(ER_VERS_READONLY_FIELD, MYF(0), field->field_name); goto err; } diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 4a588ea0cc2..50b98678271 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -2045,8 +2045,8 @@ int check_that_all_fields_are_given_values(THD *thd, TABLE *entry, TABLE_LIST *t for (Field **field=entry->field ; *field ; field++) { if (!bitmap_is_set(write_set, (*field)->field_index) && + !(*field)->vers_sys_field() && has_no_default_value(thd, *field, table_list) && - !((*field)->flags & (GENERATED_ROW_START_FLAG | GENERATED_ROW_END_FLAG)) && ((*field)->real_type() != MYSQL_TYPE_ENUM)) err=1; } diff --git a/sql/sql_show.cc b/sql/sql_show.cc index cc7f2b0a017..5a640ccb613 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1666,7 +1666,7 @@ static bool get_field_default_value(THD *thd, Field *field, String *def_value, has_default= (field->default_value || (!(field->flags & NO_DEFAULT_VALUE_FLAG) && - !field->is_generated() && + !field->vers_sys_field() && field->unireg_check != Field::NEXT_NUMBER)); def_value->length(0); @@ -2109,7 +2109,7 @@ int show_create_table(THD *thd, TABLE_LIST *table_list, String *packet, { if (flags & NOT_NULL_FLAG) packet->append(STRING_WITH_LEN(" NOT NULL")); - else if (field->type() == MYSQL_TYPE_TIMESTAMP) + else if (field->type() == MYSQL_TYPE_TIMESTAMP && !field->vers_sys_field()) { /* TIMESTAMP field require explicit NULL flag, because unlike @@ -2124,16 +2124,16 @@ int show_create_table(THD *thd, TABLE_LIST *table_list, String *packet, packet->append(STRING_WITH_LEN(" DEFAULT ")); packet->append(def_value.ptr(), def_value.length(), system_charset_info); } - else if (field->is_generated_row_start()) + else if (field->flags & VERS_SYS_START_FLAG) { - packet->append(STRING_WITH_LEN(" GENERATED AS ROW START")); + packet->append(STRING_WITH_LEN(" GENERATED ALWAYS AS ROW START")); } - else if (field->is_generated_row_end()) + else if (field->flags & VERS_SYS_END_FLAG) { - packet->append(STRING_WITH_LEN(" GENERATED AS ROW END")); + packet->append(STRING_WITH_LEN(" GENERATED ALWAYS AS ROW END")); } - if (field->is_versioning_disabled()) + if (field->flags & VERS_OPTIMIZED_UPDATE_FLAG) { packet->append(STRING_WITH_LEN(" WITHOUT SYSTEM VERSIONING")); } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 288c36ee7ab..68504ffddba 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3051,7 +3051,7 @@ void promote_first_timestamp_column(List *column_definitions) column_definition->default_value == NULL && // no constant default, column_definition->unireg_check == Field::NONE && // no function default column_definition->vcol_info == NULL && - !(column_definition->flags & (GENERATED_ROW_START_FLAG | GENERATED_ROW_END_FLAG))) // column isn't generated + !(column_definition->flags & (VERS_SYS_START_FLAG | VERS_SYS_END_FLAG))) // column isn't generated { DBUG_PRINT("info", ("First TIMESTAMP column '%s' was promoted to " "DEFAULT CURRENT_TIMESTAMP ON UPDATE " @@ -3146,37 +3146,6 @@ static void check_duplicate_key(THD *thd, Key *key, KEY *key_info, } } -static void -copy_info_about_generated_fields(Alter_info *dst_alter_info, - HA_CREATE_INFO *src_create_info) -{ - if (!src_create_info->versioned()) - return; - - const char *row_start_field = src_create_info->vers_info.generated_as_row.start->c_ptr(); - DBUG_ASSERT(row_start_field); - const char *row_end_field = src_create_info->vers_info.generated_as_row.end->c_ptr(); - DBUG_ASSERT(row_end_field); - - List_iterator it(dst_alter_info->create_list); - Create_field *column_definition = NULL; - while ( (column_definition = it++) ) - { - if (!my_strcasecmp(system_charset_info, - row_start_field, - column_definition->field_name)) - { - column_definition->flags |= GENERATED_ROW_START_FLAG; - } - else if (!my_strcasecmp(system_charset_info, - row_end_field, - column_definition->field_name)) - { - column_definition->flags |= GENERATED_ROW_END_FLAG; - } - } -} - /* Preparation for table creation @@ -5039,8 +5008,6 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table, else create_table_mode= C_ASSISTED_DISCOVERY; - copy_info_about_generated_fields(alter_info, create_info); - if (!opt_explicit_defaults_for_timestamp) promote_first_timestamp_column(&alter_info->create_list); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6b55582be0b..fb2bbb9ad64 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -6170,13 +6170,14 @@ field_def: vcol_opt_specifier vcol_opt_attribute | opt_generated_always AS ROW_SYM start_or_end { - Vers_parse_info &info= Lex->vers_get_info(); + LEX *lex= Lex; + Vers_parse_info &info= lex->vers_get_info(); String *field_name= new (thd->mem_root) - String((const char*)Lex->last_field->field_name, system_charset_info); + String((const char*)lex->last_field->field_name, system_charset_info); if (!field_name) MYSQL_YYABORT; - const char *table_name= Lex->create_last_non_select_table->table_name; + const char *table_name= lex->create_last_non_select_table->table_name; String **p= NULL; const char* err; @@ -6185,10 +6186,12 @@ field_def: case 1: p= &info.generated_as_row.start; err= "multiple 'GENERATED ALWAYS AS ROW START'"; + lex->last_field->flags|= VERS_SYS_START_FLAG; break; case 0: p= &info.generated_as_row.end; err= "multiple 'GENERATED ALWAYS AS ROW END'"; + lex->last_field->flags|= VERS_SYS_END_FLAG; break; default: /* Not Reachable */ diff --git a/sql/table.cc b/sql/table.cc index 1bda4607dcf..4b41a59a750 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -2001,7 +2001,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, { uchar flags= *extra2_field_flags++; if (flags & VERS_OPTIMIZED_UPDATE) - reg_field->disable_versioning(); + reg_field->flags|= VERS_OPTIMIZED_UPDATE_FLAG; if (flags & HIDDEN) reg_field->flags|= HIDDEN_FLAG; } @@ -2557,8 +2557,8 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, goto err; DBUG_PRINT("info", ("Columns with system versioning: [%d, %d]", row_start, row_end)); share->enable_system_versioning(row_start, row_end); - vers_start_field()->set_generated_row_start(); - vers_end_field()->set_generated_row_end(); + vers_start_field()->flags|= VERS_SYS_START_FLAG; + vers_end_field()->flags|= VERS_SYS_END_FLAG; DBUG_ASSERT(db_type()); if (db_type()->versioned()) @@ -3148,7 +3148,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, outparam->non_generated_field = fptr; for (i=0 ; i < share->fields; i++) { - if (outparam->field[i]->is_generated()) + if (outparam->field[i]->vers_sys_field()) continue; *fptr++ = outparam->field[i]; }