diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-09-04 09:55:59 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-09-04 10:19:58 +0400 |
commit | 7e08ac0b41b50195aa79f6ac185bc69a91a960ca (patch) | |
tree | 3a399827dc8e6bd89bbb6d142f21eda8bd659119 /sql/field.cc | |
parent | a071e0e029cd7c155cff1054d9f7f8a6aa898620 (diff) | |
parent | ef00ac4c86daf3294c46a45358da636763fb0049 (diff) | |
download | mariadb-git-7e08ac0b41b50195aa79f6ac185bc69a91a960ca.tar.gz |
Merge 10.2 (up to commit ef00ac4c86daf3294c46a45358da636763fb0049) into 10.3
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/sql/field.cc b/sql/field.cc index 29446b9378b..75798999cc1 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1372,6 +1372,46 @@ error: } +void Field::error_generated_column_function_is_not_allowed(THD *thd, + bool error) const +{ + StringBuffer<64> tmp; + vcol_info->expr->print(&tmp, (enum_query_type) + (QT_TO_SYSTEM_CHARSET | + QT_ITEM_IDENT_SKIP_DB_NAMES | + QT_ITEM_IDENT_SKIP_TABLE_NAMES)); + my_error(ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED, + MYF(error ? 0 : ME_JUST_WARNING), + tmp.c_ptr(), vcol_info->get_vcol_type_name(), + const_cast<const char*>(field_name.str)); +} + + +/* + Check if an indexed or a persistent virtual column depends on sql_mode flags + that it cannot handle. + See sql_mode.h for details. +*/ +bool Field::check_vcol_sql_mode_dependency(THD *thd, vcol_init_mode mode) const +{ + DBUG_ASSERT(vcol_info); + if ((flags & PART_KEY_FLAG) != 0 || stored_in_db()) + { + Sql_mode_dependency dep= + vcol_info->expr->value_depends_on_sql_mode() & + Sql_mode_dependency(~0, ~can_handle_sql_mode_dependency_on_store()); + if (dep) + { + bool error= (mode & VCOL_INIT_DEPENDENCY_FAILURE_IS_ERROR) != 0; + error_generated_column_function_is_not_allowed(thd, error); + dep.push_dependency_warnings(thd); + return error; + } + } + return false; +} + + /** Numeric fields base class constructor. */ @@ -1408,6 +1448,12 @@ void Field_num::prepend_zeros(String *value) const } +sql_mode_t Field_num::can_handle_sql_mode_dependency_on_store() const +{ + return MODE_PAD_CHAR_TO_FULL_LENGTH; +} + + Item *Field_num::get_equal_zerofill_const_item(THD *thd, const Context &ctx, Item *const_item) { @@ -5559,6 +5605,12 @@ my_time_t Field_timestampf::get_timestamp(const uchar *pos, /*************************************************************/ +sql_mode_t Field_temporal::can_handle_sql_mode_dependency_on_store() const +{ + return MODE_PAD_CHAR_TO_FULL_LENGTH; +} + + uint Field_temporal::is_equal(Create_field *new_field) { return new_field->type_handler() == type_handler() && @@ -7187,6 +7239,18 @@ longlong Field_string::val_int(void) } +sql_mode_t Field_string::value_depends_on_sql_mode() const +{ + return has_charset() ? MODE_PAD_CHAR_TO_FULL_LENGTH : sql_mode_t(0); +}; + + +sql_mode_t Field_string::can_handle_sql_mode_dependency_on_store() const +{ + return has_charset() ? MODE_PAD_CHAR_TO_FULL_LENGTH : sql_mode_t(0); +} + + String *Field_string::val_str(String *val_buffer __attribute__((unused)), String *val_ptr) { @@ -9072,6 +9136,12 @@ bool Field_geom::load_data_set_null(THD *thd) ** If one uses this string in a number context one gets the type number. ****************************************************************************/ +sql_mode_t Field_enum::can_handle_sql_mode_dependency_on_store() const +{ + return MODE_PAD_CHAR_TO_FULL_LENGTH; +} + + enum ha_base_keytype Field_enum::key_type() const { switch (packlength) { |