mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	It was not possible to use a package body variable as a
fetch target:
CREATE PACKAGE BODY pkg AS
  vc INT := 0;
  FUNCTION f1 RETURN INT AS
    CURSOR cur IS SELECT 1 AS c FROM DUAL;
  BEGIN
    OPEN cur;
    FETCH cur INTO vc; -- this returned "Undeclared variable: vc" error.
    CLOSE cur;
    RETURN vc;
  END;
END;
FETCH assumed that all fetch targets reside of the same sp_rcontext
instance with the cursor. This patch fixes the problem.
Now a cursor and its fetch target can reside in different sp_rcontext
instances.
Details:
- Adding a helper class sp_rcontext_addr
  (a combination of Sp_rcontext_handler pointer and an offset in the rcontext)
- Adding a new class sp_fetch_target deriving from sp_rcontext_addr.
  Fetch targets in "FETCH cur INTO target1, target2 ..." are now collected
  into this structure instead of sp_variable.
  sp_variable cannot be used any more to store fetch targets,
  because it does not have a pointer to Sp_rcontext_handler
  (it only has the current rcontext offset).
- Removing members sp_instr_set members m_rcontext_handler and m_offset.
  Deriving sp_instr_set from sp_rcontext_addr instead.
- Renaming sp_instr_cfetch member  "List<sp_variable> m_varlist"
  to "List<sp_fetch_target> m_fetch_target_list".
- Fixing LEX::sp_add_cfetch() to return the pointer to the
  created sp_fetch_target instance (instead of returning bool).
  This helps to make the grammar in sql_yacc.c simpler
- Renaming LEX::sp_add_cfetch() to LEX::sp_add_instr_cfetch(),
  as `if(sp_add_cfetch())` changed its meaning to the opposite,
  to avoid automatic wrong merge from earlier versions.
- Chaning the "List<sp_variable> *vars" parameter to sp_cursor::fetch
  to have the data type "List<sp_fetch_target> *".
- Changing the data type of "List<sp_variable> &vars" in
  sp_cursor::Select_fetch_into_spvars::send_data_to_variable_list()
  to "List<sp_fetch_target> &".
- Adding THD helper methods get_rcontext() and get_variable().
- Moving the code from sql_yacc.yy into a new LEX method
  LEX::make_fetch_target().
- Simplifying the grammar in sql_yacc.yy using the new LEX method.
  Changing the data type of the bison rule sp_fetch_list from "void"
  to "List<sp_fetch_target> *".
		
	
		
			
				
	
	
		
			20 lines
		
	
	
		
			403 B
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			20 lines
		
	
	
		
			403 B
		
	
	
	
		
			SQL
		
	
	
	
	
	
# Fetching into a PACKAGE BODY variable of the ROW type
 | 
						|
DELIMITER $$;
 | 
						|
CREATE PACKAGE pkg
 | 
						|
  FUNCTION f1() RETURNS TEXT;
 | 
						|
END;
 | 
						|
$$
 | 
						|
CREATE PACKAGE BODY pkg
 | 
						|
  DECLARE vc ROW(p1 INT, p2 INT);
 | 
						|
  FUNCTION f1() RETURNS TEXT
 | 
						|
  BEGIN
 | 
						|
    DECLARE cur CURSOR FOR SELECT 1 AS c1, 2 AS c2 FROM DUAL;
 | 
						|
    OPEN cur;
 | 
						|
    FETCH cur INTO vc;
 | 
						|
    CLOSE cur;
 | 
						|
    RETURN CONCAT(vc.p1, ' ', vc.p2);
 | 
						|
  END;
 | 
						|
END;
 | 
						|
$$
 | 
						|
DELIMITER ;$$
 |