github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/testdata/external_iterator (about) 1 build 1 2 set b b 3 set c c 4 ---- 5 6 build 2 7 del-range c z 8 ---- 9 10 # Test that a delete range in a more recent file shadows keys in an 11 # earlier file. 12 13 iter files=(1) 14 first 15 next 16 next 17 ---- 18 b: (b, .) 19 c: (c, .) 20 . 21 22 iter files=(1) 23 seek-ge bb 24 next 25 ---- 26 c: (c, .) 27 . 28 29 iter files=(2, 1) fwd-only 30 first 31 next 32 ---- 33 b: (b, .) 34 . 35 36 build 3 37 set a a 38 set f f 39 ---- 40 41 # Test including an even more recent file with point keys overlapping 42 # the rangedel. Since the point keys are assigned a higher sequence 43 # number, they should NOT be shadowed by the rangedel. 44 45 iter files=(3, 2, 1) fwd-only 46 first 47 next 48 next 49 next 50 ---- 51 a: (a, .) 52 b: (b, .) 53 f: (f, .) 54 . 55 56 # Test including range keys, and merging the range key state across 57 # files. Range keys should be interleaved. 58 59 build 4 60 range-key-set a c @2 foo 61 range-key-set c e @3 bar 62 ---- 63 64 build 5 65 range-key-del b d 66 ---- 67 68 iter files=(5, 4, 3, 2, 1) fwd-only 69 first 70 next 71 next 72 next 73 next 74 ---- 75 a: (a, [a-b) @2=foo UPDATED) 76 b: (b, . UPDATED) 77 d: (., [d-e) @3=bar UPDATED) 78 f: (f, . UPDATED) 79 . 80 81 # Test including range keys with empty spans and a merge in between. At no point 82 # should an empty span be returned. 83 84 build 6 85 merge bb ac 86 ---- 87 88 iter files=(6, 5, 4, 3, 2, 1) 89 seek-lt c 90 prev 91 next 92 next 93 ---- 94 bb: (ac, .) 95 b: (b, .) 96 bb: (ac, .) 97 d: (., [d-e) @3=bar UPDATED) 98 99 iter files=(6, 5, 4, 3, 2, 1) 100 seek-ge b 101 next 102 prev 103 prev 104 next 105 next 106 next 107 ---- 108 b: (b, .) 109 bb: (ac, .) 110 b: (b, .) 111 a: (a, [a-b) @2=foo UPDATED) 112 b: (b, . UPDATED) 113 bb: (ac, .) 114 d: (., [d-e) @3=bar UPDATED) 115 116 # Test range keys that overlap each other with identical state. These 117 # should be defragmented and exposed as a single range key. 118 119 reset 120 ---- 121 122 build ag 123 range-key-set a g @5 foo 124 ---- 125 126 build ek 127 range-key-set e k @5 foo 128 ---- 129 130 iter files=(ag, ek) fwd-only 131 first 132 next 133 ---- 134 a: (., [a-k) @5=foo UPDATED) 135 . 136 137 # Test range-key masking by creating points, some with suffixes above 138 # the range key's suffix, some with suffixes below the range key's 139 # suffix. 140 141 build points 142 set a@4 v 143 set c@2 v 144 set d@9 v 145 set e@5 v 146 set k@3 v 147 set p@4 v 148 ---- 149 150 iter files=(points, ag, ek) mask-suffix=@7 fwd-only 151 first 152 next 153 next 154 next 155 next 156 next 157 ---- 158 a: (., [a-k) @5=foo UPDATED) 159 d@9: (v, [a-k) @5=foo) 160 e@5: (v, [a-k) @5=foo) 161 k@3: (v, . UPDATED) 162 p@4: (v, .) 163 . 164 165 # Test that 'stacked' range keys (eg, multiple defined over the same keyspan at 166 # varying suffixes) work as expected. 167 168 build stacked 169 range-key-set a k @4 bar 170 range-key-set a k @1 bax 171 ---- 172 173 iter files=(points, ag, ek, stacked) fwd-only 174 first 175 next 176 ---- 177 a: (., [a-k) @5=foo, @4=bar, @1=bax UPDATED) 178 a@4: (v, [a-k) @5=foo, @4=bar, @1=bax) 179 180 # Test mutating the external iterator's options through SetOptions. 181 182 iter files=(points, ag, ek) fwd-only 183 set-options key-types=point 184 first 185 next 186 set-options lower=e upper=p 187 first 188 next 189 ---- 190 . 191 a@4: (v, .) 192 c@2: (v, .) 193 . 194 e@5: (v, .) 195 k@3: (v, .) 196 197 # Test the TrySeekUsingNext optimization that's enabled only for fwd-only 198 # external iterators. Seed the database with keys like 'a', 'aa', 'aaa', etc so 199 # that the index block uses a final separator that's beyond all the other live 200 # keys. 201 202 reset 203 ---- 204 205 build a 206 set a@3 a@3 207 set a@1 a@1 208 ---- 209 210 build aa 211 set aa@3 aa@3 212 set aa@1 aa@1 213 ---- 214 215 build aaa 216 set aaa@3 aaa@3 217 set aaa@1 aaa@1 218 ---- 219 220 build aaaa 221 set aaaa@3 aaaa@3 222 set aaaa@1 aaaa@1 223 ---- 224 225 build aaaaa 226 set aaaaa@3 aaaaa@3 227 set aaaaa@1 aaaaa@1 228 ---- 229 230 # Note the absence of fwd-only. This iterator will not use the TrySeekUsingNext 231 # optimization. 232 233 iter files=(a, aa, aaa, aaaa, aaaaa) 234 seek-ge a 235 next 236 seek-ge aa 237 next 238 seek-ge aaa 239 next 240 seek-ge aaaa 241 next 242 seek-ge aaaaa 243 next 244 stats 245 ---- 246 a@3: (a@3, .) 247 a@1: (a@1, .) 248 aa@3: (aa@3, .) 249 aa@1: (aa@1, .) 250 aaa@3: (aaa@3, .) 251 aaa@1: (aaa@1, .) 252 aaaa@3: (aaaa@3, .) 253 aaaa@1: (aaaa@1, .) 254 aaaaa@3: (aaaaa@3, .) 255 aaaaa@1: (aaaaa@1, .) 256 stats: (interface (dir, seek, step): (fwd, 5, 5), (rev, 0, 0)), (internal (dir, seek, step): (fwd, 5, 5), (rev, 0, 0)), 257 (internal-stats: (block-bytes: (total 475B, cached 0B, read-time 0s)), (points: (count 10, key-bytes 50B, value-bytes 50B, tombstoned 0))) 258 259 # Note the inclusion of fwd-only. This iterator will use the TrySeekUsingNext 260 # optimization and loads ~half the block-bytes as a result. 261 262 iter files=(a, aa, aaa, aaaa, aaaaa) fwd-only 263 seek-ge a 264 next 265 seek-ge aa 266 next 267 seek-ge aaa 268 next 269 seek-ge aaaa 270 next 271 seek-ge aaaaa 272 next 273 stats 274 ---- 275 a@3: (a@3, .) 276 a@1: (a@1, .) 277 aa@3: (aa@3, .) 278 aa@1: (aa@1, .) 279 aaa@3: (aaa@3, .) 280 aaa@1: (aaa@1, .) 281 aaaa@3: (aaaa@3, .) 282 aaaa@1: (aaaa@1, .) 283 aaaaa@3: (aaaaa@3, .) 284 aaaaa@1: (aaaaa@1, .) 285 stats: (interface (dir, seek, step): (fwd, 5, 5), (rev, 0, 0)), (internal (dir, seek, step): (fwd, 5, 5), (rev, 0, 0)), 286 (internal-stats: (block-bytes: (total 281B, cached 0B, read-time 0s)), (points: (count 10, key-bytes 50B, value-bytes 50B, tombstoned 0)))