mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Move handling of suffix_length from strnxfrm_bin() to filesort to ensure proper sorting of all kind of binary objects
field::sort_key() now adds length last for varbinary/blob VARBINARY/BLOB is now sorted by filesort so that shorter strings comes before longer ones Fixed issues in test cases from last merge mysql-test/r/select.result: Change column name in test to get GROUP BY to use the alias mysql-test/r/type_blob.result: Test BLOB and VARCHAR sorting mysql-test/t/select.test: Change column name in test to get GROUP BY to use the alias Drop used tables at start of test Don't use table names 'a', 'b' or 'c' mysql-test/t/type_blob.test: Test BLOB and VARCHAR sorting sql/field.cc: Store length last in VARBINARY() and BLOB() columns to get shorter strings sorted before longer onces sql/field.h: Added method 'sort_length()' to allow one to have length bytes last for VARBINARY/BLOB to get these to sort properly sql/filesort.cc: Use 'sort_length()' instead of 'pack_length()' to get length of field. Store suffix_length last for varbinary (blob) objects. The above ensures that BLOB/VARBINARY are correctly sorted (shorter strings before longer ones) sql/sql_class.h: Added sort suffix length (to get varbinary/blob to sort correctly) sql/sql_select.cc: Use sort_length() instead of pack_lengths() strings/ctype-bin.c: Don't let strnxfrm_bin store length last Better to do it in MySQL field object to ensure it's done properly for all cases
This commit is contained in:
@ -2668,10 +2668,9 @@ a c
|
||||
drop table t1;
|
||||
CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE idx (a,b) );
|
||||
INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
|
||||
CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, c INT );
|
||||
INSERT INTO t2 VALUES ( 1,10,1), (1,10,2), (1,11,1), (1,11,2), (1,2,1), (1,2,2),
|
||||
(1,2,3);
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, e INT );
|
||||
INSERT INTO t2 VALUES ( 1,10,1), (1,10,2), (1,11,1), (1,11,2), (1,2,1), (1,2,2),(1,2,3);
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
|
||||
a b c d
|
||||
1 2 1 1
|
||||
@ -2679,14 +2678,14 @@ a b c d
|
||||
1 2 3 1
|
||||
1 10 2
|
||||
1 11 2
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t1.a, t1.b, c;
|
||||
a b c d
|
||||
1 10 4
|
||||
1 2 1 1
|
||||
1 2 2 1
|
||||
1 2 3 1
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t2.a, t2.b, c;
|
||||
a b c d
|
||||
1 2 1 1
|
||||
@ -2694,7 +2693,7 @@ a b c d
|
||||
1 2 3 1
|
||||
1 10 2
|
||||
1 11 2
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2,t1
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2,t1
|
||||
WHERE t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
|
||||
a b c d
|
||||
1 2 1 1
|
||||
|
@ -718,3 +718,73 @@ t1 CREATE TABLE `t1` (
|
||||
KEY `a` (`a`,`b`,`d`,`e`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
CREATE table t1 (a blob);
|
||||
insert into t1 values ('b'),('a\0'),('a'),('a '),('aa'),(NULL);
|
||||
select hex(a) from t1 order by a;
|
||||
hex(a)
|
||||
NULL
|
||||
61
|
||||
6100
|
||||
6120
|
||||
6161
|
||||
62
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
b
|
||||
NULL
|
||||
6100
|
||||
610000
|
||||
612000
|
||||
616100
|
||||
6200
|
||||
alter table t1 modify a varbinary(5);
|
||||
select hex(a) from t1 order by a;
|
||||
hex(a)
|
||||
NULL
|
||||
61
|
||||
6100
|
||||
6120
|
||||
6161
|
||||
62
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
b
|
||||
NULL
|
||||
6100
|
||||
610000
|
||||
612000
|
||||
616100
|
||||
6200
|
||||
alter table t1 modify a char(5);
|
||||
select hex(a) from t1 order by a;
|
||||
hex(a)
|
||||
NULL
|
||||
6100
|
||||
61
|
||||
61
|
||||
6161
|
||||
62
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
b
|
||||
NULL
|
||||
610000
|
||||
6100
|
||||
6100
|
||||
616100
|
||||
6200
|
||||
alter table t1 modify a binary(5);
|
||||
select hex(a) from t1 order by a;
|
||||
hex(a)
|
||||
NULL
|
||||
6100000000
|
||||
6100000000
|
||||
6100000000
|
||||
6161000000
|
||||
6200000000
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
b
|
||||
NULL
|
||||
610000000000
|
||||
610000000000
|
||||
610000000000
|
||||
616100000000
|
||||
620000000000
|
||||
drop table t1;
|
||||
|
@ -7,7 +7,7 @@
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2,t3,t4;
|
||||
drop table if exists t1,t2,t3,t4,t11;
|
||||
# The following may be left from older tests
|
||||
drop table if exists t1_1,t1_2,t9_1,t9_2,t1aa,t2aa;
|
||||
drop view if exists v1;
|
||||
@ -2232,16 +2232,15 @@ drop table t1;
|
||||
|
||||
CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE idx (a,b) );
|
||||
INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4);
|
||||
CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, c INT );
|
||||
INSERT INTO t2 VALUES ( 1,10,1), (1,10,2), (1,11,1), (1,11,2), (1,2,1), (1,2,2),
|
||||
(1,2,3);
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
CREATE TABLE t2 ( a INT NOT NULL, b INT NOT NULL, e INT );
|
||||
INSERT INTO t2 VALUES ( 1,10,1), (1,10,2), (1,11,1), (1,11,2), (1,2,1), (1,2,2),(1,2,3);
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t1.a, t1.b, c;
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2 LEFT JOIN
|
||||
t1 ON t2.a = t1.a AND t2.b = t1.b GROUP BY t2.a, t2.b, c;
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2,t1
|
||||
SELECT t2.a, t2.b, IF(t1.b IS NULL,'',e) AS c, COUNT(*) AS d FROM t2,t1
|
||||
WHERE t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
|
||||
@ -2635,31 +2634,18 @@ drop view v1, v2, v3;
|
||||
# nested right join.
|
||||
#
|
||||
|
||||
create table a (
|
||||
id int(11) not null default '0'
|
||||
) engine=myisam default charset=latin1;
|
||||
|
||||
insert into a values (123),(191),(192);
|
||||
|
||||
create table b (
|
||||
id char(16) character set utf8 not null default ''
|
||||
) engine=myisam default charset=latin1;
|
||||
|
||||
insert into b values ('58013'),('58014'),('58015'),('58016');
|
||||
|
||||
create table c (
|
||||
a_id int(11) not null default '0',
|
||||
b_id char(16) character set utf8 default null
|
||||
) engine=myisam default charset=latin1;
|
||||
|
||||
insert into c values
|
||||
(123,null),(123,null),(123,null),(123,null),(123,null),(123,'58013');
|
||||
create table t1 (id int(11) not null default '0');
|
||||
insert into t1 values (123),(191),(192);
|
||||
create table t2 (id char(16) character set utf8 not null);
|
||||
insert into t2 values ('58013'),('58014'),('58015'),('58016');
|
||||
create table t3 (a_id int(11) not null, b_id char(16) character set utf8);
|
||||
insert into t3 values (123,null),(123,null),(123,null),(123,null),(123,null),(123,'58013');
|
||||
|
||||
-- both queries are equivalent
|
||||
select count(*)
|
||||
from a inner join (c left join b on b.id = c.b_id) on a.id = c.a_id;
|
||||
from t1 inner join (t3 left join t2 on t2.id = t3.b_id) on t1.id = t3.a_id;
|
||||
|
||||
select count(*)
|
||||
from a inner join (b right join c on b.id = c.b_id) on a.id = c.a_id;
|
||||
from t1 inner join (t2 right join t3 on t2.id = t3.b_id) on t1.id = t3.a_id;
|
||||
|
||||
drop table a, b, c;
|
||||
drop table t1,t2,t3;
|
||||
|
@ -404,3 +404,22 @@ alter table t1 add primary key (a,b,c(255),d);
|
||||
alter table t1 add key (a,b,d,e);
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test that blob's and varbinary are sorted according to length
|
||||
#
|
||||
|
||||
CREATE table t1 (a blob);
|
||||
insert into t1 values ('b'),('a\0'),('a'),('a '),('aa'),(NULL);
|
||||
select hex(a) from t1 order by a;
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
alter table t1 modify a varbinary(5);
|
||||
select hex(a) from t1 order by a;
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
alter table t1 modify a char(5);
|
||||
select hex(a) from t1 order by a;
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
alter table t1 modify a binary(5);
|
||||
select hex(a) from t1 order by a;
|
||||
select hex(concat(a,'\0')) as b from t1 order by concat(a,'\0');
|
||||
drop table t1;
|
||||
|
Reference in New Issue
Block a user