mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
All functions now use the same function to aggregate comparison
and result types
This commit is contained in:
@@ -7,7 +7,7 @@ select 1 | NULL,1 & NULL,1+NULL,1-NULL;
|
|||||||
NULL NULL NULL NULL
|
NULL NULL NULL NULL
|
||||||
select NULL=NULL,NULL<>NULL,IFNULL(NULL,1.1)+0,IFNULL(NULL,1) | 0;
|
select NULL=NULL,NULL<>NULL,IFNULL(NULL,1.1)+0,IFNULL(NULL,1) | 0;
|
||||||
NULL=NULL NULL<>NULL IFNULL(NULL,1.1)+0 IFNULL(NULL,1) | 0
|
NULL=NULL NULL<>NULL IFNULL(NULL,1.1)+0 IFNULL(NULL,1) | 0
|
||||||
NULL NULL 1 1
|
NULL NULL 1.1 1
|
||||||
select strcmp("a",NULL),(1<NULL)+0.0,NULL regexp "a",null like "a%","a%" like null;
|
select strcmp("a",NULL),(1<NULL)+0.0,NULL regexp "a",null like "a%","a%" like null;
|
||||||
strcmp("a",NULL) (1<NULL)+0.0 NULL regexp "a" null like "a%" "a%" like null
|
strcmp("a",NULL) (1<NULL)+0.0 NULL regexp "a" null like "a%" "a%" like null
|
||||||
NULL NULL NULL NULL NULL
|
NULL NULL NULL NULL NULL
|
||||||
|
@@ -24,6 +24,32 @@
|
|||||||
#include "mysql_priv.h"
|
#include "mysql_priv.h"
|
||||||
#include <m_ctype.h>
|
#include <m_ctype.h>
|
||||||
|
|
||||||
|
static Item_result item_store_type(Item_result a,Item_result b)
|
||||||
|
{
|
||||||
|
if (a == STRING_RESULT || b == STRING_RESULT)
|
||||||
|
return STRING_RESULT;
|
||||||
|
else if (a == REAL_RESULT || b == REAL_RESULT)
|
||||||
|
return REAL_RESULT;
|
||||||
|
else
|
||||||
|
return INT_RESULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void agg_result_type(Item_result *type, Item **items, uint nitems)
|
||||||
|
{
|
||||||
|
uint i;
|
||||||
|
type[0]= items[0]->result_type();
|
||||||
|
for (i=1 ; i < nitems ; i++)
|
||||||
|
type[0]= item_store_type(type[0], items[i]->result_type());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void agg_cmp_type(Item_result *type, Item **items, uint nitems)
|
||||||
|
{
|
||||||
|
uint i;
|
||||||
|
type[0]= items[0]->result_type();
|
||||||
|
for (i=1 ; i < nitems ; i++)
|
||||||
|
type[0]= item_cmp_type(type[0], items[i]->result_type());
|
||||||
|
}
|
||||||
|
|
||||||
static void my_coll_agg_error(DTCollation &c1, DTCollation &c2, const char *fname)
|
static void my_coll_agg_error(DTCollation &c1, DTCollation &c2, const char *fname)
|
||||||
{
|
{
|
||||||
my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
|
my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
|
||||||
@@ -556,10 +582,7 @@ void Item_func_between::fix_length_and_dec()
|
|||||||
*/
|
*/
|
||||||
if (!args[0] || !args[1] || !args[2])
|
if (!args[0] || !args[1] || !args[2])
|
||||||
return;
|
return;
|
||||||
cmp_type=item_cmp_type(args[0]->result_type(),
|
agg_cmp_type(&cmp_type, args, 3);
|
||||||
item_cmp_type(args[1]->result_type(),
|
|
||||||
args[2]->result_type()));
|
|
||||||
|
|
||||||
if (cmp_type == STRING_RESULT &&
|
if (cmp_type == STRING_RESULT &&
|
||||||
agg_arg_collations_for_comparison(cmp_collation, args, 3))
|
agg_arg_collations_for_comparison(cmp_collation, args, 3))
|
||||||
return;
|
return;
|
||||||
@@ -650,28 +673,17 @@ longlong Item_func_between::val_int()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Item_result item_store_type(Item_result a,Item_result b)
|
|
||||||
{
|
|
||||||
if (a == STRING_RESULT || b == STRING_RESULT)
|
|
||||||
return STRING_RESULT;
|
|
||||||
else if (a == REAL_RESULT || b == REAL_RESULT)
|
|
||||||
return REAL_RESULT;
|
|
||||||
else
|
|
||||||
return INT_RESULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Item_func_ifnull::fix_length_and_dec()
|
Item_func_ifnull::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
maybe_null=args[1]->maybe_null;
|
maybe_null=args[1]->maybe_null;
|
||||||
max_length=max(args[0]->max_length,args[1]->max_length);
|
max_length=max(args[0]->max_length,args[1]->max_length);
|
||||||
decimals=max(args[0]->decimals,args[1]->decimals);
|
decimals=max(args[0]->decimals,args[1]->decimals);
|
||||||
if ((cached_result_type=item_store_type(args[0]->result_type(),
|
agg_result_type(&cached_result_type, args, 2);
|
||||||
args[1]->result_type())) !=
|
|
||||||
REAL_RESULT)
|
|
||||||
decimals= 0;
|
|
||||||
if (cached_result_type == STRING_RESULT)
|
if (cached_result_type == STRING_RESULT)
|
||||||
agg_arg_collations(collation, args, arg_count);
|
agg_arg_collations(collation, args, arg_count);
|
||||||
|
else if (cached_result_type != REAL_RESULT)
|
||||||
|
decimals= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -744,19 +756,18 @@ Item_func_if::fix_length_and_dec()
|
|||||||
cached_result_type= arg1_type;
|
cached_result_type= arg1_type;
|
||||||
set_charset(args[1]->charset());
|
set_charset(args[1]->charset());
|
||||||
}
|
}
|
||||||
else if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT)
|
|
||||||
{
|
|
||||||
cached_result_type = STRING_RESULT;
|
|
||||||
if (agg_arg_collations(collation, args+1, 2))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_charset(&my_charset_bin); // Number
|
agg_result_type(&cached_result_type, args+1, 2);
|
||||||
if (arg1_type == REAL_RESULT || arg2_type == REAL_RESULT)
|
if (cached_result_type == STRING_RESULT)
|
||||||
cached_result_type = REAL_RESULT;
|
{
|
||||||
|
if (agg_arg_collations(collation, args+1, 2))
|
||||||
|
return;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
cached_result_type=arg1_type; // Should be INT_RESULT
|
{
|
||||||
|
set_charset(&my_charset_bin); // Number
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -800,7 +811,7 @@ Item_func_nullif::fix_length_and_dec()
|
|||||||
{
|
{
|
||||||
max_length=args[0]->max_length;
|
max_length=args[0]->max_length;
|
||||||
decimals=args[0]->decimals;
|
decimals=args[0]->decimals;
|
||||||
cached_result_type=args[0]->result_type();
|
agg_result_type(&cached_result_type, args, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -984,22 +995,6 @@ double Item_func_case::val()
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void agg_result_type(Item_result *type, Item **items, uint nitems)
|
|
||||||
{
|
|
||||||
uint i;
|
|
||||||
type[0]= items[0]->result_type();
|
|
||||||
for (i=1 ; i < nitems ; i++)
|
|
||||||
type[0]= item_store_type(type[0], items[i]->result_type());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void agg_cmp_type(Item_result *type, Item **items, uint nitems)
|
|
||||||
{
|
|
||||||
uint i;
|
|
||||||
type[0]= items[0]->result_type();
|
|
||||||
for (i=1 ; i < nitems ; i++)
|
|
||||||
type[0]= item_cmp_type(type[0], items[i]->result_type());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Item_func_case::fix_length_and_dec()
|
void Item_func_case::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
Item **agg;
|
Item **agg;
|
||||||
@@ -1109,13 +1104,11 @@ void Item_func_coalesce::fix_length_and_dec()
|
|||||||
{
|
{
|
||||||
max_length= 0;
|
max_length= 0;
|
||||||
decimals= 0;
|
decimals= 0;
|
||||||
cached_result_type = args[0]->result_type();
|
agg_result_type(&cached_result_type, args, arg_count);
|
||||||
for (uint i=0 ; i < arg_count ; i++)
|
for (uint i=0 ; i < arg_count ; i++)
|
||||||
{
|
{
|
||||||
set_if_bigger(max_length,args[i]->max_length);
|
set_if_bigger(max_length,args[i]->max_length);
|
||||||
set_if_bigger(decimals,args[i]->decimals);
|
set_if_bigger(decimals,args[i]->decimals);
|
||||||
cached_result_type=item_store_type(cached_result_type,
|
|
||||||
args[i]->result_type());
|
|
||||||
}
|
}
|
||||||
if (cached_result_type == STRING_RESULT)
|
if (cached_result_type == STRING_RESULT)
|
||||||
agg_arg_collations(collation, args, arg_count);
|
agg_arg_collations(collation, args, arg_count);
|
||||||
|
Reference in New Issue
Block a user