summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2021-10-11 13:36:06 +0300
committerAleksey Midenkov <midenok@gmail.com>2021-10-11 13:36:06 +0300
commit911c803db19de7ffd45c39ff3614abcf19c63536 (patch)
tree5622f776d4cdafedae25a08c4b97e09cf418959d
parent00affc324cd69f5e00befe195de930c4df7b2f32 (diff)
downloadmariadb-git-911c803db19de7ffd45c39ff3614abcf19c63536.tar.gz
MDEV-22660 System versioning cleanups
- Cleaned up Vers_parse_info::check_sys_fields(); - Renamed VERS_SYS_START_FLAG, VERS_SYS_END_FLAG to VERS_ROW_START, VERS_ROW_END.
-rw-r--r--include/mysql_com.h6
-rw-r--r--sql/field.cc4
-rw-r--r--sql/field.h13
-rw-r--r--sql/handler.cc86
-rw-r--r--sql/item_vers.cc2
-rw-r--r--sql/sql_lex.cc4
-rw-r--r--sql/sql_show.cc6
-rw-r--r--sql/sql_table.cc6
-rw-r--r--sql/table.cc4
9 files changed, 64 insertions, 67 deletions
diff --git a/include/mysql_com.h b/include/mysql_com.h
index b1534b1d746..234b6133676 100644
--- a/include/mysql_com.h
+++ b/include/mysql_com.h
@@ -193,13 +193,13 @@ 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 VERS_SYS_START_FLAG (1 << 27) /* autogenerated column declared with
+#define VERS_ROW_START (1 << 27) /* autogenerated column declared with
`generated always as row start`
(see II.a SQL Standard) */
-#define VERS_SYS_END_FLAG (1 << 28) /* autogenerated column declared with
+#define VERS_ROW_END (1 << 28) /* autogenerated column declared with
`generated always as row end`
(see II.a SQL Standard).*/
-#define VERS_SYSTEM_FIELD (VERS_SYS_START_FLAG | VERS_SYS_END_FLAG)
+#define VERS_SYSTEM_FIELD (VERS_ROW_START | VERS_ROW_END)
#define VERS_UPDATE_UNVERSIONED_FLAG (1 << 29) /* column that doesn't support
system versioning when table
itself supports it*/
diff --git a/sql/field.cc b/sql/field.cc
index cba6df52b62..ddb309c3262 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -2360,7 +2360,7 @@ Field *Field::make_new_field(MEM_ROOT *root, TABLE *new_table,
tmp->unireg_check= Field::NONE;
tmp->flags&= (NOT_NULL_FLAG | BLOB_FLAG | UNSIGNED_FLAG |
ZEROFILL_FLAG | BINARY_FLAG | ENUM_FLAG | SET_FLAG |
- VERS_SYS_START_FLAG | VERS_SYS_END_FLAG |
+ VERS_ROW_START | VERS_ROW_END |
VERS_UPDATE_UNVERSIONED_FLAG);
tmp->reset_fields();
tmp->invisible= VISIBLE;
@@ -10967,7 +10967,7 @@ Field *make_field(TABLE_SHARE *share,
f_is_zerofill(pack_flag) != 0,
f_is_dec(pack_flag) == 0);
case MYSQL_TYPE_LONGLONG:
- if (flags & (VERS_SYS_START_FLAG|VERS_SYS_END_FLAG))
+ if (flags & (VERS_ROW_START|VERS_ROW_END))
{
return new (mem_root)
Field_vers_trx_id(ptr, field_length, null_pos, null_bit,
diff --git a/sql/field.h b/sql/field.h
index 825a0dae7aa..7d60e0953f8 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1499,7 +1499,7 @@ public:
bool vers_sys_field() const
{
- return flags & (VERS_SYS_START_FLAG | VERS_SYS_END_FLAG);
+ return flags & (VERS_ROW_START | VERS_ROW_END);
}
bool vers_update_unversioned() const
@@ -4469,7 +4469,7 @@ public:
}
bool vers_sys_field() const
{
- return flags & (VERS_SYS_START_FLAG | VERS_SYS_END_FLAG);
+ return flags & (VERS_ROW_START | VERS_ROW_END);
}
void create_length_to_internal_length_bit();
void create_length_to_internal_length_newdecimal();
@@ -4813,6 +4813,15 @@ public:
}
/* Used to make a clone of this object for ALTER/CREATE TABLE */
Create_field *clone(MEM_ROOT *mem_root) const;
+
+ bool is_some_bigint() const
+ {
+ return type_handler() == &type_handler_longlong ||
+ type_handler() == &type_handler_vers_trx_id;
+ }
+
+ bool vers_check_timestamp(const Lex_table_name &table_name) const;
+ bool vers_check_bigint(const Lex_table_name &table_name) const;
};
diff --git a/sql/handler.cc b/sql/handler.cc
index c0a810a72bc..f46e51a34ce 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -7122,11 +7122,11 @@ bool Vers_parse_info::is_end(const char *name) const
}
bool Vers_parse_info::is_start(const Create_field &f) const
{
- return f.flags & VERS_SYS_START_FLAG;
+ return f.flags & VERS_ROW_START;
}
bool Vers_parse_info::is_end(const Create_field &f) const
{
- return f.flags & VERS_SYS_END_FLAG;
+ return f.flags & VERS_ROW_END;
}
static Create_field *vers_init_sys_field(THD *thd, const char *field_name, int flags, bool integer)
@@ -7186,8 +7186,8 @@ bool Vers_parse_info::fix_implicit(THD *thd, Alter_info *alter_info)
system_time= start_end_t(default_start, default_end);
as_row= system_time;
- if (vers_create_sys_field(thd, default_start, alter_info, VERS_SYS_START_FLAG) ||
- vers_create_sys_field(thd, default_end, alter_info, VERS_SYS_END_FLAG))
+ if (vers_create_sys_field(thd, default_start, alter_info, VERS_ROW_START) ||
+ vers_create_sys_field(thd, default_end, alter_info, VERS_ROW_END))
{
return true;
}
@@ -7346,7 +7346,7 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info,
return true;
}
my_error(ER_VERS_DUPLICATE_ROW_START_END, MYF(0),
- f->flags & VERS_SYS_START_FLAG ? "START" : "END", f->field_name.str);
+ f->flags & VERS_ROW_START ? "START" : "END", f->field_name.str);
return true;
}
}
@@ -7451,13 +7451,13 @@ Vers_parse_info::fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_
while ((f= it++))
{
- if (f->flags & VERS_SYS_START_FLAG)
+ if (f->flags & VERS_ROW_START)
{
f_start= f;
if (f_end)
break;
}
- else if (f->flags & VERS_SYS_END_FLAG)
+ else if (f->flags & VERS_ROW_END)
{
f_end= f;
if (f_start)
@@ -7519,37 +7519,31 @@ bool Vers_parse_info::check_conditions(const Lex_table_name &table_name,
return false;
}
-static bool is_versioning_timestamp(const Create_field *f)
-{
- return f->type_handler() == &type_handler_timestamp2 &&
- f->length == MAX_DATETIME_FULL_WIDTH;
-}
-
-static bool is_some_bigint(const Create_field *f)
-{
- return f->type_handler() == &type_handler_longlong ||
- f->type_handler() == &type_handler_vers_trx_id;
-}
-static bool is_versioning_bigint(const Create_field *f)
+bool Create_field::vers_check_timestamp(const Lex_table_name &table_name) const
{
- return is_some_bigint(f) && f->flags & UNSIGNED_FLAG &&
- f->length == MY_INT64_NUM_DECIMAL_DIGITS - 1;
-}
+ if (type_handler() == &type_handler_timestamp2 &&
+ length == MAX_DATETIME_FULL_WIDTH)
+ return false;
-static bool require_timestamp(const Create_field *f, Lex_table_name table_name)
-{
- my_error(ER_VERS_FIELD_WRONG_TYPE, MYF(0), f->field_name.str, "TIMESTAMP(6)",
+ my_error(ER_VERS_FIELD_WRONG_TYPE, MYF(0), field_name.str, "TIMESTAMP(6)",
table_name.str);
return true;
}
-static bool require_bigint(const Create_field *f, Lex_table_name table_name)
+
+
+bool Create_field::vers_check_bigint(const Lex_table_name &table_name) const
{
- my_error(ER_VERS_FIELD_WRONG_TYPE, MYF(0), f->field_name.str,
+ if (is_some_bigint() && flags & UNSIGNED_FLAG &&
+ length == MY_INT64_NUM_DECIMAL_DIGITS - 1)
+ return false;
+
+ my_error(ER_VERS_FIELD_WRONG_TYPE, MYF(0), field_name.str,
"BIGINT(20) UNSIGNED", table_name.str);
return true;
}
+
bool Vers_parse_info::check_sys_fields(const Lex_table_name &table_name,
const Lex_table_name &db,
Alter_info *alter_info,
@@ -7564,37 +7558,31 @@ bool Vers_parse_info::check_sys_fields(const Lex_table_name &table_name,
List_iterator<Create_field> it(alter_info->create_list);
while (Create_field *f= it++)
{
- if (!row_start && f->flags & VERS_SYS_START_FLAG)
+ if (!row_start && f->flags & VERS_ROW_START)
row_start= f;
- else if (!row_end && f->flags & VERS_SYS_END_FLAG)
+ else if (!row_end && f->flags & VERS_ROW_END)
row_end= f;
}
- const bool expect_timestamp=
- !can_native || !is_some_bigint(row_start) || !is_some_bigint(row_end);
-
- if (expect_timestamp)
+ if (!can_native ||
+ !row_start->is_some_bigint() ||
+ !row_end->is_some_bigint())
{
- if (!is_versioning_timestamp(row_start))
- return require_timestamp(row_start, table_name);
-
- if (!is_versioning_timestamp(row_end))
- return require_timestamp(row_end, table_name);
+ if (row_start->vers_check_timestamp(table_name) ||
+ row_end->vers_check_timestamp(table_name))
+ return true;
}
else
{
- if (!is_versioning_bigint(row_start))
- return require_bigint(row_start, table_name);
-
- if (!is_versioning_bigint(row_end))
- return require_bigint(row_end, table_name);
- }
+ if (row_start->vers_check_bigint(table_name) ||
+ row_end->vers_check_bigint(table_name))
+ return true;
- if (is_versioning_bigint(row_start) && is_versioning_bigint(row_end) &&
- !TR_table::use_transaction_registry)
- {
- my_error(ER_VERS_TRT_IS_DISABLED, MYF(0));
- return true;
+ if (!TR_table::use_transaction_registry)
+ {
+ my_error(ER_VERS_TRT_IS_DISABLED, MYF(0));
+ return true;
+ }
}
return false;
diff --git a/sql/item_vers.cc b/sql/item_vers.cc
index 76cda6a5ea2..6103c53fd51 100644
--- a/sql/item_vers.cc
+++ b/sql/item_vers.cc
@@ -30,7 +30,7 @@ bool Item_func_history::val_bool()
{
Item_field *f= static_cast<Item_field *>(args[0]);
DBUG_ASSERT(f->fixed);
- DBUG_ASSERT(f->field->flags & VERS_SYS_END_FLAG);
+ DBUG_ASSERT(f->field->flags & VERS_ROW_END);
return !f->field->is_max();
}
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 4fc8ebb5a60..00e1d30f209 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -8322,7 +8322,7 @@ bool LEX::last_field_generated_always_as_row_start()
Vers_parse_info &info= vers_get_info();
Lex_ident *p= &info.as_row.start;
return last_field_generated_always_as_row_start_or_end(p, "START",
- VERS_SYS_START_FLAG);
+ VERS_ROW_START);
}
@@ -8331,7 +8331,7 @@ bool LEX::last_field_generated_always_as_row_end()
Vers_parse_info &info= vers_get_info();
Lex_ident *p= &info.as_row.end;
return last_field_generated_always_as_row_start_or_end(p, "END",
- VERS_SYS_END_FLAG);
+ VERS_ROW_END);
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 35e0c7364f5..5a3c27832ac 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -2288,11 +2288,11 @@ int show_create_table(THD *thd, TABLE_LIST *table_list, String *packet,
}
else
{
- if (field->flags & VERS_SYS_START_FLAG)
+ if (field->flags & VERS_ROW_START)
{
packet->append(STRING_WITH_LEN(" GENERATED ALWAYS AS ROW START"));
}
- else if (field->flags & VERS_SYS_END_FLAG)
+ else if (field->flags & VERS_ROW_END)
{
packet->append(STRING_WITH_LEN(" GENERATED ALWAYS AS ROW END"));
}
@@ -6080,7 +6080,7 @@ static int get_schema_column_record(THD *thd, TABLE_LIST *tables,
}
else if (field->flags & VERS_SYSTEM_FIELD)
{
- if (field->flags & VERS_SYS_START_FLAG)
+ if (field->flags & VERS_ROW_START)
{
table->field[21]->store(STRING_WITH_LEN("ROW START"), cs);
buf.set(STRING_WITH_LEN("STORED GENERATED"), cs);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 9aae74a613d..2b796403dc8 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -8209,7 +8209,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
def= new (thd->mem_root) Create_field(thd, field, field);
def->invisible= INVISIBLE_SYSTEM;
alter_info->flags|= ALTER_CHANGE_COLUMN;
- if (field->flags & VERS_SYS_START_FLAG)
+ if (field->flags & VERS_ROW_START)
create_info->vers_info.as_row.start= def->field_name= Vers_parse_info::default_start;
else
create_info->vers_info.as_row.end= def->field_name= Vers_parse_info::default_end;
@@ -8250,9 +8250,9 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
!vers_system_invisible)
{
StringBuffer<NAME_LEN*3> tmp;
- if (!(dropped_sys_vers_fields & VERS_SYS_START_FLAG))
+ if (!(dropped_sys_vers_fields & VERS_ROW_START))
append_drop_column(thd, &tmp, table->vers_start_field());
- if (!(dropped_sys_vers_fields & VERS_SYS_END_FLAG))
+ if (!(dropped_sys_vers_fields & VERS_ROW_END))
append_drop_column(thd, &tmp, table->vers_end_field());
my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr());
goto err;
diff --git a/sql/table.cc b/sql/table.cc
index 18bb28e0863..0bef0fc29a1 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -2059,9 +2059,9 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
if (versioned)
{
if (i == row_start_field)
- flags|= VERS_SYS_START_FLAG;
+ flags|= VERS_ROW_START;
else if (i == row_end_field)
- flags|= VERS_SYS_END_FLAG;
+ flags|= VERS_ROW_END;
if (flags & VERS_SYSTEM_FIELD)
{