1set @save_rand_seed1=  @@RAND_SEED1;
2set @save_rand_seed2=  @@RAND_SEED2;
3set @@RAND_SEED1=810763568, @@RAND_SEED2=600681772;
4create table t1(a int);
5insert into t1 select seq from seq_1_to_10000 order by rand(),seq;
6#
7# parameters:
8# mean           mean for the column to be considered
9# max_val        max_value for the column to be considered
10#
11# This function generate a sample of a normal distribution
12# This function return a point
13# of the normal distribution with a given mean.
14#
15CREATE FUNCTION
16generate_normal_distribution_sample(mean DOUBLE, max_val DOUBLE)RETURNS DOUBLE
17BEGIN
18DECLARE z DOUBLE DEFAULT 0;
19SET z= (rand() + rand() + rand() + rand() + rand() + rand())/6;
20SET z= 2*(max_val-mean)*z;
21SET z= z + mean - (max_val-mean);
22return z;
23END|
24#
25# parameters:
26# len      length of the random string to be generated
27#
28# This function generates a random string for the length passed
29# as an argument with characters in the range of [A,Z]
30#
31CREATE FUNCTION generate_random_string(len INT) RETURNS varchar(128)
32BEGIN
33DECLARE str VARCHAR(256) DEFAULT '';
34DECLARE x INT DEFAULT 0;
35WHILE (len > 0) DO
36SET x =round(rand()*25);
37SET str= CONCAT(str, CHAR(65 + x));
38SET len= len-1;
39END WHILE;
40RETURN str;
41END|
42#
43# parameters:
44# mean      mean for the column to be considered
45# min_val   min_value for the column to be considered
46# max_val   max_value for the column to be considered
47#
48# This function generate a normal distribution sample in the range of
49# [min_val, max_val]
50#
51CREATE FUNCTION
52clipped_normal_distribution(mean DOUBLE, min_val DOUBLE, max_val DOUBLE)
53RETURNS INT
54BEGIN
55DECLARE r DOUBLE DEFAULT 0;
56WHILE 1=1 DO
57set r= generate_normal_distribution_sample(mean, max_val);
58IF (r >= min_val AND r <= max_val) THEN
59RETURN round(r);
60end if;
61END WHILE;
62RETURN 0;
63END|
64create table t2 (id INT NOT NULL, a INT, b int);
65insert into t2
66select a, clipped_normal_distribution(12, 0, 64),
67clipped_normal_distribution(32, 0, 128)
68from t1;
69CREATE TABLE t3(
70id INT NOT NULL,
71names VARCHAR(64),
72address VARCHAR(128),
73PRIMARY KEY (id)
74);
75#
76# table t3 stores random strings calculated from the length stored in
77# table t2
78#
79insert into t3
80select id, generate_random_string(a), generate_random_string(b) from t2;
81#
82# All records fit in memory
83#
84set sort_buffer_size=262144*10;
85analyze format=json select id DIV 100 as x,
86MD5(group_concat(substring(names,1,3), substring(address,1,3)
87order by id))
88FROM t3
89GROUP BY x;
90ANALYZE
91{
92  "query_block": {
93    "select_id": 1,
94    "r_loops": 1,
95    "r_total_time_ms": "REPLACED",
96    "read_sorted_file": {
97      "r_rows": 10000,
98      "filesort": {
99        "sort_key": "t3.`id` DIV 100",
100        "r_loops": 1,
101        "r_total_time_ms": "REPLACED",
102        "r_used_priority_queue": false,
103        "r_output_rows": 10000,
104        "r_buffer_size": "REPLACED",
105        "r_sort_mode": "sort_key,packed_addon_fields",
106        "table": {
107          "table_name": "t3",
108          "access_type": "ALL",
109          "r_loops": 1,
110          "rows": 10000,
111          "r_rows": 10000,
112          "r_table_time_ms": "REPLACED",
113          "r_other_time_ms": "REPLACED",
114          "filtered": 100,
115          "r_filtered": 100
116        }
117      }
118    }
119  }
120}
121flush status;
122select id DIV 100 as x,
123MD5(group_concat(substring(names,1,3), substring(address,1,3)
124order by id))
125FROM t3
126GROUP BY x;
127x	MD5(group_concat(substring(names,1,3), substring(address,1,3)
128order by id))
1290	3d24cb0237caf81aa74a2dddf367ac23
1301	618f9b8b6cefaa268dcb5477eece5e90
1312	fbfe93cc7713f852852f66e578d999aa
1323	34802712af9c95664f41e789d19fb6e7
1334	2d9a4d628013b45cea5301143ec559c5
1345	324b8e682ad2233498f36979fddddf30
1356	31ccc1ab69c00dcade71f7fda2fad599
1367	e059e0279a5654a1c5f6596d220691bf
1378	a21e5021cfb19be280f7fa2c2e70608e
1389	6230b389a5bb0f9cd464b839e8824d0d
13910	f2db66b6c4ad49e406f965a80ff5d224
14011	75f39127d968cad28d30707889191d81
14112	2e75191c0f32966a9e7675d0ddcf1c1c
14213	808b4ecabb9cbb40ff3549c81b21d2f5
14314	c7c0c0bbf0ab7558793a86eaca714a3f
14415	3065d81035dc9c596bc235ab553f92de
14516	13b1b17e93649fe49d6da356c2072c63
14617	e3ce0af10608e6467ba4d38b135ff873
14718	0f172b310ad772e13630b647e09ef79a
14819	26bbfb77888fa151215fe8ff75e448e7
14920	fcd6d5113e8178766dc370b470eb053a
15021	d3860a17be6da02e17432f2ff80a261f
15122	1d0cb7cd3f54c15bd41491e6fa449f12
15223	15f95be2574a94677fa7e76ead23e025
15324	924abdbb21c79cc7fd11d4d5b87ac339
15425	7493978704b5223a4f5dc6d8beb51d90
15526	f4ac4696b05577ba4a05334cd131cf94
15627	cfd45d4915f342978fb6982a825f6cc2
15728	2bd8981c6245c32ea1dc27ef394df94e
15829	0e47838fe4be239939424fcef1289002
15930	18e291b42da10b04434bdad010a5b66c
16031	cbd1bf2554378ef7edd9087d4a8562d4
16132	ddb1e7282bb637f7fe3aa3aed149b482
16233	1963f2400c8870d67f99c391bc5040c2
16334	d2b44d3c13a7a2c83de840892a370f47
16435	7ff20517acf5ea901757262eae1edf5e
16536	685fbfc47faad4243944d7331a2dee36
16637	9d58b82b5f9d369a16c4f2bcc424b412
16738	be15aa080dda65c9489892c34a330c30
16839	4b52ddf7b599c9a00d094008a464c18c
16940	441b03789e58aec883138d9c657a005e
17041	e76cc7b1cadcb4f31e0232a0a8458620
17142	3581a040fbf210f6942fe591621f0e41
17243	acc552d3cba6a900054093c3c6876fc5
17344	fd7fa7a0a4a58485a1aa30e804f024af
17445	56afedd4f2e8101fbb4402051e9857e8
17546	019e4178eccbdd84150f196668e40888
17647	132c8e314dd7c9064e1cb4980856531c
17748	dcc08184bf2f7cfb640af0c603ff7506
17849	691b29183f64480003f8a1a74cd3ac13
17950	105da23f1b4a63d755414beca9df20d5
18051	30b2e973a0186721f9a7720be6be09e5
18152	b307d14c06fd6f27173d683a5596b542
18253	2125a788f107a4ba6a364984f7145156
18354	aa0793982ae401cd2c1bea949d726ae1
18455	e1797ba6b7ecf5f84cda2703f79c878c
18556	78fc3f94127c0d5c6b3fa82ac3a8c167
18657	b8c6d1e26cfd94aade5e32cf89e05da6
18758	1e3481d6ff3b22f6ad739b93afe4c341
18859	59e9d5be4a87ee707578a3a8e5d624e9
18960	7a00e357826e950ffbe688c3f9a99a97
19061	e5a8c0d404f6fb59d9e3dd88b13ba5a7
19162	19d22c20fbf76b5b9ac746679ade26e7
19263	c96f912f54b9b862532ce959398c76ca
19364	86c167171b777a150356f1f083203d24
19465	e1bca8d6cc1904a919cce1090e62f34d
19566	f5dd3f6267376875239222dbefac87b1
19667	d6a2aa26124dd42a9df9fa21b7eb8bce
19768	ecd36ba9a56f89d4bf6fa83c2b800985
19869	87b64475fd3f4db6dd68a45fb9a825dc
19970	f5f7aa5569558b3e6556c72c9dfc429b
20071	9e1cc67e0c13d00c771b6bed2fd566cf
20172	3a6e7c6ce76a04fa2503d094121d84d5
20273	5fd8ba2dd8d36814d06a1d278002e437
20374	10db883700dde7289eb640df3a6d6676
20475	3ebd59ed119d6dfda3eedc5bf05fd425
20576	5008d3ce585f3b2dda2b313c57ebcb0a
20677	ac7cee33e39827de02acedb7584acae5
20778	3f440facefbd95f905942c75bfe60bbb
20879	89639b3145c988c775d9d997c9d356ff
20980	a6f8b29a83b2305188c241f2724ea998
21081	d79f9bd47505cee69627e8044f7745c2
21182	5f8d8b55bc9d5b44f817ada0b9bab2f7
21283	411a99ef2e2af45640f0224274979fb5
21384	60706cd1eb7dffae3d7a34133c5cb67e
21485	272a5d09070b5a0569fb18e144100f8b
21586	0f969fd16dd186e9eb099213a82fb119
21687	6c48f63ec50e26ba42d8ca074daee9a6
21788	83512539cc5a2561426564590d307a58
21889	c57cf49bbeaa12aaba2106278681c9cd
21990	d248507181561f0aba09182c4326fb11
22091	a1e153dd8bb1334bccd73890fafc5ba9
22192	d7a0ba2d1241a07abf3691074cecff76
22293	466034794d577c41a9716bc9eb903ee2
22394	b5e2158feb4290b04a7bdfdec0a17976
22495	8a16a27008d033dd6e9074b042021e60
22596	ccaa12e89f6de3058b3a2baddc4eff00
22697	7fdbf02f369546d0fde2b7db85752e33
22798	63b286bb777298397f3acf03fc3e9deb
22899	b271f751a4952f86b002b9730bd02c8b
229100	cbd5cef546acc0bfa33117d7c1ae58a8
230show status like '%sort%';
231Variable_name	Value
232Sort_merge_passes	0
233Sort_priority_queue_sorts	0
234Sort_range	0
235Sort_rows	10000
236Sort_scan	1
237set sort_buffer_size=default;
238#
239# Test for merge_many_buff
240#
241set sort_buffer_size=32768;
242analyze format=json select id DIV 100 as x,
243MD5(group_concat(substring(names,1,3), substring(address,1,3)
244order by id))
245FROM t3
246GROUP BY x;
247ANALYZE
248{
249  "query_block": {
250    "select_id": 1,
251    "r_loops": 1,
252    "r_total_time_ms": "REPLACED",
253    "read_sorted_file": {
254      "r_rows": 10000,
255      "filesort": {
256        "sort_key": "t3.`id` DIV 100",
257        "r_loops": 1,
258        "r_total_time_ms": "REPLACED",
259        "r_used_priority_queue": false,
260        "r_output_rows": 10000,
261        "r_sort_passes": 4,
262        "r_buffer_size": "REPLACED",
263        "r_sort_mode": "sort_key,packed_addon_fields",
264        "table": {
265          "table_name": "t3",
266          "access_type": "ALL",
267          "r_loops": 1,
268          "rows": 10000,
269          "r_rows": 10000,
270          "r_table_time_ms": "REPLACED",
271          "r_other_time_ms": "REPLACED",
272          "filtered": 100,
273          "r_filtered": 100
274        }
275      }
276    }
277  }
278}
279flush status;
280select id DIV 100 as x,
281MD5(group_concat(substring(names,1,3), substring(address,1,3)
282order by id))
283FROM t3
284GROUP BY x;
285x	MD5(group_concat(substring(names,1,3), substring(address,1,3)
286order by id))
2870	3d24cb0237caf81aa74a2dddf367ac23
2881	618f9b8b6cefaa268dcb5477eece5e90
2892	fbfe93cc7713f852852f66e578d999aa
2903	34802712af9c95664f41e789d19fb6e7
2914	2d9a4d628013b45cea5301143ec559c5
2925	324b8e682ad2233498f36979fddddf30
2936	31ccc1ab69c00dcade71f7fda2fad599
2947	e059e0279a5654a1c5f6596d220691bf
2958	a21e5021cfb19be280f7fa2c2e70608e
2969	6230b389a5bb0f9cd464b839e8824d0d
29710	f2db66b6c4ad49e406f965a80ff5d224
29811	75f39127d968cad28d30707889191d81
29912	2e75191c0f32966a9e7675d0ddcf1c1c
30013	808b4ecabb9cbb40ff3549c81b21d2f5
30114	c7c0c0bbf0ab7558793a86eaca714a3f
30215	3065d81035dc9c596bc235ab553f92de
30316	13b1b17e93649fe49d6da356c2072c63
30417	e3ce0af10608e6467ba4d38b135ff873
30518	0f172b310ad772e13630b647e09ef79a
30619	26bbfb77888fa151215fe8ff75e448e7
30720	fcd6d5113e8178766dc370b470eb053a
30821	d3860a17be6da02e17432f2ff80a261f
30922	1d0cb7cd3f54c15bd41491e6fa449f12
31023	15f95be2574a94677fa7e76ead23e025
31124	924abdbb21c79cc7fd11d4d5b87ac339
31225	7493978704b5223a4f5dc6d8beb51d90
31326	f4ac4696b05577ba4a05334cd131cf94
31427	cfd45d4915f342978fb6982a825f6cc2
31528	2bd8981c6245c32ea1dc27ef394df94e
31629	0e47838fe4be239939424fcef1289002
31730	18e291b42da10b04434bdad010a5b66c
31831	cbd1bf2554378ef7edd9087d4a8562d4
31932	ddb1e7282bb637f7fe3aa3aed149b482
32033	1963f2400c8870d67f99c391bc5040c2
32134	d2b44d3c13a7a2c83de840892a370f47
32235	7ff20517acf5ea901757262eae1edf5e
32336	685fbfc47faad4243944d7331a2dee36
32437	9d58b82b5f9d369a16c4f2bcc424b412
32538	be15aa080dda65c9489892c34a330c30
32639	4b52ddf7b599c9a00d094008a464c18c
32740	441b03789e58aec883138d9c657a005e
32841	e76cc7b1cadcb4f31e0232a0a8458620
32942	3581a040fbf210f6942fe591621f0e41
33043	acc552d3cba6a900054093c3c6876fc5
33144	fd7fa7a0a4a58485a1aa30e804f024af
33245	56afedd4f2e8101fbb4402051e9857e8
33346	019e4178eccbdd84150f196668e40888
33447	132c8e314dd7c9064e1cb4980856531c
33548	dcc08184bf2f7cfb640af0c603ff7506
33649	691b29183f64480003f8a1a74cd3ac13
33750	105da23f1b4a63d755414beca9df20d5
33851	30b2e973a0186721f9a7720be6be09e5
33952	b307d14c06fd6f27173d683a5596b542
34053	2125a788f107a4ba6a364984f7145156
34154	aa0793982ae401cd2c1bea949d726ae1
34255	e1797ba6b7ecf5f84cda2703f79c878c
34356	78fc3f94127c0d5c6b3fa82ac3a8c167
34457	b8c6d1e26cfd94aade5e32cf89e05da6
34558	1e3481d6ff3b22f6ad739b93afe4c341
34659	59e9d5be4a87ee707578a3a8e5d624e9
34760	7a00e357826e950ffbe688c3f9a99a97
34861	e5a8c0d404f6fb59d9e3dd88b13ba5a7
34962	19d22c20fbf76b5b9ac746679ade26e7
35063	c96f912f54b9b862532ce959398c76ca
35164	86c167171b777a150356f1f083203d24
35265	e1bca8d6cc1904a919cce1090e62f34d
35366	f5dd3f6267376875239222dbefac87b1
35467	d6a2aa26124dd42a9df9fa21b7eb8bce
35568	ecd36ba9a56f89d4bf6fa83c2b800985
35669	87b64475fd3f4db6dd68a45fb9a825dc
35770	f5f7aa5569558b3e6556c72c9dfc429b
35871	9e1cc67e0c13d00c771b6bed2fd566cf
35972	3a6e7c6ce76a04fa2503d094121d84d5
36073	5fd8ba2dd8d36814d06a1d278002e437
36174	10db883700dde7289eb640df3a6d6676
36275	3ebd59ed119d6dfda3eedc5bf05fd425
36376	5008d3ce585f3b2dda2b313c57ebcb0a
36477	ac7cee33e39827de02acedb7584acae5
36578	3f440facefbd95f905942c75bfe60bbb
36679	89639b3145c988c775d9d997c9d356ff
36780	a6f8b29a83b2305188c241f2724ea998
36881	d79f9bd47505cee69627e8044f7745c2
36982	5f8d8b55bc9d5b44f817ada0b9bab2f7
37083	411a99ef2e2af45640f0224274979fb5
37184	60706cd1eb7dffae3d7a34133c5cb67e
37285	272a5d09070b5a0569fb18e144100f8b
37386	0f969fd16dd186e9eb099213a82fb119
37487	6c48f63ec50e26ba42d8ca074daee9a6
37588	83512539cc5a2561426564590d307a58
37689	c57cf49bbeaa12aaba2106278681c9cd
37790	d248507181561f0aba09182c4326fb11
37891	a1e153dd8bb1334bccd73890fafc5ba9
37992	d7a0ba2d1241a07abf3691074cecff76
38093	466034794d577c41a9716bc9eb903ee2
38194	b5e2158feb4290b04a7bdfdec0a17976
38295	8a16a27008d033dd6e9074b042021e60
38396	ccaa12e89f6de3058b3a2baddc4eff00
38497	7fdbf02f369546d0fde2b7db85752e33
38598	63b286bb777298397f3acf03fc3e9deb
38699	b271f751a4952f86b002b9730bd02c8b
387100	cbd5cef546acc0bfa33117d7c1ae58a8
388show status like '%sort%';
389Variable_name	Value
390Sort_merge_passes	4
391Sort_priority_queue_sorts	0
392Sort_range	0
393Sort_rows	10000
394Sort_scan	1
395set sort_buffer_size=default;
396#
397# CASE #1 Packed sort keys with addon fields
398#
399ALTER TABLE t3 ADD INDEX idx(names, address);
400set sort_buffer_size= 2097152;
401ANALYZE FORMAT=JSON  SELECT id, names, address FROM t3 ORDER BY names, address;
402ANALYZE
403{
404  "query_block": {
405    "select_id": 1,
406    "r_loops": 1,
407    "r_total_time_ms": "REPLACED",
408    "read_sorted_file": {
409      "r_rows": 10000,
410      "filesort": {
411        "sort_key": "t3.`names`, t3.address",
412        "r_loops": 1,
413        "r_total_time_ms": "REPLACED",
414        "r_used_priority_queue": false,
415        "r_output_rows": 10000,
416        "r_buffer_size": "REPLACED",
417        "r_sort_mode": "packed_sort_key,packed_addon_fields",
418        "table": {
419          "table_name": "t3",
420          "access_type": "ALL",
421          "r_loops": 1,
422          "rows": 10000,
423          "r_rows": 10000,
424          "r_table_time_ms": "REPLACED",
425          "r_other_time_ms": "REPLACED",
426          "filtered": 100,
427          "r_filtered": 100
428        }
429      }
430    }
431  }
432}
433flush status;
434SELECT id, names, address INTO OUTFILE '$file1' FROM t3 ORDER BY names, address;
435# Sort_merge_passes should be 0
436show status like '%sort%';
437Variable_name	Value
438Sort_merge_passes	0
439Sort_priority_queue_sorts	0
440Sort_range	0
441Sort_rows	10000
442Sort_scan	1
443SELECT id, names, address INTO OUTFILE '$file2' FROM t3 FORCE INDEX(idx) ORDER BY names, address;
444#
445# CASE #2 Packed sort keys and ROW_ID
446#
447set @save_max_length_for_sort_data=@@max_length_for_sort_data;
448set max_length_for_sort_data= 300;
449set sort_buffer_size= 1097152;
450ANALYZE FORMAT=JSON  SELECT id, names, address FROM t3 ORDER BY names, address;
451ANALYZE
452{
453  "query_block": {
454    "select_id": 1,
455    "r_loops": 1,
456    "r_total_time_ms": "REPLACED",
457    "read_sorted_file": {
458      "r_rows": 10000,
459      "filesort": {
460        "sort_key": "t3.`names`, t3.address",
461        "r_loops": 1,
462        "r_total_time_ms": "REPLACED",
463        "r_used_priority_queue": false,
464        "r_output_rows": 10000,
465        "r_buffer_size": "REPLACED",
466        "r_sort_mode": "packed_sort_key,rowid",
467        "table": {
468          "table_name": "t3",
469          "access_type": "ALL",
470          "r_loops": 1,
471          "rows": 10000,
472          "r_rows": 10000,
473          "r_table_time_ms": "REPLACED",
474          "r_other_time_ms": "REPLACED",
475          "filtered": 100,
476          "r_filtered": 100
477        }
478      }
479    }
480  }
481}
482flush status;
483SELECT id, names, address INTO OUTFILE '$file1' FROM t3 ORDER BY names, address;
484# Sort_merge_passes should be 0
485show status like '%sort%';
486Variable_name	Value
487Sort_merge_passes	0
488Sort_priority_queue_sorts	0
489Sort_range	0
490Sort_rows	10000
491Sort_scan	1
492set @@max_length_for_sort_data=@save_max_length_for_sort_data;
493set @@sort_buffer_size=default;
494set @@RAND_SEED1= @save_rand_seed1;
495set @@RAND_SEED2= @save_rand_seed2;
496drop function generate_normal_distribution_sample;
497drop function generate_random_string;
498drop function clipped_normal_distribution;
499drop table t1, t2, t3;
500