| Bug #12903 | upper function does not work inside a function | ||
|---|---|---|---|
| Submitted: | 31 Aug 2005 9:16 | Modified: | 7 Dec 2005 20:41 |
| Reporter: | Rupert Barnes | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Stored Routines | Severity: | S2 (Serious) |
| Version: | 5.0.11 beta | OS: | Linux (Linux, Windows) |
| Assigned to: | Alexander Nozdrin | CPU Architecture: | Any |
[31 Aug 2005 14:01]
Valeriy Kravchuk
Test case (slightly corrected syntax):
delimiter //
create function to_upper (p_param varchar(128)) returns varchar(128)
begin
return upper(p_param);
end;
//
delimiter ;
mysql> select to_upper('abc');
+-----------------+
| to_upper('abc') |
+-----------------+
| abc |
+-----------------+
1 row in set (0.00 sec)
mysql> create table ta (ca varchar(255) binary);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into ta values('this is a test');
Query OK, 1 row affected (0.05 sec)
mysql> select * from ta;
+----------------+
| ca |
+----------------+
| this is a test |
+----------------+
1 row in set (0.02 sec)
mysql> select upper(ca) from ta;
+----------------+
| upper(ca) |
+----------------+
| THIS IS A TEST |
+----------------+
1 row in set (0.00 sec)
mysql> select to_upper('abc');
+-----------------+
| to_upper('abc') |
+-----------------+
| abc |
+-----------------+
1 row in set (0.00 sec)
mysql> select to_upper(ca) from ta;
+----------------+
| to_upper(ca) |
+----------------+
| this is a test |
+----------------+
1 row in set (0.00 sec)
mysql> select version();
+----------------+
| version() |
+----------------+
| 5.0.11-beta-nt |
+----------------+
1 row in set (0.00 sec)
So, the questions really are: why upper() does not work inside a function and how to make it work.
The following function gives the same results:
create function to_upper4 (p_param varchar(128) ascii) returns varchar(128) ascii
begin
return upper(p_param);
end;
//
[23 Oct 2005 17:51]
David Green
I've also noticed upper does not work within a stored proc. Tried various things, including:-
/* buffering results into temp variable:*/
CREATE PROCEDURE hospitals_AddHospital (IN HospitalName char(150))
BEGIN
DECLARE strHospital char(150);
SET strHospital = UPPER(HospitalName);
SELECT strHospital AS hospital;
END
/* inserting to table using upper inside a select statement (this was where I first noticed the problem: */
CREATE PROCEDURE hospitals_AddHospital (IN HospitalName char(150))
BEGIN
INSERT INTO HOSPITALS
(hospital_name)
SELECT UPPER(HospitalName);
END
as well as combining the two methods.
[9 Nov 2005 11:01]
Alan D. Saunders
Not only does it not work within stored functions, it doesn't seem to work on function results:
Consider this function..
drop function if exists regorder//
create function regorder(regname char)
returns char(5)
deterministic
begin
declare regtype character;
declare regorder character;
declare regnumber integer;
set regtype = substring(regname,1,1);
if regtype = 'W' or regtype = 'w' then
set regnumber = conv(substring(regname,2),16,10);
else
set regnumber = substring(regname,2);
end if;
set regorder = cast(regnumber as char);
return upper(concat(regtype,lpad(regorder,4,'0')));
end
//
It's purpose is to take a data register (from a shop floor data collection system) in the form of 'D1100', D1120' etc. or 'WA', WC, W10'. The D registers have decimal extensions (1100, 1120 etc) and the W registers are coded hexadecimally. The function is supposed to rebuild the register code, converting the hexadecimal register numbers to decimal, and padding with zeros to the same length so that sort order presents data in the correct register order.
now with that function,
select regorder('wa') should return 'W0010', and select regorder('d1102') should return 'D1102') respectively.
In fact, they return 'w0010' and 'd1102' respectively. . .?
even 'select upper(regorder('wa'))' and select upper(regorder('d1102')) return the same values.
The only way I can seem to get the correct result is:
set @a = regorder('wa')
select upper(@a)
Environment:
MySQL version 5.0.15-nt server running on Windows server 2003,
client running on Windows XP professional service pack 2.
Regards .. Alan
[5 Dec 2005 19:30]
Gabe Jackson
CREATE PROCEDURE testUpper(
IN firstName VARCHAR(50)
)
BEGIN
SELECT UPPER(firstName);
SELECT UPPER(CONVERT(firstName USING latin1));
END
Output:
+------------------+
| UPPER(firstName) |
+------------------+
| mysql |
+------------------+
1 row in set (0.00 sec)
+----------------------------------------+
| UPPER(CONVERT(firstName USING latin1)) |
+----------------------------------------+
| MYSQL |
+----------------------------------------+
1 row in set (0.00 sec)
The latter seems to work...
[7 Dec 2005 20:41]
Paul DuBois
Noted in 5.0.18 changelog.

Description: the upper (and lower) function(s) does not appear to work when used within another function How to repeat: create function to_upper ( p_param varchar(128) ) begin return upper(p_param); end; // select to_upper('abc') returns 'abc'