summaryrefslogtreecommitdiff
path: root/sql/item.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-12-30 13:03:47 +0100
committerSergei Golubchik <serg@mariadb.org>2017-02-13 18:12:04 +0100
commitcd4dd2b62dda31a4ea1da99ca6732ecb7ee0d628 (patch)
treede21f02863d5dfe94b65b92211f3c730216d9068 /sql/item.cc
parent588eca31e3c60a6778e59e618717396eb5293ebe (diff)
downloadmariadb-git-cd4dd2b62dda31a4ea1da99ca6732ecb7ee0d628.tar.gz
MDEV-10201 Bad results for CREATE TABLE t1 (a INT DEFAULT b, b INT DEFAULT 4)
Optionally do table->update_default_fields() even for INSERT that supposedly provides values for all column. Because these "values" might be DEFAULT, which would need table->update_default_fields() at the end. Also set Item_default_value::used_tables() from the default expression. Non-zero used_field() means that mysql_insert() will initialize all fields to their default values (with restore_record()) even if all columns are later provided with values. Because default expressions may refer to other columns and they must be initialized.
Diffstat (limited to 'sql/item.cc')
-rw-r--r--sql/item.cc18
1 files changed, 13 insertions, 5 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 4ce0b318ed0..a2c59255b55 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -8834,15 +8834,23 @@ bool Item_default_value::send(Protocol *protocol, String *buffer)
int Item_default_value::save_in_field(Field *field_arg, bool no_conversions)
{
if (arg)
- calculate();
- else
{
- return field_arg->save_in_field_default_value(context->error_processor ==
- &view_error_processor);
+ calculate();
+ return Item_field::save_in_field(field_arg, 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);
}
+table_map Item_default_value::used_tables() const
+{
+ if (field && field->default_value && field->default_value->flags)
+ return field->default_value->expr->used_tables();
+ return static_cast<table_map>(0);
+}
/**
This method like the walk method traverses the item tree, but at the