diff options
-rw-r--r-- | mysql-test/r/default.result | 2 | ||||
-rw-r--r-- | mysql-test/r/function_defaults.result | 29 | ||||
-rw-r--r-- | mysql-test/t/function_defaults.test | 25 | ||||
-rw-r--r-- | sql/field.cc | 27 | ||||
-rw-r--r-- | sql/field.h | 1 | ||||
-rw-r--r-- | sql/item.cc | 4 | ||||
-rw-r--r-- | sql/sql_base.cc | 8 |
7 files changed, 56 insertions, 40 deletions
diff --git a/mysql-test/r/default.result b/mysql-test/r/default.result index c2de5a578f1..f4ef9fcc8c8 100644 --- a/mysql-test/r/default.result +++ b/mysql-test/r/default.result @@ -3372,7 +3372,7 @@ insert into t1 values (b, 5, '5 the value of the DEFAULT(a), that is b'); select * from t1 order by t; a b t 5 5 1 column is omitted -5 5 2 column gets DEFAULT, keyword +4 5 2 column gets DEFAULT, keyword 4 5 3 column gets DEFAULT(a), expression 4 5 4 also expression DEFAULT(0)+0 4 5 5 the value of the DEFAULT(a), that is b diff --git a/mysql-test/r/function_defaults.result b/mysql-test/r/function_defaults.result index 1c63ae17a5d..4a8f64df352 100644 --- a/mysql-test/r/function_defaults.result +++ b/mysql-test/r/function_defaults.result @@ -3116,3 +3116,32 @@ select if(@new = j, 'correct', 'wrong') from t1; if(@new = j, 'correct', 'wrong') correct drop table t1; +create table t1 (a int, b varchar(20) default 'foo'); +insert t1 values (1,'bla'),(2, 'bar'); +select * from t1; +a b +1 bla +2 bar +update t1 set b=default where a=1; +select * from t1; +a b +1 foo +2 bar +drop table t1; +create table t1 ( +a int, +b timestamp default '2010-10-10 10:10:10' on update now(), +c varchar(100) default 'x'); +insert t1 (a) values (1),(2); +select * from t1; +a b c +1 2010-10-10 10:10:10 x +2 2010-10-10 10:10:10 x +set timestamp=unix_timestamp('2011-11-11 11-11-11'); +update t1 set b=default, c=default(b) where a=1; +select * from t1; +a b c +1 2010-10-10 10:10:10 2010-10-10 10:10:10 +2 2010-10-10 10:10:10 x +drop table t1; +set timestamp=default; diff --git a/mysql-test/t/function_defaults.test b/mysql-test/t/function_defaults.test index 1e3e86599e3..dd3ba109b2a 100644 --- a/mysql-test/t/function_defaults.test +++ b/mysql-test/t/function_defaults.test @@ -24,14 +24,14 @@ source 'include/function_defaults.inc'; # MDEV-20403 Assertion `0' or Assertion `btr_validate_index(index, 0)' failed in row_upd_sec_index_entry or error code 126: Index is corrupted upon UPDATE with TIMESTAMP..ON UPDATE # -# ON UPDATE DEFAULT NOW and indexed virtual columns +# ON UPDATE NOW and indexed virtual columns create table t1 (t timestamp, i int, v timestamp as (t) virtual, key(v)); insert t1 (t,i) values ('2006-03-01 23:59:59',1); update t1 set i = 2; check table t1; drop table t1; -# ON UPDATE DEFAULT NOW and triggers +# ON UPDATE NOW and triggers create table t1 (t timestamp, i int); create trigger tr1 before update on t1 for each row set @new:=new.t; insert t1 (t,i) values ('2006-03-01 23:59:59', 1); @@ -46,3 +46,24 @@ insert t1 (i) values (1); update t1, t1 as t2 set t1.i = 2; select if(@new = j, 'correct', 'wrong') from t1; drop table t1; + +# SET xxx=DEFAULT +create table t1 (a int, b varchar(20) default 'foo'); +insert t1 values (1,'bla'),(2, 'bar'); +select * from t1; +update t1 set b=default where a=1; +select * from t1; +drop table t1; + +# ON UPDATE NOW and SET xxx=DEFAULT +create table t1 ( + a int, + b timestamp default '2010-10-10 10:10:10' on update now(), + c varchar(100) default 'x'); +insert t1 (a) values (1),(2); +select * from t1; +set timestamp=unix_timestamp('2011-11-11 11-11-11'); +update t1 set b=default, c=default(b) where a=1; +select * from t1; +drop table t1; +set timestamp=default; diff --git a/sql/field.cc b/sql/field.cc index 30edee0e386..2b1ba0e1372 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -11106,33 +11106,6 @@ key_map Field::get_possible_keys() } -/** - Mark the field as having an explicit default value. - - @param value if available, the value that the field is being set to - - @note - Fields that have an explicit default value should not be updated - automatically via the DEFAULT or ON UPDATE functions. The functions - that deal with data change functionality (INSERT/UPDATE/LOAD), - determine if there is an explicit value for each field before performing - the data change, and call this method to mark the field. - - If the 'value' parameter is NULL, then the field is marked unconditionally - as having an explicit value. If 'value' is not NULL, then it can be further - analyzed to check if it really should count as a value. -*/ - -bool Field::set_explicit_default(Item *value) -{ - if (value->type() == Item::DEFAULT_VALUE_ITEM && - !((Item_default_value*)value)->arg) - return false; - set_has_explicit_value(); - return true; -} - - bool Field::validate_value_in_record_with_warn(THD *thd, const uchar *record) { my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->read_set); diff --git a/sql/field.h b/sql/field.h index 73c36affce0..19a716cfd5d 100644 --- a/sql/field.h +++ b/sql/field.h @@ -990,7 +990,6 @@ public: { return bitmap_is_set(&table->has_value_set, field_index); } - bool set_explicit_default(Item *value); virtual bool binary() const { return 1; } virtual bool zero_pack() const { return 1; } diff --git a/sql/item.cc b/sql/item.cc index 58b00e41fb1..333d71ddf70 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -9010,8 +9010,6 @@ int Item_default_value::save_in_field(Field *field_arg, bool no_conversions) return Item_field::save_in_field(field_arg, no_conversions); } - if (field_arg->default_value && field_arg->default_value->flags) - return 0; // defaut fields will be set later, no need to do it twice return field_arg->save_in_field_default_value(context->error_processor == &view_error_processor); } @@ -9263,7 +9261,7 @@ bool Item_trigger_field::set_value(THD *thd, sp_rcontext * /*ctx*/, Item **it) int err_code= item->save_in_field(field, 0); field->table->copy_blobs= copy_blobs_saved; - field->set_explicit_default(item); + field->set_has_explicit_value(); return err_code < 0; } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index f7f7d50bc85..5e34958bf59 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -8068,7 +8068,7 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values, my_message(ER_UNKNOWN_ERROR, ER_THD(thd, ER_UNKNOWN_ERROR), MYF(0)); goto err; } - rfield->set_explicit_default(value); + rfield->set_has_explicit_value(); } if (update) @@ -8265,7 +8265,6 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values, { List_iterator_fast<Item> v(values); List<TABLE> tbl_list; - bool all_fields_have_values= true; Item *value; Field *field; bool abort_on_warning_saved= thd->abort_on_warning; @@ -8318,11 +8317,8 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values, else if (value->save_in_field(field, 0) < 0) goto err; - all_fields_have_values &= field->set_explicit_default(value); + field->set_has_explicit_value(); } - if (!all_fields_have_values && table->default_field && - table->update_default_fields(ignore_errors)) - goto err; /* Update virtual fields */ thd->abort_on_warning= FALSE; if (table->vfield && |