From 980aa3e71dfe0284ae8acb3e22852f29aaebd0bd Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 3 Aug 2018 07:55:50 +0400 Subject: [PATCH] MDEV-16888 Add virtual Type_handler::cond_notnull_field_isnull_to_field_eq_zero() --- sql/item_cmpfunc.h | 5 ++--- sql/sql_select.cc | 5 ++--- sql/sql_type.h | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 3b2e58dab89..3336885c036 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -2518,9 +2518,8 @@ public: { Field *field=((Item_field*) args[0]->real_item())->field; - if (((field->type() == MYSQL_TYPE_DATE) || - (field->type() == MYSQL_TYPE_DATETIME)) && - (field->flags & NOT_NULL_FLAG)) + if ((field->flags & NOT_NULL_FLAG) && + field->type_handler()->cond_notnull_field_isnull_to_field_eq_zero()) return true; } return false; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 49bff77b547..80ca1d7da62 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -16360,9 +16360,8 @@ Item_func_isnull::remove_eq_conds(THD *thd, Item::cond_result *cond_value, { Field *field= ((Item_field*) real_item)->field; - if (((field->type() == MYSQL_TYPE_DATE) || - (field->type() == MYSQL_TYPE_DATETIME)) && - (field->flags & NOT_NULL_FLAG)) + if ((field->flags & NOT_NULL_FLAG) && + field->type_handler()->cond_notnull_field_isnull_to_field_eq_zero()) { /* fix to replace 'NULL' dates with '0' (shreeve@uci.edu) */ /* diff --git a/sql/sql_type.h b/sql/sql_type.h index d9989bdbc32..f617a963ca3 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -1399,6 +1399,17 @@ public: { return false; } + /* + Returns true if this data type supports a hack that + WHERE notnull_column IS NULL + finds zero values, e.g.: + WHERE date_notnull_column IS NULL -> + WHERE date_notnull_column = '0000-00-00' + */ + virtual bool cond_notnull_field_isnull_to_field_eq_zero() const + { + return false; + } /** Check whether a field type can be partially indexed by a key. @param type field type @@ -3344,6 +3355,10 @@ public: { return MYSQL_TIMESTAMP_DATE; } + bool cond_notnull_field_isnull_to_field_eq_zero() const + { + return true; + } Item_literal *create_literal_item(THD *thd, const char *str, size_t length, CHARSET_INFO *cs, bool send_error) const; Item *create_typecast_item(THD *thd, Item *item, @@ -3425,6 +3440,10 @@ public: { return MYSQL_TIMESTAMP_DATETIME; } + bool cond_notnull_field_isnull_to_field_eq_zero() const + { + return true; + } Item *create_typecast_item(THD *thd, Item *item, const Type_cast_attributes &attr) const; void Column_definition_implicit_upgrade(Column_definition *c) const;