mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
Fixed bug #21698: erroneously a field could be replaced by an
equal constant under any circumstances. In fact this substitution can be allowed if the field is not of a type string or if the field reference serves as an argument of a comparison predicate. mysql-test/r/func_str.result: Added test cases for bug #21698. mysql-test/r/heap_hash.result: Adjusted results after the fix for bug #21198. mysql-test/t/func_str.test: Added test cases for bug #21698. sql/item.cc: Fixed bug #21198. Added a method to check whether a field reference can be substituted for a constant equal to the field. This substitution is allowed if the field is not of a type string or if the field reference serves as an argument of a comparison predicate. sql/item.h: Fixed bug #21698. Added a new virtual transformation method for a item 'compile' with two callback function parameters. Added a new virtual method 'subst_argument_checker' to be used as an amnalyzer method. This method is supposed to set its in/out argument to NULL for the nodes where substitution of a string field for a constant is not valid. sql/item_cmpfunc.cc: Fixed bug #21698. Added an implementation of the compile method for class Item_cond. First it processes the Item_cond node with a callback function and if the latter returns TRUE it proceeds with a transformation performed by another callback function. sql/item_cmpfunc.h: Fixed bug #21698. Added the implementations of 'subst_argument_checker' for the Item_func and Item_cond classes. This method is supposed to set its in/out argument to NULL for the nodes where substitution of a string field for a constant is not valid. Added the declaration of an implementation of the compile method for class Item_cond. First it processes the Item_cond node with a callback function and if the latter returns TRUE it proceeds with a transformation performed by another callback function. sql/item_func.cc: Fixed bug #21698. Added an implementation of the compile method for class Item_func. First it processes the Item_func node with a callback function and if the latter returns TRUE it proceeds with a transformation performed by another callback function. sql/item_func.h: Fixed bug #21698. Added the declaration of the implementation of the compile method for class Item_func. First it processes the Item_func node with a callback function and if the latter returns TRUE it proceeds with a transformation performed by another callback function. sql/sql_select.cc: Fixed bug #21698. Limited the conditions at which a field can be substituted a for an equal constant in a formula. This substitution is allowed if the field is not of a type string or if the field reference serves as an argument of a comparison predicate.
This commit is contained in:
parent
a1d03bd632
commit
8716670229
10 changed files with 247 additions and 24 deletions
18
sql/item.h
18
sql/item.h
|
|
@ -410,7 +410,8 @@ public:
|
|||
};
|
||||
|
||||
|
||||
typedef bool (Item::*Item_processor)(byte *arg);
|
||||
typedef bool (Item::*Item_processor) (byte *arg);
|
||||
typedef bool (Item::*Item_analyzer) (byte **argp);
|
||||
typedef Item* (Item::*Item_transformer) (byte *arg);
|
||||
typedef void (*Cond_traverser) (const Item *item, void *arg);
|
||||
|
||||
|
|
@ -739,6 +740,14 @@ public:
|
|||
return (this->*transformer)(arg);
|
||||
}
|
||||
|
||||
virtual Item* compile(Item_analyzer analyzer, byte **arg_p,
|
||||
Item_transformer transformer, byte *arg_t)
|
||||
{
|
||||
if ((this->*analyzer) (arg_p))
|
||||
return ((this->*transformer) (arg_t));
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual void traverse_cond(Cond_traverser traverser,
|
||||
void *arg, traverse_order order)
|
||||
{
|
||||
|
|
@ -753,6 +762,12 @@ public:
|
|||
virtual bool change_context_processor(byte *context) { return 0; }
|
||||
virtual bool reset_query_id_processor(byte *query_id) { return 0; }
|
||||
virtual bool is_expensive_processor(byte *arg) { return 0; }
|
||||
virtual bool subst_argument_checker(byte **arg)
|
||||
{
|
||||
if (*arg)
|
||||
*arg= NULL;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
virtual Item *equal_fields_propagator(byte * arg) { return this; }
|
||||
virtual Item *set_no_const_sub(byte *arg) { return this; }
|
||||
|
|
@ -1254,6 +1269,7 @@ public:
|
|||
return field->can_be_compared_as_longlong();
|
||||
}
|
||||
Item_equal *find_item_equal(COND_EQUAL *cond_equal);
|
||||
bool subst_argument_checker(byte **arg);
|
||||
Item *equal_fields_propagator(byte *arg);
|
||||
Item *set_no_const_sub(byte *arg);
|
||||
Item *replace_equal_field(byte *arg);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue