diff --git a/sql/field.h b/sql/field.h
index e12dd60c13b7983ccf8507ff2ebf67d5d2466985..3d22c6904a7f8565b8ca9df6a30e1df3a2f05f6b 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -179,7 +179,14 @@ public:
   virtual void make_field(Send_field *)=0;
   virtual void sort_string(char *buff,uint length)=0;
   virtual bool optimize_range(uint idx, uint part);
-  virtual bool store_for_compare() { return 0; }
+  /*
+    This should be true for fields which, when compared with constant
+    items, can be casted to longlong. In this case we will at 'fix_fields'
+    stage cast the constant items to longlongs and at the execution stage
+    use field->val_int() for comparison.  Used to optimize clauses like
+    'a_column BETWEEN date_const, date_const'.
+  */
+  virtual bool can_be_compared_as_longlong() const { return FALSE; }
   virtual void free() {}
   Field *new_field(MEM_ROOT *root, struct st_table *new_table)
   {
@@ -566,7 +573,7 @@ public:
   void sort_string(char *buff,uint length);
   uint32 pack_length() const { return 8; }
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   uint32 max_length() { return 20; }
   field_cast_enum field_cast_type() { return FIELD_CAST_LONGLONG; }
 };
@@ -694,7 +701,7 @@ public:
   void sort_string(char *buff,uint length);
   uint32 pack_length() const { return 4; }
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   bool zero_pack() const { return 0; }
   void set_time();
   virtual void set_default()
@@ -740,7 +747,7 @@ public:
   String *val_str(String*,String *);
   bool send_binary(Protocol *protocol);
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   field_cast_enum field_cast_type() { return FIELD_CAST_YEAR; }
 };
 
@@ -772,7 +779,7 @@ public:
   void sort_string(char *buff,uint length);
   uint32 pack_length() const { return 4; }
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   bool zero_pack() const { return 1; }
   field_cast_enum field_cast_type() { return FIELD_CAST_DATE; }
 };
@@ -802,7 +809,7 @@ public:
   void sort_string(char *buff,uint length);
   uint32 pack_length() const { return 3; }
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   bool zero_pack() const { return 1; }
   bool get_date(TIME *ltime,uint fuzzydate);
   bool get_time(TIME *ltime);
@@ -839,7 +846,7 @@ public:
   void sort_string(char *buff,uint length);
   uint32 pack_length() const { return 3; }
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   bool zero_pack() const { return 1; }
   field_cast_enum field_cast_type() { return FIELD_CAST_TIME; }
 };
@@ -875,7 +882,7 @@ public:
   void sort_string(char *buff,uint length);
   uint32 pack_length() const { return 8; }
   void sql_type(String &str) const;
-  bool store_for_compare() { return 1; }
+  bool can_be_compared_as_longlong() const { return TRUE; }
   bool zero_pack() const { return 1; }
   bool get_date(TIME *ltime,uint fuzzydate);
   bool get_time(TIME *ltime);
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 8950ad0c59439b4a9a2de2b3f616c5893f6cbf8f..bb1ea09d6bcaa52bfd241967b8969aa3ed7324fe 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -243,7 +243,7 @@ void Item_bool_func2::fix_length_and_dec()
   if (args[0]->type() == FIELD_ITEM)
   {
     Field *field=((Item_field*) args[0])->field;
-    if (field->store_for_compare())
+    if (field->can_be_compared_as_longlong())
     {
       if (convert_constant_item(field,&args[1]))
       {
@@ -256,7 +256,7 @@ void Item_bool_func2::fix_length_and_dec()
   if (args[1]->type() == FIELD_ITEM)
   {
     Field *field=((Item_field*) args[1])->field;
-    if (field->store_for_compare())
+    if (field->can_be_compared_as_longlong())
     {
       if (convert_constant_item(field,&args[0]))
       {
@@ -856,7 +856,7 @@ void Item_func_between::fix_length_and_dec()
   if (args[0]->type() == FIELD_ITEM)
   {
     Field *field=((Item_field*) args[0])->field;
-    if (field->store_for_compare())
+    if (field->can_be_compared_as_longlong())
     {
       if (convert_constant_item(field,&args[1]))
 	cmp_type=INT_RESULT;			// Works for all types.