| OLD | NEW |
| 1 # 2005 January 19 | 1 # 2005 January 19 |
| 2 # | 2 # |
| 3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
| 4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
| 5 # | 5 # |
| 6 # May you do good and not evil. | 6 # May you do good and not evil. |
| 7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
| 8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
| 9 # | 9 # |
| 10 #************************************************************************* | 10 #************************************************************************* |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 do_test subquery-2.5.3.1 { | 234 do_test subquery-2.5.3.1 { |
| 235 # The t4i index cannot be used to resolve the "x IN (...)" constraint | 235 # The t4i index cannot be used to resolve the "x IN (...)" constraint |
| 236 # because the constraint has integer affinity but t4i has text affinity. | 236 # because the constraint has integer affinity but t4i has text affinity. |
| 237 execsql { | 237 execsql { |
| 238 CREATE INDEX t4i ON t4(x); | 238 CREATE INDEX t4i ON t4(x); |
| 239 SELECT * FROM t4 WHERE x IN (SELECT a FROM t3); | 239 SELECT * FROM t4 WHERE x IN (SELECT a FROM t3); |
| 240 } | 240 } |
| 241 } {10.0} | 241 } {10.0} |
| 242 do_test subquery-2.5.3.2 { | 242 do_test subquery-2.5.3.2 { |
| 243 # Verify that the t4i index was not used in the previous query | 243 # Verify that the t4i index was not used in the previous query |
| 244 set ::sqlite_query_plan | 244 execsql { |
| 245 } {t4 {}} | 245 EXPLAIN QUERY PLAN |
| 246 SELECT * FROM t4 WHERE x IN (SELECT a FROM t3); |
| 247 } |
| 248 } {~/t4i/} |
| 246 do_test subquery-2.5.4 { | 249 do_test subquery-2.5.4 { |
| 247 execsql { | 250 execsql { |
| 248 DROP TABLE t3; | 251 DROP TABLE t3; |
| 249 DROP TABLE t4; | 252 DROP TABLE t4; |
| 250 } | 253 } |
| 251 } {} | 254 } {} |
| 252 | 255 |
| 253 #------------------------------------------------------------------ | 256 #------------------------------------------------------------------ |
| 254 # The following test cases - subquery-3.* - test tickets that | 257 # The following test cases - subquery-3.* - test tickets that |
| 255 # were raised during development of correlated subqueries. | 258 # were raised during development of correlated subqueries. |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 execsql { | 327 execsql { |
| 325 SELECT a, (SELECT (SELECT d FROM t2 WHERE a=c)) FROM t1 GROUP BY a; | 328 SELECT a, (SELECT (SELECT d FROM t2 WHERE a=c)) FROM t1 GROUP BY a; |
| 326 } | 329 } |
| 327 } {1 one 2 two} | 330 } {1 one 2 two} |
| 328 do_test subquery-3.3.5 { | 331 do_test subquery-3.3.5 { |
| 329 execsql { | 332 execsql { |
| 330 SELECT a, (SELECT count(*) FROM t2 WHERE a=c) FROM t1; | 333 SELECT a, (SELECT count(*) FROM t2 WHERE a=c) FROM t1; |
| 331 } | 334 } |
| 332 } {1 1 2 1} | 335 } {1 1 2 1} |
| 333 | 336 |
| 337 # The following tests check for aggregate subqueries in an aggregate |
| 338 # query. |
| 339 # |
| 340 do_test subquery-3.4.1 { |
| 341 execsql { |
| 342 CREATE TABLE t34(x,y); |
| 343 INSERT INTO t34 VALUES(106,4), (107,3), (106,5), (107,5); |
| 344 SELECT a.x, avg(a.y) |
| 345 FROM t34 AS a |
| 346 GROUP BY a.x |
| 347 HAVING NOT EXISTS( SELECT b.x, avg(b.y) |
| 348 FROM t34 AS b |
| 349 GROUP BY b.x |
| 350 HAVING avg(a.y) > avg(b.y)); |
| 351 } |
| 352 } {107 4.0} |
| 353 do_test subquery-3.4.2 { |
| 354 execsql { |
| 355 SELECT a.x, avg(a.y) AS avg1 |
| 356 FROM t34 AS a |
| 357 GROUP BY a.x |
| 358 HAVING NOT EXISTS( SELECT b.x, avg(b.y) AS avg2 |
| 359 FROM t34 AS b |
| 360 GROUP BY b.x |
| 361 HAVING avg1 > avg2); |
| 362 } |
| 363 } {107 4.0} |
| 364 do_test subquery-3.4.3 { |
| 365 execsql { |
| 366 SELECT |
| 367 a.x, |
| 368 avg(a.y), |
| 369 NOT EXISTS ( SELECT b.x, avg(b.y) |
| 370 FROM t34 AS b |
| 371 GROUP BY b.x |
| 372 HAVING avg(a.y) > avg(b.y)), |
| 373 EXISTS ( SELECT c.x, avg(c.y) |
| 374 FROM t34 AS c |
| 375 GROUP BY c.x |
| 376 HAVING avg(a.y) > avg(c.y)) |
| 377 FROM t34 AS a |
| 378 GROUP BY a.x |
| 379 ORDER BY a.x; |
| 380 } |
| 381 } {106 4.5 0 1 107 4.0 1 0} |
| 382 |
| 383 do_test subquery-3.5.1 { |
| 384 execsql { |
| 385 CREATE TABLE t35a(x); INSERT INTO t35a VALUES(1),(2),(3); |
| 386 CREATE TABLE t35b(y); INSERT INTO t35b VALUES(98), (99); |
| 387 SELECT max((SELECT avg(y) FROM t35b)) FROM t35a; |
| 388 } |
| 389 } {98.5} |
| 390 do_test subquery-3.5.2 { |
| 391 execsql { |
| 392 SELECT max((SELECT count(y) FROM t35b)) FROM t35a; |
| 393 } |
| 394 } {2} |
| 395 do_test subquery-3.5.3 { |
| 396 execsql { |
| 397 SELECT max((SELECT count() FROM t35b)) FROM t35a; |
| 398 } |
| 399 } {2} |
| 400 do_test subquery-3.5.4 { |
| 401 catchsql { |
| 402 SELECT max((SELECT count(x) FROM t35b)) FROM t35a; |
| 403 } |
| 404 } {1 {misuse of aggregate: count()}} |
| 405 do_test subquery-3.5.5 { |
| 406 catchsql { |
| 407 SELECT max((SELECT count(x) FROM t35b)) FROM t35a; |
| 408 } |
| 409 } {1 {misuse of aggregate: count()}} |
| 410 do_test subquery-3.5.6 { |
| 411 catchsql { |
| 412 SELECT max((SELECT a FROM (SELECT count(x) AS a FROM t35b))) FROM t35a; |
| 413 } |
| 414 } {1 {misuse of aggregate: count()}} |
| 415 do_test subquery-3.5.7 { |
| 416 execsql { |
| 417 SELECT max((SELECT a FROM (SELECT count(y) AS a FROM t35b))) FROM t35a; |
| 418 } |
| 419 } {2} |
| 420 |
| 421 |
| 334 #------------------------------------------------------------------ | 422 #------------------------------------------------------------------ |
| 335 # These tests - subquery-4.* - use the TCL statement cache to try | 423 # These tests - subquery-4.* - use the TCL statement cache to try |
| 336 # and expose bugs to do with re-using statements that have been | 424 # and expose bugs to do with re-using statements that have been |
| 337 # passed to sqlite3_reset(). | 425 # passed to sqlite3_reset(). |
| 338 # | 426 # |
| 339 # One problem was that VDBE memory cells were not being initialised | 427 # One problem was that VDBE memory cells were not being initialized |
| 340 # to NULL on the second and subsequent executions. | 428 # to NULL on the second and subsequent executions. |
| 341 # | 429 # |
| 342 do_test subquery-4.1.1 { | 430 do_test subquery-4.1.1 { |
| 343 execsql { | 431 execsql { |
| 344 SELECT (SELECT a FROM t1); | 432 SELECT (SELECT a FROM t1); |
| 345 } | 433 } |
| 346 } {1} | 434 } {1} |
| 347 do_test subquery-4.2 { | 435 do_test subquery-4.2 { |
| 348 execsql { | 436 execsql { |
| 349 DELETE FROM t1; | 437 DELETE FROM t1; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 } | 578 } |
| 491 } {30101 30102 30103} | 579 } {30101 30102 30103} |
| 492 do_test subquery-7.11 { | 580 do_test subquery-7.11 { |
| 493 execsql { | 581 execsql { |
| 494 SELECT (SELECT (SELECT max(c7)+max(c8)+max(c9) FROM t9) FROM t8) FROM t7 | 582 SELECT (SELECT (SELECT max(c7)+max(c8)+max(c9) FROM t9) FROM t8) FROM t7 |
| 495 } | 583 } |
| 496 } {30303} | 584 } {30303} |
| 497 } ;############# Disabled | 585 } ;############# Disabled |
| 498 | 586 |
| 499 finish_test | 587 finish_test |
| OLD | NEW |