diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.h | 26 | ||||
-rw-r--r-- | sql/sql_base.cc | 26 |
2 files changed, 35 insertions, 17 deletions
diff --git a/sql/item.h b/sql/item.h index b83b997323d..c910ef9acd4 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1576,7 +1576,14 @@ public: a constant expression. Used in the optimizer to propagate basic constants. */ virtual bool basic_const_item() const { return 0; } - /* + /** + Determines if the expression is allowed as + a virtual column assignment source: + INSERT INTO t1 (vcol) VALUES (10) -> error + INSERT INTO t1 (vcol) VALUES (NULL) -> ok + */ + virtual bool vcol_assignment_allowed_value() const { return false; } + /** Test if "this" is an ORDER position (rather than an expression). Notes: - can be called before fix_fields(). @@ -3591,6 +3598,7 @@ public: collation.set(cs, DERIVATION_IGNORABLE, MY_REPERTOIRE_ASCII); } enum Type type() const { return NULL_ITEM; } + bool vcol_assignment_allowed_value() const { return true; } double val_real(); longlong val_int(); String *val_str(String *str); @@ -3837,6 +3845,21 @@ public: const Type_handler *type_handler() const { return Type_handler_hybrid_field_type::type_handler(); } + bool vcol_assignment_allowed_value() const + { + switch (state) { + case NULL_VALUE: + case DEFAULT_VALUE: + case IGNORE_VALUE: + return true; + case NO_VALUE: + case SHORT_DATA_VALUE: + case LONG_DATA_VALUE: + break; + } + return false; + } + Field::geometry_type get_geometry_type() const { return Type_geometry_attributes::get_geometry_type(); }; @@ -6273,6 +6296,7 @@ public: &null_clex_str), arg(NULL), cached_field(NULL) {} enum Type type() const { return DEFAULT_VALUE_ITEM; } + bool vcol_assignment_allowed_value() const { return arg == NULL; } bool eq(const Item *item, bool binary_cmp) const; bool fix_fields(THD *, Item **); void cleanup(); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 529dd815b51..d00cd4a6e15 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -8463,11 +8463,9 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values, if (table->next_number_field && rfield->field_index == table->next_number_field->field_index) table->auto_increment_field_not_null= TRUE; - Item::Type type= value->type(); const bool skip_sys_field= rfield->vers_sys_field(); // TODO: && !thd->vers_modify_history() [MDEV-16546] if ((rfield->vcol_info || skip_sys_field) && - type != Item::DEFAULT_VALUE_ITEM && - type != Item::NULL_ITEM && + !value->vcol_assignment_allowed_value() && table->s->table_category != TABLE_CATEGORY_TEMPORARY) { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, @@ -8748,20 +8746,16 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values, if (field->field_index == autoinc_index) table->auto_increment_field_not_null= TRUE; - if (unlikely(field->vcol_info) || (vers_sys_field && !ignore_errors)) + if ((unlikely(field->vcol_info) || (vers_sys_field && !ignore_errors)) && + !value->vcol_assignment_allowed_value() && + table->s->table_category != TABLE_CATEGORY_TEMPORARY) { - Item::Type type= value->type(); - if (type != Item::DEFAULT_VALUE_ITEM && - type != Item::NULL_ITEM && - table->s->table_category != TABLE_CATEGORY_TEMPORARY) - { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN, - ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN), - field->field_name.str, table->s->table_name.str); - if (vers_sys_field) - continue; - } + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN, + ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN), + field->field_name.str, table->s->table_name.str); + if (vers_sys_field) + continue; } if (use_value) |