Commit f1906c62 authored by Sergei Golubchik's avatar Sergei Golubchik

Bug#34374: mysql generates incorrect warning

an item was evaluated unnecessary, fix that by checking preconditions before evaluating the item

sql/sql_select.cc:
  an item was evaluated unnecessary, fix that by checking preconditions before evaluating the item
parent 255f8feb
...@@ -494,3 +494,11 @@ SELECT a FROM t1 WHERE MATCH a AGAINST ('+city* of*' IN BOOLEAN MODE); ...@@ -494,3 +494,11 @@ SELECT a FROM t1 WHERE MATCH a AGAINST ('+city* of*' IN BOOLEAN MODE);
a a
City Of God City Of God
DROP TABLE t1; DROP TABLE t1;
create table t1(a text,b date,fulltext index(a))engine=myisam;
insert into t1 set a='water',b='2008-08-04';
select 1 from t1 where match(a) against ('water' in boolean mode) and b>='2008-08-01';
1
1
drop table t1;
show warnings;
Level Code Message
...@@ -418,3 +418,12 @@ SELECT a FROM t1 WHERE MATCH a AGAINST ('+city* of*' IN BOOLEAN MODE); ...@@ -418,3 +418,12 @@ SELECT a FROM t1 WHERE MATCH a AGAINST ('+city* of*' IN BOOLEAN MODE);
DROP TABLE t1; DROP TABLE t1;
# End of 4.1 tests # End of 4.1 tests
#
# bug#34374 - mysql generates incorrect warning
#
create table t1(a text,b date,fulltext index(a))engine=myisam;
insert into t1 set a='water',b='2008-08-04';
select 1 from t1 where match(a) against ('water' in boolean mode) and b>='2008-08-01';
drop table t1;
show warnings;
...@@ -39,8 +39,7 @@ static ulonglong getopt_ull(char *arg, const struct my_option *optp, ...@@ -39,8 +39,7 @@ static ulonglong getopt_ull(char *arg, const struct my_option *optp,
static double getopt_double(char *arg, const struct my_option *optp, int *err); static double getopt_double(char *arg, const struct my_option *optp, int *err);
static void init_variables(const struct my_option *options, static void init_variables(const struct my_option *options,
init_func_p init_one_value); init_func_p init_one_value);
static void init_one_value(const struct my_option *option, uchar* *variable, static void init_one_value(const struct my_option *opt, uchar* *, longlong);
longlong value);
static void fini_one_value(const struct my_option *option, uchar* *variable, static void fini_one_value(const struct my_option *option, uchar* *variable,
longlong value); longlong value);
static int setval(const struct my_option *opts, uchar **value, char *argument, static int setval(const struct my_option *opts, uchar **value, char *argument,
......
...@@ -3547,16 +3547,16 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array, ...@@ -3547,16 +3547,16 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
Item_func *arg0=(Item_func *)(func->arguments()[0]), Item_func *arg0=(Item_func *)(func->arguments()[0]),
*arg1=(Item_func *)(func->arguments()[1]); *arg1=(Item_func *)(func->arguments()[1]);
if (arg1->const_item() && if (arg1->const_item() &&
((functype == Item_func::GE_FUNC && arg1->val_real() > 0) ||
(functype == Item_func::GT_FUNC && arg1->val_real() >=0)) &&
arg0->type() == Item::FUNC_ITEM && arg0->type() == Item::FUNC_ITEM &&
arg0->functype() == Item_func::FT_FUNC) arg0->functype() == Item_func::FT_FUNC &&
((functype == Item_func::GE_FUNC && arg1->val_real() > 0) ||
(functype == Item_func::GT_FUNC && arg1->val_real() >=0)))
cond_func=(Item_func_match *) arg0; cond_func=(Item_func_match *) arg0;
else if (arg0->const_item() && else if (arg0->const_item() &&
((functype == Item_func::LE_FUNC && arg0->val_real() > 0) ||
(functype == Item_func::LT_FUNC && arg0->val_real() >=0)) &&
arg1->type() == Item::FUNC_ITEM && arg1->type() == Item::FUNC_ITEM &&
arg1->functype() == Item_func::FT_FUNC) arg1->functype() == Item_func::FT_FUNC &&
((functype == Item_func::LE_FUNC && arg0->val_real() > 0) ||
(functype == Item_func::LT_FUNC && arg0->val_real() >=0)))
cond_func=(Item_func_match *) arg1; cond_func=(Item_func_match *) arg1;
} }
} }
......
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