mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge branch '5.5' into 10.0
This commit is contained in:
@ -110,7 +110,7 @@ drop table t1,t2;
|
|||||||
drop procedure p1;
|
drop procedure p1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Bug mdev-3845: values of virtual columns are not computed for triggers
|
--echo # MDEV-3845 values of virtual columns are not computed for triggers
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
@ -149,3 +149,10 @@ DROP TRIGGER t1_ins_aft;
|
|||||||
DROP TRIGGER t1_del_bef;
|
DROP TRIGGER t1_del_bef;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-11706 Assertion `is_stat_field || !table || (!table->write_set || bitmap_is_set(table->write_set, field_index) || (table->vcol_set && bitmap_is_set(table->vcol_set, field_index)))' failed in Field_time::store_TIME_with_warning
|
||||||
|
#
|
||||||
|
create table t1 (i int, t time not null, vt time(4) as (t) virtual);
|
||||||
|
create trigger trg before update on t1 for each row set @a = 1;
|
||||||
|
insert ignore into t1 (i) values (1);
|
||||||
|
drop table t1;
|
||||||
|
@ -330,3 +330,10 @@ t1 CREATE TABLE `t1` (
|
|||||||
`c1` varchar(50) COLLATE latin1_general_ci DEFAULT NULL
|
`c1` varchar(50) COLLATE latin1_general_ci DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set sql_mode='no_zero_date';
|
||||||
|
create table t1 (
|
||||||
|
ts timestamp not null default current_timestamp,
|
||||||
|
tsv timestamp as (adddate(ts, interval 1 day)) virtual
|
||||||
|
);
|
||||||
|
drop table t1;
|
||||||
|
set sql_mode=default;
|
||||||
|
@ -86,7 +86,7 @@ a b c
|
|||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
drop procedure p1;
|
drop procedure p1;
|
||||||
#
|
#
|
||||||
# Bug mdev-3845: values of virtual columns are not computed for triggers
|
# MDEV-3845 values of virtual columns are not computed for triggers
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
||||||
@ -125,3 +125,9 @@ c
|
|||||||
DROP TRIGGER t1_ins_aft;
|
DROP TRIGGER t1_ins_aft;
|
||||||
DROP TRIGGER t1_del_bef;
|
DROP TRIGGER t1_del_bef;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
create table t1 (i int, t time not null, vt time(4) as (t) virtual);
|
||||||
|
create trigger trg before update on t1 for each row set @a = 1;
|
||||||
|
insert ignore into t1 (i) values (1);
|
||||||
|
Warnings:
|
||||||
|
Warning 1364 Field 't' doesn't have a default value
|
||||||
|
drop table t1;
|
||||||
|
@ -86,7 +86,7 @@ a b c
|
|||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
drop procedure p1;
|
drop procedure p1;
|
||||||
#
|
#
|
||||||
# Bug mdev-3845: values of virtual columns are not computed for triggers
|
# MDEV-3845 values of virtual columns are not computed for triggers
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
a INTEGER UNSIGNED NULL DEFAULT NULL,
|
||||||
@ -125,3 +125,9 @@ c
|
|||||||
DROP TRIGGER t1_ins_aft;
|
DROP TRIGGER t1_ins_aft;
|
||||||
DROP TRIGGER t1_del_bef;
|
DROP TRIGGER t1_del_bef;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
create table t1 (i int, t time not null, vt time(4) as (t) virtual);
|
||||||
|
create trigger trg before update on t1 for each row set @a = 1;
|
||||||
|
insert ignore into t1 (i) values (1);
|
||||||
|
Warnings:
|
||||||
|
Warning 1364 Field 't' doesn't have a default value
|
||||||
|
drop table t1;
|
||||||
|
@ -290,3 +290,14 @@ create table t1 (a int, b int as (b is null) virtual);
|
|||||||
create table t1 (v1 varchar(255) as (c1) persistent, c1 varchar(50)) collate=latin1_general_ci;
|
create table t1 (v1 varchar(255) as (c1) persistent, c1 varchar(50)) collate=latin1_general_ci;
|
||||||
show create table t1;
|
show create table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-11527 Virtual columns do not get along well with NO_ZERO_DATE
|
||||||
|
#
|
||||||
|
set sql_mode='no_zero_date';
|
||||||
|
create table t1 (
|
||||||
|
ts timestamp not null default current_timestamp,
|
||||||
|
tsv timestamp as (adddate(ts, interval 1 day)) virtual
|
||||||
|
);
|
||||||
|
drop table t1;
|
||||||
|
set sql_mode=default;
|
||||||
|
@ -8714,9 +8714,7 @@ fill_record(THD * thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
|
|||||||
/* Update virtual fields*/
|
/* Update virtual fields*/
|
||||||
thd->abort_on_warning= FALSE;
|
thd->abort_on_warning= FALSE;
|
||||||
if (vcol_table && vcol_table->vfield &&
|
if (vcol_table && vcol_table->vfield &&
|
||||||
update_virtual_fields(thd, vcol_table,
|
update_virtual_fields(thd, vcol_table, VCOL_UPDATE_FOR_WRITE))
|
||||||
vcol_table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_WRITE))
|
|
||||||
goto err;
|
goto err;
|
||||||
thd->abort_on_warning= save_abort_on_warning;
|
thd->abort_on_warning= save_abort_on_warning;
|
||||||
thd->no_errors= save_no_errors;
|
thd->no_errors= save_no_errors;
|
||||||
@ -8777,9 +8775,7 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table, List<Item> &fields,
|
|||||||
if (item_field && item_field->field && table && table->vfield)
|
if (item_field && item_field->field && table && table->vfield)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(table == item_field->field->table);
|
DBUG_ASSERT(table == item_field->field->table);
|
||||||
result= update_virtual_fields(thd, table,
|
result= update_virtual_fields(thd, table, VCOL_UPDATE_FOR_WRITE);
|
||||||
table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_WRITE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8864,9 +8860,7 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values,
|
|||||||
/* Update virtual fields*/
|
/* Update virtual fields*/
|
||||||
thd->abort_on_warning= FALSE;
|
thd->abort_on_warning= FALSE;
|
||||||
if (table->vfield &&
|
if (table->vfield &&
|
||||||
update_virtual_fields(thd, table,
|
update_virtual_fields(thd, table, VCOL_UPDATE_FOR_WRITE))
|
||||||
table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_WRITE))
|
|
||||||
goto err;
|
goto err;
|
||||||
thd->abort_on_warning= abort_on_warning_saved;
|
thd->abort_on_warning= abort_on_warning_saved;
|
||||||
DBUG_RETURN(thd->is_error());
|
DBUG_RETURN(thd->is_error());
|
||||||
@ -8917,9 +8911,7 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table, Field **ptr,
|
|||||||
{
|
{
|
||||||
DBUG_ASSERT(table == (*ptr)->table);
|
DBUG_ASSERT(table == (*ptr)->table);
|
||||||
if (table->vfield)
|
if (table->vfield)
|
||||||
result= update_virtual_fields(thd, table,
|
result= update_virtual_fields(thd, table, VCOL_UPDATE_FOR_WRITE);
|
||||||
table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_WRITE);
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
@ -548,9 +548,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
! thd->is_error())
|
! thd->is_error())
|
||||||
{
|
{
|
||||||
if (table->vfield)
|
if (table->vfield)
|
||||||
update_virtual_fields(thd, table,
|
update_virtual_fields(thd, table, VCOL_UPDATE_FOR_READ);
|
||||||
table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_READ);
|
|
||||||
thd->inc_examined_row_count(1);
|
thd->inc_examined_row_count(1);
|
||||||
// thd->is_error() is tested to disallow delete row on error
|
// thd->is_error() is tested to disallow delete row on error
|
||||||
if (!select || select->skip_record(thd) > 0)
|
if (!select || select->skip_record(thd) > 0)
|
||||||
@ -1297,4 +1295,3 @@ bool multi_delete::send_eof()
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4149,7 +4149,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
Field::utype type= (Field::utype) MTYP_TYPENR(sql_field->unireg_check);
|
Field::utype type= (Field::utype) MTYP_TYPENR(sql_field->unireg_check);
|
||||||
|
|
||||||
if (thd->variables.sql_mode & MODE_NO_ZERO_DATE &&
|
if (thd->variables.sql_mode & MODE_NO_ZERO_DATE &&
|
||||||
!sql_field->def &&
|
!sql_field->def && !sql_field->vcol_info &&
|
||||||
is_timestamp_type(sql_field->sql_type) &&
|
is_timestamp_type(sql_field->sql_type) &&
|
||||||
(sql_field->flags & NOT_NULL_FLAG) &&
|
(sql_field->flags & NOT_NULL_FLAG) &&
|
||||||
(type == Field::NONE || type == Field::TIMESTAMP_UN_FIELD))
|
(type == Field::NONE || type == Field::TIMESTAMP_UN_FIELD))
|
||||||
|
@ -2224,6 +2224,9 @@ void Table_triggers_list::mark_fields_used(trg_event_type event)
|
|||||||
bitmap_set_bit(trigger_table->read_set, trg_field->field_idx);
|
bitmap_set_bit(trigger_table->read_set, trg_field->field_idx);
|
||||||
if (trg_field->get_settable_routine_parameter())
|
if (trg_field->get_settable_routine_parameter())
|
||||||
bitmap_set_bit(trigger_table->write_set, trg_field->field_idx);
|
bitmap_set_bit(trigger_table->write_set, trg_field->field_idx);
|
||||||
|
if (trigger_table->field[trg_field->field_idx]->vcol_info)
|
||||||
|
trigger_table->mark_virtual_col(trigger_table->
|
||||||
|
field[trg_field->field_idx]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -629,9 +629,7 @@ int mysql_update(THD *thd,
|
|||||||
while (!(error=info.read_record(&info)) && !thd->killed)
|
while (!(error=info.read_record(&info)) && !thd->killed)
|
||||||
{
|
{
|
||||||
if (table->vfield)
|
if (table->vfield)
|
||||||
update_virtual_fields(thd, table,
|
update_virtual_fields(thd, table, VCOL_UPDATE_FOR_READ);
|
||||||
table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_READ);
|
|
||||||
thd->inc_examined_row_count(1);
|
thd->inc_examined_row_count(1);
|
||||||
if (!select || (error= select->skip_record(thd)) > 0)
|
if (!select || (error= select->skip_record(thd)) > 0)
|
||||||
{
|
{
|
||||||
@ -744,9 +742,7 @@ int mysql_update(THD *thd,
|
|||||||
while (!(error=info.read_record(&info)) && !thd->killed)
|
while (!(error=info.read_record(&info)) && !thd->killed)
|
||||||
{
|
{
|
||||||
if (table->vfield)
|
if (table->vfield)
|
||||||
update_virtual_fields(thd, table,
|
update_virtual_fields(thd, table, VCOL_UPDATE_FOR_READ);
|
||||||
table->triggers ? VCOL_UPDATE_ALL :
|
|
||||||
VCOL_UPDATE_FOR_READ);
|
|
||||||
thd->inc_examined_row_count(1);
|
thd->inc_examined_row_count(1);
|
||||||
if (!select || select->skip_record(thd) > 0)
|
if (!select || select->skip_record(thd) > 0)
|
||||||
{
|
{
|
||||||
@ -2399,8 +2395,7 @@ int multi_update::do_updates()
|
|||||||
if (table->default_field && (error= table->update_default_fields()))
|
if (table->default_field && (error= table->update_default_fields()))
|
||||||
goto err2;
|
goto err2;
|
||||||
if (table->vfield &&
|
if (table->vfield &&
|
||||||
update_virtual_fields(thd, table,
|
update_virtual_fields(thd, table, VCOL_UPDATE_FOR_WRITE))
|
||||||
(table->triggers ? VCOL_UPDATE_ALL : VCOL_UPDATE_FOR_WRITE)))
|
|
||||||
goto err2;
|
goto err2;
|
||||||
if ((error= cur_table->view_check_option(thd, ignore)) !=
|
if ((error= cur_table->view_check_option(thd, ignore)) !=
|
||||||
VIEW_CHECK_OK)
|
VIEW_CHECK_OK)
|
||||||
|
13
sql/table.cc
13
sql/table.cc
@ -6686,11 +6686,9 @@ bool is_simple_order(ORDER *order)
|
|||||||
@details
|
@details
|
||||||
The function computes the values of the virtual columns of the table and
|
The function computes the values of the virtual columns of the table and
|
||||||
stores them in the table record buffer.
|
stores them in the table record buffer.
|
||||||
If vcol_update_mode is set to VCOL_UPDATE_ALL then all virtual column are
|
Only fields from vcol_set are computed: all of them, if vcol_update_mode is
|
||||||
computed. Otherwise, only fields from vcol_set are computed: all of them,
|
set to VCOL_UPDATE_FOR_WRITE, and, only those with the stored_in_db flag
|
||||||
if vcol_update_mode is set to VCOL_UPDATE_FOR_WRITE, and, only those with
|
set to false, if vcol_update_mode is equal to VCOL_UPDATE_FOR_READ.
|
||||||
the stored_in_db flag set to false, if vcol_update_mode is equal to
|
|
||||||
VCOL_UPDATE_FOR_READ.
|
|
||||||
|
|
||||||
@retval
|
@retval
|
||||||
0 Success
|
0 Success
|
||||||
@ -6712,9 +6710,8 @@ int update_virtual_fields(THD *thd, TABLE *table,
|
|||||||
{
|
{
|
||||||
vfield= (*vfield_ptr);
|
vfield= (*vfield_ptr);
|
||||||
DBUG_ASSERT(vfield->vcol_info && vfield->vcol_info->expr_item);
|
DBUG_ASSERT(vfield->vcol_info && vfield->vcol_info->expr_item);
|
||||||
if ((bitmap_is_set(table->vcol_set, vfield->field_index) &&
|
if (bitmap_is_set(table->vcol_set, vfield->field_index) &&
|
||||||
(vcol_update_mode == VCOL_UPDATE_FOR_WRITE || !vfield->stored_in_db)) ||
|
(vcol_update_mode == VCOL_UPDATE_FOR_WRITE || !vfield->stored_in_db))
|
||||||
vcol_update_mode == VCOL_UPDATE_ALL)
|
|
||||||
{
|
{
|
||||||
/* Compute the actual value of the virtual fields */
|
/* Compute the actual value of the virtual fields */
|
||||||
error= vfield->vcol_info->expr_item->save_in_field(vfield, 0);
|
error= vfield->vcol_info->expr_item->save_in_field(vfield, 0);
|
||||||
|
@ -315,8 +315,7 @@ enum release_type { RELEASE_NORMAL, RELEASE_WAIT_FOR_DROP };
|
|||||||
enum enum_vcol_update_mode
|
enum enum_vcol_update_mode
|
||||||
{
|
{
|
||||||
VCOL_UPDATE_FOR_READ= 0,
|
VCOL_UPDATE_FOR_READ= 0,
|
||||||
VCOL_UPDATE_FOR_WRITE,
|
VCOL_UPDATE_FOR_WRITE
|
||||||
VCOL_UPDATE_ALL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class Filesort_info
|
class Filesort_info
|
||||||
|
Reference in New Issue
Block a user