Loading sql/field.h +15 −8 Original line number Diff line number Diff line Loading @@ -179,7 +179,14 @@ class Field 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) { Loading Loading @@ -566,7 +573,7 @@ class Field_longlong :public Field_num { 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; } }; Loading Loading @@ -694,7 +701,7 @@ class Field_timestamp :public Field_str { 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() Loading Loading @@ -740,7 +747,7 @@ class Field_year :public Field_tiny { 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; } }; Loading Loading @@ -772,7 +779,7 @@ class Field_date :public Field_str { 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; } }; Loading Loading @@ -802,7 +809,7 @@ class Field_newdate :public Field_str { 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); Loading Loading @@ -839,7 +846,7 @@ class Field_time :public Field_str { 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; } }; Loading Loading @@ -875,7 +882,7 @@ class Field_datetime :public Field_str { 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); Loading sql/item_cmpfunc.cc +3 −3 Original line number Diff line number Diff line Loading @@ -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])) { Loading @@ -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])) { Loading Loading @@ -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. Loading Loading
sql/field.h +15 −8 Original line number Diff line number Diff line Loading @@ -179,7 +179,14 @@ class Field 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) { Loading Loading @@ -566,7 +573,7 @@ class Field_longlong :public Field_num { 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; } }; Loading Loading @@ -694,7 +701,7 @@ class Field_timestamp :public Field_str { 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() Loading Loading @@ -740,7 +747,7 @@ class Field_year :public Field_tiny { 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; } }; Loading Loading @@ -772,7 +779,7 @@ class Field_date :public Field_str { 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; } }; Loading Loading @@ -802,7 +809,7 @@ class Field_newdate :public Field_str { 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); Loading Loading @@ -839,7 +846,7 @@ class Field_time :public Field_str { 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; } }; Loading Loading @@ -875,7 +882,7 @@ class Field_datetime :public Field_str { 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); Loading
sql/item_cmpfunc.cc +3 −3 Original line number Diff line number Diff line Loading @@ -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])) { Loading @@ -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])) { Loading Loading @@ -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. Loading