1 # 2008 October 6 2 # 3 # The author disclaims copyright to this source code. In place of 4 # a legal notice, here is a blessing: 5 # 6 # May you do good and not evil. 7 # May you find forgiveness for yourself and forgive others. 8 # May you share freely, never taking more than you give. 9 # 10 #*********************************************************************** 11 # This file implements regression tests for SQLite library. The 12 # focus of this file is testing the LIMIT ... OFFSET ... clause 13 # of UPDATE and DELETE statements. 14 # 15 # $Id: wherelimit.test,v 1.2 2008/10/10 18:25:46 shane Exp $ 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 20 proc create_test_data {size} { 21 # Build some test data 22 # 23 execsql { 24 DROP TABLE IF EXISTS t1; 25 CREATE TABLE t1(x int, y int); 26 BEGIN; 27 } 28 for {set i 1} {$i<=$size} {incr i} { 29 for {set j 1} {$j<=$size} {incr j} { 30 execsql "INSERT INTO t1 VALUES([expr {$i}],[expr {$j}])" 31 } 32 } 33 execsql { 34 COMMIT; 35 } 36 return {} 37 } 38 39 ifcapable {update_delete_limit} { 40 41 # check syntax error support 42 do_test wherelimit-0.1 { 43 catchsql {DELETE FROM t1 ORDER BY x} 44 } {1 {ORDER BY without LIMIT on DELETE}} 45 do_test wherelimit-0.2 { 46 catchsql {DELETE FROM t1 WHERE x=1 ORDER BY x} 47 } {1 {ORDER BY without LIMIT on DELETE}} 48 do_test wherelimit-0.3 { 49 catchsql {UPDATE t1 SET y=1 WHERE x=1 ORDER BY x} 50 } {1 {ORDER BY without LIMIT on UPDATE}} 51 52 # no AS on table sources 53 do_test wherelimit-0.4 { 54 catchsql {DELETE FROM t1 AS a WHERE x=1} 55 } {1 {near "AS": syntax error}} 56 do_test wherelimit-0.5 { 57 catchsql {UPDATE t1 AS a SET y=1 WHERE x=1} 58 } {1 {near "AS": syntax error}} 59 60 # OFFSET w/o LIMIT 61 do_test wherelimit-0.6 { 62 catchsql {DELETE FROM t1 WHERE x=1 OFFSET 2} 63 } {1 {near "OFFSET": syntax error}} 64 do_test wherelimit-0.7 { 65 catchsql {UPDATE t1 SET y=1 WHERE x=1 OFFSET 2} 66 } {1 {near "OFFSET": syntax error}} 67 68 69 # check deletes w/o where clauses but with limit/offsets 70 create_test_data 5 71 do_test wherelimit-1.0 { 72 execsql {SELECT count(*) FROM t1} 73 } {25} 74 do_test wherelimit-1.1 { 75 execsql {DELETE FROM t1} 76 execsql {SELECT count(*) FROM t1} 77 } {0} 78 create_test_data 5 79 do_test wherelimit-1.2 { 80 execsql {DELETE FROM t1 LIMIT 5} 81 execsql {SELECT count(*) FROM t1} 82 } {20} 83 do_test wherelimit-1.3 { 84 # limit 5 85 execsql {DELETE FROM t1 ORDER BY x LIMIT 5} 86 execsql {SELECT count(*) FROM t1} 87 } {15} 88 do_test wherelimit-1.4 { 89 # limit 5, offset 2 90 execsql {DELETE FROM t1 ORDER BY x LIMIT 5 OFFSET 2} 91 execsql {SELECT count(*) FROM t1} 92 } {10} 93 do_test wherelimit-1.5 { 94 # limit 5, offset -2 95 execsql {DELETE FROM t1 ORDER BY x LIMIT 5 OFFSET -2} 96 execsql {SELECT count(*) FROM t1} 97 } {5} 98 do_test wherelimit-1.6 { 99 # limit -5 (no limit), offset 2 100 execsql {DELETE FROM t1 ORDER BY x LIMIT 2, -5} 101 execsql {SELECT count(*) FROM t1} 102 } {2} 103 do_test wherelimit-1.7 { 104 # limit 5, offset -2 (no offset) 105 execsql {DELETE FROM t1 ORDER BY x LIMIT -2, 5} 106 execsql {SELECT count(*) FROM t1} 107 } {0} 108 create_test_data 5 109 do_test wherelimit-1.8 { 110 # limit -5 (no limit), offset -2 (no offset) 111 execsql {DELETE FROM t1 ORDER BY x LIMIT -2, -5} 112 execsql {SELECT count(*) FROM t1} 113 } {0} 114 create_test_data 3 115 do_test wherelimit-1.9 { 116 # limit 5, offset 2 117 execsql {DELETE FROM t1 ORDER BY x LIMIT 2, 5} 118 execsql {SELECT count(*) FROM t1} 119 } {4} 120 do_test wherelimit-1.10 { 121 # limit 5, offset 5 122 execsql {DELETE FROM t1 ORDER BY x LIMIT 5 OFFSET 5} 123 execsql {SELECT count(*) FROM t1} 124 } {4} 125 do_test wherelimit-1.11 { 126 # limit 50, offset 30 127 execsql {DELETE FROM t1 ORDER BY x LIMIT 50 OFFSET 30} 128 execsql {SELECT count(*) FROM t1} 129 } {4} 130 do_test wherelimit-1.12 { 131 # limit 50, offset 30 132 execsql {DELETE FROM t1 ORDER BY x LIMIT 30, 50} 133 execsql {SELECT count(*) FROM t1} 134 } {4} 135 do_test wherelimit-1.13 { 136 execsql {DELETE FROM t1 ORDER BY x LIMIT 50 OFFSET 50} 137 execsql {SELECT count(*) FROM t1} 138 } {4} 139 140 141 create_test_data 6 142 do_test wherelimit-2.0 { 143 execsql {SELECT count(*) FROM t1} 144 } {36} 145 do_test wherelimit-2.1 { 146 execsql {DELETE FROM t1 WHERE x=1} 147 execsql {SELECT count(*) FROM t1} 148 } {30} 149 create_test_data 6 150 do_test wherelimit-2.2 { 151 execsql {DELETE FROM t1 WHERE x=1 LIMIT 5} 152 execsql {SELECT count(*) FROM t1} 153 } {31} 154 do_test wherelimit-2.3 { 155 # limit 5 156 execsql {DELETE FROM t1 WHERE x=1 ORDER BY x LIMIT 5} 157 execsql {SELECT count(*) FROM t1} 158 } {30} 159 do_test wherelimit-2.4 { 160 # limit 5, offset 2 161 execsql {DELETE FROM t1 WHERE x=2 ORDER BY x LIMIT 5 OFFSET 2} 162 execsql {SELECT count(*) FROM t1} 163 } {26} 164 do_test wherelimit-2.5 { 165 # limit 5, offset -2 166 execsql {DELETE FROM t1 WHERE x=2 ORDER BY x LIMIT 5 OFFSET -2} 167 execsql {SELECT count(*) FROM t1} 168 } {24} 169 do_test wherelimit-2.6 { 170 # limit -5 (no limit), offset 2 171 execsql {DELETE FROM t1 WHERE x=3 ORDER BY x LIMIT 2, -5} 172 execsql {SELECT count(*) FROM t1} 173 } {20} 174 do_test wherelimit-2.7 { 175 # limit 5, offset -2 (no offset) 176 execsql {DELETE FROM t1 WHERE x=3 ORDER BY x LIMIT -2, 5} 177 execsql {SELECT count(*) FROM t1} 178 } {18} 179 do_test wherelimit-2.8 { 180 # limit -5 (no limit), offset -2 (no offset) 181 execsql {DELETE FROM t1 WHERE x=4 ORDER BY x LIMIT -2, -5} 182 execsql {SELECT count(*) FROM t1} 183 } {12} 184 create_test_data 6 185 do_test wherelimit-2.9 { 186 # limit 5, offset 2 187 execsql {DELETE FROM t1 WHERE x=5 ORDER BY x LIMIT 2, 5} 188 execsql {SELECT count(*) FROM t1} 189 } {32} 190 do_test wherelimit-2.10 { 191 # limit 5, offset 5 192 execsql {DELETE FROM t1 WHERE x=6 ORDER BY x LIMIT 5 OFFSET 5} 193 execsql {SELECT count(*) FROM t1} 194 } {31} 195 do_test wherelimit-2.11 { 196 # limit 50, offset 30 197 execsql {DELETE FROM t1 WHERE x=1 ORDER BY x LIMIT 50 OFFSET 30} 198 execsql {SELECT count(*) FROM t1} 199 } {31} 200 do_test wherelimit-2.12 { 201 # limit 50, offset 30 202 execsql {DELETE FROM t1 WHERE x=2 ORDER BY x LIMIT 30, 50} 203 execsql {SELECT count(*) FROM t1} 204 } {31} 205 do_test wherelimit-2.13 { 206 execsql {DELETE FROM t1 WHERE x=3 ORDER BY x LIMIT 50 OFFSET 50} 207 execsql {SELECT count(*) FROM t1} 208 } {31} 209 210 211 create_test_data 6 212 do_test wherelimit-3.0 { 213 execsql {SELECT count(*) FROM t1} 214 } {36} 215 do_test wherelimit-3.1 { 216 execsql {UPDATE t1 SET y=1 WHERE x=1} 217 execsql {SELECT count(*) FROM t1 WHERE y=1} 218 } {11} 219 create_test_data 6 220 do_test wherelimit-3.2 { 221 execsql {UPDATE t1 SET y=1 WHERE x=1 LIMIT 5} 222 execsql {SELECT count(*) FROM t1 WHERE y=1} 223 } {10} 224 do_test wherelimit-3.3 { 225 # limit 5 226 execsql {UPDATE t1 SET y=2 WHERE x=2 ORDER BY x LIMIT 5} 227 execsql {SELECT count(*) FROM t1 WHERE y=2} 228 } {9} 229 create_test_data 6 230 do_test wherelimit-3.4 { 231 # limit 5, offset 2 232 execsql {UPDATE t1 SET y=2 WHERE x=2 ORDER BY x LIMIT 5 OFFSET 2} 233 execsql {SELECT count(*) FROM t1 WHERE y=1} 234 } {6} 235 do_test wherelimit-3.5 { 236 # limit 5, offset -2 237 execsql {UPDATE t1 SET y=2 WHERE x=2 ORDER BY x LIMIT 5 OFFSET -2} 238 execsql {SELECT count(*) FROM t1 WHERE y=1} 239 } {5} 240 do_test wherelimit-3.6 { 241 # limit -5 (no limit), offset 2 242 execsql {UPDATE t1 SET y=3 WHERE x=3 ORDER BY x LIMIT 2, -5} 243 execsql {SELECT count(*) FROM t1 WHERE y=3} 244 } {8} 245 do_test wherelimit-3.7 { 246 # limit 5, offset -2 (no offset) 247 execsql {UPDATE t1 SET y=3 WHERE x=3 ORDER BY x LIMIT -2, 5} 248 execsql {SELECT count(*) FROM t1 WHERE y=3} 249 } {10} 250 251 do_test wherelimit-3.8 { 252 # limit -5 (no limit), offset -2 (no offset) 253 execsql {UPDATE t1 SET y=4 WHERE x=4 ORDER BY x LIMIT -2, -5} 254 execsql {SELECT count(*) FROM t1 WHERE y=4} 255 } {9} 256 create_test_data 6 257 do_test wherelimit-3.9 { 258 # limit 5, offset 2 259 execsql {UPDATE t1 SET y=4 WHERE x=5 ORDER BY x LIMIT 2, 5} 260 execsql {SELECT count(*) FROM t1 WHERE y=4} 261 } {9} 262 do_test wherelimit-3.10 { 263 # limit 5, offset 5 264 execsql {UPDATE t1 SET y=4 WHERE x=6 ORDER BY x LIMIT 5 OFFSET 5} 265 execsql {SELECT count(*) FROM t1 WHERE y=1} 266 } {6} 267 do_test wherelimit-3.11 { 268 # limit 50, offset 30 269 execsql {UPDATE t1 SET y=1 WHERE x=1 ORDER BY x LIMIT 50 OFFSET 30} 270 execsql {SELECT count(*) FROM t1 WHERE y=1} 271 } {6} 272 do_test wherelimit-3.12 { 273 # limit 50, offset 30 274 execsql {UPDATE t1 SET y=1 WHERE x=2 ORDER BY x LIMIT 30, 50} 275 execsql {SELECT count(*) FROM t1 WHERE y=1} 276 } {6} 277 do_test wherelimit-3.13 { 278 execsql {UPDATE t1 SET y=1 WHERE x=3 ORDER BY x LIMIT 50 OFFSET 50} 279 execsql {SELECT count(*) FROM t1 WHERE y=1} 280 } {6} 281 282 } 283 284 finish_test 285