1058 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1058 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| -- source include/have_debug.inc
 | |
| 
 | |
| SET sql_mode=ORACLE;
 | |
| 
 | |
| --echo #
 | |
| --echo # Testing exceptions in the top-level blocks
 | |
| --echo #
 | |
| 
 | |
| --echo # No HANDLER declarations, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 RETURN INT
 | |
| AS
 | |
| BEGIN
 | |
|   RETURN 10;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1();
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| --echo # No HANDLER declarations, no code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 ()
 | |
| IS
 | |
| BEGIN
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # No HANDLER declarations, no code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
| EXCEPTION
 | |
|   WHEN 1002 THEN v:=225;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| set @v= 10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # No HANDLER declarations, some code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=224;
 | |
| EXCEPTION
 | |
|   WHEN 1002 THEN v:=225;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| set @v= 10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # Some HANDLER declarations, no code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
|   EXIT HANDLER FOR 1000
 | |
|   BEGIN
 | |
|    v:=123;
 | |
|   END;
 | |
| BEGIN
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| set @v= 10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # Some HANDLER declarations, no code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
|   EXIT HANDLER FOR 1000
 | |
|   BEGIN
 | |
|    v:=123;
 | |
|   END;
 | |
| BEGIN
 | |
| EXCEPTION
 | |
|   WHEN 1002 THEN v:=225;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| set @v= 10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # Some HANDLER declarations, some code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
|   EXIT HANDLER FOR 1000
 | |
|   BEGIN
 | |
|    v:=123;
 | |
|   END;
 | |
| BEGIN
 | |
|   v:=223;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| set @v= 10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # Some HANDLER declarations, some code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT VARCHAR2(20))
 | |
| IS
 | |
|   EXIT HANDLER FOR 1000
 | |
|   BEGIN
 | |
|     v:=123;
 | |
|   END;
 | |
|   CONTINUE HANDLER FOR 1001
 | |
|   BEGIN
 | |
|     SET v=223;
 | |
|   END;
 | |
| BEGIN
 | |
|   v:= 1;
 | |
| EXCEPTION
 | |
|   WHEN 1002 THEN SET v=225;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Testing EXCEPTIONS in internal blocks
 | |
| --echo #
 | |
| 
 | |
| --echo # No HANDLER declarations, no code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   BEGIN
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # No HANDLER declarations, no code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   BEGIN
 | |
|   EXCEPTION
 | |
|     WHEN 20002 THEN v:=335;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # No HANDLER declarations, some code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   BEGIN
 | |
|     v:=223;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # No HANDLER declarations, some code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   BEGIN
 | |
|     v:=223;
 | |
|   EXCEPTION
 | |
|     WHEN 20002 THEN v:=335;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # Some HANDLER declarations, no code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   DECLARE
 | |
|     EXIT HANDLER FOR 1000
 | |
|     BEGIN
 | |
|       v:=323;
 | |
|     END;
 | |
|   BEGIN
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # Some HANDLER declarations, no code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   DECLARE
 | |
|     EXIT HANDLER FOR 1000
 | |
|     BEGIN
 | |
|       v:=323;
 | |
|     END;
 | |
|   BEGIN
 | |
|   EXCEPTION
 | |
|     WHEN 20002 THEN v:=335;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # Some HANDLER declarations, some code, no exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   DECLARE
 | |
|     EXIT HANDLER FOR 1000
 | |
|     BEGIN
 | |
|       v:=323;
 | |
|     END;
 | |
|   BEGIN
 | |
|    v:= 324;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo # Some HANDLER declarations, some code, some exceptions
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (v IN OUT INT)
 | |
| IS
 | |
| BEGIN
 | |
|   v:=123;
 | |
|   DECLARE
 | |
|     EXIT HANDLER FOR 1000
 | |
|     BEGIN
 | |
|       v:=323;
 | |
|     END;
 | |
|   BEGIN
 | |
|     v:= 324;
 | |
|   EXCEPTION WHEN 2002 THEN v:= 325;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| SET @v=10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Testing EXIT statement
 | |
| --echo #
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 RETURN INT
 | |
| IS
 | |
|   i INT := 0;
 | |
| BEGIN
 | |
|   LOOP
 | |
|     i:= i + 1;
 | |
|     IF i >= 5 THEN
 | |
|       EXIT;
 | |
|     END IF;
 | |
|   END LOOP;
 | |
|   RETURN i;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1() FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 RETURN INT
 | |
| IS
 | |
|   i INT := 0;
 | |
| BEGIN
 | |
|   LOOP
 | |
|     i:= i + 1;
 | |
|     EXIT WHEN i >=5;
 | |
|   END LOOP;
 | |
|   RETURN i;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1() FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 RETURN INT
 | |
| IS
 | |
|   i INT := 0;
 | |
| BEGIN
 | |
|   LOOP
 | |
|     BEGIN
 | |
|       i:= i + 1;
 | |
|       IF i >= 5 THEN
 | |
|         EXIT;
 | |
|       END IF;
 | |
|     EXCEPTION
 | |
|       WHEN OTHERS THEN i:= 1000;
 | |
|     END;
 | |
|   END LOOP;
 | |
|   RETURN i;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1() FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1(a IN OUT INT)
 | |
| IS
 | |
|   i INT := 0;
 | |
| BEGIN
 | |
|   LOOP
 | |
|     LOOP
 | |
|       BEGIN
 | |
|         i:= i + 1;
 | |
|         IF i >=5 THEN
 | |
|           EXIT;
 | |
|         END IF;
 | |
|       EXCEPTION
 | |
|         WHEN OTHERS THEN a:=1000;
 | |
|       END;
 | |
|     END LOOP;
 | |
|     i:= i + 100;
 | |
|     EXIT;
 | |
|   END LOOP;
 | |
|   a:= i;
 | |
| EXCEPTION
 | |
|   WHEN OTHERS THEN a:=11;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| set @v= 10;
 | |
| CALL p1(@v);
 | |
| SELECT @v;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # Testing RETURN in procedures
 | |
| DELIMITER /;
 | |
| CREATE PROCEDURE p1 (a IN OUT INT)
 | |
| AS
 | |
| BEGIN
 | |
|   IF a < 10 THEN
 | |
|     BEGIN
 | |
|       a:= a + 1;
 | |
|       RETURN;
 | |
|     END;
 | |
|   END IF;
 | |
|   a:= 200;
 | |
| EXCEPTION
 | |
|   WHEN OTHERS THEN
 | |
|   BEGIN
 | |
|     a:= 100;
 | |
|     RETURN;
 | |
|   END;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo # Testing FOR loop statement
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 (a INT, b INT) RETURN INT
 | |
| AS
 | |
|   total INT := 0;
 | |
| BEGIN
 | |
|   FOR i IN 1 .. a
 | |
|   LOOP
 | |
|     total:= total + i;
 | |
|     IF i = b THEN
 | |
|       EXIT;
 | |
|     END IF;
 | |
|   END LOOP;
 | |
|   RETURN total;
 | |
| END
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(3, 100) FROM DUAL;
 | |
| SELECT f1(3, 2) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 (a INT, b INT) RETURN INT
 | |
| AS
 | |
|   total INT := 0;
 | |
| BEGIN
 | |
|   FOR i IN REVERSE a..1
 | |
|   LOOP
 | |
|     total:= total + i;
 | |
|     IF i = b THEN
 | |
|       EXIT;
 | |
|     END IF;
 | |
|   END LOOP;
 | |
|   RETURN total;
 | |
| END
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(3, 100) FROM DUAL;
 | |
| SELECT f1(3, 2) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| --echo # Testing labeled FOR LOOP statement
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1 (a INT, limita INT, b INT, limitb INT) RETURN INT
 | |
| AS
 | |
|   total INT := 0;
 | |
| BEGIN
 | |
|   <<la>>
 | |
|   FOR ia IN 1 .. a
 | |
|   LOOP
 | |
|     total:= total + 1000;
 | |
|     <<lb>>
 | |
|     FOR ib IN 1 .. b
 | |
|     LOOP
 | |
|       total:= total + 1;
 | |
|       EXIT lb WHEN ib = limitb;
 | |
|       EXIT la WHEN ia = limita;
 | |
|     END LOOP lb;
 | |
|   END LOOP la;
 | |
|   RETURN total;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(2, 1, 2, 2) FROM DUAL;
 | |
| SELECT f1(2, 2, 2, 2) FROM DUAL;
 | |
| SELECT f1(2, 3, 2, 3) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| --echo # Testing labeled ITERATE in a labeled FOR LOOP
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1(a INT) RETURN INT
 | |
| AS
 | |
|   total INT:= 0;
 | |
| BEGIN
 | |
|   <<li>>
 | |
|   FOR i IN 1 .. a
 | |
|   LOOP
 | |
|     total:= total + 1000;
 | |
|     IF i = 5 THEN
 | |
|       ITERATE li;
 | |
|     END IF;
 | |
|     total:= total + 1;
 | |
|   END LOOP;
 | |
|   RETURN total;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1(a INT) RETURN INT
 | |
| AS
 | |
|   total INT:= 0;
 | |
| BEGIN
 | |
|   <<li>>
 | |
|   FOR i IN 1 .. a
 | |
|   LOOP
 | |
|     FOR j IN 1 .. 2
 | |
|     LOOP
 | |
|       total:= total + 1000;
 | |
|       IF i = 5 THEN
 | |
|         ITERATE li;
 | |
|       END IF;
 | |
|       total:= total + 1;
 | |
|     END LOOP;
 | |
|   END LOOP;
 | |
|   RETURN total;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1(a INT) RETURN INT
 | |
| AS
 | |
|   total INT:= 0;
 | |
| BEGIN
 | |
|   <<lj>>
 | |
|   FOR j IN 1 .. 2
 | |
|   LOOP
 | |
|     <<li>>
 | |
|     FOR i IN 1 .. a
 | |
|     LOOP
 | |
|       total:= total + 1000;
 | |
|       IF i = 5 THEN
 | |
|         ITERATE li;
 | |
|       END IF;
 | |
|       total:= total + 1;
 | |
|     END LOOP;
 | |
|   END LOOP;
 | |
|   RETURN total;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| --echo # Testing CONTINUE statement
 | |
| 
 | |
| DELIMITER /;
 | |
| CREATE FUNCTION f1(a INT) RETURN INT
 | |
| AS
 | |
|   total INT:= 0;
 | |
| BEGIN
 | |
|   FOR i IN 1 .. a
 | |
|   LOOP
 | |
|     CONTINUE WHEN i=5;
 | |
|     total:= total + 1;
 | |
|   END LOOP;
 | |
|   RETURN total;
 | |
| END;
 | |
| /
 | |
| DELIMITER ;/
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Start of MDEV-10597 Cursors with parameters
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1(arg_value_a VARCHAR, arg_value_b VARCHAR,
 | |
|                     arg_pattern_a VARCHAR, arg_pattern_b VARCHAR)
 | |
| AS
 | |
|   v_a VARCHAR(10);
 | |
|   v_b VARCHAR(20);
 | |
|   CURSOR c (p_value_a VARCHAR,
 | |
|             p_value_b VARCHAR,
 | |
|             p_pattern_a VARCHAR,
 | |
|             p_pattern_b VARCHAR,
 | |
|             p_limit_a INT,
 | |
|             p_limit_b INT,
 | |
|             p_unused TEXT) IS
 | |
|     (SELECT p_value_a, p_value_b FROM DUAL
 | |
|        WHERE p_value_a LIKE p_pattern_a LIMIT p_limit_a)
 | |
|     UNION
 | |
|     (SELECT p_value_b, p_value_a FROM DUAL
 | |
|        WHERE p_value_b LIKE p_pattern_b LIMIT p_limit_b);
 | |
| BEGIN
 | |
|   OPEN c(arg_value_a, (SELECT arg_value_b),
 | |
|          arg_pattern_a, arg_pattern_b, 100, 101, 'x');
 | |
|   LOOP
 | |
|     FETCH c INTO v_a, v_b;
 | |
|     EXIT WHEN c%NOTFOUND;
 | |
|     SELECT v_a, v_b;
 | |
|   END LOOP;
 | |
|   CLOSE c;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| CALL p1('aaa','bbb','aaa','bbb');
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # End of MDEV-10597 Cursors with parameters
 | |
| --echo #
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-10914 ROW data type for stored routine variables
 | |
| --echo #
 | |
| DELIMITER $$;
 | |
| CREATE FUNCTION f1() RETURN INT
 | |
| AS
 | |
|   a ROW(a INT, b INT);
 | |
| BEGIN
 | |
|   a.b:= 200;
 | |
|   RETURN a.b;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW FUNCTION CODE f1;
 | |
| SELECT f1();
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   rec ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10));
 | |
| BEGIN
 | |
|   rec:= ROW(10,20.123456,30.123,'test');
 | |
|   SELECT rec.a, rec.b, rec.c, rec.d;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   rec ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10)) :=
 | |
|       ROW(10,20.123456,30.123,'test');
 | |
| BEGIN
 | |
|   SELECT rec.a, rec.b, rec.c, rec.d;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   rec1 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10));
 | |
|   rec2 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10));
 | |
| BEGIN
 | |
|   rec1:= ROW(10,20.123456,30.123,'test');
 | |
|   rec2:= rec1;
 | |
|   SELECT rec2.a, rec2.b, rec2.c, rec2.d;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   rec1 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10)) :=
 | |
|        ROW(10,20.123456,30.123,'test');
 | |
|   rec2 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10)) := rec1;
 | |
| BEGIN
 | |
|   SELECT rec2.a, rec2.b, rec2.c, rec2.d;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo #
 | |
| --echo # End of MDEV-10914 ROW data type for stored routine variables
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-12133 sql_mode=ORACLE: table%ROWTYPE in variable declarations
 | |
| --echo #
 | |
| 
 | |
| CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10,2));
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1()
 | |
| AS
 | |
|   rec1 t1%ROWTYPE;
 | |
| BEGIN
 | |
|   rec1.a:= 10;
 | |
|   rec1.b:= 'bbb';
 | |
|   rec1.c:= 10e2;
 | |
|   rec1.d:= 10.12;
 | |
|   rec1.c:= rec1.d;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-12011 sql_mode=ORACLE: cursor%ROWTYPE in variable declarations
 | |
| --echo #
 | |
| CREATE TABLE t1 (a INT, b VARCHAR(10));
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1()
 | |
| AS
 | |
|   CURSOR cur1 IS SELECT * FROM t1;
 | |
|   CURSOR cur2 IS SELECT * FROM t1;
 | |
| BEGIN
 | |
|   DECLARE
 | |
|     rec1,rec2 cur1%ROWTYPE;
 | |
|     rec3 cur2%ROWTYPE;
 | |
|   BEGIN
 | |
|     rec1.a:= 10;
 | |
|     rec1.b:= 'bbb';
 | |
|   END;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-10581 sql_mode=ORACLE: Explicit cursor FOR LOOP
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   CURSOR cur0 IS SELECT 10 AS a, 'b0' AS b;
 | |
|   CURSOR cur1 IS SELECT 10 AS a, 'b0' AS b;
 | |
|   CURSOR cur2 IS SELECT 10 AS a, 'b0' AS b;
 | |
| BEGIN
 | |
|   FOR rec1 IN cur1
 | |
|   LOOP
 | |
|     SELECT rec1.a, rec1.b;
 | |
|     rec1.a:= 11;
 | |
|     rec1.b:= 'b1';
 | |
|     SELECT rec1.a, rec1.b;
 | |
|   END LOOP;
 | |
|   FOR rec0 IN cur0
 | |
|   LOOP
 | |
|     rec0.a:= 10;
 | |
|     rec0.b:='b0';
 | |
|   END LOOP;
 | |
|   FOR rec2 IN cur2
 | |
|   LOOP
 | |
|     rec2.a:= 10;
 | |
|     rec2.b:='b0';
 | |
|   END LOOP;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   CURSOR cur0 IS SELECT 10 AS a, 'b0' AS b;
 | |
| BEGIN
 | |
|   FOR rec0 IN cur0
 | |
|   LOOP
 | |
|     DECLARE
 | |
|       CURSOR cur1 IS SELECT 11 AS a, 'b1' AS b;
 | |
|     BEGIN
 | |
|       rec0.a:= 11;
 | |
|       rec0.b:= 'b0';
 | |
|       FOR rec1 IN cur1
 | |
|       LOOP
 | |
|         rec1.a:= 11;
 | |
|         rec1.b:= 'b1';
 | |
|         DECLARE
 | |
|           CURSOR cur2 IS SELECT 12 AS a, 'b2' AS b;
 | |
|         BEGIN
 | |
|           FOR rec2 IN cur2
 | |
|           LOOP
 | |
|             rec2.a:=12;
 | |
|             rec2.b:='b2';
 | |
|           END LOOP;
 | |
|         END;
 | |
|       END LOOP;
 | |
|     END;
 | |
|   END LOOP;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-12098 sql_mode=ORACLE: Implicit cursor FOR loop
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
| BEGIN
 | |
|   FOR rec1 IN (SELECT 11 AS a, 'b1' AS b)
 | |
|   LOOP
 | |
|     SELECT rec1.a, rec1.b;
 | |
|     rec1.a:= 11;
 | |
|     rec1.b:= 'b1';
 | |
|     SELECT rec1.a, rec1.b;
 | |
|   END LOOP;
 | |
|   FOR rec0 IN (SELECT 10 AS a, 'b0' AS b)
 | |
|   LOOP
 | |
|     rec0.a:= 10;
 | |
|     rec0.b:='b0';
 | |
|   END LOOP;
 | |
|   FOR rec2 IN (SELECT 12 AS a, 'b2' AS b)
 | |
|   LOOP
 | |
|     rec2.a:= 10;
 | |
|     rec2.b:='b0';
 | |
|   END LOOP;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
| BEGIN
 | |
|   FOR rec0 IN (SELECT 10 AS a, 'b0' AS b)
 | |
|   LOOP
 | |
|     rec0.a:= 11;
 | |
|     rec0.b:= 'b0';
 | |
|     FOR rec1 IN (SELECT 11 AS a, 'b1' AS b)
 | |
|     LOOP
 | |
|       rec1.a:= 11;
 | |
|       rec1.b:= 'b1';
 | |
|       FOR rec2 IN (SELECT 12 AS a, 'b2' AS b)
 | |
|       LOOP
 | |
|         rec2.a:=12;
 | |
|         rec2.b:='b2';
 | |
|       END LOOP;
 | |
|     END LOOP;
 | |
|   END LOOP;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-10598 sql_mode=ORACLE: Variable declarations can go after cursor declarations
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo # Cursor declaration and cursor%ROWTYPE declaration in the same block
 | |
| --echo #
 | |
| 
 | |
| CREATE TABLE t1 (a INT, b VARCHAR(10));
 | |
| INSERT INTO t1 VALUES (1,'a');
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1()
 | |
| AS
 | |
|   CURSOR cur1 IS SELECT a FROM t1;
 | |
|   rec1 cur1%ROWTYPE;
 | |
| BEGIN
 | |
|   rec1.a:= 10;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1;
 | |
| DROP PROCEDURE p1;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Recursive cursor and cursor%ROWTYPE declarations in the same block
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1
 | |
| AS
 | |
|   a INT:=10;
 | |
|   CURSOR cur1 IS SELECT a;
 | |
|   rec1 cur1%ROWTYPE;
 | |
|   CURSOR cur2 IS SELECT rec1.a + 1  "a";
 | |
|   rec2 cur2%ROWTYPE;
 | |
| BEGIN
 | |
|   OPEN cur1;
 | |
|   FETCH cur1 INTO rec1;
 | |
|   CLOSE cur1;
 | |
|   SELECT rec1.a;
 | |
|   open cur2;
 | |
|   FETCH cur2 INTO rec2;
 | |
|   CLOSE cur2;
 | |
|   SELECT rec2.a;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1();
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-12441 Variables declared after cursors with parameters lose values
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1() AS
 | |
|   x0 INT:=100;
 | |
|   CURSOR cur(cp1 INT, cp2 INT) IS SELECT cp1+cp2;
 | |
|   x1 INT:=101;
 | |
| BEGIN
 | |
|   OPEN cur(10,11);
 | |
|   CLOSE cur;
 | |
|   SELECT x0, x1;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1();
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1() AS
 | |
|   x0 INT:=100;
 | |
|   CURSOR cur0(cp1 INT, cp2 INT) IS SELECT cp1+cp2;
 | |
|   x1 INT:=101;
 | |
|   CURSOR cur1(cp1 INT, cp2 INT) IS SELECT cp1+cp2;
 | |
|   x2 INT:=102;
 | |
|   CURSOR cur2(cp1 INT, cp2 INT) IS SELECT cp1+cp2;
 | |
|   x3 INT:=103;
 | |
| BEGIN
 | |
|   OPEN cur0(0,1);
 | |
|   CLOSE cur0;
 | |
|   SELECT x0, x1, x2, x3;
 | |
|   OPEN cur1(10,11);
 | |
|   CLOSE cur1;
 | |
|   SELECT x0, x1, x2, x3;
 | |
|   OPEN cur2(20,21);
 | |
|   CLOSE cur2;
 | |
|   SELECT x0, x1, x2, x3;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1();
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| CREATE TABLE t1 (a INT);
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1() AS
 | |
|   x0 INT:=100;
 | |
|   CURSOR cur(cp1 INT, cp2 INT) IS SELECT cp1+cp2;
 | |
|   x1 t1.a%TYPE:=101;
 | |
| BEGIN
 | |
|   OPEN cur(10,11);
 | |
|   CLOSE cur;
 | |
|   SELECT x0, x1;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1();
 | |
| DROP PROCEDURE p1;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1() AS
 | |
|   x0 INT:=100;
 | |
|   CURSOR cur(cp1 INT, cp2 INT) IS SELECT cp1+cp2;
 | |
|   x1 ROW(a INT,b INT):=ROW(101,102);
 | |
| BEGIN
 | |
|   OPEN cur(10,11);
 | |
|   CLOSE cur;
 | |
|   SELECT x0, x1.a, x1.b;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SHOW PROCEDURE CODE p1;
 | |
| CALL p1();
 | |
| DROP PROCEDURE p1;
 | 
