summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <anozdrin@mysql.com>2005-10-25 13:02:48 +0400
committerunknown <anozdrin@mysql.com>2005-10-25 13:02:48 +0400
commit5ed3b0b3d7d3474823b9d07844b74620d6b6b065 (patch)
treec016532cef6719e53b426f6b3d9f5a4ebcd8c0ba
parent215602cbe39243e9b6421894e11aa52ef576da81 (diff)
downloadmariadb-git-5ed3b0b3d7d3474823b9d07844b74620d6b6b065.tar.gz
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.
-rw-r--r--mysql-test/r/sp-error.result37
-rw-r--r--mysql-test/t/sp-error.test54
-rw-r--r--sql/sql_base.cc2
-rw-r--r--sql/sql_class.cc6
-rw-r--r--sql/sql_class.h8
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;