diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2022-10-17 12:39:25 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2022-10-17 12:39:25 +0200 |
commit | d86ad1f127fdc71e888e2e168b99f561f111a0b2 (patch) | |
tree | df05decbc411609ddb875c371cf2549b0a4aaa26 /sql/table.cc | |
parent | 069552a41d27b44016f54225af1c172b7df4e8bb (diff) | |
parent | f3fddc1b4a3d05167303a87b04be985b17096a46 (diff) | |
download | mariadb-git-d86ad1f127fdc71e888e2e168b99f561f111a0b2.tar.gz |
Merge branch '10.8' into 10.9
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/sql/table.cc b/sql/table.cc index b8397c7b013..96ee700f61c 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8893,12 +8893,28 @@ int TABLE::update_virtual_fields(handler *h, enum_vcol_update_mode update_mode) DBUG_RETURN(in_use->is_error()); } -int TABLE::update_virtual_field(Field *vf) +/* + Calculate the virtual field value for a specified field. + @param vf A field to calculate + @param ignore_warnings Ignore the warnings and also make the + calculations permissive. This usually means + that a calculation is internal and is not + expected to fail. +*/ +int TABLE::update_virtual_field(Field *vf, bool ignore_warnings) { DBUG_ENTER("TABLE::update_virtual_field"); Query_arena backup_arena; Counting_error_handler count_errors; + Suppress_warnings_error_handler warning_handler; in_use->push_internal_handler(&count_errors); + bool abort_on_warning; + if (ignore_warnings) + { + abort_on_warning= in_use->abort_on_warning; + in_use->abort_on_warning= false; + in_use->push_internal_handler(&warning_handler); + } /* TODO: this may impose memory leak until table flush. See comment in @@ -8912,6 +8928,13 @@ int TABLE::update_virtual_field(Field *vf) DBUG_RESTORE_WRITE_SET(vf); in_use->restore_active_arena(expr_arena, &backup_arena); in_use->pop_internal_handler(); + if (ignore_warnings) + { + in_use->abort_on_warning= abort_on_warning; + in_use->pop_internal_handler(); + // This is an internal calculation, we expect it to always succeed + DBUG_ASSERT(count_errors.errors == 0); + } DBUG_RETURN(count_errors.errors); } |