Commit cbd1bd90 authored by unknown's avatar unknown

Fixed bug #25027.

Blocked evaluation of constant objects of the classes
Item_func_is_null and Item_is_not_null_test at the
prepare phase in the cases when the objects used subqueries. 


mysql-test/r/ps.result:
  Extended test case for bug #25027.
mysql-test/t/ps.test:
  Extended test case for bug #25027.
sql/sql_lex.cc:
  Returned back the assertion in st_select_lex_unit::set_limit,
  removed by the previous commit for this bug.
parent 2f78d5ca
...@@ -1528,5 +1528,12 @@ a ...@@ -1528,5 +1528,12 @@ a
1 1
2 2
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
PREPARE stmt FROM 'SELECT a FROM t1 WHERE (SELECT b FROM t2 limit ?) IS NULL';
SET @arg=1;
EXECUTE stmt USING @arg;
a
1
2
DEALLOCATE PREPARE stmt;
DROP TABLE t1,t2; DROP TABLE t1,t2;
End of 5.0 tests. End of 5.0 tests.
...@@ -1577,8 +1577,13 @@ SELECT a FROM t1 WHERE (SELECT b FROM t2) IS NULL; ...@@ -1577,8 +1577,13 @@ SELECT a FROM t1 WHERE (SELECT b FROM t2) IS NULL;
PREPARE stmt FROM 'SELECT a FROM t1 WHERE (SELECT b FROM t2) IS NULL'; PREPARE stmt FROM 'SELECT a FROM t1 WHERE (SELECT b FROM t2) IS NULL';
EXECUTE stmt; EXECUTE stmt;
DEALLOCATE PREPARE stmt;
PREPARE stmt FROM 'SELECT a FROM t1 WHERE (SELECT b FROM t2 limit ?) IS NULL';
SET @arg=1;
EXECUTE stmt USING @arg;
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE t1,t2; DROP TABLE t1,t2;
--echo End of 5.0 tests. --echo End of 5.0 tests.
...@@ -2990,7 +2990,7 @@ longlong Item_func_isnull::val_int() ...@@ -2990,7 +2990,7 @@ longlong Item_func_isnull::val_int()
Handle optimization if the argument can't be null Handle optimization if the argument can't be null
This has to be here because of the test in update_used_tables(). This has to be here because of the test in update_used_tables().
*/ */
if (!used_tables_cache) if (!used_tables_cache && !with_subselect)
return cached_value; return cached_value;
return args[0]->is_null() ? 1: 0; return args[0]->is_null() ? 1: 0;
} }
...@@ -2999,7 +2999,7 @@ longlong Item_is_not_null_test::val_int() ...@@ -2999,7 +2999,7 @@ longlong Item_is_not_null_test::val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
DBUG_ENTER("Item_is_not_null_test::val_int"); DBUG_ENTER("Item_is_not_null_test::val_int");
if (!used_tables_cache) if (!used_tables_cache && !with_subselect)
{ {
owner->was_null|= (!cached_value); owner->was_null|= (!cached_value);
DBUG_PRINT("info", ("cached :%ld", (long) cached_value)); DBUG_PRINT("info", ("cached :%ld", (long) cached_value));
...@@ -3026,7 +3026,7 @@ void Item_is_not_null_test::update_used_tables() ...@@ -3026,7 +3026,7 @@ void Item_is_not_null_test::update_used_tables()
else else
{ {
args[0]->update_used_tables(); args[0]->update_used_tables();
if (!(used_tables_cache=args[0]->used_tables())) if (!(used_tables_cache=args[0]->used_tables()) && !with_subselect)
{ {
/* Remember if the value is always NULL or never NULL */ /* Remember if the value is always NULL or never NULL */
cached_value= (longlong) !args[0]->is_null(); cached_value= (longlong) !args[0]->is_null();
......
...@@ -1028,7 +1028,8 @@ public: ...@@ -1028,7 +1028,8 @@ public:
else else
{ {
args[0]->update_used_tables(); args[0]->update_used_tables();
if ((const_item_cache= !(used_tables_cache= args[0]->used_tables()))) if ((const_item_cache= !(used_tables_cache= args[0]->used_tables())) &&
!with_subselect)
{ {
/* Remember if the value is always NULL or never NULL */ /* Remember if the value is always NULL or never NULL */
cached_value= (longlong) args[0]->is_null(); cached_value= (longlong) args[0]->is_null();
......
...@@ -1903,6 +1903,7 @@ void st_select_lex_unit::set_limit(SELECT_LEX *sl) ...@@ -1903,6 +1903,7 @@ void st_select_lex_unit::set_limit(SELECT_LEX *sl)
{ {
ha_rows select_limit_val; ha_rows select_limit_val;
DBUG_ASSERT(! thd->stmt_arena->is_stmt_prepare());
select_limit_val= (ha_rows)(sl->select_limit ? sl->select_limit->val_uint() : select_limit_val= (ha_rows)(sl->select_limit ? sl->select_limit->val_uint() :
HA_POS_ERROR); HA_POS_ERROR);
offset_limit_cnt= (ha_rows)(sl->offset_limit ? sl->offset_limit->val_uint() : offset_limit_cnt= (ha_rows)(sl->offset_limit ? sl->offset_limit->val_uint() :
......
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