Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-14347

CREATE PROCEDURE returns no error when using an unknown variable

Details

    • Bug
    • Status: Closed (View Workflow)
    • Major
    • Resolution: Fixed
    • 5.5(EOL), 10.0(EOL), 10.1(EOL), 10.2(EOL), 10.3(EOL), 10.4(EOL)
    • 10.5.4
    • Stored routines
    • None

    Description

      DELIMITER $$
      CREATE OR REPLACE PROCEDURE p1(a INT)
      BEGIN
        DECLARE res INT DEFAULT 0;
        IF (a < 0) THEN
          SET res=x;
        END IF;
      END;
      $$
      DELIMITER ;
      

      Now if I call the procedure as follows:

      CALL p1(0);
      

      it still returns no errors.

      It only returns an error if the condition in IF evaluates to true:

      call p1(-1);
      

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

      This behavior makes it very difficult to design stored procedures.
      The error should happen during CREATE PROCEDURE time.

      In this context, x can only be a variable. It cannot be a column because no tables are involved.

      Attachments

        Issue Links

          Activity

            bar Alexander Barkov added a comment - - edited

            More examples when an error is not returned:

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1(a INT)
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=(SELECT 1 WHERE unknown);
            END;
            $$
            DELIMITER ;
            

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1(a INT)
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=(SELECT 1 HAVING unknown);
            END;
            $$
            DELIMITER ;
            

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1(a INT)
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=(SELECT 1 GROUP BY unknown);
            END;
            $$
            DELIMITER ;
            

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1(a INT)
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=(SELECT 1 ORDER BY unknown);
            END;
            $$
            DELIMITER ;
            

            bar Alexander Barkov added a comment - - edited More examples when an error is not returned: DELIMITER $$ CREATE OR REPLACE PROCEDURE p1(a INT ) BEGIN DECLARE res INT DEFAULT 0; SET res=( SELECT 1 WHERE unknown); END ; $$ DELIMITER ; DELIMITER $$ CREATE OR REPLACE PROCEDURE p1(a INT ) BEGIN DECLARE res INT DEFAULT 0; SET res=( SELECT 1 HAVING unknown); END ; $$ DELIMITER ; DELIMITER $$ CREATE OR REPLACE PROCEDURE p1(a INT ) BEGIN DECLARE res INT DEFAULT 0; SET res=( SELECT 1 GROUP BY unknown); END ; $$ DELIMITER ; DELIMITER $$ CREATE OR REPLACE PROCEDURE p1(a INT ) BEGIN DECLARE res INT DEFAULT 0; SET res=( SELECT 1 ORDER BY unknown); END ; $$ DELIMITER ;
            bar Alexander Barkov added a comment - - edited

            More examples with TVC when no error is returned:

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1(a INT)
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=(VALUES(xxx));
            END;
            $$
            DELIMITER ;
            

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1(a INT)
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=(VALUES(1) ORDER BY yyy);
              SELECT res;
            END;
            $$
            DELIMITER ;
            

            bar Alexander Barkov added a comment - - edited More examples with TVC when no error is returned: DELIMITER $$ CREATE OR REPLACE PROCEDURE p1(a INT ) BEGIN DECLARE res INT DEFAULT 0; SET res=( VALUES (xxx)); END ; $$ DELIMITER ; DELIMITER $$ CREATE OR REPLACE PROCEDURE p1(a INT ) BEGIN DECLARE res INT DEFAULT 0; SET res=( VALUES (1) ORDER BY yyy); SELECT res; END ; $$ DELIMITER ;
            bar Alexander Barkov added a comment - - edited

            More examples with DEFAULT and VALUE

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1()
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=DEFAULT(unknown);
              SELECT res;
            END;
            $$
            DELIMITER ;
            

            DELIMITER $$
            CREATE OR REPLACE PROCEDURE p1()
            BEGIN
              DECLARE res INT DEFAULT 0;
              SET res=VALUE(unknown);
              SELECT res;
            END;
            $$
            DELIMITER ;
            

            bar Alexander Barkov added a comment - - edited More examples with DEFAULT and VALUE DELIMITER $$ CREATE OR REPLACE PROCEDURE p1() BEGIN DECLARE res INT DEFAULT 0; SET res= DEFAULT (unknown); SELECT res; END ; $$ DELIMITER ; DELIMITER $$ CREATE OR REPLACE PROCEDURE p1() BEGIN DECLARE res INT DEFAULT 0; SET res=VALUE(unknown); SELECT res; END ; $$ DELIMITER ;
            bar Alexander Barkov added a comment - sanja , can you please review a patch? https://github.com/MariaDB/server/commit/06942363ebc847c5cd16f4b8e610451d3c8eeb3f Thanks.

            OK, to push

            sanja Oleksandr Byelkin added a comment - OK, to push

            igor it looks like Item::walk do not check TVC now even if asked to go inside subqueries (see the patch)

            sanja Oleksandr Byelkin added a comment - igor it looks like Item::walk do not check TVC now even if asked to go inside subqueries (see the patch)

            People

              bar Alexander Barkov
              bar Alexander Barkov
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.