mirror of
https://github.com/MariaDB/server.git
synced 2025-08-18 17:42:20 +03:00
- Let sp_get_flags_for_command() set sp_head::MULTI_RESULTS for DELETE ... RETURNING, like it does for all statements that return a resultset.
268 lines
4.7 KiB
Plaintext
268 lines
4.7 KiB
Plaintext
drop table if exists t1,t2;
|
|
drop view if exists v1;
|
|
drop procedure if exists p1;
|
|
CREATE TABLE t1 (a int, b varchar(32));
|
|
INSERT INTO t1 VALUES
|
|
(7,'ggggggg'), (1,'a'), (3,'ccc'),
|
|
(4,'dddd'), (1,'A'), (2,'BB'), (4,'DDDD'),
|
|
(5,'EEEEE'), (7,'GGGGGGG'), (2,'bb');
|
|
CREATE TABLE t1c SELECT * FROM t1;
|
|
CREATE TABLE t2 (c int);
|
|
INSERT INTO t2 VALUES
|
|
(4), (5), (7), (1);
|
|
CREATE TABLE t2c SELECT * FROM t2;
|
|
CREATE VIEW v1 AS SELECT a, UPPER(b) FROM t1;
|
|
DELETE FROM t1 WHERE a=2 RETURNING * ;
|
|
a b
|
|
2 BB
|
|
2 bb
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
1 a
|
|
3 ccc
|
|
4 dddd
|
|
1 A
|
|
4 DDDD
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
INSERT INTO t1 VALUES (2,'BB'), (2,'bb');
|
|
DELETE FROM t1 WHERE a=2 RETURNING b;
|
|
b
|
|
bb
|
|
BB
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
1 a
|
|
3 ccc
|
|
4 dddd
|
|
1 A
|
|
4 DDDD
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
DELETE FROM t1 WHERE a=2 RETURNING c;
|
|
ERROR 42S22: Unknown column 'c' in 'field list'
|
|
INSERT INTO t1 VALUES (2,'BB'), (2,'bb');
|
|
DELETE FROM t1 WHERE a=2 RETURNING a, UPPER(b);
|
|
a UPPER(b)
|
|
2 BB
|
|
2 BB
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
1 a
|
|
3 ccc
|
|
4 dddd
|
|
1 A
|
|
4 DDDD
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
INSERT INTO t1 VALUES (2,'BB'), (2,'bb');
|
|
DELETE FROM t1 WHERE a=6 RETURNING b;
|
|
b
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
1 a
|
|
3 ccc
|
|
4 dddd
|
|
1 A
|
|
2 bb
|
|
4 DDDD
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
2 BB
|
|
DELETE FROM t1 WHERE a=2 RETURNING MAX(b);
|
|
ERROR HY000: Invalid use of group function
|
|
DELETE FROM t1 WHERE a < 5 RETURNING a, (SELECT MIN(c) FROM t2 WHERE c=a+1);
|
|
a (SELECT MIN(c) FROM t2 WHERE c=a+1)
|
|
1 NULL
|
|
3 4
|
|
4 5
|
|
1 NULL
|
|
2 NULL
|
|
4 5
|
|
2 NULL
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
DELETE FROM t1;
|
|
INSERT INTO t1 SELECT * FROM t1c;
|
|
DELETE FROM t2 WHERE c < 5
|
|
RETURNING (SELECT GROUP_CONCAT(b) FROM t1 GROUP BY a HAVING a=c);
|
|
(SELECT GROUP_CONCAT(b) FROM t1 GROUP BY a HAVING a=c)
|
|
dddd,DDDD
|
|
a,A
|
|
SELECT * FROM t2;
|
|
c
|
|
5
|
|
7
|
|
DELETE FROM t2;
|
|
INSERT INTO t2 SELECT * FROM t2c;
|
|
CREATE FUNCTION f(arg INT) RETURNS TEXT
|
|
BEGIN
|
|
RETURN (SELECT GROUP_CONCAT(b) FROM t1 WHERE a=arg);
|
|
END|
|
|
DELETE FROM t2 WHERE c < 5 RETURNING f(c);
|
|
f(c)
|
|
dddd,DDDD
|
|
a,A
|
|
SELECT * FROM t2;
|
|
c
|
|
5
|
|
7
|
|
DELETE FROM t2;
|
|
INSERT INTO t2 SELECT * FROM t2c;
|
|
DROP FUNCTION f;
|
|
DELETE FROM v1 WHERE a < 5 RETURNING * ;
|
|
a UPPER(b)
|
|
1 A
|
|
3 CCC
|
|
4 DDDD
|
|
1 A
|
|
2 BB
|
|
4 DDDD
|
|
2 BB
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
DELETE FROM t1;
|
|
INSERT INTO t1 SELECT * FROM t1c;
|
|
CREATE VIEW v11(a,c) AS SELECT a, COUNT(b) FROM t1 GROUP BY a;
|
|
DELETE FROM v11 WHERE a < 5 RETURNING * ;
|
|
ERROR HY000: The target table v11 of the DELETE is not updatable
|
|
DROP VIEW v11;
|
|
PREPARE stmt FROM
|
|
"DELETE FROM t1 WHERE a=2 ORDER BY b LIMIT 1 RETURNING a, UPPER(b)";
|
|
EXECUTE stmt;
|
|
a UPPER(b)
|
|
2 BB
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
1 a
|
|
3 ccc
|
|
4 dddd
|
|
1 A
|
|
4 DDDD
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
2 bb
|
|
EXECUTE stmt;
|
|
a UPPER(b)
|
|
2 BB
|
|
SELECT * FROM t1;
|
|
a b
|
|
7 ggggggg
|
|
1 a
|
|
3 ccc
|
|
4 dddd
|
|
1 A
|
|
4 DDDD
|
|
5 EEEEE
|
|
7 GGGGGGG
|
|
DEALLOCATE PREPARE stmt;
|
|
DELETE FROM t1;
|
|
INSERT INTO t1 SELECT * FROM t1c;
|
|
FLUSH PRIVILEGES;
|
|
CREATE DATABASE mysqltest;
|
|
CREATE TABLE mysqltest.t1 SELECT * FROM t1;
|
|
GRANT DELETE ON mysqltest.* TO mysqltest_1@localhost;
|
|
GRANT SELECT(b) ON mysqltest.t1 TO mysqltest_1@localhost;
|
|
DELETE FROM mysqltest.t1 WHERE a=2 RETURNING b;
|
|
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'a' in table 't1'
|
|
DELETE FROM mysqltest.t1 RETURNING b;
|
|
b
|
|
ggggggg
|
|
a
|
|
ccc
|
|
dddd
|
|
A
|
|
BB
|
|
DDDD
|
|
EEEEE
|
|
GGGGGGG
|
|
bb
|
|
SELECT * FROM mysqltest.t1;
|
|
a b
|
|
INSERT INTO mysqltest.t1 SELECT * FROM t1;
|
|
GRANT SELECT(a) ON mysqltest.t1 TO mysqltest_1@localhost;
|
|
DELETE FROM mysqltest.t1 WHERE a=2 RETURNING b;
|
|
b
|
|
bb
|
|
BB
|
|
SELECT * FROM mysqltest.t1;
|
|
a b
|
|
7 GGGGGGG
|
|
5 EEEEE
|
|
4 DDDD
|
|
1 A
|
|
4 dddd
|
|
3 ccc
|
|
1 a
|
|
7 ggggggg
|
|
INSERT INTO mysqltest.t1 SELECT * FROM t1;
|
|
CREATE VIEW mysqltest.v1(a) AS SELECT a FROM mysqltest.t1;
|
|
GRANT SELECT, INSERT ON mysqltest.t1 TO mysqltest_1@localhost;
|
|
DELETE FROM mysqltest.v1;
|
|
SELECT * FROM mysqltest.t1;
|
|
a b
|
|
INSERT INTO mysqltest.t1 SELECT * FROM t1;
|
|
DELETE FROM mysqltest.v1 RETURNING a;
|
|
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'a' in table 'v1'
|
|
GRANT SELECT ON mysqltest.* TO mysqltest_1@localhost;
|
|
DELETE FROM mysqltest.v1 RETURNING a;
|
|
a
|
|
7
|
|
1
|
|
3
|
|
4
|
|
1
|
|
2
|
|
4
|
|
5
|
|
7
|
|
2
|
|
SELECT * FROM mysqltest.t1;
|
|
a b
|
|
INSERT INTO mysqltest.t1 SELECT * FROM t1;
|
|
DROP DATABASE mysqltest;
|
|
DROP USER mysqltest_1@localhost;
|
|
DROP VIEW v1;
|
|
DROP TABLE t1,t2;
|
|
DROP TABLE t1c,t2c;
|
|
#
|
|
# Bug mdev-4918: DELETE ... RETURNING subquery with more than 1 row
|
|
#
|
|
CREATE TABLE t1 (i1 int);
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
CREATE TABLE t2 (i2 int);
|
|
INSERT INTO t2 VALUES (1),(2);
|
|
DELETE FROM t1 ORDER BY i1 RETURNING ( SELECT i2 FROM t2 );
|
|
ERROR 21000: Subquery returns more than 1 row
|
|
DROP TABLE t1,t2;
|
|
#
|
|
# MDEV-4919: Packets out of order on a SELECT after calling a procedure with DELETE .. RETURNING
|
|
#
|
|
CREATE TABLE t1 (i INT);
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
CREATE PROCEDURE p1 (a INT)
|
|
BEGIN
|
|
DELETE FROM t1 WHERE i = a RETURNING *;
|
|
INSERT INTO t1 VALUES (a);
|
|
END |
|
|
CALL p1(1);
|
|
i
|
|
1
|
|
SELECT * FROM t1;
|
|
i
|
|
1
|
|
2
|
|
DROP PROCEDURE p1;
|
|
DROP TABLE t1;
|