From 831de41ca6e41e3673900b4c5dcf31921fbcad7f Mon Sep 17 00:00:00 2001 From: "anozdrin@mysql.com" <> Date: Tue, 25 Oct 2005 13:02:48 +0400 Subject: [PATCH] Fix for BUG#13037: undefined variable in IF cause erroneous error-message. --- mysql-test/r/sp-error.result | 37 ++++++++++++++++++++++-- mysql-test/t/sp-error.test | 54 ++++++++++++++++++++++++++++++++++++ sql/sql_base.cc | 2 +- sql/sql_class.cc | 6 +++- sql/sql_class.h | 8 ++++++ 5 files changed, 103 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index 7ee2d168ddd..50ff7ea264a 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -444,9 +444,9 @@ set b = a; end if; end| call bug2653_1(1, @b)| -ERROR 42S22: Unknown column 'aa' in 'order clause' +ERROR 42S22: Unknown column 'aa' in 'field list' call bug2653_2(2, @b)| -ERROR 42S22: Unknown column 'aa' in 'order clause' +ERROR 42S22: Unknown column 'aa' in 'field list' drop procedure bug2653_1| drop procedure bug2653_2| create procedure bug4344() drop procedure bug4344| @@ -883,3 +883,36 @@ select count(*) into param1 from t3; end| ERROR 3D000: No database selected use test; +DROP PROCEDURE IF EXISTS bug13037_p1; +DROP PROCEDURE IF EXISTS bug13037_p2; +DROP PROCEDURE IF EXISTS bug13037_p3; +CREATE PROCEDURE bug13037_p1() +BEGIN +IF bug13037_foo THEN +SELECT 1; +END IF; +END| +CREATE PROCEDURE bug13037_p2() +BEGIN +SET @bug13037_foo = bug13037_bar; +END| +CREATE PROCEDURE bug13037_p3() +BEGIN +SELECT bug13037_foo; +END| + +CALL bug13037_p1(); +ERROR 42S22: Unknown column 'bug13037_foo' in 'field list' +CALL bug13037_p2(); +ERROR 42S22: Unknown column 'bug13037_bar' in 'field list' +CALL bug13037_p3(); +ERROR 42S22: Unknown column 'bug13037_foo' in 'field list' +CALL bug13037_p1(); +ERROR 42S22: Unknown column 'bug13037_foo' in 'field list' +CALL bug13037_p2(); +ERROR 42S22: Unknown column 'bug13037_bar' in 'field list' +CALL bug13037_p3(); +ERROR 42S22: Unknown column 'bug13037_foo' in 'field list' +DROP PROCEDURE bug13037_p1; +DROP PROCEDURE bug13037_p2; +DROP PROCEDURE bug13037_p3; diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index c41be99cb30..e2343cd905c 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -1284,6 +1284,60 @@ begin end| delimiter ;| use test; + + +# +# BUG#13037: undefined variable in IF cause erroneous error-message +# + +--disable_warnings +DROP PROCEDURE IF EXISTS bug13037_p1; +DROP PROCEDURE IF EXISTS bug13037_p2; +DROP PROCEDURE IF EXISTS bug13037_p3; +--enable_warnings + +delimiter |; + +CREATE PROCEDURE bug13037_p1() +BEGIN + IF bug13037_foo THEN + SELECT 1; + END IF; +END| + +CREATE PROCEDURE bug13037_p2() +BEGIN + SET @bug13037_foo = bug13037_bar; +END| + +CREATE PROCEDURE bug13037_p3() +BEGIN + SELECT bug13037_foo; +END| + +delimiter ;| + +--echo + +--error 1054 +CALL bug13037_p1(); +--error 1054 +CALL bug13037_p2(); +--error 1054 +CALL bug13037_p3(); + +--error 1054 +CALL bug13037_p1(); +--error 1054 +CALL bug13037_p2(); +--error 1054 +CALL bug13037_p3(); + +DROP PROCEDURE bug13037_p1; +DROP PROCEDURE bug13037_p2; +DROP PROCEDURE bug13037_p3; + + # BUG#NNNN: New bug synopsis # #--disable_warnings diff --git a/sql/sql_base.cc b/sql/sql_base.cc index d4376a65594..973fbca12f5 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -4272,7 +4272,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array, thd->set_query_id=set_query_id; thd->allow_sum_func= allow_sum_func; - thd->where="field list"; + thd->where= THD::DEFAULT_WHERE; /* To prevent fail on forward lookup we fill it with zerows, diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 609156ef5a8..fc9df020b6c 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -44,6 +44,8 @@ */ char internal_table_name[2]= "*"; +const char * const THD::DEFAULT_WHERE= "field list"; + /***************************************************************************** ** Instansiate templates @@ -234,7 +236,7 @@ THD::THD() /* Variables with default values */ proc_info="login"; - where="field list"; + where= THD::DEFAULT_WHERE; server_id = ::server_id; slave_net = 0; command=COM_CONNECT; @@ -545,6 +547,8 @@ void THD::cleanup_after_query() } /* Free Items that were created during this execution */ free_items(); + /* Reset where. */ + where= THD::DEFAULT_WHERE; } /* diff --git a/sql/sql_class.h b/sql/sql_class.h index 2679143e9a5..7ca168ec518 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1109,6 +1109,14 @@ class THD :public Statement, public Open_tables_state { public: + /* + Constant for THD::where initialization in the beginning of every query. + + It's needed because we do not save/restore THD::where normally during + primary (non subselect) query execution. + */ + static const char * const DEFAULT_WHERE; + #ifdef EMBEDDED_LIBRARY struct st_mysql *mysql; struct st_mysql_data *data;