github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/upsert5.test (about) 1 # 2020-12-11 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 # 12 # Test cases for generalized UPSERT 13 14 set testdir [file dirname $argv0] 15 source $testdir/tester.tcl 16 set testprefix upsert5 17 18 foreach {tn sql} { 19 1 { CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c UNIQUE, d UNIQUE, e UNIQUE) } 20 2 { CREATE TABLE t1(a INT PRIMARY KEY, b, c UNIQUE, d UNIQUE, e UNIQUE) } 21 3 { CREATE TABLE t1(a INT PRIMARY KEY, b, c UNIQUE, d UNIQUE, e UNIQUE) WITHOUT ROWID} 22 4 { CREATE TABLE t1(e UNIQUE, d UNIQUE, c UNIQUE, a INTEGER PRIMARY KEY, b) } 23 5 { CREATE TABLE t1(e UNIQUE, d UNIQUE, c UNIQUE, a INT PRIMARY KEY, b) } 24 6 { CREATE TABLE t1(e UNIQUE, d UNIQUE, c UNIQUE, a INT PRIMARY KEY, b) WITHOUT ROWID} 25 } { 26 reset_db 27 execsql $sql 28 29 do_execsql_test 1.$tn.100 { 30 DELETE FROM t1; 31 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 32 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,3,4,5) 33 ON CONFLICT(a) DO UPDATE SET b='a' 34 ON CONFLICT(c) DO UPDATE SET b='c' 35 ON CONFLICT(d) DO UPDATE SET b='d' 36 ON CONFLICT(e) DO UPDATE SET b='e'; 37 SELECT a,b,c,d,e FROM t1; 38 } {1 a 3 4 5} 39 do_execsql_test 1.$tn.101 { 40 DELETE FROM t1; 41 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 42 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,4,5) 43 ON CONFLICT(a) DO UPDATE SET b='a' 44 ON CONFLICT(c) DO UPDATE SET b='c' 45 ON CONFLICT(d) DO UPDATE SET b='d' 46 ON CONFLICT(e) DO UPDATE SET b='e'; 47 SELECT a,b,c,d,e FROM t1; 48 } {1 c 3 4 5} 49 do_execsql_test 1.$tn.102 { 50 DELETE FROM t1; 51 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 52 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,4,5) 53 ON CONFLICT(a) DO UPDATE SET b='a' 54 ON CONFLICT(c) DO UPDATE SET b='c' 55 ON CONFLICT(d) DO UPDATE SET b='d' 56 ON CONFLICT(e) DO UPDATE SET b='e'; 57 SELECT a,b,c,d,e FROM t1; 58 } {1 d 3 4 5} 59 do_execsql_test 1.$tn.103 { 60 DELETE FROM t1; 61 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 62 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 63 ON CONFLICT(a) DO UPDATE SET b='a' 64 ON CONFLICT(c) DO UPDATE SET b='c' 65 ON CONFLICT(d) DO UPDATE SET b='d' 66 ON CONFLICT(e) DO UPDATE SET b='e'; 67 SELECT a,b,c,d,e FROM t1; 68 } {1 e 3 4 5} 69 do_execsql_test 1.$tn.200 { 70 DELETE FROM t1; 71 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 72 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 73 ON CONFLICT(c) DO UPDATE SET b='c' 74 ON CONFLICT(a) DO UPDATE SET b='a' 75 ON CONFLICT(d) DO UPDATE SET b='d' 76 ON CONFLICT(e) DO UPDATE SET b='e'; 77 SELECT a,b,c,d,e FROM t1; 78 } {1 a 3 4 5} 79 do_execsql_test 1.$tn.201 { 80 DELETE FROM t1; 81 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 82 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,3,94,95) 83 ON CONFLICT(c) DO UPDATE SET b='c' 84 ON CONFLICT(a) DO UPDATE SET b='a' 85 ON CONFLICT(d) DO UPDATE SET b='d' 86 ON CONFLICT(e) DO UPDATE SET b='e'; 87 SELECT a,b,c,d,e FROM t1; 88 } {1 c 3 4 5} 89 do_execsql_test 1.$tn.202 { 90 DELETE FROM t1; 91 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 92 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,3,4,5) 93 ON CONFLICT(c) DO UPDATE SET b='c' 94 ON CONFLICT(a) DO UPDATE SET b='a' 95 ON CONFLICT(d) DO UPDATE SET b='d' 96 ON CONFLICT(e) DO UPDATE SET b='e'; 97 SELECT a,b,c,d,e FROM t1; 98 } {1 c 3 4 5} 99 do_execsql_test 1.$tn.203 { 100 DELETE FROM t1; 101 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 102 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,5) 103 ON CONFLICT(c) DO UPDATE SET b='c' 104 ON CONFLICT(a) DO UPDATE SET b='a' 105 ON CONFLICT(d) DO UPDATE SET b='d' 106 ON CONFLICT(e) DO UPDATE SET b='e'; 107 SELECT a,b,c,d,e FROM t1; 108 } {1 a 3 4 5} 109 do_execsql_test 1.$tn.204 { 110 DELETE FROM t1; 111 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 112 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,4,95) 113 ON CONFLICT(c) DO UPDATE SET b='c' 114 ON CONFLICT(a) DO UPDATE SET b='a' 115 ON CONFLICT(d) DO UPDATE SET b='d' 116 ON CONFLICT(e) DO UPDATE SET b='e'; 117 SELECT a,b,c,d,e FROM t1; 118 } {1 a 3 4 5} 119 do_execsql_test 1.$tn.210 { 120 DELETE FROM t1; 121 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 122 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 123 ON CONFLICT(c) DO UPDATE SET b='c' 124 ON CONFLICT(d) DO UPDATE SET b='d' 125 ON CONFLICT(a) DO UPDATE SET b='a' 126 ON CONFLICT(e) DO UPDATE SET b='e'; 127 SELECT a,b,c,d,e FROM t1; 128 } {1 a 3 4 5} 129 do_execsql_test 1.$tn.211 { 130 DELETE FROM t1; 131 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 132 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,4,95) 133 ON CONFLICT(c) DO UPDATE SET b='c' 134 ON CONFLICT(d) DO UPDATE SET b='d' 135 ON CONFLICT(a) DO UPDATE SET b='a' 136 ON CONFLICT(e) DO UPDATE SET b='e'; 137 SELECT a,b,c,d,e FROM t1; 138 } {1 d 3 4 5} 139 do_execsql_test 1.$tn.212 { 140 DELETE FROM t1; 141 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 142 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,5) 143 ON CONFLICT(c) DO UPDATE SET b='c' 144 ON CONFLICT(d) DO UPDATE SET b='d' 145 ON CONFLICT(a) DO UPDATE SET b='a' 146 ON CONFLICT(e) DO UPDATE SET b='e'; 147 SELECT a,b,c,d,e FROM t1; 148 } {1 a 3 4 5} 149 do_execsql_test 1.$tn.213 { 150 DELETE FROM t1; 151 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 152 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 153 ON CONFLICT(c) DO UPDATE SET b='c' 154 ON CONFLICT(d) DO UPDATE SET b='d' 155 ON CONFLICT(a) DO UPDATE SET b='a' 156 ON CONFLICT(e) DO UPDATE SET b='e'; 157 SELECT a,b,c,d,e FROM t1; 158 } {1 e 3 4 5} 159 do_execsql_test 1.$tn.214 { 160 DELETE FROM t1; 161 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 162 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 163 ON CONFLICT(c) DO UPDATE SET b='c' 164 ON CONFLICT(d) DO UPDATE SET b='d' 165 ON CONFLICT(e) DO UPDATE SET b='e' 166 ON CONFLICT(a) DO UPDATE SET b='a'; 167 SELECT a,b,c,d,e FROM t1; 168 } {1 e 3 4 5} 169 do_execsql_test 1.$tn.215 { 170 DELETE FROM t1; 171 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 172 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,5) 173 ON CONFLICT(c) DO UPDATE SET b='c' 174 ON CONFLICT(d) DO UPDATE SET b='d' 175 ON CONFLICT(e) DO UPDATE SET b='e' 176 ON CONFLICT(a) DO UPDATE SET b='a'; 177 SELECT a,b,c,d,e FROM t1; 178 } {1 e 3 4 5} 179 do_execsql_test 1.$tn.216 { 180 DELETE FROM t1; 181 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 182 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 183 ON CONFLICT(c) DO UPDATE SET b='c' 184 ON CONFLICT(d) DO UPDATE SET b='d' 185 ON CONFLICT(e) DO UPDATE SET b='e' 186 ON CONFLICT(a) DO UPDATE SET b='a'; 187 SELECT a,b,c,d,e FROM t1; 188 } {1 a 3 4 5} 189 190 do_execsql_test 1.$tn.300 { 191 DELETE FROM t1; 192 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 193 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 194 ON CONFLICT(c) DO UPDATE SET b='c' 195 ON CONFLICT(d) DO UPDATE SET b='d' 196 ON CONFLICT(a) DO UPDATE SET b='a1' 197 ON CONFLICT(a) DO UPDATE SET b='a2' 198 ON CONFLICT(a) DO UPDATE SET b='a3' 199 ON CONFLICT(a) DO UPDATE SET b='a4' 200 ON CONFLICT(a) DO UPDATE SET b='a5' 201 ON CONFLICT(e) DO UPDATE SET b='e'; 202 SELECT a,b,c,d,e FROM t1; 203 } {1 a1 3 4 5} 204 do_execsql_test 1.$tn.301 { 205 DELETE FROM t1; 206 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 207 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 208 ON CONFLICT(c) DO UPDATE SET b='c' 209 ON CONFLICT(d) DO UPDATE SET b='d' 210 ON CONFLICT(a) DO UPDATE SET b='a1' 211 ON CONFLICT(a) DO UPDATE SET b='a2' 212 ON CONFLICT(a) DO UPDATE SET b='a3' 213 ON CONFLICT(a) DO UPDATE SET b='a4' 214 ON CONFLICT(a) DO UPDATE SET b='a5' 215 ON CONFLICT(e) DO UPDATE SET b='e'; 216 SELECT a,b,c,d,e FROM t1; 217 } {1 e 3 4 5} 218 219 do_execsql_test 1.$tn.400 { 220 DELETE FROM t1; 221 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 222 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 223 ON CONFLICT(c) DO UPDATE SET b='c' 224 ON CONFLICT(d) DO UPDATE SET b='d' 225 ON CONFLICT DO UPDATE set b='x'; 226 SELECT a,b,c,d,e FROM t1; 227 } {1 x 3 4 5} 228 do_execsql_test 1.$tn.401 { 229 DELETE FROM t1; 230 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 231 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 232 ON CONFLICT(c) DO UPDATE SET b='c' 233 ON CONFLICT(d) DO UPDATE SET b='d' 234 ON CONFLICT DO UPDATE set b='x'; 235 SELECT a,b,c,d,e FROM t1; 236 } {1 x 3 4 5} 237 do_execsql_test 1.$tn.402 { 238 DELETE FROM t1; 239 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 240 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 241 ON CONFLICT(c) DO UPDATE SET b='c' 242 ON CONFLICT(d) DO UPDATE SET b='d' 243 ON CONFLICT DO UPDATE set b='x'; 244 SELECT a,b,c,d,e FROM t1; 245 } {1 x 3 4 5} 246 do_execsql_test 1.$tn.403 { 247 DELETE FROM t1; 248 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 249 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,94,95) 250 ON CONFLICT(c) DO UPDATE SET b='c' 251 ON CONFLICT(d) DO UPDATE SET b='d' 252 ON CONFLICT DO UPDATE set b='x'; 253 SELECT a,b,c,d,e FROM t1; 254 } {1 c 3 4 5} 255 do_execsql_test 1.$tn.404 { 256 DELETE FROM t1; 257 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 258 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,4,95) 259 ON CONFLICT(c) DO UPDATE SET b='c' 260 ON CONFLICT(d) DO UPDATE SET b='d' 261 ON CONFLICT DO UPDATE set b='x'; 262 SELECT a,b,c,d,e FROM t1; 263 } {1 c 3 4 5} 264 do_execsql_test 1.$tn.405 { 265 DELETE FROM t1; 266 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 267 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,4,5) 268 ON CONFLICT(c) DO UPDATE SET b='c' 269 ON CONFLICT(d) DO UPDATE SET b='d' 270 ON CONFLICT DO UPDATE set b='x'; 271 SELECT a,b,c,d,e FROM t1; 272 } {1 d 3 4 5} 273 274 do_execsql_test 1.$tn.410 { 275 DELETE FROM t1; 276 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 277 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 278 ON CONFLICT DO UPDATE set b='x'; 279 SELECT a,b,c,d,e FROM t1; 280 } {1 x 3 4 5} 281 do_execsql_test 1.$tn.411 { 282 DELETE FROM t1; 283 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 284 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 285 ON CONFLICT DO UPDATE set b='x'; 286 SELECT a,b,c,d,e FROM t1; 287 } {1 x 3 4 5} 288 do_execsql_test 1.$tn.412 { 289 DELETE FROM t1; 290 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 291 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,4,95) 292 ON CONFLICT DO UPDATE set b='x'; 293 SELECT a,b,c,d,e FROM t1; 294 } {1 x 3 4 5} 295 do_execsql_test 1.$tn.413 { 296 DELETE FROM t1; 297 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 298 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,94,95) 299 ON CONFLICT DO UPDATE set b='x'; 300 SELECT a,b,c,d,e FROM t1; 301 } {1 x 3 4 5} 302 303 do_execsql_test 1.$tn.420 { 304 DELETE FROM t1; 305 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 306 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 307 ON CONFLICT(c) DO NOTHING 308 ON CONFLICT(d) DO NOTHING 309 ON CONFLICT DO UPDATE set b='x'; 310 SELECT a,b,c,d,e FROM t1; 311 } {1 x 3 4 5} 312 do_execsql_test 1.$tn.421 { 313 DELETE FROM t1; 314 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 315 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 316 ON CONFLICT(c) DO NOTHING 317 ON CONFLICT(d) DO NOTHING 318 ON CONFLICT DO UPDATE set b='x'; 319 SELECT a,b,c,d,e FROM t1; 320 } {1 x 3 4 5} 321 do_execsql_test 1.$tn.422 { 322 DELETE FROM t1; 323 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 324 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,4,95) 325 ON CONFLICT(c) DO NOTHING 326 ON CONFLICT(d) DO NOTHING 327 ON CONFLICT DO UPDATE set b='x'; 328 SELECT a,b,c,d,e FROM t1; 329 } {1 2 3 4 5} 330 do_execsql_test 1.$tn.423 { 331 DELETE FROM t1; 332 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 333 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,94,95) 334 ON CONFLICT(c) DO NOTHING 335 ON CONFLICT(d) DO NOTHING 336 ON CONFLICT DO UPDATE set b='x'; 337 SELECT a,b,c,d,e FROM t1; 338 } {1 2 3 4 5} 339 340 do_execsql_test 1.$tn.500 { 341 DELETE FROM t1; 342 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 343 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 344 ON CONFLICT(c) DO UPDATE SET b='c' 345 ON CONFLICT(d) DO UPDATE SET b='d' 346 ON CONFLICT DO NOTHING; 347 SELECT a,b,c,d,e FROM t1; 348 } {1 2 3 4 5} 349 do_execsql_test 1.$tn.501 { 350 DELETE FROM t1; 351 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 352 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,93,94,5) 353 ON CONFLICT(c) DO UPDATE SET b='c' 354 ON CONFLICT(d) DO UPDATE SET b='d' 355 ON CONFLICT DO NOTHING; 356 SELECT a,b,c,d,e FROM t1; 357 } {1 2 3 4 5} 358 do_execsql_test 1.$tn.502 { 359 DELETE FROM t1; 360 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 361 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,94,95) 362 ON CONFLICT(c) DO UPDATE SET b='c' 363 ON CONFLICT(d) DO UPDATE SET b='d' 364 ON CONFLICT DO NOTHING; 365 SELECT a,b,c,d,e FROM t1; 366 } {1 2 3 4 5} 367 do_execsql_test 1.$tn.503 { 368 DELETE FROM t1; 369 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 370 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,94,95) 371 ON CONFLICT(c) DO UPDATE SET b='c' 372 ON CONFLICT(d) DO UPDATE SET b='d' 373 ON CONFLICT DO NOTHING; 374 SELECT a,b,c,d,e FROM t1; 375 } {1 c 3 4 5} 376 do_execsql_test 1.$tn.504 { 377 DELETE FROM t1; 378 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 379 INSERT INTO t1(a,b,c,d,e) VALUES(91,NULL,3,4,95) 380 ON CONFLICT(c) DO UPDATE SET b='c' 381 ON CONFLICT(d) DO UPDATE SET b='d' 382 ON CONFLICT DO NOTHING; 383 SELECT a,b,c,d,e FROM t1; 384 } {1 c 3 4 5} 385 do_execsql_test 1.$tn.505 { 386 DELETE FROM t1; 387 INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5); 388 INSERT INTO t1(a,b,c,d,e) VALUES(1,NULL,93,4,5) 389 ON CONFLICT(c) DO UPDATE SET b='c' 390 ON CONFLICT(d) DO UPDATE SET b='d' 391 ON CONFLICT DO NOTHING; 392 SELECT a,b,c,d,e FROM t1; 393 } {1 d 3 4 5} 394 395 } 396 397 #-------------------------------------------------------------------------- 398 reset_db 399 do_execsql_test 2.0 { 400 CREATE TABLE t2(a, b, c REAL, d, e, PRIMARY KEY(a,b)) WITHOUT ROWID; 401 CREATE UNIQUE INDEX t2c ON t2(c); 402 } 403 404 do_catchsql_test 2.1 { 405 INSERT INTO t2(a,b,c,e,d) VALUES(1,2,3,4,5) 406 ON CONFLICT(c) DO UPDATE SET b='' 407 ON CONFLICT((SELECT t2 FROM nosuchtable)) DO NOTHING; 408 409 } {1 {no such table: nosuchtable}} 410 411 finish_test