github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/opt/exec/execbuilder/testdata/limit (about) 1 # LogicTest: local 2 3 statement ok 4 CREATE TABLE t (k INT PRIMARY KEY, v INT, w INT, INDEX(v)) 5 6 # There must be no limit at the index scan level. 7 query TTTTT colnames 8 EXPLAIN (VERBOSE) SELECT * FROM t WHERE v > 4 AND v < 8 AND w > 30 ORDER BY v LIMIT 2 9 ---- 10 tree field description columns ordering 11 · distributed false · · 12 · vectorized true · · 13 limit · · (k, v, w) +v 14 │ count 2 · · 15 └── filter · · (k, v, w) +v 16 │ filter w > 30 · · 17 └── index-join · · (k, v, w) +v 18 │ table t@primary · · 19 │ key columns k · · 20 └── scan · · (k, v) +v 21 · table t@t_v_idx · · 22 · spans /5-/8 · · 23 24 # This kind of query can be used to work around memory usage limits. We need to 25 # choose the "hard" limit of 100 over the "soft" limit of 25 (with the hard 26 # limit we will only store 100 rows in the sort node). See #19677. 27 query TTTTT colnames 28 EXPLAIN (VERBOSE) SELECT DISTINCT w FROM (SELECT w FROM t ORDER BY w LIMIT 100) ORDER BY w LIMIT 25 29 ---- 30 tree field description columns ordering 31 · distributed false · · 32 · vectorized true · · 33 limit · · (w) +w 34 │ count 25 · · 35 └── distinct · · (w) +w 36 │ distinct on w · · 37 │ order key w · · 38 └── limit · · (w) +w 39 │ count 100 · · 40 └── sort · · (w) +w 41 │ order +w · · 42 └── scan · · (w) · 43 · table t@primary · · 44 · spans FULL SCAN · · 45 46 query TTTTT 47 EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY k LIMIT 5 48 ---- 49 · distributed false · · 50 · vectorized true · · 51 scan · · (k, v) +k 52 · table t@primary · · 53 · spans LIMITED SCAN · · 54 · limit 5 · · 55 56 query TTTTT 57 EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY k OFFSET 5 58 ---- 59 · distributed false · · 60 · vectorized true · · 61 limit · · (k, v) +k 62 │ offset 5 · · 63 └── scan · · (k, v) +k 64 · table t@primary · · 65 · spans FULL SCAN · · 66 67 query TTTTT 68 EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY v LIMIT (1+4) OFFSET 1 69 ---- 70 · distributed false · · 71 · vectorized true · · 72 limit · · (k, v) +v 73 │ offset 1 · · 74 └── scan · · (k, v) +v 75 · table t@t_v_idx · · 76 · spans LIMITED SCAN · · 77 · limit 6 · · 78 79 query TTTTT 80 EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY v DESC LIMIT (1+4) OFFSET 1 81 ---- 82 · distributed false · · 83 · vectorized true · · 84 limit · · (k, v) -v 85 │ offset 1 · · 86 └── revscan · · (k, v) -v 87 · table t@t_v_idx · · 88 · spans LIMITED SCAN · · 89 · limit 6 · · 90 91 query TTTTT 92 EXPLAIN (VERBOSE) SELECT sum(w) FROM t GROUP BY k, v ORDER BY v DESC LIMIT 10 93 ---- 94 · distributed false · · 95 · vectorized true · · 96 render · · (sum) · 97 │ render 0 sum · · 98 └── limit · · (k, sum, any_not_null) -any_not_null 99 │ count 10 · · 100 └── sort · · (k, sum, any_not_null) -any_not_null 101 │ order -any_not_null · · 102 └── group · · (k, sum, any_not_null) · 103 │ aggregate 0 k · · 104 │ aggregate 1 sum(w) · · 105 │ aggregate 2 any_not_null(v) · · 106 │ group by k · · 107 │ ordered +k · · 108 └── scan · · (k, v, w) +k 109 · table t@primary · · 110 · spans FULL SCAN · · 111 112 query TTTTT 113 EXPLAIN (VERBOSE) SELECT k FROM (SELECT k, v FROM t ORDER BY v LIMIT 4) 114 ---- 115 · distributed false · · 116 · vectorized true · · 117 render · · (k) · 118 │ render 0 k · · 119 └── scan · · (k, v) · 120 · table t@t_v_idx · · 121 · spans LIMITED SCAN · · 122 · limit 4 · · 123 124 query TTTTT 125 EXPLAIN (VERBOSE) SELECT k FROM (SELECT k, v, w FROM t ORDER BY v LIMIT 4) 126 ---- 127 · distributed false · · 128 · vectorized true · · 129 render · · (k) · 130 │ render 0 k · · 131 └── scan · · (k, v) · 132 · table t@t_v_idx · · 133 · spans LIMITED SCAN · · 134 · limit 4 · · 135 136 query TTTTT 137 EXPLAIN (VERBOSE) SELECT k FROM (SELECT k FROM t LIMIT 5) WHERE k != 2 138 ---- 139 · distributed false · · 140 · vectorized true · · 141 filter · · (k) · 142 │ filter k != 2 · · 143 └── scan · · (k) · 144 · table t@t_v_idx · · 145 · spans LIMITED SCAN · · 146 · limit 5 · · 147 148 query TTTTT 149 EXPLAIN (VERBOSE) SELECT k, w FROM t WHERE v >= 1 AND v <= 100 LIMIT 10 150 ---- 151 · distributed false · · 152 · vectorized true · · 153 render · · (k, w) · 154 │ render 0 k · · 155 │ render 1 w · · 156 └── limit · · (k, v, w) · 157 │ count 10 · · 158 └── scan · · (k, v, w) · 159 · table t@primary · · 160 · spans FULL SCAN · · 161 · filter (v >= 1) AND (v <= 100) · · 162 163 query TTTTT 164 EXPLAIN (VERBOSE) SELECT k, w FROM t WHERE v >= 1 AND v <= 100 ORDER BY v LIMIT 10 165 ---- 166 · distributed false · · 167 · vectorized true · · 168 render · · (k, w) · 169 │ render 0 k · · 170 │ render 1 w · · 171 └── index-join · · (k, v, w) +v 172 │ table t@primary · · 173 │ key columns k · · 174 └── scan · · (k, v) +v 175 · table t@t_v_idx · · 176 · spans /1-/101 · · 177 · limit 10 · · 178 179 query TTTTT 180 EXPLAIN (VERBOSE) SELECT k, w FROM (SELECT * FROM t WHERE v >= 1 AND v <= 100 ORDER BY k LIMIT 10) ORDER BY v 181 ---- 182 · distributed false · · 183 · vectorized true · · 184 render · · (k, w) · 185 │ render 0 k · · 186 │ render 1 w · · 187 └── sort · · (k, v, w) +v 188 │ order +v · · 189 └── limit · · (k, v, w) +k 190 │ count 10 · · 191 └── scan · · (k, v, w) +k 192 · table t@primary · · 193 · spans FULL SCAN · · 194 · filter (v >= 1) AND (v <= 100) · · 195 196 # Regression test for #47283: scan with both hard limit and soft limit. 197 statement ok 198 CREATE TABLE t_47283(k INT PRIMARY KEY, a INT) 199 200 # The scan should have a hard limit. 201 query TTTTT 202 EXPLAIN (VERBOSE) SELECT * FROM (SELECT * FROM t_47283 ORDER BY k LIMIT 4) WHERE a > 5 LIMIT 1 203 ---- 204 · distributed false · · 205 · vectorized true · · 206 limit · · (k, a) · 207 │ count 1 · · 208 └── filter · · (k, a) · 209 │ filter a > 5 · · 210 └── scan · · (k, a) · 211 · table t_47283@primary · · 212 · spans LIMITED SCAN · · 213 · limit 4 · ·