mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Fixed bug#15950: NOW() optimized away in VIEWs
This bug is a side-effect of bug fix #16377. NOW() is optimized in BETWEEN to integer constants to speed up query execution. When view is being created it saves already modified query and thus becomes wrong. The agg_cmp_type() function now substitutes constant result DATE/TIME functions for their results only if the current query isn't CREATE VIEW or SHOW CREATE VIEW.
This commit is contained in:
parent
612c072b13
commit
8364a646a9
3 changed files with 44 additions and 20 deletions
|
@ -2850,3 +2850,10 @@ Tables_in_test
|
|||
t1
|
||||
DROP TABLE t1;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
create table t1 (f1 datetime);
|
||||
create view v1 as select * from t1 where f1 between now() and now() + interval 1 minute;
|
||||
show create view v1;
|
||||
View Create View
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`f1` AS `f1` from `t1` where (`t1`.`f1` between now() and (now() + interval 1 minute))
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
|
|
@ -2718,3 +2718,12 @@ DROP TABLE t1;
|
|||
--disable_warnings
|
||||
DROP VIEW IF EXISTS v1;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Bug #15950: NOW() optimized away in VIEWs
|
||||
#
|
||||
create table t1 (f1 datetime);
|
||||
create view v1 as select * from t1 where f1 between now() and now() + interval 1 minute;
|
||||
show create view v1;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
|
|
@ -125,31 +125,39 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
|
|||
uchar null_byte;
|
||||
Field *field= NULL;
|
||||
|
||||
/* Search for date/time fields/functions */
|
||||
for (i= 0; i < nitems; i++)
|
||||
/*
|
||||
Do not convert items while creating a or showing a view in order
|
||||
to store/display the original query in these cases.
|
||||
*/
|
||||
if (thd->lex->sql_command != SQLCOM_CREATE_VIEW &&
|
||||
thd->lex->sql_command != SQLCOM_SHOW_CREATE)
|
||||
{
|
||||
if (!items[i]->result_as_longlong())
|
||||
/* Search for date/time fields/functions */
|
||||
for (i= 0; i < nitems; i++)
|
||||
{
|
||||
/* Do not convert anything if a string field/function is present */
|
||||
if (!items[i]->const_item() && items[i]->result_type() == STRING_RESULT)
|
||||
if (!items[i]->result_as_longlong())
|
||||
{
|
||||
i= nitems;
|
||||
/* Do not convert anything if a string field/function is present */
|
||||
if (!items[i]->const_item() && items[i]->result_type() == STRING_RESULT)
|
||||
{
|
||||
i= nitems;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ((res= items[i]->real_item()->type()) == Item::FIELD_ITEM &&
|
||||
items[i]->result_type() != INT_RESULT)
|
||||
{
|
||||
field= ((Item_field *)items[i]->real_item())->field;
|
||||
break;
|
||||
}
|
||||
else if (res == Item::FUNC_ITEM)
|
||||
{
|
||||
field= items[i]->tmp_table_field_from_field_type(0);
|
||||
if (field)
|
||||
field->move_field(buff, &null_byte, 0);
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ((res= items[i]->real_item()->type()) == Item::FIELD_ITEM &&
|
||||
items[i]->result_type() != INT_RESULT)
|
||||
{
|
||||
field= ((Item_field *)items[i]->real_item())->field;
|
||||
break;
|
||||
}
|
||||
else if (res == Item::FUNC_ITEM)
|
||||
{
|
||||
field= items[i]->tmp_table_field_from_field_type(0);
|
||||
if (field)
|
||||
field->move_field(buff, &null_byte, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (field)
|
||||
|
|
Loading…
Reference in a new issue