An user assignment variable expression that's evaluated in a logical expression context (Item::val_bool()) can be pre-calculated in a temporary table for GROUP BY. However when the expression value is used after the temp table creation it was re-evaluated instead of being read from the temp table due to a missing val_bool_result() method. Fixed by implementing the method.
This commit is contained in:
parent
ed736379f5
commit
a557509653
@ -430,4 +430,21 @@ CREATE TRIGGER t_after_insert AFTER INSERT ON t1 FOR EACH ROW SET @bug42188 = 10
|
|||||||
INSERT INTO t1 VALUES (1);
|
INSERT INTO t1 VALUES (1);
|
||||||
INSERT INTO t1 VALUES (1);
|
INSERT INTO t1 VALUES (1);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES (0),(0);
|
||||||
|
# BUG#55615 : should not crash
|
||||||
|
SELECT (@a:=(SELECT @a:=1 FROM t1 LIMIT 1)) AND COUNT(1) FROM t1 GROUP BY @a;
|
||||||
|
(@a:=(SELECT @a:=1 FROM t1 LIMIT 1)) AND COUNT(1)
|
||||||
|
1
|
||||||
|
1
|
||||||
|
# BUG#55564 : should not crash
|
||||||
|
SELECT IF(
|
||||||
|
@v:=LEAST((SELECT 1 FROM t1 t2 LEFT JOIN t1 ON (@v) GROUP BY t1.a), a),
|
||||||
|
count(*), 1)
|
||||||
|
FROM t1 GROUP BY a LIMIT 1;
|
||||||
|
IF(
|
||||||
|
@v:=LEAST((SELECT 1 FROM t1 t2 LEFT JOIN t1 ON (@v) GROUP BY t1.a), a),
|
||||||
|
count(*), 1)
|
||||||
|
1
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -328,4 +328,22 @@ INSERT INTO t1 VALUES (1);
|
|||||||
INSERT INTO t1 VALUES (1);
|
INSERT INTO t1 VALUES (1);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #55615: debug assertion after using variable in assignment and
|
||||||
|
# referred to
|
||||||
|
# Bug #55564: crash with user variables, assignments, joins...
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES (0),(0);
|
||||||
|
--echo # BUG#55615 : should not crash
|
||||||
|
SELECT (@a:=(SELECT @a:=1 FROM t1 LIMIT 1)) AND COUNT(1) FROM t1 GROUP BY @a;
|
||||||
|
--echo # BUG#55564 : should not crash
|
||||||
|
SELECT IF(
|
||||||
|
@v:=LEAST((SELECT 1 FROM t1 t2 LEFT JOIN t1 ON (@v) GROUP BY t1.a), a),
|
||||||
|
count(*), 1)
|
||||||
|
FROM t1 GROUP BY a LIMIT 1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -4263,6 +4263,14 @@ longlong Item_func_set_user_var::val_int_result()
|
|||||||
return entry->val_int(&null_value);
|
return entry->val_int(&null_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Item_func_set_user_var::val_bool_result()
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(fixed == 1);
|
||||||
|
check(TRUE);
|
||||||
|
update(); // Store expression
|
||||||
|
return entry->val_int(&null_value) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
String *Item_func_set_user_var::str_result(String *str)
|
String *Item_func_set_user_var::str_result(String *str)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
|
@ -1353,6 +1353,7 @@ public:
|
|||||||
my_decimal *val_decimal(my_decimal *);
|
my_decimal *val_decimal(my_decimal *);
|
||||||
double val_result();
|
double val_result();
|
||||||
longlong val_int_result();
|
longlong val_int_result();
|
||||||
|
bool val_bool_result();
|
||||||
String *str_result(String *str);
|
String *str_result(String *str);
|
||||||
my_decimal *val_decimal_result(my_decimal *);
|
my_decimal *val_decimal_result(my_decimal *);
|
||||||
bool is_null_result();
|
bool is_null_result();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user