296 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
SET sql_mode=ORACLE;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # MDEV-10598 sql_mode=ORACLE: Variable declarations can go after cursor declarations
 | 
						|
--echo #
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Variable after cursor declaration
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (a INT);
 | 
						|
insert into t1 values (1);
 | 
						|
insert into t1 values (2);
 | 
						|
DELIMITER $$;
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  CURSOR c IS SELECT a FROM t1;
 | 
						|
  var1 varchar(10);
 | 
						|
BEGIN
 | 
						|
  OPEN c;
 | 
						|
  fetch c into var1;
 | 
						|
  SELECT c%ROWCOUNT,var1;
 | 
						|
  close c;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
CALL p1;
 | 
						|
DROP PROCEDURE p1;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Variable after condition declaration
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (col1 INT);
 | 
						|
insert into t1 values (1);
 | 
						|
create unique index t1_col1 on t1 (col1);
 | 
						|
DELIMITER $$;
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  dup_key CONDITION FOR SQLSTATE '23000';
 | 
						|
  var1 varchar(40);
 | 
						|
  CONTINUE HANDLER FOR dup_key
 | 
						|
  BEGIN
 | 
						|
    var1:='duplicate key in index';
 | 
						|
  END;
 | 
						|
BEGIN
 | 
						|
  var1:='';
 | 
						|
  insert into t1 values (1);
 | 
						|
  select var1;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
CALL p1;
 | 
						|
DROP PROCEDURE p1;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Condition after cursor declaration
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (col1 INT);
 | 
						|
insert into t1 values (1);
 | 
						|
create unique index t1_col1 on t1 (col1);
 | 
						|
DELIMITER $$;
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  var1 varchar(40);
 | 
						|
  var2 integer;
 | 
						|
  CURSOR c IS SELECT col1 FROM t1;
 | 
						|
  dup_key CONDITION FOR SQLSTATE '23000';
 | 
						|
  CONTINUE HANDLER FOR dup_key
 | 
						|
  BEGIN
 | 
						|
    var1:='duplicate key in index';
 | 
						|
  END;
 | 
						|
BEGIN
 | 
						|
  var1:='';
 | 
						|
  insert into t1 values (1);
 | 
						|
  SELECT var1;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
CALL p1;
 | 
						|
DROP PROCEDURE p1;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Cursor after handler declaration
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (col1 INT);
 | 
						|
insert into t1 values (1);
 | 
						|
create unique index t1_col1 on t1 (col1);
 | 
						|
DELIMITER $$;
 | 
						|
--error ER_PARSE_ERROR
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  var1 varchar(40);
 | 
						|
  var2 integer;
 | 
						|
  dup_key CONDITION FOR SQLSTATE '23000';
 | 
						|
  CONTINUE HANDLER FOR dup_key
 | 
						|
  BEGIN
 | 
						|
    var1:='duplicate key in index';
 | 
						|
  END;
 | 
						|
  CURSOR c IS SELECT col1 FROM t1;
 | 
						|
BEGIN
 | 
						|
  var1:='';
 | 
						|
  insert into t1 values (1);
 | 
						|
  SELECT var1;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Condition after handler declaration
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (col1 INT);
 | 
						|
insert into t1 values (1);
 | 
						|
create unique index t1_col1 on t1 (col1);
 | 
						|
DELIMITER $$;
 | 
						|
--error ER_PARSE_ERROR
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  var1 varchar(40);
 | 
						|
  var2 integer;
 | 
						|
  dup_key CONDITION FOR SQLSTATE '23000';
 | 
						|
  CURSOR c IS SELECT col1 FROM t1;
 | 
						|
  CONTINUE HANDLER FOR dup_key
 | 
						|
  BEGIN
 | 
						|
    var1:='duplicate key in index';
 | 
						|
  END;
 | 
						|
  divide_by_zero CONDITION FOR SQLSTATE '22012';
 | 
						|
BEGIN
 | 
						|
  var1:='';
 | 
						|
  insert into t1 values (1);
 | 
						|
  SELECT var1;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Variable after handler declaration
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (col1 INT);
 | 
						|
insert into t1 values (1);
 | 
						|
create unique index t1_col1 on t1 (col1);
 | 
						|
DELIMITER $$;
 | 
						|
--error ER_PARSE_ERROR
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  var1 varchar(40);
 | 
						|
  var2 integer;
 | 
						|
  dup_key CONDITION FOR SQLSTATE '23000';
 | 
						|
  CURSOR c IS SELECT col1 FROM t1;
 | 
						|
  CONTINUE HANDLER FOR dup_key
 | 
						|
  BEGIN
 | 
						|
    var1:='duplicate key in index';
 | 
						|
  END;
 | 
						|
  divide_by_zero CONDITION FOR SQLSTATE '22012';
 | 
						|
BEGIN
 | 
						|
  var1:='';
 | 
						|
  insert into t1 values (1);
 | 
						|
  SELECT var1;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Variable after cursor (inner block)
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1 (col1 INT);
 | 
						|
insert into t1 values (1);
 | 
						|
insert into t1 values (2);
 | 
						|
create unique index t1_col1 on t1 (col1);
 | 
						|
DELIMITER $$;
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  CURSOR c IS SELECT col1 FROM t1;
 | 
						|
  var1 varchar(40);
 | 
						|
BEGIN
 | 
						|
  OPEN c;
 | 
						|
  begin
 | 
						|
    declare
 | 
						|
      CURSOR c IS SELECT col1 FROM t1 where col1=2;
 | 
						|
      var2 integer;
 | 
						|
      dup_key CONDITION FOR SQLSTATE '23000';
 | 
						|
      CONTINUE HANDLER FOR dup_key
 | 
						|
      BEGIN
 | 
						|
        var1:='duplicate key in index';
 | 
						|
      END;
 | 
						|
    begin
 | 
						|
      OPEN c;
 | 
						|
      fetch c into var1;
 | 
						|
      SELECT 'inner cursor',var1;
 | 
						|
      insert into t1 values (2);
 | 
						|
      close c;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
  SELECT var1;
 | 
						|
  fetch c into var1;
 | 
						|
  SELECT c%ROWCOUNT,var1;
 | 
						|
  begin
 | 
						|
    insert into t1 values (2);
 | 
						|
  exception when 1062 then
 | 
						|
    begin
 | 
						|
      SELECT 'dup key caugth';
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
  close c;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
CALL p1;
 | 
						|
DROP PROCEDURE p1;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Cursor declaration and row type declaration in 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 ;$$
 | 
						|
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;
 | 
						|
  b VARCHAR(10):='b0';
 | 
						|
  c DOUBLE:=0.1;
 | 
						|
  CURSOR cur1 IS SELECT a, b, c;
 | 
						|
  rec1 cur1%ROWTYPE;
 | 
						|
  CURSOR cur2 IS SELECT rec1.a + 1 "a", rec1.b||'0' AS b, rec1.c AS c;
 | 
						|
  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;
 | 
						|
  CREATE TABLE t2 AS SELECT rec2.a AS a, rec2.b AS b, rec2.c AS c;
 | 
						|
  SHOW CREATE TABLE t2;
 | 
						|
  DROP TABLE t2;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
CALL p1();
 | 
						|
DROP PROCEDURE p1;
 | 
						|
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # MDEV-12916 Wrong column data type for an INT field of a cursor-anchored ROW variable
 | 
						|
--echo #
 | 
						|
 | 
						|
DELIMITER $$;
 | 
						|
CREATE PROCEDURE p1
 | 
						|
AS
 | 
						|
  a INT DEFAULT 10;
 | 
						|
  CURSOR cur1 IS SELECT a;
 | 
						|
  rec1 cur1%ROWTYPE;
 | 
						|
BEGIN
 | 
						|
  CREATE TABLE t1 AS SELECT rec1.a;
 | 
						|
  SHOW CREATE TABLE t1;
 | 
						|
  DROP TABLE t1;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 | 
						|
CALL p1();
 | 
						|
DROP PROCEDURE p1;
 |