1SET sql_mode=ORACLE; 2# 3# MDEV-10598 sql_mode=ORACLE: Variable declarations can go after cursor declarations 4# 5# 6# Variable after cursor declaration 7# 8CREATE TABLE t1 (a INT); 9insert into t1 values (1); 10insert into t1 values (2); 11CREATE PROCEDURE p1 12AS 13CURSOR c IS SELECT a FROM t1; 14var1 varchar(10); 15BEGIN 16OPEN c; 17fetch c into var1; 18SELECT c%ROWCOUNT,var1; 19close c; 20END; 21$$ 22CALL p1; 23c%ROWCOUNT var1 241 1 25DROP PROCEDURE p1; 26drop table t1; 27# 28# Variable after condition declaration 29# 30CREATE TABLE t1 (col1 INT); 31insert into t1 values (1); 32create unique index t1_col1 on t1 (col1); 33CREATE PROCEDURE p1 34AS 35dup_key CONDITION FOR SQLSTATE '23000'; 36var1 varchar(40); 37CONTINUE HANDLER FOR dup_key 38BEGIN 39var1:='duplicate key in index'; 40END; 41BEGIN 42var1:=''; 43insert into t1 values (1); 44select var1; 45END; 46$$ 47CALL p1; 48var1 49duplicate key in index 50DROP PROCEDURE p1; 51drop table t1; 52# 53# Condition after cursor declaration 54# 55CREATE TABLE t1 (col1 INT); 56insert into t1 values (1); 57create unique index t1_col1 on t1 (col1); 58CREATE PROCEDURE p1 59AS 60var1 varchar(40); 61var2 integer; 62CURSOR c IS SELECT col1 FROM t1; 63dup_key CONDITION FOR SQLSTATE '23000'; 64CONTINUE HANDLER FOR dup_key 65BEGIN 66var1:='duplicate key in index'; 67END; 68BEGIN 69var1:=''; 70insert into t1 values (1); 71SELECT var1; 72END; 73$$ 74CALL p1; 75var1 76duplicate key in index 77DROP PROCEDURE p1; 78drop table t1; 79# 80# Cursor after handler declaration 81# 82CREATE TABLE t1 (col1 INT); 83insert into t1 values (1); 84create unique index t1_col1 on t1 (col1); 85CREATE PROCEDURE p1 86AS 87var1 varchar(40); 88var2 integer; 89dup_key CONDITION FOR SQLSTATE '23000'; 90CONTINUE HANDLER FOR dup_key 91BEGIN 92var1:='duplicate key in index'; 93END; 94CURSOR c IS SELECT col1 FROM t1; 95BEGIN 96var1:=''; 97insert into t1 values (1); 98SELECT var1; 99END; 100$$ 101ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CURSOR c IS SELECT col1 FROM t1; 102BEGIN 103var1:=''; 104insert into t1 values (1); 105S...' at line 10 106drop table t1; 107# 108# Condition after handler declaration 109# 110CREATE TABLE t1 (col1 INT); 111insert into t1 values (1); 112create unique index t1_col1 on t1 (col1); 113CREATE PROCEDURE p1 114AS 115var1 varchar(40); 116var2 integer; 117dup_key CONDITION FOR SQLSTATE '23000'; 118CURSOR c IS SELECT col1 FROM t1; 119CONTINUE HANDLER FOR dup_key 120BEGIN 121var1:='duplicate key in index'; 122END; 123divide_by_zero CONDITION FOR SQLSTATE '22012'; 124BEGIN 125var1:=''; 126insert into t1 values (1); 127SELECT var1; 128END; 129$$ 130ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'divide_by_zero CONDITION FOR SQLSTATE '22012'; 131BEGIN 132var1:=''; 133insert into t1...' at line 11 134drop table t1; 135# 136# Variable after handler declaration 137# 138CREATE TABLE t1 (col1 INT); 139insert into t1 values (1); 140create unique index t1_col1 on t1 (col1); 141CREATE PROCEDURE p1 142AS 143var1 varchar(40); 144var2 integer; 145dup_key CONDITION FOR SQLSTATE '23000'; 146CURSOR c IS SELECT col1 FROM t1; 147CONTINUE HANDLER FOR dup_key 148BEGIN 149var1:='duplicate key in index'; 150END; 151divide_by_zero CONDITION FOR SQLSTATE '22012'; 152BEGIN 153var1:=''; 154insert into t1 values (1); 155SELECT var1; 156END; 157$$ 158ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'divide_by_zero CONDITION FOR SQLSTATE '22012'; 159BEGIN 160var1:=''; 161insert into t1...' at line 11 162drop table t1; 163# 164# Variable after cursor (inner block) 165# 166CREATE TABLE t1 (col1 INT); 167insert into t1 values (1); 168insert into t1 values (2); 169create unique index t1_col1 on t1 (col1); 170CREATE PROCEDURE p1 171AS 172CURSOR c IS SELECT col1 FROM t1; 173var1 varchar(40); 174BEGIN 175OPEN c; 176begin 177declare 178CURSOR c IS SELECT col1 FROM t1 where col1=2; 179var2 integer; 180dup_key CONDITION FOR SQLSTATE '23000'; 181CONTINUE HANDLER FOR dup_key 182BEGIN 183var1:='duplicate key in index'; 184END; 185begin 186OPEN c; 187fetch c into var1; 188SELECT 'inner cursor',var1; 189insert into t1 values (2); 190close c; 191end; 192end; 193SELECT var1; 194fetch c into var1; 195SELECT c%ROWCOUNT,var1; 196begin 197insert into t1 values (2); 198exception when 1062 then 199begin 200SELECT 'dup key caugth'; 201end; 202end; 203close c; 204END; 205$$ 206CALL p1; 207inner cursor var1 208inner cursor 2 209var1 210duplicate key in index 211c%ROWCOUNT var1 2121 1 213dup key caugth 214dup key caugth 215DROP PROCEDURE p1; 216drop table t1; 217# 218# Cursor declaration and row type declaration in same block 219# 220CREATE TABLE t1 (a INT, b VARCHAR(10)); 221insert into t1 values(1,'a'); 222CREATE PROCEDURE p1() 223AS 224CURSOR cur1 IS SELECT a FROM t1; 225rec1 cur1%ROWTYPE; 226BEGIN 227rec1.a:= 10; 228END; 229$$ 230call p1; 231DROP PROCEDURE p1; 232drop table t1; 233# 234# Recursive cursor and cursor%ROWTYPE declarations in the same block 235# 236CREATE PROCEDURE p1 237AS 238a INT:=10; 239b VARCHAR(10):='b0'; 240c DOUBLE:=0.1; 241CURSOR cur1 IS SELECT a, b, c; 242rec1 cur1%ROWTYPE; 243CURSOR cur2 IS SELECT rec1.a + 1 "a", rec1.b||'0' AS b, rec1.c AS c; 244rec2 cur2%ROWTYPE; 245BEGIN 246OPEN cur1; 247FETCH cur1 INTO rec1; 248CLOSE cur1; 249SELECT rec1.a; 250OPEN cur2; 251FETCH cur2 INTO rec2; 252CLOSE cur2; 253SELECT rec2.a; 254CREATE TABLE t2 AS SELECT rec2.a AS a, rec2.b AS b, rec2.c AS c; 255SHOW CREATE TABLE t2; 256DROP TABLE t2; 257END; 258$$ 259CALL p1(); 260rec1.a 26110 262rec2.a 26311 264Table Create Table 265t2 CREATE TABLE "t2" ( 266 "a" bigint(20) DEFAULT NULL, 267 "b" varchar(11) DEFAULT NULL, 268 "c" double DEFAULT NULL 269) 270DROP PROCEDURE p1; 271# 272# MDEV-12916 Wrong column data type for an INT field of a cursor-anchored ROW variable 273# 274CREATE PROCEDURE p1 275AS 276a INT DEFAULT 10; 277CURSOR cur1 IS SELECT a; 278rec1 cur1%ROWTYPE; 279BEGIN 280CREATE TABLE t1 AS SELECT rec1.a; 281SHOW CREATE TABLE t1; 282DROP TABLE t1; 283END; 284$$ 285CALL p1(); 286Table Create Table 287t1 CREATE TABLE "t1" ( 288 "rec1.a" int(11) DEFAULT NULL 289) 290DROP PROCEDURE p1; 291