github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/testdata/iter_histories/range_keys_simple (about) 1 reset 2 ---- 3 4 # Use the key string as the value so that it's easy to tell when we surface the 5 # wrong value. 6 7 batch commit 8 set a a 9 set b b 10 set c c 11 set d d 12 range-key-set b c @5 boop 13 range-key-set cat dog @3 beep 14 ---- 15 committed 6 keys 16 17 # Scan forward 18 19 combined-iter 20 seek-ge a 21 next 22 next 23 next 24 next 25 next 26 ---- 27 a: (a, .) 28 b: (b, [b-c) @5=boop UPDATED) 29 c: (c, . UPDATED) 30 cat: (., [cat-dog) @3=beep UPDATED) 31 d: (d, [cat-dog) @3=beep) 32 . 33 34 # Do the above forward iteration but with a mask suffix. The results should be 35 # identical despite range keys serving as masks, because none of the point keys 36 # have suffixes. 37 38 combined-iter mask-suffix=@9 39 seek-ge a 40 next 41 next 42 next 43 next 44 next 45 ---- 46 a: (a, .) 47 b: (b, [b-c) @5=boop UPDATED) 48 c: (c, . UPDATED) 49 cat: (., [cat-dog) @3=beep UPDATED) 50 d: (d, [cat-dog) @3=beep) 51 . 52 53 # Scan backward 54 55 combined-iter 56 seek-lt z 57 prev 58 prev 59 prev 60 prev 61 prev 62 ---- 63 d: (d, [cat-dog) @3=beep UPDATED) 64 cat: (., [cat-dog) @3=beep) 65 c: (c, . UPDATED) 66 b: (b, [b-c) @5=boop UPDATED) 67 a: (a, . UPDATED) 68 . 69 70 combined-iter 71 seek-ge ace 72 seek-ge b 73 seek-ge c 74 seek-ge cab 75 seek-ge cat 76 seek-ge d 77 seek-ge day 78 seek-ge dog 79 ---- 80 b: (b, [b-c) @5=boop UPDATED) 81 b: (b, [b-c) @5=boop) 82 c: (c, . UPDATED) 83 cat: (., [cat-dog) @3=beep UPDATED) 84 cat: (., [cat-dog) @3=beep) 85 d: (d, [cat-dog) @3=beep) 86 day: (., [cat-dog) @3=beep) 87 . 88 89 combined-iter 90 seek-lt 1 91 seek-lt ace 92 seek-lt b 93 seek-lt c 94 seek-lt cab 95 seek-lt cat 96 seek-lt d 97 seek-lt day 98 seek-lt dog 99 seek-lt zebra 100 ---- 101 . 102 a: (a, .) 103 a: (a, .) 104 b: (b, [b-c) @5=boop UPDATED) 105 c: (c, . UPDATED) 106 c: (c, .) 107 cat: (., [cat-dog) @3=beep UPDATED) 108 d: (d, [cat-dog) @3=beep) 109 d: (d, [cat-dog) @3=beep) 110 d: (d, [cat-dog) @3=beep) 111 112 rangekey-iter 113 first 114 next 115 next 116 set-bounds lower=bat upper=catatonic 117 first 118 next 119 next 120 ---- 121 b [b-c) @5=boop UPDATED 122 cat [cat-dog) @3=beep UPDATED 123 . 124 . 125 bat [bat-c) @5=boop UPDATED 126 cat [cat-catatonic) @3=beep UPDATED 127 . 128 129 rangekey-iter 130 seek-ge bat 131 ---- 132 bat [b-c) @5=boop UPDATED 133 134 # Delete 'b': The Iterator should still stop at b because of the range key 135 # with a start boundary at b. 136 137 batch commit 138 del b 139 ---- 140 committed 1 keys 141 142 combined-iter 143 seek-ge b 144 seek-ge ace 145 ---- 146 b: (., [b-c) @5=boop UPDATED) 147 b: (., [b-c) @5=boop) 148 149 rangekey-iter 150 seek-ge b 151 seek-ge ace 152 ---- 153 b [b-c) @5=boop UPDATED 154 b [b-c) @5=boop 155 156 # Delete the b-c range key and the beginning of the cat-dog range key, 157 # truncating it to now begin at 'd'. 158 159 batch name=indexed 160 range-key-del b d 161 ---- 162 wrote 1 keys to batch "indexed" 163 164 # Reading through the indexed batch, we should see the beginning of the cat-dog 165 # range key now beginning at 'd'. 166 167 combined-iter reader=indexed 168 seek-ge b 169 next 170 ---- 171 c: (c, .) 172 d: (d, [d-dog) @3=beep UPDATED) 173 174 commit batch=indexed 175 ---- 176 committed 1 keys 177 178 # Reading through the database after applying the batch, we should still see the 179 # beginning of the cat-dog range key now beginning at 'd'. 180 181 combined-iter 182 seek-ge b 183 next 184 ---- 185 c: (c, .) 186 d: (d, [d-dog) @3=beep UPDATED) 187 188 # Reading through the database after flushing, we should still see the 189 # beginning of the cat-dog range key now beginning at 'd'. 190 191 flush 192 ---- 193 194 combined-iter 195 seek-ge b 196 next 197 ---- 198 c: (c, .) 199 d: (d, [d-dog) @3=beep UPDATED) 200 201 202 reset 203 ---- 204 205 batch commit 206 range-key-set c d @1 boop 207 range-key-set apple c @3 beep 208 range-key-set ace apple @3 beep 209 set a a1 210 set b b1 211 set c c1 212 del a 213 set b b2 214 set c c2 215 ---- 216 committed 9 keys 217 218 # Test that reverse iteration surfaces range key start boundaries alongside 219 # point keys at the same key, and defragments logically equivalent ranges. 220 221 combined-iter 222 last 223 prev 224 prev 225 prev 226 ---- 227 c: (c2, [c-d) @1=boop UPDATED) 228 b: (b2, [ace-c) @3=beep UPDATED) 229 ace: (., [ace-c) @3=beep) 230 . 231 232 # Test that forward iteration surfaces range key start boundaries alongside 233 # point keys at the same key, and defragments logically equivalent ranges. 234 235 combined-iter 236 first 237 next 238 next 239 next 240 ---- 241 ace: (., [ace-c) @3=beep UPDATED) 242 b: (b2, [ace-c) @3=beep) 243 c: (c2, [c-d) @1=boop UPDATED) 244 . 245 246 # NB: seek-prefix-ge truncates bounds to the prefix. 247 248 combined-iter 249 seek-prefix-ge b 250 next 251 ---- 252 b: (b2, [b-"b\x00") @3=beep UPDATED) 253 . 254 255 reset 256 ---- 257 258 # For all prefixes a, aa, ab, ... zz, write 3 keys at timestamps @1, @10, @100. 259 # This populates a total of (26**2 + 26) * 3 = 2106 keys. 260 261 populate keylen=2 timestamps=(1, 10, 100) 262 ---- 263 wrote 2106 keys 264 265 batch commit 266 range-key-set b c @5 beep 267 range-key-unset c d @1 268 range-key-del d e 269 ---- 270 committed 3 keys 271 272 flush 273 ---- 274 275 metrics 276 ---- 277 Metrics.Keys.RangeKeySetsCount = 1 278 279 combined-iter 280 seek-ge az 281 next 282 next 283 next 284 next 285 next 286 seek-ge bz@10 287 next 288 next 289 ---- 290 az@100: (az@100, .) 291 az@10: (az@10, .) 292 az@1: (az@1, .) 293 b: (., [b-c) @5=beep UPDATED) 294 b@100: (b@100, [b-c) @5=beep) 295 b@10: (b@10, [b-c) @5=beep) 296 bz@10: (bz@10, [b-c) @5=beep) 297 bz@1: (bz@1, [b-c) @5=beep) 298 c@100: (c@100, . UPDATED) 299 300 # Perform the same iteration with all range keys serving as masks. The bz@1 301 # point key should be elided. 302 303 combined-iter mask-suffix=@100 304 seek-ge az 305 next 306 next 307 next 308 next 309 next 310 seek-ge bz@10 311 next 312 next 313 ---- 314 az@100: (az@100, .) 315 az@10: (az@10, .) 316 az@1: (az@1, .) 317 b: (., [b-c) @5=beep UPDATED) 318 b@100: (b@100, [b-c) @5=beep) 319 b@10: (b@10, [b-c) @5=beep) 320 bz@10: (bz@10, [b-c) @5=beep) 321 c@100: (c@100, . UPDATED) 322 c@10: (c@10, .) 323 324 # Ensure that a cloned iterator includes range keys. 325 326 combined-iter 327 seek-ge bz@10 328 clone 329 seek-ge bz@10 330 ---- 331 bz@10: (bz@10, [b-c) @5=beep UPDATED) 332 . 333 bz@10: (bz@10, [b-c) @5=beep UPDATED) 334 335 # Within a batch, later writes overwrite earlier writes. Here, the range-key-del 336 # of [bat, bus) overwrites the earlier writes of [b,c) and [b,e). 337 338 batch commit 339 range-key-set b c @5 beep 340 range-key-set b e @1 bop 341 range-key-set c z @1000 boop 342 range-key-del bat bus 343 ---- 344 committed 4 keys 345 346 flush 347 ---- 348 349 lsm 350 ---- 351 0.1: 352 000008:[b#2120,RANGEKEYSET-z#inf,RANGEKEYSET] 353 0.0: 354 000006:[a@100#12,SET-zz@1#2113,SET] 355 356 scan-rangekeys 357 ---- 358 [b, bat) 359 @5=beep, @1=bop 360 [bus, c) 361 @5=beep, @1=bop 362 [c, e) 363 @1000=boop, @1=bop 364 [e, z) 365 @1000=boop 366 367 # NB: There are now 8 range key sets in the database. See the 7 range keys in 368 # the above scan-rangekeys. Additionally, the sstable flushed earlier up above 369 # included a rangekeyset [b,c) @5=beep. 370 371 metrics 372 ---- 373 Metrics.Keys.RangeKeySetsCount = 8 374 375 376 combined-iter 377 seek-prefix-ge ca 378 next 379 seek-prefix-ge ca@100 380 ---- 381 ca: (., [ca-"ca\x00") @1000=boop, @1=bop UPDATED) 382 ca@100: (ca@100, [ca-"ca\x00") @1000=boop, @1=bop) 383 ca@100: (ca@100, [ca-"ca\x00") @1000=boop, @1=bop) 384 385 386 # Perform the same iteration as above, but with @1000 range-key masking. The 387 # previously encountered point keys should be elided. 388 389 combined-iter mask-suffix=@1000 390 seek-prefix-ge ca 391 next 392 seek-prefix-ge ca@100 393 ---- 394 ca: (., [ca-"ca\x00") @1000=boop, @1=bop UPDATED) 395 . 396 ca@100: (., [ca-"ca\x00") @1000=boop, @1=bop UPDATED) 397 398 # Test masked, non-prefixed iteration. We should see the range keys, but all the 399 # points should be masked except those beginning with z which were excluded by 400 # the range key's exclusive z end bound. 401 402 combined-iter mask-suffix=@1000 403 seek-ge ca 404 next 405 next 406 next 407 next 408 next 409 ---- 410 ca: (., [c-e) @1000=boop, @1=bop UPDATED) 411 e: (., [e-z) @1000=boop UPDATED) 412 z@100: (z@100, . UPDATED) 413 z@10: (z@10, .) 414 z@1: (z@1, .) 415 za@100: (za@100, .) 416 417 # Applying range keys to a DB running with a version that doesn't support them 418 # results in an error. Range keys were added in version 7. 419 reset format-major-version=6 420 ---- 421 422 batch commit 423 range-key-set a z @5 boop 424 ---- 425 pebble: batch requires at least format major version 8 (current: 6) 426 427 # Constructing iterator over range keys on a DB that doesn't support them 428 # results in an error. 429 430 reset format-major-version=6 431 ---- 432 433 combined-iter 434 ---- 435 pebble: range keys require at least format major version 8 (current: 6) 436 437 # Test Prev-ing back over a synthetic range key marker. Synthetic range-key 438 # markers (the keys interleaved at 'c' during a SeekGE(c) when there's a 439 # straddling range key) are ephemeral, and Prev-ing back must move back the 440 # appropriate number of times. 441 442 reset 443 ---- 444 445 batch commit 446 set a a 447 range-key-set b e @1 foo 448 ---- 449 committed 2 keys 450 451 flush 452 ---- 453 454 combined-iter 455 seek-ge b 456 prev 457 seek-ge c 458 prev 459 ---- 460 b: (., [b-e) @1=foo UPDATED) 461 a: (a, . UPDATED) 462 c: (., [b-e) @1=foo UPDATED) 463 b: (., [b-e) @1=foo) 464 465 define 466 L6 467 a.RANGEDEL.3:z 468 rangekey:b-d:{(#5,RANGEKEYSET,@2,foo)} 469 ---- 470 6: 471 000004:[a#3,RANGEDEL-z#inf,RANGEDEL] 472 473 combined-iter 474 seek-lt apple 475 ---- 476 . 477 478 combined-iter 479 seek-ge apple 480 seek-ge z 481 seek-lt apple 482 seek-lt z 483 first 484 last 485 ---- 486 b: (., [b-d) @2=foo UPDATED) 487 . 488 . 489 b: (., [b-d) @2=foo UPDATED) 490 b: (., [b-d) @2=foo) 491 b: (., [b-d) @2=foo) 492 493 combined-iter 494 seek-ge apple 495 prev 496 last 497 next 498 prev 499 seek-lt c 500 prev 501 ---- 502 b: (., [b-d) @2=foo UPDATED) 503 . 504 b: (., [b-d) @2=foo UPDATED) 505 . 506 b: (., [b-d) @2=foo UPDATED) 507 b: (., [b-d) @2=foo) 508 .