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