Skip to content

Commit 4c2c5ec

Browse files
author
Alexander Barkov
committed
MDEV-14434 Wrong result for CHARSET(CONCAT(?,const))
1 parent 0d1e805 commit 4c2c5ec

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

mysql-test/r/ps.result

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4992,3 +4992,40 @@ ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NE
49924992
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
49934993
ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger
49944994
DROP PROCEDURE p1;
4995+
#
4996+
# MDEV-14434 Wrong result for CHARSET(CONCAT(?,const))
4997+
#
4998+
SET NAMES utf8;
4999+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(5,_latin1'a'))";
5000+
CHARSET(CONCAT(5,_latin1'a'))
5001+
latin1
5002+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5;
5003+
CHARSET(CONCAT(?,_latin1'a'))
5004+
latin1
5005+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5;
5006+
CHARSET(CONCAT(?,_latin1'a'))
5007+
latin1
5008+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5e0;
5009+
CHARSET(CONCAT(?,_latin1'a'))
5010+
latin1
5011+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIME'10:20:30';
5012+
CHARSET(CONCAT(?,_latin1'a'))
5013+
latin1
5014+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIMESTAMP'2001-01-01 10:20:30';
5015+
CHARSET(CONCAT(?,_latin1'a'))
5016+
latin1
5017+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5;
5018+
COERCIBILITY(?)
5019+
5
5020+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5;
5021+
COERCIBILITY(?)
5022+
5
5023+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5e0;
5024+
COERCIBILITY(?)
5025+
5
5026+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIME'10:20:30';
5027+
COERCIBILITY(?)
5028+
5
5029+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIMESTAMP'2001-01-01 10:20:30';
5030+
COERCIBILITY(?)
5031+
5

mysql-test/t/ps.test

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4476,3 +4476,22 @@ EXECUTE IMMEDIATE 'CALL p1(?)' USING DEFAULT;
44764476
--error ER_SP_NOT_VAR_ARG
44774477
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
44784478
DROP PROCEDURE p1;
4479+
4480+
4481+
--echo #
4482+
--echo # MDEV-14434 Wrong result for CHARSET(CONCAT(?,const))
4483+
--echo #
4484+
4485+
SET NAMES utf8;
4486+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(5,_latin1'a'))";
4487+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5;
4488+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5;
4489+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5e0;
4490+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIME'10:20:30';
4491+
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIMESTAMP'2001-01-01 10:20:30';
4492+
4493+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5;
4494+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5;
4495+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5e0;
4496+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIME'10:20:30';
4497+
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIMESTAMP'2001-01-01 10:20:30';

sql/item.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3409,6 +3409,7 @@ void Item_param::set_int(longlong i, uint32 max_length_arg)
34093409
DBUG_ENTER("Item_param::set_int");
34103410
value.integer= (longlong) i;
34113411
state= INT_VALUE;
3412+
collation.set_numeric();
34123413
max_length= max_length_arg;
34133414
decimals= 0;
34143415
maybe_null= 0;
@@ -3421,6 +3422,7 @@ void Item_param::set_double(double d)
34213422
DBUG_ENTER("Item_param::set_double");
34223423
value.real= d;
34233424
state= REAL_VALUE;
3425+
collation.set_numeric();
34243426
max_length= DBL_DIG + 8;
34253427
decimals= NOT_FIXED_DEC;
34263428
maybe_null= 0;
@@ -3450,6 +3452,7 @@ void Item_param::set_decimal(const char *str, ulong length)
34503452
str2my_decimal(E_DEC_FATAL_ERROR, str, &decimal_value, &end);
34513453
state= DECIMAL_VALUE;
34523454
decimals= decimal_value.frac;
3455+
collation.set_numeric();
34533456
max_length=
34543457
my_decimal_precision_to_length_no_truncation(decimal_value.precision(),
34553458
decimals, unsigned_flag);
@@ -3465,6 +3468,7 @@ void Item_param::set_decimal(const my_decimal *dv, bool unsigned_arg)
34653468
my_decimal2decimal(dv, &decimal_value);
34663469

34673470
decimals= (uint8) decimal_value.frac;
3471+
collation.set_numeric();
34683472
unsigned_flag= unsigned_arg;
34693473
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
34703474
decimals, unsigned_flag);
@@ -3475,6 +3479,7 @@ void Item_param::set_decimal(const my_decimal *dv, bool unsigned_arg)
34753479
void Item_param::fix_temporal(uint32 max_length_arg, uint decimals_arg)
34763480
{
34773481
state= TIME_VALUE;
3482+
collation.set_numeric();
34783483
max_length= max_length_arg;
34793484
decimals= decimals_arg;
34803485
fix_type(Item::DATE_ITEM);

0 commit comments

Comments
 (0)