Commit 759ebc25 authored by unknown's avatar unknown

item_cmpfunc.cc, type_datetime.result, type_datetime.test, item_cmpfunc.h:

  After merge fix.


sql/item_cmpfunc.cc:
  After merge fix.
sql/item_cmpfunc.h:
  After merge fix.
mysql-test/r/type_datetime.result:
  After merge fix.
mysql-test/t/type_datetime.test:
  After merge fix.
parent 26938810
...@@ -328,8 +328,8 @@ least(cast('01-01-01' as datetime), '01-01-02') + 0 ...@@ -328,8 +328,8 @@ least(cast('01-01-01' as datetime), '01-01-02') + 0
select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed); select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed);
cast(least(cast('01-01-01' as datetime), '01-01-02') as signed) cast(least(cast('01-01-01' as datetime), '01-01-02') as signed)
20010101000000 20010101000000
select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal); select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2));
cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal) cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2))
20010101000000.00 20010101000000.00
DROP PROCEDURE IF EXISTS test27759 ; DROP PROCEDURE IF EXISTS test27759 ;
CREATE PROCEDURE test27759() CREATE PROCEDURE test27759()
......
...@@ -207,7 +207,7 @@ select least(cast('01-01-01' as date), '01-01-02') + 0; ...@@ -207,7 +207,7 @@ select least(cast('01-01-01' as date), '01-01-02') + 0;
select greatest(cast('01-01-01' as date), '01-01-02') + 0; select greatest(cast('01-01-01' as date), '01-01-02') + 0;
select least(cast('01-01-01' as datetime), '01-01-02') + 0; select least(cast('01-01-01' as datetime), '01-01-02') + 0;
select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed); select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed);
select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal); select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2));
--disable_warnings --disable_warnings
DROP PROCEDURE IF EXISTS test27759 ; DROP PROCEDURE IF EXISTS test27759 ;
--enable_warnings --enable_warnings
......
...@@ -3238,6 +3238,12 @@ void Item_func_in::fix_length_and_dec() ...@@ -3238,6 +3238,12 @@ void Item_func_in::fix_length_and_dec()
/* TRUE <=> arguments values will be compared as DATETIMEs. */ /* TRUE <=> arguments values will be compared as DATETIMEs. */
bool compare_as_datetime= FALSE; bool compare_as_datetime= FALSE;
Item *date_arg= 0; Item *date_arg= 0;
uint found_types= 0;
uint type_cnt= 0, i;
Item_result cmp_type= STRING_RESULT;
left_result_type= args[0]->result_type();
if (!(found_types= collect_cmp_types(args, arg_count)))
return;
for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++) for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++)
{ {
...@@ -3247,6 +3253,24 @@ void Item_func_in::fix_length_and_dec() ...@@ -3247,6 +3253,24 @@ void Item_func_in::fix_length_and_dec()
break; break;
} }
} }
for (i= 0; i <= (uint)DECIMAL_RESULT; i++)
{
if (found_types & 1 << i)
{
(type_cnt)++;
cmp_type= (Item_result) i;
}
}
if (type_cnt == 1)
{
if (cmp_type == STRING_RESULT &&
agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV, 1))
return;
arg_types_compatible= TRUE;
}
if (type_cnt == 1)
{
/* /*
When comparing rows create the row comparator object beforehand to ease When comparing rows create the row comparator object beforehand to ease
the DATETIME comparison detection procedure. the DATETIME comparison detection procedure.
...@@ -3263,7 +3287,7 @@ void Item_func_in::fix_length_and_dec() ...@@ -3263,7 +3287,7 @@ void Item_func_in::fix_length_and_dec()
{ {
if (!(cmp= new cmp_item_row)) if (!(cmp= new cmp_item_row))
return; return;
in_item= cmp; cmp_items[ROW_RESULT]= cmp;
} }
cmp->n= args[0]->cols(); cmp->n= args[0]->cols();
cmp->alloc_comparators(); cmp->alloc_comparators();
...@@ -3317,7 +3341,7 @@ void Item_func_in::fix_length_and_dec() ...@@ -3317,7 +3341,7 @@ void Item_func_in::fix_length_and_dec()
if (array) if (array)
cmp= ((in_row*)array)->tmp.comparators + col; cmp= ((in_row*)array)->tmp.comparators + col;
else else
cmp= ((cmp_item_row*)in_item)->comparators + col; cmp= ((cmp_item_row*)cmp_items[ROW_RESULT])->comparators + col;
*cmp= new cmp_item_datetime(date_arg); *cmp= new cmp_item_datetime(date_arg);
/* Reset variables for the next column. */ /* Reset variables for the next column. */
date_arg= 0; date_arg= 0;
...@@ -3328,23 +3352,7 @@ void Item_func_in::fix_length_and_dec() ...@@ -3328,23 +3352,7 @@ void Item_func_in::fix_length_and_dec()
} }
} }
} }
for (i= 0; i <= (uint)DECIMAL_RESULT; i++)
{
if (found_types & 1 << i)
{
(type_cnt)++;
cmp_type= (Item_result) i;
}
}
if (type_cnt == 1)
{
if (cmp_type == STRING_RESULT &&
agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV, 1))
return;
arg_types_compatible= TRUE;
} }
/* /*
Row item with NULLs inside can return NULL or FALSE => Row item with NULLs inside can return NULL or FALSE =>
they can't be processed as static they can't be processed as static
...@@ -3424,17 +3432,8 @@ void Item_func_in::fix_length_and_dec() ...@@ -3424,17 +3432,8 @@ void Item_func_in::fix_length_and_dec()
} }
else else
{ {
if (in_item) if (compare_as_datetime)
{ cmp_items[STRING_RESULT]= new cmp_item_datetime(date_arg);
/*
The row comparator was created at the beginning but only DATETIME
items comparators were initialized. Call store_value() to setup
others.
*/
in_item->store_value(args[0]);
}
else if (compare_as_datetime)
in_item= new cmp_item_datetime(date_arg);
else else
{ {
for (i= 0; i <= (uint) DECIMAL_RESULT; i++) for (i= 0; i <= (uint) DECIMAL_RESULT; i++)
...@@ -3442,9 +3441,10 @@ void Item_func_in::fix_length_and_dec() ...@@ -3442,9 +3441,10 @@ void Item_func_in::fix_length_and_dec()
if (found_types & (1 << i) && !cmp_items[i]) if (found_types & (1 << i) && !cmp_items[i])
{ {
if ((Item_result)i == STRING_RESULT && if ((Item_result)i == STRING_RESULT &&
agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV, 1)) agg_arg_charsets(cmp_collation, args, arg_count,
MY_COLL_CMP_CONV, 1))
return; return;
if (!(cmp_items[i]= if (!cmp_items[i] && !(cmp_items[i]=
cmp_item::get_comparator((Item_result)i, cmp_item::get_comparator((Item_result)i,
cmp_collation.collation))) cmp_collation.collation)))
return; return;
......
...@@ -1186,7 +1186,7 @@ class Item_func_in :public Item_func_opt_neg ...@@ -1186,7 +1186,7 @@ class Item_func_in :public Item_func_opt_neg
*/ */
bool arg_types_compatible; bool arg_types_compatible;
Item_result left_result_type; Item_result left_result_type;
cmp_item *cmp_items[5]; /* One cmp_item for each result type */ cmp_item *cmp_items[6]; /* One cmp_item for each result type */
DTCollation cmp_collation; DTCollation cmp_collation;
Item_func_in(List<Item> &list) Item_func_in(List<Item> &list)
...@@ -1207,7 +1207,7 @@ class Item_func_in :public Item_func_opt_neg ...@@ -1207,7 +1207,7 @@ class Item_func_in :public Item_func_opt_neg
Item_int_func::cleanup(); Item_int_func::cleanup();
delete array; delete array;
array= 0; array= 0;
for (i= 0; i <= (uint)DECIMAL_RESULT; i++) for (i= 0; i <= (uint)DECIMAL_RESULT + 1; i++)
{ {
delete cmp_items[i]; delete cmp_items[i];
cmp_items[i]= 0; cmp_items[i]= 0;
...@@ -1251,35 +1251,7 @@ class in_row :public in_vector ...@@ -1251,35 +1251,7 @@ class in_row :public in_vector
void set(uint pos,Item *item); void set(uint pos,Item *item);
byte *get_value(Item *item); byte *get_value(Item *item);
friend void Item_func_in::fix_length_and_dec(); friend void Item_func_in::fix_length_and_dec();
Item_resul result_type() { return ROW_RESULT; }; Item_result result_type() { return ROW_RESULT; };
};
class cmp_item_row :public cmp_item
{
cmp_item **comparators;
uint n;
public:
cmp_item_row(): comparators(0), n(0) {}
~cmp_item_row();
void store_value(Item *item);
inline void alloc_comparators();
int cmp(Item *arg);
int compare(cmp_item *arg);
cmp_item *make_same();
void store_value_by_template(cmp_item *tmpl, Item *);
friend void Item_func_in::fix_length_and_dec();
};
class in_row :public in_vector
{
cmp_item_row tmp;
public:
in_row(uint elements, Item *);
~in_row();
void set(uint pos,Item *item);
byte *get_value(Item *item);
friend void Item_func_in::fix_length_and_dec();
}; };
/* Functions used by where clause */ /* Functions used by where clause */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment