summaryrefslogtreecommitdiff
path: root/mysql-test/main/natural_sort_key.test
blob: f918c0e9bdf228017d0001cfb769a46fc91d8ba4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
--source include/have_innodb.inc
--source include/have_sequence.inc

SET NAMES utf8mb4;
SELECT NATURAL_SORT_KEY(NULL);

# Sort without tables
SELECT '' c WHERE 0 UNION VALUES('a10'),('a9'),('a1000'), ('a0'),('b'),('b0') ORDER BY NATURAL_SORT_KEY(c);

#Test that max packet overflow produces NULL plus warning
SELECT NATURAL_SORT_KEY(repeat('a1',@@max_allowed_packet/2-1));
SELECT NATURAL_SORT_KEY(repeat('1',@@max_allowed_packet-1));

#Test with virtual(index only) key
CREATE TABLE t1(
  c VARCHAR(30) CHARACTER SET latin1 COLLATE latin1_bin,
  k VARCHAR(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci AS (NATURAL_SORT_KEY(CONVERT(c USING utf8mb4))) INVISIBLE,
  KEY(k,c)) ENGINE=InnoDB;
INSERT INTO t1 values
 ('A1'),('a1'),('A100'),('a100'),('A2'),('ä2'),('a2'),('A99'),
 ('äb'),('B1'),('B100'),('B9'),('C'),('100');
EXPLAIN SELECT c FROM t1 ORDER BY k,c;
-- echo #Natural sort order.
# We sort by 2 colums, for stable sort,as we do not currenly have a case and accent insensitive Unicode collation.
SELECT c FROM t1 ORDER BY k,c;
-- echo #Unnatural but  unicode aware) sort order
SELECT c FROM t1 ORDER BY CONVERT(c USING utf8mb4) COLLATE utf8mb4_unicode_ci,c;
# CREATE TABLE AS SELECT, to see that length of the column is correct.
CREATE TABLE t2 AS SELECT c, NATURAL_SORT_KEY(c) FROM t1 WHERE 0;
SHOW CREATE TABLE t2;
DROP TABLE t1,t2;

#Show encoding of numbers, with some leading whitespace.
SELECT RPAD(val,28,' ') value , RPAD(NATURAL_SORT_KEY(val),35,' ') sortkey , LENGTH(NATURAL_SORT_KEY(val)) - LENGTH(val) encoding_overhead
FROM
(
SELECT 0 val
UNION  VALUES ('1'),('01'),('0001')
UNION  SELECT CONCAT('1',repeat('0',seq)) FROM seq_1_to_27
) AS numbers ORDER BY sortkey;


#Test that sort order with leading zeros (lead zeros sort larger)
SELECT val
FROM
(
SELECT 0 val WHERE 0
UNION  VALUES ('1/'),('01'),('1a')
) AS strings ORDER BY NATURAL_SORT_KEY(val);