github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/internal/keyspan/testdata/merging_iter (about) 1 # Test a single level. 2 3 define 4 a-c:{(#10,RANGEKEYSET,@5,apples) (#10,RANGEKEYDEL) (#8,RANGEKEYUNSET,@1) (#4,RANGEKEYSET,@3,bananas)} 5 c-d:{(#4,RANGEKEYSET,@3,coconut)} 6 e-f:{(#20,RANGEKEYSET,@5,pineapple) (#20,RANGEKEYSET,@3,guava)} 7 h-j:{(#22,RANGEKEYDEL) (#21,RANGEKEYSET,@5,peaches) (#21,RANGEKEYSET,@3,starfruit)} 8 l-m:{(#2,RANGEKEYUNSET,@9) (#2,RANGEKEYUNSET,@5)} 9 q-z:{(#14,RANGEKEYSET,@9,mangos)} 10 ---- 11 1 levels 12 13 iter 14 first 15 next 16 next 17 next 18 next 19 next 20 next 21 ---- 22 a-c:{(#10,RANGEKEYSET,@5,apples) (#10,RANGEKEYDEL) (#8,RANGEKEYUNSET,@1) (#4,RANGEKEYSET,@3,bananas)} 23 c-d:{(#4,RANGEKEYSET,@3,coconut)} 24 e-f:{(#20,RANGEKEYSET,@5,pineapple) (#20,RANGEKEYSET,@3,guava)} 25 h-j:{(#22,RANGEKEYDEL) (#21,RANGEKEYSET,@5,peaches) (#21,RANGEKEYSET,@3,starfruit)} 26 l-m:{(#2,RANGEKEYUNSET,@9) (#2,RANGEKEYUNSET,@5)} 27 q-z:{(#14,RANGEKEYSET,@9,mangos)} 28 <nil> 29 30 # Test snapshot filtering. 31 32 define snapshot=12 33 a-c:{(#10,RANGEKEYSET,@5,apples) (#10,RANGEKEYDEL) (#8,RANGEKEYUNSET,@1) (#4,RANGEKEYSET,@3,bananas)} 34 c-d:{(#4,RANGEKEYSET,@3,coconut)} 35 e-f:{(#20,RANGEKEYSET,@5,pineapple) (#20,RANGEKEYSET,@3,guava)} 36 h-j:{(#22,RANGEKEYDEL) (#21,RANGEKEYSET,@5,peaches) (#21,RANGEKEYSET,@3,starfruit)} 37 l-m:{(#2,RANGEKEYUNSET,@9) (#2,RANGEKEYUNSET,@5)} 38 q-z:{(#14,RANGEKEYSET,@9,mangos)} 39 ---- 40 1 levels 41 42 iter 43 first 44 next 45 next 46 next 47 next 48 next 49 next 50 ---- 51 a-c:{(#10,RANGEKEYSET,@5,apples) (#10,RANGEKEYDEL) (#8,RANGEKEYUNSET,@1) (#4,RANGEKEYSET,@3,bananas)} 52 c-d:{(#4,RANGEKEYSET,@3,coconut)} 53 e-f:{} 54 h-j:{} 55 l-m:{(#2,RANGEKEYUNSET,@9) (#2,RANGEKEYUNSET,@5)} 56 q-z:{} 57 <nil> 58 59 define 60 b-d:{#10,RANGEKEYSET,@1,apples} 61 e-h:{#8,RANGEKEYDEL} 62 -- 63 a-c:{#3,RANGEKEYUNSET,@1} 64 h-k:{#5,RANGEKEYDEL} 65 ---- 66 2 levels 67 68 iter 69 first 70 next 71 next 72 next 73 next 74 next 75 ---- 76 a-b:{(#3,RANGEKEYUNSET,@1)} 77 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 78 c-d:{(#10,RANGEKEYSET,@1,apples)} 79 e-h:{(#8,RANGEKEYDEL)} 80 h-k:{(#5,RANGEKEYDEL)} 81 <nil> 82 83 iter 84 last 85 prev 86 prev 87 prev 88 prev 89 prev 90 ---- 91 h-k:{(#5,RANGEKEYDEL)} 92 e-h:{(#8,RANGEKEYDEL)} 93 c-d:{(#10,RANGEKEYSET,@1,apples)} 94 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 95 a-b:{(#3,RANGEKEYUNSET,@1)} 96 <nil> 97 98 # Test changing directions at each iterator position, reverse to forward. 99 iter 100 last 101 next 102 last 103 prev 104 next 105 ---- 106 h-k:{(#5,RANGEKEYDEL)} 107 <nil> 108 h-k:{(#5,RANGEKEYDEL)} 109 e-h:{(#8,RANGEKEYDEL)} 110 h-k:{(#5,RANGEKEYDEL)} 111 112 iter 113 last 114 prev 115 prev 116 next 117 ---- 118 h-k:{(#5,RANGEKEYDEL)} 119 e-h:{(#8,RANGEKEYDEL)} 120 c-d:{(#10,RANGEKEYSET,@1,apples)} 121 e-h:{(#8,RANGEKEYDEL)} 122 123 iter 124 last 125 prev 126 prev 127 prev 128 next 129 ---- 130 h-k:{(#5,RANGEKEYDEL)} 131 e-h:{(#8,RANGEKEYDEL)} 132 c-d:{(#10,RANGEKEYSET,@1,apples)} 133 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 134 c-d:{(#10,RANGEKEYSET,@1,apples)} 135 136 iter 137 last 138 prev 139 prev 140 prev 141 prev 142 next 143 ---- 144 h-k:{(#5,RANGEKEYDEL)} 145 e-h:{(#8,RANGEKEYDEL)} 146 c-d:{(#10,RANGEKEYSET,@1,apples)} 147 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 148 a-b:{(#3,RANGEKEYUNSET,@1)} 149 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 150 151 iter 152 last 153 prev 154 prev 155 prev 156 prev 157 prev 158 next 159 ---- 160 h-k:{(#5,RANGEKEYDEL)} 161 e-h:{(#8,RANGEKEYDEL)} 162 c-d:{(#10,RANGEKEYSET,@1,apples)} 163 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 164 a-b:{(#3,RANGEKEYUNSET,@1)} 165 <nil> 166 a-b:{(#3,RANGEKEYUNSET,@1)} 167 168 # Test changing directions at each iterator position, forward to reverse. 169 170 iter 171 first 172 prev 173 first 174 next 175 prev 176 ---- 177 a-b:{(#3,RANGEKEYUNSET,@1)} 178 <nil> 179 a-b:{(#3,RANGEKEYUNSET,@1)} 180 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 181 a-b:{(#3,RANGEKEYUNSET,@1)} 182 183 iter 184 first 185 next 186 next 187 prev 188 ---- 189 a-b:{(#3,RANGEKEYUNSET,@1)} 190 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 191 c-d:{(#10,RANGEKEYSET,@1,apples)} 192 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 193 194 iter 195 first 196 next 197 next 198 next 199 prev 200 ---- 201 a-b:{(#3,RANGEKEYUNSET,@1)} 202 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 203 c-d:{(#10,RANGEKEYSET,@1,apples)} 204 e-h:{(#8,RANGEKEYDEL)} 205 c-d:{(#10,RANGEKEYSET,@1,apples)} 206 207 iter 208 first 209 next 210 next 211 next 212 next 213 next 214 prev 215 ---- 216 a-b:{(#3,RANGEKEYUNSET,@1)} 217 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 218 c-d:{(#10,RANGEKEYSET,@1,apples)} 219 e-h:{(#8,RANGEKEYDEL)} 220 h-k:{(#5,RANGEKEYDEL)} 221 <nil> 222 h-k:{(#5,RANGEKEYDEL)} 223 224 iter 225 first 226 next 227 next 228 next 229 next 230 prev 231 ---- 232 a-b:{(#3,RANGEKEYUNSET,@1)} 233 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 234 c-d:{(#10,RANGEKEYSET,@1,apples)} 235 e-h:{(#8,RANGEKEYDEL)} 236 h-k:{(#5,RANGEKEYDEL)} 237 e-h:{(#8,RANGEKEYDEL)} 238 239 # Test SeekGE. Note that MergingIter's SeekGE implements the FragmentIterator's 240 # SeekGE semantics. It returns the first fragment that covers a key ≥ the search 241 # key. 242 243 iter 244 seek-ge cc 245 ---- 246 c-d:{(#10,RANGEKEYSET,@1,apples)} 247 248 iter 249 seek-ge 1 250 seek-ge a 251 seek-ge b 252 seek-ge bb 253 ---- 254 a-b:{(#3,RANGEKEYUNSET,@1)} 255 a-b:{(#3,RANGEKEYUNSET,@1)} 256 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 257 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 258 259 iter 260 seek-ge c 261 seek-ge cc 262 seek-ge e 263 seek-ge f 264 ---- 265 c-d:{(#10,RANGEKEYSET,@1,apples)} 266 c-d:{(#10,RANGEKEYSET,@1,apples)} 267 e-h:{(#8,RANGEKEYDEL)} 268 e-h:{(#8,RANGEKEYDEL)} 269 270 iter 271 seek-ge h 272 seek-ge i 273 seek-ge k 274 seek-ge l 275 ---- 276 h-k:{(#5,RANGEKEYDEL)} 277 h-k:{(#5,RANGEKEYDEL)} 278 <nil> 279 <nil> 280 281 # Test SeekLT. Note that MergingIter's SeekLT implements the FragmentIterator's 282 # SeekLT semantics. It returns the first fragment with a Start key < the search 283 # key, NOT the first fragment that covers a key < the search key. 284 # 285 # NB: seek-lt bb finds b-c#3.RANGEKEYUNSET (the last fragment with the bounds 286 # [b,c), unlike the above seek-ge b which finds the first). 287 288 iter 289 seek-lt b 290 ---- 291 a-b:{(#3,RANGEKEYUNSET,@1)} 292 293 iter 294 seek-lt 1 295 seek-lt a 296 seek-lt aa 297 seek-lt b 298 seek-lt bb 299 seek-lt c 300 ---- 301 <nil> 302 <nil> 303 a-b:{(#3,RANGEKEYUNSET,@1)} 304 a-b:{(#3,RANGEKEYUNSET,@1)} 305 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 306 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 307 308 iter 309 seek-lt cc 310 seek-lt d 311 seek-lt dd 312 seek-lt e 313 seek-lt ee 314 seek-lt h 315 seek-lt hh 316 seek-lt k 317 seek-lt z 318 ---- 319 c-d:{(#10,RANGEKEYSET,@1,apples)} 320 c-d:{(#10,RANGEKEYSET,@1,apples)} 321 c-d:{(#10,RANGEKEYSET,@1,apples)} 322 c-d:{(#10,RANGEKEYSET,@1,apples)} 323 e-h:{(#8,RANGEKEYDEL)} 324 e-h:{(#8,RANGEKEYDEL)} 325 h-k:{(#5,RANGEKEYDEL)} 326 h-k:{(#5,RANGEKEYDEL)} 327 h-k:{(#5,RANGEKEYDEL)} 328 329 define 330 a-f:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 331 k-s:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 332 ---- 333 1 levels 334 335 iter 336 first 337 prev 338 next 339 ---- 340 a-f:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 341 <nil> 342 a-f:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 343 344 iter 345 last 346 next 347 prev 348 ---- 349 k-s:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 350 <nil> 351 k-s:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 352 353 define 354 w-x:{(#5,RANGEKEYDEL) (#3,RANGEKEYDEL)} 355 x-z:{(#5,RANGEKEYDEL)} 356 -- 357 w-y:{(#4,RANGEKEYDEL) (#1,RANGEKEYDEL)} 358 ---- 359 2 levels 360 361 iter 362 last 363 next 364 prev 365 first 366 prev 367 next 368 ---- 369 y-z:{(#5,RANGEKEYDEL)} 370 <nil> 371 y-z:{(#5,RANGEKEYDEL)} 372 w-x:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL) (#3,RANGEKEYDEL) (#1,RANGEKEYDEL)} 373 <nil> 374 w-x:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL) (#3,RANGEKEYDEL) (#1,RANGEKEYDEL)} 375 376 iter 377 seek-ge x 378 prev 379 seek-ge xray 380 prev 381 ---- 382 x-y:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL) (#1,RANGEKEYDEL)} 383 w-x:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL) (#3,RANGEKEYDEL) (#1,RANGEKEYDEL)} 384 x-y:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL) (#1,RANGEKEYDEL)} 385 w-x:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL) (#3,RANGEKEYDEL) (#1,RANGEKEYDEL)} 386 387 define 388 il-qb:{(#10,RANGEKEYDEL)} 389 sn-wn:{(#10,RANGEKEYDEL)} 390 -- 391 qt-kh:{(#9,RANGEKEYDEL) (#8,RANGEKEYDEL) (#7,RANGEKEYDEL)} 392 ky-sv:{(#8,RANGEKEYDEL) (#7,RANGEKEYDEL)} 393 -- 394 as-fz:{(#5,RANGEKEYDEL) (#4,RANGEKEYDEL)} 395 hh-ir:{(#4,RANGEKEYDEL)} 396 rf-yx:{(#4,RANGEKEYDEL)} 397 ---- 398 3 levels 399 400 iter 401 seek-ge qp 402 next 403 next 404 next 405 next 406 next 407 seek-ge yz 408 prev 409 ---- 410 qb-rf:{(#8,RANGEKEYDEL) (#7,RANGEKEYDEL)} 411 rf-sn:{(#8,RANGEKEYDEL) (#7,RANGEKEYDEL) (#4,RANGEKEYDEL)} 412 sn-sv:{(#10,RANGEKEYDEL) (#8,RANGEKEYDEL) (#7,RANGEKEYDEL) (#4,RANGEKEYDEL)} 413 sv-wn:{(#10,RANGEKEYDEL) (#4,RANGEKEYDEL)} 414 wn-yx:{(#4,RANGEKEYDEL)} 415 <nil> 416 <nil> 417 wn-yx:{(#4,RANGEKEYDEL)} 418 419 # Test that empty spans from child iterators are preserved 420 define 421 b-d:{#10,RANGEKEYSET,@1,apples} 422 e-f:{} 423 g-h:{#8,RANGEKEYDEL} 424 -- 425 a-c:{#3,RANGEKEYUNSET,@1} 426 h-k:{#5,RANGEKEYDEL} 427 k-m:{} 428 ---- 429 2 levels 430 431 iter 432 first 433 next 434 next 435 next 436 next 437 next 438 next 439 next 440 ---- 441 a-b:{(#3,RANGEKEYUNSET,@1)} 442 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 443 c-d:{(#10,RANGEKEYSET,@1,apples)} 444 e-f:{} 445 g-h:{(#8,RANGEKEYDEL)} 446 h-k:{(#5,RANGEKEYDEL)} 447 k-m:{} 448 <nil> 449 450 iter 451 last 452 prev 453 prev 454 prev 455 prev 456 prev 457 prev 458 prev 459 ---- 460 k-m:{} 461 h-k:{(#5,RANGEKEYDEL)} 462 g-h:{(#8,RANGEKEYDEL)} 463 e-f:{} 464 c-d:{(#10,RANGEKEYSET,@1,apples)} 465 b-c:{(#10,RANGEKEYSET,@1,apples) (#3,RANGEKEYUNSET,@1)} 466 a-b:{(#3,RANGEKEYUNSET,@1)} 467 <nil>