[MDEV-32922] stored procedure outvars not looked up in execute immediate Created: 2023-12-01  Updated: 2023-12-05

Status: Open
Project: MariaDB Server
Component/s: Prepared Statements, Stored routines
Affects Version/s: 10.4.32, 10.11.6
Fix Version/s: 10.4, 10.11

Type: Bug Priority: Major
Reporter: Daniel Black Assignee: Alexander Barkov
Resolution: Unresolved Votes: 0
Labels: None


 Description   

CREATE PROCEDURE `getMax`(IN `cTable` VARCHAR(255), IN `cColumn` VARCHAR(255), OUT nMax INT) DETERMINISTIC
EXECUTE IMMEDIATE CONCAT('SELECT MAX(', cColumn, ') INTO nMax FROM ', cTable);
Query OK, 0 rows affected (0.001 sec)
 
call getMax('seq_1_to_100', 'seq', @max);
ERROR 1327 (42000): Undeclared variable: nMax



 Comments   
Comment by Alexander Barkov [ 2023-12-05 ]

Variables are not seen inside prepared statements.

  • Neither OUT:

    CREATE OR REPLACE PROCEDURE p1 (IN v1 VARCHAR(255), OUT v2 INT) DETERMINISTIC
    	EXECUTE IMMEDIATE 'SELECT CONCAT(v1, v2)';
    CALL p1('a',@b);
    

    ERROR 1054 (42S22): Unknown column 'v1' in 'field list'
    

  • Nor IN variables in INTO clause:

    CREATE OR REPLACE PROCEDURE p1 (IN v1 VARCHAR(255)) DETERMINISTIC
    	EXECUTE IMMEDIATE 'SELECT 1 INTO v1';
    CALL p1('a');
    

    ERROR 1327 (42000): Undeclared variable: v1
    

  • Nor IN variables in other parts of the query:

    CREATE OR REPLACE PROCEDURE p1 (IN v1 VARCHAR(255)) DETERMINISTIC
    	EXECUTE IMMEDIATE 'SELECT v1';
    CALL p1('a');
    

    ERROR 1054 (42S22): Unknown column 'v1' in 'field list'
    

The problem is that EXECUTE IMMEDIATE is just a short for:

  • PREPARE
  • EXECUTE

After the PREPARE step, the prepared statement gets caches in the connection prepared statement list goes out of the context. This explain why variables are not supported.

Variables can be passed as parameters and the EXECUTE step:

CREATE OR REPLACE PROCEDURE p1 (IN v1 VARCHAR(255)) DETERMINISTIC
	EXECUTE IMMEDIATE 'SELECT ?' USING v1;
CALL p1('a');

+---+
| ? |
+---+
| a |
+---+

However, the INTO clause does not support parameters yet:

CREATE OR REPLACE PROCEDURE p1 (IN v1 VARCHAR(255)) DETERMINISTIC
	EXECUTE IMMEDIATE 'SELECT 1 INTO ?' USING v1;
CALL p1('a');

ERROR 1064 (42000): You have an error in your SQL syntax ....near '?'

The workaround is to use the INTO clause directly with the user variable rather than a parameter.

Generated at Thu Feb 08 10:35:02 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.