mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
Part#2 (final): rewritting the code to pass the correct enum_sp_aggregate_type
to the sp_head constructor, so sp_head never changes its aggregation type
later on. The grammar has been simplified and defragmented.
This allowed to check aggregate specific instructions right after
a routine body has been scanned, by calling new LEX methods:
sp_body_finalize_{procedure|function|trigger|event}()
Moving some C++ code from *.yy to a few new helper methods in LEX.
This commit is contained in:
parent
a71d185a9a
commit
5f34513c2a
12 changed files with 567 additions and 275 deletions
|
|
@ -37,7 +37,7 @@ set x=5;
|
|||
fetch group next row;
|
||||
return x+1;
|
||||
end |
|
||||
ERROR HY000: Non-aggregate function contains aggregate specific instructions: (FETCH GROUP NEXT ROW)
|
||||
ERROR HY000: Aggregate specific instruction (FETCH GROUP NEXT ROW) used in a wrong context
|
||||
create aggregate function f1(x INT) returns INT
|
||||
begin
|
||||
declare continue handler for not found return x;
|
||||
|
|
@ -1153,3 +1153,36 @@ i sum(i)
|
|||
NULL 8
|
||||
drop function agg_sum;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
|
||||
#
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
FETCH GROUP NEXT ROW;
|
||||
END;
|
||||
$$
|
||||
ERROR HY000: Aggregate specific instruction (FETCH GROUP NEXT ROW) used in a wrong context
|
||||
BEGIN NOT ATOMIC
|
||||
FETCH GROUP NEXT ROW;
|
||||
END;
|
||||
$$
|
||||
ERROR HY000: Aggregate specific instruction (FETCH GROUP NEXT ROW) used in a wrong context
|
||||
CREATE DEFINER=root@localhost FUNCTION f1() RETURNS INT
|
||||
BEGIN
|
||||
FETCH GROUP NEXT ROW;
|
||||
RETURN 0;
|
||||
END;
|
||||
$$
|
||||
ERROR HY000: Aggregate specific instruction (FETCH GROUP NEXT ROW) used in a wrong context
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TRIGGER tr1
|
||||
AFTER INSERT ON t1 FOR EACH ROW
|
||||
FETCH GROUP NEXT ROW;
|
||||
ERROR HY000: Aggregate specific instruction (FETCH GROUP NEXT ROW) used in a wrong context
|
||||
DROP TABLE t1;
|
||||
CREATE EVENT ev1
|
||||
ON SCHEDULE EVERY 1 HOUR
|
||||
STARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
|
||||
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK
|
||||
DO FETCH GROUP NEXT ROW;
|
||||
ERROR HY000: Aggregate specific instruction (FETCH GROUP NEXT ROW) used in a wrong context
|
||||
|
|
|
|||
|
|
@ -965,3 +965,54 @@ select i, sum(i) from t1 group by i with rollup;
|
|||
# Cleanup
|
||||
drop function agg_sum;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
|
||||
--echo #
|
||||
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_NOT_AGGREGATE_FUNCTION
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
FETCH GROUP NEXT ROW;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_NOT_AGGREGATE_FUNCTION
|
||||
BEGIN NOT ATOMIC
|
||||
FETCH GROUP NEXT ROW;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_NOT_AGGREGATE_FUNCTION
|
||||
CREATE DEFINER=root@localhost FUNCTION f1() RETURNS INT
|
||||
BEGIN
|
||||
FETCH GROUP NEXT ROW;
|
||||
RETURN 0;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
--error ER_NOT_AGGREGATE_FUNCTION
|
||||
CREATE TRIGGER tr1
|
||||
AFTER INSERT ON t1 FOR EACH ROW
|
||||
FETCH GROUP NEXT ROW;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--error ER_NOT_AGGREGATE_FUNCTION
|
||||
CREATE EVENT ev1
|
||||
ON SCHEDULE EVERY 1 HOUR
|
||||
STARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
|
||||
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK
|
||||
DO FETCH GROUP NEXT ROW;
|
||||
|
|
|
|||
|
|
@ -5170,7 +5170,7 @@ RETURN CONCAT(']]>, ', c1, '!');
|
|||
<routines>
|
||||
<routine Function="straße" sql_mode="" character_set_client="utf8" collation_connection="utf8_general_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `straße`( c1 CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `straße`(c1 CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
DETERMINISTIC
|
||||
RETURN CONCAT(']]]]><![CDATA[>, ', c1, '!')
|
||||
]]>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue