Skip to content

Commit ab58493

Browse files
committed
MDEV-13118 Wrong results with LOWER and UPPER and subquery
This problem is similar to MDEV-10306. 1. Fixing Item_str_conv::val_str(String *str) to return the result in "str", and to use tmp_value only as a temporary buffer for args[0]->val_str(). The new code version now guarantees that the result is always returned in "str". The trick with copy_if_not_alloced() is not used any more. 2. The change #1 revealed the same problem in SUBSTRING_INDEX(), so some tests with combinations of UPPER()/LOWER() and SUBSTRING_INDEX() started to fail. Fixing Item_func_substr_index::val_str() the same way, to return the result in "str" and use tmp_value as a temporary buffer for args[0]->val_str().
1 parent ada5410 commit ab58493

26 files changed

+433
-48
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--echo #
2+
--echo # MDEV-13118 Wrong results with LOWER and UPPER and subquery
3+
--echo #
4+
5+
SET @save_optimizer_switch=@@optimizer_switch;
6+
SET optimizer_switch=_latin1'derived_merge=on';
7+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
8+
SHOW CREATE TABLE t1;
9+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
10+
--sorted_result
11+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
12+
--sorted_result
13+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
14+
DROP TABLE t1;
15+
SET optimizer_switch=@save_optimizer_switch;

mysql-test/r/ctype_binary.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3022,6 +3022,29 @@ DROP TABLE t1;
30223022
SELECT _binary 0x7E, _binary X'7E', _binary B'01111110';
30233023
_binary 0x7E _binary X'7E' _binary B'01111110'
30243024
~ ~ ~
3025+
SET NAMES utf8, character_set_connection=binary;
3026+
#
3027+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
3028+
#
3029+
SET @save_optimizer_switch=@@optimizer_switch;
3030+
SET optimizer_switch=_latin1'derived_merge=on';
3031+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
3032+
SHOW CREATE TABLE t1;
3033+
Table Create Table
3034+
t1 CREATE TABLE `t1` (
3035+
`t` varbinary(10) NOT NULL DEFAULT ''
3036+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
3037+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
3038+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
3039+
c2
3040+
ABCDEFGHI-ABCDEFGHI
3041+
abcdefghi-abcdefghi
3042+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
3043+
c2
3044+
ABCDEFGHI-ABCDEFGHI
3045+
abcdefghi-abcdefghi
3046+
DROP TABLE t1;
3047+
SET optimizer_switch=@save_optimizer_switch;
30253048
#
30263049
# End of 10.0 tests
30273050
#

mysql-test/r/ctype_eucjpms.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33636,6 +33636,29 @@ HEX(a) CHAR_LENGTH(a)
3363633636
DROP TABLE t1;
3363733637
SELECT _eucjpms 0x8EA0;
3363833638
ERROR HY000: Invalid eucjpms character string: '8EA0'
33639+
SET NAMES eucjpms;
33640+
#
33641+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
33642+
#
33643+
SET @save_optimizer_switch=@@optimizer_switch;
33644+
SET optimizer_switch=_latin1'derived_merge=on';
33645+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
33646+
SHOW CREATE TABLE t1;
33647+
Table Create Table
33648+
t1 CREATE TABLE `t1` (
33649+
`t` varchar(10) CHARACTER SET eucjpms NOT NULL DEFAULT ''
33650+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
33651+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
33652+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
33653+
c2
33654+
abcdefghi-abcdefghi
33655+
abcdefghi-abcdefghi
33656+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
33657+
c2
33658+
ABCDEFGHI-ABCDEFGHI
33659+
ABCDEFGHI-ABCDEFGHI
33660+
DROP TABLE t1;
33661+
SET optimizer_switch=@save_optimizer_switch;
3363933662
#
3364033663
# End of 10.0 tests
3364133664
#

mysql-test/r/ctype_euckr.result

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25274,3 +25274,32 @@ A1A1A1A1A1A120202020202020202020202020202020202020
2527425274
#
2527525275
# End of 5.6 tests
2527625276
#
25277+
#
25278+
# Start of 10.0 tests
25279+
#
25280+
SET NAMES utf8, character_set_connection=euckr;
25281+
#
25282+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
25283+
#
25284+
SET @save_optimizer_switch=@@optimizer_switch;
25285+
SET optimizer_switch=_latin1'derived_merge=on';
25286+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
25287+
SHOW CREATE TABLE t1;
25288+
Table Create Table
25289+
t1 CREATE TABLE `t1` (
25290+
`t` varchar(10) CHARACTER SET euckr NOT NULL DEFAULT ''
25291+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
25292+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
25293+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
25294+
c2
25295+
abcdefghi-abcdefghi
25296+
abcdefghi-abcdefghi
25297+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
25298+
c2
25299+
ABCDEFGHI-ABCDEFGHI
25300+
ABCDEFGHI-ABCDEFGHI
25301+
DROP TABLE t1;
25302+
SET optimizer_switch=@save_optimizer_switch;
25303+
#
25304+
# End of 10.0 tests
25305+
#

mysql-test/r/ctype_gbk.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4943,6 +4943,29 @@ E05C5B
49434943
E05B
49444944
DROP TABLE t1;
49454945
# Start of ctype_E05C.inc
4946+
SET NAMES utf8, character_set_connection=gbk;
4947+
#
4948+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
4949+
#
4950+
SET @save_optimizer_switch=@@optimizer_switch;
4951+
SET optimizer_switch=_latin1'derived_merge=on';
4952+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
4953+
SHOW CREATE TABLE t1;
4954+
Table Create Table
4955+
t1 CREATE TABLE `t1` (
4956+
`t` varchar(10) CHARACTER SET gbk NOT NULL DEFAULT ''
4957+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
4958+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
4959+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
4960+
c2
4961+
abcdefghi-abcdefghi
4962+
abcdefghi-abcdefghi
4963+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
4964+
c2
4965+
ABCDEFGHI-ABCDEFGHI
4966+
ABCDEFGHI-ABCDEFGHI
4967+
DROP TABLE t1;
4968+
SET optimizer_switch=@save_optimizer_switch;
49464969
#
49474970
# MDEV-9886 Illegal mix of collations with a view comparing a field to a binary constant
49484971
#

mysql-test/r/ctype_latin1.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7939,6 +7939,29 @@ a
79397939
0
79407940
DROP VIEW v1;
79417941
DROP TABLE t1;
7942+
SET NAMES latin1;
7943+
#
7944+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
7945+
#
7946+
SET @save_optimizer_switch=@@optimizer_switch;
7947+
SET optimizer_switch=_latin1'derived_merge=on';
7948+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
7949+
SHOW CREATE TABLE t1;
7950+
Table Create Table
7951+
t1 CREATE TABLE `t1` (
7952+
`t` varchar(10) NOT NULL DEFAULT ''
7953+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
7954+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
7955+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
7956+
c2
7957+
abcdefghi-abcdefghi
7958+
abcdefghi-abcdefghi
7959+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
7960+
c2
7961+
ABCDEFGHI-ABCDEFGHI
7962+
ABCDEFGHI-ABCDEFGHI
7963+
DROP TABLE t1;
7964+
SET optimizer_switch=@save_optimizer_switch;
79427965
#
79437966
# End of 10.0 tests
79447967
#

mysql-test/r/ctype_ucs.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5629,6 +5629,29 @@ c2
56295629
YWJjZGVmZ2hp-YWJjZGVmZ2hp
56305630
DROP TABLE t1;
56315631
SET optimizer_switch=@save_optimizer_switch;
5632+
SET NAMES utf8, character_set_connection=ucs2;
5633+
#
5634+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
5635+
#
5636+
SET @save_optimizer_switch=@@optimizer_switch;
5637+
SET optimizer_switch=_latin1'derived_merge=on';
5638+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
5639+
SHOW CREATE TABLE t1;
5640+
Table Create Table
5641+
t1 CREATE TABLE `t1` (
5642+
`t` varchar(10) CHARACTER SET ucs2 NOT NULL DEFAULT ''
5643+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
5644+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
5645+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
5646+
c2
5647+
abcdefghi-abcdefghi
5648+
abcdefghi-abcdefghi
5649+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
5650+
c2
5651+
ABCDEFGHI-ABCDEFGHI
5652+
ABCDEFGHI-ABCDEFGHI
5653+
DROP TABLE t1;
5654+
SET optimizer_switch=@save_optimizer_switch;
56325655
#
56335656
# End of 10.0 tests
56345657
#

mysql-test/r/ctype_ujis.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25942,6 +25942,29 @@ HEX(a) CHAR_LENGTH(a)
2594225942
DROP TABLE t1;
2594325943
SELECT _ujis 0x8EA0;
2594425944
ERROR HY000: Invalid ujis character string: '8EA0'
25945+
SET NAMES ujis;
25946+
#
25947+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
25948+
#
25949+
SET @save_optimizer_switch=@@optimizer_switch;
25950+
SET optimizer_switch=_latin1'derived_merge=on';
25951+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
25952+
SHOW CREATE TABLE t1;
25953+
Table Create Table
25954+
t1 CREATE TABLE `t1` (
25955+
`t` varchar(10) CHARACTER SET ujis NOT NULL DEFAULT ''
25956+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
25957+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
25958+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
25959+
c2
25960+
abcdefghi-abcdefghi
25961+
abcdefghi-abcdefghi
25962+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
25963+
c2
25964+
ABCDEFGHI-ABCDEFGHI
25965+
ABCDEFGHI-ABCDEFGHI
25966+
DROP TABLE t1;
25967+
SET optimizer_switch=@save_optimizer_switch;
2594525968
#
2594625969
# End of 10.0 tests
2594725970
#

mysql-test/r/ctype_utf16.result

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,6 +2134,29 @@ EXECUTE stmt USING @arg00;
21342134
CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)
21352135
aÿ
21362136
DEALLOCATE PREPARE stmt;
2137+
SET NAMES utf8, character_set_connection=utf16;
2138+
#
2139+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
2140+
#
2141+
SET @save_optimizer_switch=@@optimizer_switch;
2142+
SET optimizer_switch=_latin1'derived_merge=on';
2143+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
2144+
SHOW CREATE TABLE t1;
2145+
Table Create Table
2146+
t1 CREATE TABLE `t1` (
2147+
`t` varchar(10) CHARACTER SET utf16 NOT NULL DEFAULT ''
2148+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
2149+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
2150+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
2151+
c2
2152+
abcdefghi-abcdefghi
2153+
abcdefghi-abcdefghi
2154+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
2155+
c2
2156+
ABCDEFGHI-ABCDEFGHI
2157+
ABCDEFGHI-ABCDEFGHI
2158+
DROP TABLE t1;
2159+
SET optimizer_switch=@save_optimizer_switch;
21372160
#
21382161
# End of 10.0 tests
21392162
#

mysql-test/r/ctype_utf16le.result

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2319,3 +2319,32 @@ DFFFFFDFFFFF9CFFFF9DFFFF9EFFFF
23192319
#
23202320
# End of 5.6 tests
23212321
#
2322+
#
2323+
# Start of 10.0 tests
2324+
#
2325+
SET NAMES utf8, character_set_connection=utf16le;
2326+
#
2327+
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
2328+
#
2329+
SET @save_optimizer_switch=@@optimizer_switch;
2330+
SET optimizer_switch=_latin1'derived_merge=on';
2331+
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
2332+
SHOW CREATE TABLE t1;
2333+
Table Create Table
2334+
t1 CREATE TABLE `t1` (
2335+
`t` varchar(10) CHARACTER SET utf16le NOT NULL DEFAULT ''
2336+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
2337+
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
2338+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
2339+
c2
2340+
abcdefghi-abcdefghi
2341+
abcdefghi-abcdefghi
2342+
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
2343+
c2
2344+
ABCDEFGHI-ABCDEFGHI
2345+
ABCDEFGHI-ABCDEFGHI
2346+
DROP TABLE t1;
2347+
SET optimizer_switch=@save_optimizer_switch;
2348+
#
2349+
# Start of 10.0 tests
2350+
#

0 commit comments

Comments
 (0)