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;
 |