From 0994dc396e9afe9516fae1b6fa2c707b1164d978 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 9 Sep 2004 19:08:54 +0200 Subject: [PATCH] Fixed BUG#4487: Stored procedure connection aborted if uninitialized char. mysql-test/r/sp.result: New test case for BUG#4487. mysql-test/t/sp.test: New test case for BUG#4487. sql/item_func.h: Propagate null_value properly in sp functions. --- mysql-test/r/sp.result | 13 +++++++++++++ mysql-test/t/sp.test | 12 ++++++++++++ sql/item_func.h | 10 ++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index f0f51945f36..6d743bf5c71 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -1820,6 +1820,19 @@ Ok Ok drop procedure bug5258| drop procedure bug5258_aux| +create function bug4487() returns char +begin +declare v char; +return v; +end| +Warnings: +Warning 1311 Referring to uninitialized variable v +select bug4487()| +bug4487() +NULL +Warnings: +Warning 1311 Referring to uninitialized variable v +drop function bug4487| drop table if exists fac| create table fac (n int unsigned not null primary key, f bigint unsigned)| create procedure ifac(n int unsigned) diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 05d38d25956..1d7efab3841 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -1987,6 +1987,18 @@ call bug5258_aux()| drop procedure bug5258| drop procedure bug5258_aux| +# +# BUG#4487: Stored procedure connection aborted if uninitialized char +# +create function bug4487() returns char +begin + declare v char; + return v; +end| + +select bug4487()| +drop function bug4487| + # # Some "real" examples diff --git a/sql/item_func.h b/sql/item_func.h index 76d0346531e..95d0b3f451c 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1130,25 +1130,31 @@ public: double val() { Item *it; + double d; if (execute(&it)) { null_value= 1; return 0.0; } - return it->val(); + d= it->val(); + null_value= it->null_value; + return d; } String *val_str(String *str) { Item *it; + String *s; if (execute(&it)) { null_value= 1; return NULL; } - return it->val_str(str); + s= it->val_str(str); + null_value= it->null_value; + return s; } void fix_length_and_dec();