summaryrefslogtreecommitdiff
path: root/sql/item.h
diff options
context:
space:
mode:
authorAlexey Kopytov <Alexey.Kopytov@Sun.com>2009-12-13 23:29:50 +0300
committerAlexey Kopytov <Alexey.Kopytov@Sun.com>2009-12-13 23:29:50 +0300
commita8cfe3d4f74db680084c3ec8a8b6fbd8f71780d6 (patch)
tree9618da2b288832f2f203077e1254b626a4bd6475 /sql/item.h
parent13f7a81b3781c7e5496874641d35e5b20ff81635 (diff)
downloadmariadb-git-a8cfe3d4f74db680084c3ec8a8b6fbd8f71780d6.tar.gz
Bug #42849: innodb crash with varying time_zone on partitioned
timestamp primary key Since TIMESTAMP values are adjusted by the current time zone settings in both numeric and string contexts, using any expressions involving TIMESTAMP values as a (sub)partitioning function leads to undeterministic behavior of partitioned tables. The effect may vary depending on a storage engine, it can be either incorrect data being retrieved or stored, or an assertion failure. The root cause of this is the fact that the calculated partition ID may differ from a previously calculated ID for the same data due to timezone adjustments of the partitioning expression value. Fixed by disabling any expressions involving TIMESTAMP values to be used in partitioning functions with the follwing two exceptions: 1. Creating or altering into a partitioned table that violates the above rule is not allowed, but opening existing such tables results in a warning rather than an error so that such tables could be fixed. 2. UNIX_TIMESTAMP() is the only way to get a timezone-independent value from a TIMESTAMP column, because it returns the internal representation (a time_t value) of a TIMESTAMP argument verbatim. So UNIX_TIMESTAMP(timestamp_column) is allowed and should be used to fix existing tables if one wants to use TIMESTAMP columns with partitioning.
Diffstat (limited to 'sql/item.h')
-rw-r--r--sql/item.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/sql/item.h b/sql/item.h
index 3dfcd7c2612..4135ff2b097 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -950,6 +950,15 @@ public:
virtual Item *equal_fields_propagator(uchar * arg) { return this; }
virtual bool set_no_const_sub(uchar *arg) { return FALSE; }
virtual Item *replace_equal_field(uchar * arg) { return this; }
+ /*
+ Check if an expression value depends on the current timezone. Used by
+ partitioning code to reject timezone-dependent expressions in a
+ (sub)partitioning function.
+ */
+ virtual bool is_timezone_dependent_processor(uchar *bool_arg)
+ {
+ return FALSE;
+ }
/*
For SP local variable returns pointer to Item representing its