summaryrefslogtreecommitdiff
path: root/sql/table.cc
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2022-10-17 12:39:25 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2022-10-17 12:39:25 +0200
commitd86ad1f127fdc71e888e2e168b99f561f111a0b2 (patch)
treedf05decbc411609ddb875c371cf2549b0a4aaa26 /sql/table.cc
parent069552a41d27b44016f54225af1c172b7df4e8bb (diff)
parentf3fddc1b4a3d05167303a87b04be985b17096a46 (diff)
downloadmariadb-git-d86ad1f127fdc71e888e2e168b99f561f111a0b2.tar.gz
Merge branch '10.8' into 10.9
Diffstat (limited to 'sql/table.cc')
-rw-r--r--sql/table.cc25
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);
}