mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
SQL: default NULL for sys fields + misc fixes
* sys fields are NULL by default (with exceptions, see comment about NOT_NULL_FLAG in #77); * error codes renamed, messages cleared out; * SHOW CREATE TABLE fixed; * set_max() fix; * redundant flag setters/getters removed; * flags are set in sql_yacc.yy, redundant copy_info_about_generated_fields() eliminated.
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
49
sql/field.h
49
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -7971,10 +7971,10 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &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<Item> &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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -3051,7 +3051,7 @@ void promote_first_timestamp_column(List<Create_field> *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<Create_field> 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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user