Commit b584382f authored by unknown's avatar unknown

Fix for BUG#13037: undefined variable in IF cause erroneous error-message.


mysql-test/r/sp-error.result:
  Results for the test case for BUG#13037.
mysql-test/t/sp-error.test:
  Test case for BUG#13037.
sql/sql_base.cc:
  Polishing: use constant.
sql/sql_class.cc:
  Reset THD::where in THD::cleanup_after_query();
  Polishing: use the constant (THD::DEFAULT_WHERE).
sql/sql_class.h:
  Introduce a constant for the default value of THD::where.
parent a4685abd
...@@ -444,9 +444,9 @@ set b = a; ...@@ -444,9 +444,9 @@ set b = a;
end if; end if;
end| end|
call bug2653_1(1, @b)| 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)| 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_1|
drop procedure bug2653_2| drop procedure bug2653_2|
create procedure bug4344() drop procedure bug4344| create procedure bug4344() drop procedure bug4344|
...@@ -883,3 +883,36 @@ select count(*) into param1 from t3; ...@@ -883,3 +883,36 @@ select count(*) into param1 from t3;
end| end|
ERROR 3D000: No database selected ERROR 3D000: No database selected
use test; 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;
...@@ -1284,6 +1284,60 @@ begin ...@@ -1284,6 +1284,60 @@ begin
end| end|
delimiter ;| delimiter ;|
use test; 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 # BUG#NNNN: New bug synopsis
# #
#--disable_warnings #--disable_warnings
......
...@@ -4272,7 +4272,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array, ...@@ -4272,7 +4272,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
thd->set_query_id=set_query_id; thd->set_query_id=set_query_id;
thd->allow_sum_func= allow_sum_func; 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, To prevent fail on forward lookup we fill it with zerows,
......
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
*/ */
char internal_table_name[2]= "*"; char internal_table_name[2]= "*";
const char * const THD::DEFAULT_WHERE= "field list";
/***************************************************************************** /*****************************************************************************
** Instansiate templates ** Instansiate templates
...@@ -234,7 +236,7 @@ THD::THD() ...@@ -234,7 +236,7 @@ THD::THD()
/* Variables with default values */ /* Variables with default values */
proc_info="login"; proc_info="login";
where="field list"; where= THD::DEFAULT_WHERE;
server_id = ::server_id; server_id = ::server_id;
slave_net = 0; slave_net = 0;
command=COM_CONNECT; command=COM_CONNECT;
...@@ -545,6 +547,8 @@ void THD::cleanup_after_query() ...@@ -545,6 +547,8 @@ void THD::cleanup_after_query()
} }
/* Free Items that were created during this execution */ /* Free Items that were created during this execution */
free_items(); free_items();
/* Reset where. */
where= THD::DEFAULT_WHERE;
} }
/* /*
......
...@@ -1109,6 +1109,14 @@ class THD :public Statement, ...@@ -1109,6 +1109,14 @@ class THD :public Statement,
public Open_tables_state public Open_tables_state
{ {
public: 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 #ifdef EMBEDDED_LIBRARY
struct st_mysql *mysql; struct st_mysql *mysql;
struct st_mysql_data *data; struct st_mysql_data *data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment