1CREATE TABLE t1 (
2a int PRIMARY KEY,
3b int NOT NULL,
4KEY kb (b)
5) ENGINE=rocksdb
6COMMENT='ttl_duration=1;';
7set global rocksdb_debug_ttl_rec_ts = -100;
8INSERT INTO t1 values (1, 1);
9INSERT INTO t1 values (2, 2);
10set global rocksdb_debug_ttl_rec_ts = 0;
11set global rocksdb_force_flush_memtable_now=1;
12SELECT * FROM t1 FORCE INDEX (PRIMARY);
13a	b
14SELECT * FROM t1 FORCE INDEX (kb);
15a	b
16select variable_value into @c from information_schema.global_status where variable_name='rocksdb_rows_expired';
17set global rocksdb_debug_ttl_ignore_pk = 1;
18set global rocksdb_compact_cf='default';
19set global rocksdb_debug_ttl_ignore_pk = 0;
20select variable_value-@c from information_schema.global_status where variable_name='rocksdb_rows_expired';
21variable_value-@c
222
23DROP TABLE t1;
24CREATE TABLE t1 (
25a int PRIMARY KEY,
26b BIGINT UNSIGNED NOT NULL,
27KEY kb (b)
28) ENGINE=rocksdb
29COMMENT='ttl_duration=10;';
30set global rocksdb_debug_ttl_rec_ts = -300;
31INSERT INTO t1 values (1, UNIX_TIMESTAMP());
32set global rocksdb_debug_ttl_rec_ts = 300;
33INSERT INTO t1 values (2, UNIX_TIMESTAMP());
34INSERT INTO t1 values (3, UNIX_TIMESTAMP());
35set global rocksdb_debug_ttl_rec_ts = 0;
36set global rocksdb_force_flush_memtable_now=1;
37# 1 should be hidden
38SELECT a FROM t1 FORCE INDEX (PRIMARY);
39a
402
413
42SELECT a FROM t1 FORCE INDEX (kb);
43a
442
453
46set global rocksdb_debug_ttl_ignore_pk = 1;
47set global rocksdb_compact_cf='default';
48set global rocksdb_debug_ttl_ignore_pk = 0;
49# none should be hidden yet, compaction runs but records aren't expired
50SELECT a FROM t1 FORCE INDEX (PRIMARY);
51a
522
533
54SELECT a FROM t1 FORCE INDEX (kb);
55a
562
573
58# all should be hidden now, even though compaction hasn't run again
59set global rocksdb_debug_ttl_read_filter_ts = -310;
60SELECT a FROM t1 FORCE INDEX (PRIMARY);
61a
62SELECT a FROM t1 FORCE INDEX (kb);
63a
64set global rocksdb_debug_ttl_read_filter_ts = 0;
65DROP TABLE t1;
66CREATE TABLE t1 (
67a int PRIMARY KEY,
68b int NOT NULL,
69KEY kb (b)
70) ENGINE=rocksdb
71COMMENT='ttl_duration=1;';
72set global rocksdb_debug_ttl_rec_ts = -100;
73INSERT INTO t1 values (1, 1);
74INSERT INTO t1 values (3, 3);
75INSERT INTO t1 values (5, 5);
76INSERT INTO t1 values (7, 7);
77set global rocksdb_debug_ttl_rec_ts = 0;
78# should return nothing.
79SELECT * FROM t1 FORCE INDEX (PRIMARY);
80a	b
81SELECT * FROM t1 FORCE INDEX (kb);
82a	b
83set global rocksdb_enable_ttl_read_filtering=0;
84# should return everything
85SELECT * FROM t1 FORCE INDEX (PRIMARY);
86a	b
871	1
883	3
895	5
907	7
91SELECT * FROM t1 FORCE INDEX (kb);
92a	b
931	1
943	3
955	5
967	7
97set global rocksdb_enable_ttl_read_filtering=1;
98# should return nothing.
99SELECT * FROM t1 FORCE INDEX (PRIMARY);
100a	b
101SELECT * FROM t1 FORCE INDEX (kb);
102a	b
103DROP TABLE t1;
104set global rocksdb_compact_cf= 'default';
105# Read filtering index scan tests (None of these queries should return any results)
106CREATE TABLE t1 (
107a int,
108b int,
109c int,
110PRIMARY KEY (a,b,c),
111KEY kb (b)
112) ENGINE=rocksdb
113COMMENT='ttl_duration=1;';
114set global rocksdb_debug_ttl_rec_ts = -100;
115INSERT INTO t1 values (0,0,0);
116INSERT INTO t1 values (0,0,1);
117INSERT INTO t1 values (0,1,0);
118INSERT INTO t1 values (0,1,1);
119INSERT INTO t1 values (1,1,2);
120INSERT INTO t1 values (1,2,1);
121INSERT INTO t1 values (1,2,2);
122INSERT INTO t1 values (1,2,3);
123set global rocksdb_debug_ttl_rec_ts = 0;
124select variable_value into @c from information_schema.global_status where variable_name='rocksdb_rows_expired';
125set global rocksdb_force_flush_memtable_now=1;
126SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE a=1 AND b=2 AND c=2;
127a	b	c
128SELECT * FROM t1 FORCE INDEX (kb) WHERE a=1 AND b=2 AND c=2;
129a	b	c
130SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE a = 1;
131a	b	c
132SELECT * FROM t1 FORCE INDEX (kb) WHERE a = 1;
133a	b	c
134SELECT max(a) FROM t1 FORCE INDEX (PRIMARY) WHERE a < 3;
135max(a)
136NULL
137SELECT max(a) FROM t1 FORCE INDEX (kb) WHERE a < 3;
138max(a)
139NULL
140SELECT max(a) FROM t1 FORCE INDEX (PRIMARY) WHERE a < 2 AND b = 1 AND c < 3;
141max(a)
142NULL
143SELECT max(a) FROM t1 FORCE INDEX (kb) WHERE a < 2 AND b = 1 AND c < 3;
144max(a)
145NULL
146SELECT min(a) FROM t1 FORCE INDEX (PRIMARY) WHERE a >= 1;
147min(a)
148NULL
149SELECT min(a) FROM t1 FORCE INDEX (kb) WHERE a >= 1;
150min(a)
151NULL
152SELECT min(a) FROM t1 FORCE INDEX (PRIMARY) WHERE a > 1;
153min(a)
154NULL
155SELECT min(a) FROM t1 FORCE INDEX (kb) WHERE a > 1;
156min(a)
157NULL
158SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE a=1 and b in (1) order by c desc;
159a	b	c
160SELECT * FROM t1 FORCE INDEX (kb) WHERE a=1 and b in (1) order by c desc;
161a	b	c
162SELECT max(a) FROM t1 FORCE INDEX (PRIMARY) WHERE a <=10;
163max(a)
164NULL
165SELECT max(a) FROM t1 FORCE INDEX (kb) WHERE a <=10;
166max(a)
167NULL
168SELECT a FROM t1 FORCE INDEX (PRIMARY) WHERE a > 0 and a <= 2;
169a
170SELECT a FROM t1 FORCE INDEX (kb) WHERE a > 0 and a <= 2;
171a
172select variable_value-@c from information_schema.global_status where variable_name='rocksdb_rows_expired';
173variable_value-@c
1740
175set global rocksdb_debug_ttl_ignore_pk = 1;
176set global rocksdb_compact_cf='default';
177set global rocksdb_debug_ttl_ignore_pk = 0;
178select variable_value-@c from information_schema.global_status where variable_name='rocksdb_rows_expired';
179variable_value-@c
1808
181DROP TABLE t1;
182# Attempt to update expired value, should filter out
183set global rocksdb_force_flush_memtable_now=1;
184CREATE TABLE t1 (
185a int PRIMARY KEY
186) ENGINE=rocksdb
187COMMENT='ttl_duration=1;';
188set global rocksdb_debug_ttl_rec_ts = -100;
189INSERT INTO t1 values (1);
190set global rocksdb_debug_ttl_rec_ts = 0;
191SELECT * FROM t1 FORCE INDEX (PRIMARY);
192a
193SELECT * FROM t1;
194a
195# No error is thrown here, under the hood index_next_with_direction is
196# filtering out the record from being seen in the first place.
197UPDATE t1 set a = 1;
198DROP TABLE t1;
199# Ensure no rows can disappear in the middle of long-running transactions
200# Also ensure repeatable-read works as expected
201connect  con1,localhost,root,,;
202connect  con2,localhost,root,,;
203CREATE TABLE t1 (
204a int PRIMARY KEY,
205b int NOT NULL,
206KEY kb (b)
207) ENGINE=rocksdb
208COMMENT='ttl_duration=5;';
209INSERT INTO t1 values (1, 1);
210connection con1;
211# Creating Snapshot (start transaction)
212BEGIN;
213# Nothing filtered out here
214SELECT * FROM t1 FORCE INDEX (PRIMARY);
215a	b
2161	1
217SELECT * FROM t1 FORCE INDEX (kb);
218a	b
2191	1
220SELECT * FROM t1 FORCE INDEX (PRIMARY);
221a	b
2221	1
223SELECT * FROM t1 FORCE INDEX (kb);
224a	b
2251	1
226# Switching to connection 2
227connection con2;
228# compaction doesn't do anything since con1 snapshot is still open
229set global rocksdb_debug_ttl_ignore_pk = 1;
230set global rocksdb_force_flush_memtable_now=1;
231set global rocksdb_compact_cf='default';
232set global rocksdb_debug_ttl_ignore_pk = 0;
233# read filtered out, because on a different connection, on
234# this connection the records have 'expired' already so they are filtered out
235# even though they have not yet been removed by compaction
236SELECT * FROM t1 FORCE INDEX (PRIMARY);
237a	b
238SELECT * FROM t1 FORCE INDEX (kb);
239a	b
240# Switching to connection 1
241connection con1;
242SELECT * FROM t1 FORCE INDEX (PRIMARY);
243a	b
2441	1
245SELECT * FROM t1 FORCE INDEX (kb);
246a	b
2471	1
248UPDATE t1 set a = a + 1;
249SELECT * FROM t1 FORCE INDEX (PRIMARY);
250a	b
2512	1
252SELECT * FROM t1 FORCE INDEX (kb);
253a	b
2542	1
255COMMIT;
256SELECT * FROM t1 FORCE INDEX (PRIMARY);
257a	b
258SELECT * FROM t1 FORCE INDEX (kb);
259a	b
260DROP TABLE t1;
261disconnect con1;
262disconnect con2;
263connect  con1,localhost,root,,;
264connect  con2,localhost,root,,;
265set global rocksdb_force_flush_memtable_now=1;
266set global rocksdb_compact_cf='default';
267CREATE TABLE t1 (
268a int PRIMARY KEY,
269b int NOT NULL,
270KEY kb (b)
271) ENGINE=rocksdb
272COMMENT='ttl_duration=1;';
273# On Connection 1
274connection con1;
275# Creating Snapshot (start transaction)
276BEGIN;
277SELECT * FROM t1 FORCE INDEX (kb);
278a	b
279# On Connection 2
280connection con2;
281set global rocksdb_debug_ttl_rec_ts = -2;
282INSERT INTO t1 values (1, 1);
283INSERT INTO t1 values (3, 3);
284INSERT INTO t1 values (5, 5);
285INSERT INTO t1 values (7, 7);
286set global rocksdb_debug_ttl_rec_ts = 0;
287set global rocksdb_force_flush_memtable_now=1;
288set global rocksdb_compact_cf='default';
289# On Connection 1
290connection con1;
291SELECT * FROM t1 FORCE INDEX (PRIMARY);
292a	b
293SELECT * FROM t1 FORCE INDEX (kb);
294a	b
295# On Connection 2
296connection con2;
297SELECT * FROM t1 FORCE INDEX (PRIMARY);
298a	b
299SELECT * FROM t1 FORCE INDEX (kb);
300a	b
301set global rocksdb_enable_ttl_read_filtering=0;
302SELECT * FROM t1 FORCE INDEX (PRIMARY);
303a	b
3041	1
3053	3
3065	5
3077	7
308SELECT * FROM t1 FORCE INDEX (kb);
309a	b
3101	1
3113	3
3125	5
3137	7
314set global rocksdb_enable_ttl_read_filtering=1;
315disconnect con2;
316disconnect con1;
317connection default;
318DROP TABLE t1;
319CREATE TABLE t1 (
320a int,
321b int,
322ts bigint(20) UNSIGNED NOT NULL,
323PRIMARY KEY (a),
324KEY kb (b)
325) ENGINE=rocksdb
326COMMENT='ttl_duration=1;ttl_col=ts;';
327set global rocksdb_debug_ttl_rec_ts = 100;
328INSERT INTO t1 VALUES (1, 1, UNIX_TIMESTAMP());
329INSERT INTO t1 VALUES (2, 2, UNIX_TIMESTAMP());
330INSERT INTO t1 VALUES (3, 3, UNIX_TIMESTAMP());
331INSERT INTO t1 VALUES (4, 4, UNIX_TIMESTAMP());
332INSERT INTO t1 VALUES (5, 5, UNIX_TIMESTAMP());
333INSERT INTO t1 VALUES (6, 6, UNIX_TIMESTAMP());
334INSERT INTO t1 VALUES (7, 7, UNIX_TIMESTAMP());
335INSERT INTO t1 VALUES (8, 8, UNIX_TIMESTAMP());
336INSERT INTO t1 VALUES (9, 9, UNIX_TIMESTAMP());
337INSERT INTO t1 VALUES (10, 10, UNIX_TIMESTAMP());
338set global rocksdb_debug_ttl_rec_ts = 0;
339set global rocksdb_force_flush_memtable_now=1;
340# None are expired
341SELECT a, b FROM t1 FORCE INDEX (kb);
342a	b
3431	1
3442	2
3453	3
3464	4
3475	5
3486	6
3497	7
3508	8
3519	9
35210	10
353set global rocksdb_debug_ttl_rec_ts = -100;
354UPDATE t1 SET ts=(UNIX_TIMESTAMP()+1) WHERE a IN (4, 7);
355set global rocksdb_debug_ttl_rec_ts = 0;
356set global rocksdb_force_flush_memtable_now=1;
357set global rocksdb_compact_cf='default';
358# 4 and 7 should be gone
359SELECT a, b FROM t1 FORCE INDEX (kb);
360a	b
3611	1
3622	2
3633	3
3645	5
3656	6
3668	8
3679	9
36810	10
369DROP TABLE t1;
370CREATE TABLE t1 (
371c1 INT,
372c2 INT,
373name VARCHAR(25) NOT NULL,
374PRIMARY KEY (c1, c2),
375KEY kc2 (c2)
376) ENGINE=ROCKSDB
377COMMENT='ttl_duration=1;';
378set global rocksdb_debug_ttl_rec_ts = -1200;
379INSERT INTO t1 values (1,1,'a');
380INSERT INTO t1 values (2,2,'b');
381set global rocksdb_debug_ttl_rec_ts = 1200;
382INSERT INTO t1 values (3,3,'c');
383INSERT INTO t1 values (4,4,'d');
384set global rocksdb_debug_ttl_rec_ts = -1200;
385INSERT INTO t1 values (5,5,'e');
386INSERT INTO t1 values (6,6,'f');
387set global rocksdb_debug_ttl_rec_ts = 1200;
388INSERT INTO t1 values (7,7,'g');
389INSERT INTO t1 values (8,8,'h');
390set global rocksdb_debug_ttl_rec_ts = 0;
391SELECT * FROM t1 FORCE INDEX (PRIMARY);
392c1	c2	name
3933	3	c
3944	4	d
3957	7	g
3968	8	h
397SELECT * FROM t1 FORCE INDEX (kc2);
398c1	c2	name
3993	3	c
4004	4	d
4017	7	g
4028	8	h
403SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE c1 > 5;
404c1	c2	name
4057	7	g
4068	8	h
407SELECT * FROM t1 FORCE INDEX (kc2) WHERE c2 > 5;
408c1	c2	name
4097	7	g
4108	8	h
411SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE 3 < c1 AND c1 < 6;
412c1	c2	name
4134	4	d
414SELECT * FROM t1 FORCE INDEX (kc2) WHERE 3 < c2 AND c2 < 6;
415c1	c2	name
4164	4	d
417DROP TABLE t1;
418CREATE TABLE t1 (
419a int,
420b int,
421PRIMARY KEY (a),
422KEY kb (b)
423) ENGINE=rocksdb
424COMMENT='ttl_duration=1800;';
425set global rocksdb_debug_ttl_rec_ts = 0;
426INSERT INTO t1 values (1,1);
427INSERT INTO t1 values (2,2);
428INSERT INTO t1 values (7,7);
429INSERT INTO t1 values (10,10);
430INSERT INTO t1 values (11,11);
431INSERT INTO t1 values (12,12);
432set global rocksdb_debug_ttl_rec_ts = 450;
433INSERT INTO t1 values (3,3);
434INSERT INTO t1 values (4,4);
435INSERT INTO t1 values (8,8);
436INSERT INTO t1 values (16,16);
437INSERT INTO t1 values (17,17);
438INSERT INTO t1 values (18,18);
439set global rocksdb_debug_ttl_rec_ts = 900;
440INSERT INTO t1 values (5,5);
441INSERT INTO t1 values (6,6);
442INSERT INTO t1 values (9,9);
443INSERT INTO t1 values (13,13);
444INSERT INTO t1 values (14,14);
445INSERT INTO t1 values (15,15);
446set global rocksdb_debug_ttl_rec_ts = 0;
447# Should see everything
448SELECT * FROM t1;
449a	b
4501	1
4512	2
4523	3
4534	4
4545	5
4556	6
4567	7
4578	8
4589	9
45910	10
46011	11
46112	12
46213	13
46314	14
46415	15
46516	16
46617	17
46718	18
468# Should have no records from the first group
469set global rocksdb_debug_ttl_read_filter_ts = -1800;
470SELECT * FROM t1;
471a	b
4723	3
4734	4
4745	5
4756	6
4768	8
4779	9
47813	13
47914	14
48015	15
48116	16
48217	17
48318	18
484SELECT * FROM t1 FORCE INDEX (kb) WHERE a > 5 AND a < 15;
485a	b
4866	6
4878	8
4889	9
48913	13
49014	14
491# Should only have records from the last group
492set global rocksdb_debug_ttl_read_filter_ts = -1800 - 450;
493SELECT * FROM t1;
494a	b
4955	5
4966	6
4979	9
49813	13
49914	14
50015	15
501SELECT * FROM t1 FORCE INDEX (kb) WHERE a < 10;
502a	b
5035	5
5046	6
5059	9
506# Should be empty
507set global rocksdb_debug_ttl_read_filter_ts = -1800 - 900;
508SELECT * FROM t1;
509a	b
510set global rocksdb_debug_ttl_read_filter_ts = 0;
511DROP TABLE t1;
512