OLD | NEW |
1 # 2006 June 10 | 1 # 2006 June 10 |
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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 # | 49 # |
50 | 50 |
51 | 51 |
52 #---------------------------------------------------------------------- | 52 #---------------------------------------------------------------------- |
53 # Test cases vtab1.1.* | 53 # Test cases vtab1.1.* |
54 # | 54 # |
55 | 55 |
56 # We cannot create a virtual table if the module has not been registered. | 56 # We cannot create a virtual table if the module has not been registered. |
57 # | 57 # |
58 do_test vtab1-1.1.1 { | 58 do_test vtab1-1.1.1 { |
59 explain { | |
60 CREATE VIRTUAL TABLE t1 USING echo; | |
61 } | |
62 catchsql { | 59 catchsql { |
63 CREATE VIRTUAL TABLE t1 USING echo; | 60 CREATE VIRTUAL TABLE t1 USING echo; |
64 } | 61 } |
65 } {1 {no such module: echo}} | 62 } {1 {no such module: echo}} |
66 do_test vtab1-1.1.2 { | 63 do_test vtab1-1.1.2 { |
67 catchsql { | 64 catchsql { |
68 CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo; | 65 CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo; |
69 } | 66 } |
70 } {1 {no such module: echo}} | 67 } {1 {no such module: echo}} |
71 do_test vtab1-1.2 { | 68 do_test vtab1-1.2 { |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 set echo_module "" | 386 set echo_module "" |
390 execsql { | 387 execsql { |
391 SELECT * FROM t1; | 388 SELECT * FROM t1; |
392 } | 389 } |
393 } {1 2 3 4 5 6} | 390 } {1 2 3 4 5 6} |
394 do_test vtab1-3.7 { | 391 do_test vtab1-3.7 { |
395 execsql { | 392 execsql { |
396 SELECT rowid, * FROM t1; | 393 SELECT rowid, * FROM t1; |
397 } | 394 } |
398 } {1 1 2 3 2 4 5 6} | 395 } {1 1 2 3 2 4 5 6} |
399 do_test vtab1-3.8 { | 396 do_test vtab1-3.8.1 { |
400 execsql { | 397 execsql { |
401 SELECT a AS d, b AS e, c AS f FROM t1; | 398 SELECT a AS d, b AS e, c AS f FROM t1; |
402 } | 399 } |
403 } {1 2 3 4 5 6} | 400 } {1 2 3 4 5 6} |
404 | 401 |
405 # Execute some SELECT statements with WHERE clauses on the t1 table. | 402 # Execute some SELECT statements with WHERE clauses on the t1 table. |
406 # Then check the echo_module variable (written to by the module methods | 403 # Then check the echo_module variable (written to by the module methods |
407 # in test8.c) to make sure the xBestIndex() and xFilter() methods were | 404 # in test8.c) to make sure the xBestIndex() and xFilter() methods were |
408 # called correctly. | 405 # called correctly. |
409 # | 406 # |
410 do_test vtab1-3.8 { | 407 do_test vtab1-3.8.2 { |
411 set echo_module "" | 408 set echo_module "" |
412 execsql { | 409 execsql { |
413 SELECT * FROM t1; | 410 SELECT * FROM t1; |
414 } | 411 } |
415 set echo_module | 412 set echo_module |
416 } [list xBestIndex {SELECT rowid, * FROM 'treal'} \ | 413 } [list xBestIndex {SELECT rowid, a, b, c FROM 'treal'} \ |
417 xFilter {SELECT rowid, * FROM 'treal'} ] | 414 xFilter {SELECT rowid, a, b, c FROM 'treal'} ] |
418 do_test vtab1-3.9 { | 415 do_test vtab1-3.9 { |
419 set echo_module "" | 416 set echo_module "" |
420 execsql { | 417 execsql { |
421 SELECT * FROM t1 WHERE b = 5; | 418 SELECT * FROM t1 WHERE b = 5; |
422 } | 419 } |
423 } {4 5 6} | 420 } {4 5 6} |
424 do_test vtab1-3.10 { | 421 do_test vtab1-3.10 { |
425 set echo_module | 422 set echo_module |
426 } [list xBestIndex {SELECT rowid, * FROM 'treal' WHERE b = ?} \ | 423 } [list xBestIndex {SELECT rowid, a, b, c FROM 'treal' WHERE b = ?} \ |
427 xFilter {SELECT rowid, * FROM 'treal' WHERE b = ?} 5 ] | 424 xFilter {SELECT rowid, a, b, c FROM 'treal' WHERE b = ?} 5 ] |
428 do_test vtab1-3.10 { | 425 do_test vtab1-3.10 { |
429 set echo_module "" | 426 set echo_module "" |
430 execsql { | 427 execsql { |
431 SELECT * FROM t1 WHERE b >= 5 AND b <= 10; | 428 SELECT * FROM t1 WHERE b >= 5 AND b <= 10; |
432 } | 429 } |
433 } {4 5 6} | 430 } {4 5 6} |
434 do_test vtab1-3.11 { | 431 do_test vtab1-3.11 { |
435 set echo_module | 432 set echo_module |
436 } [list xBestIndex {SELECT rowid, * FROM 'treal' WHERE b >= ? AND b <= ?} \ | 433 } [list xBestIndex {SELECT rowid, a, b, c FROM 'treal' WHERE b >= ? AND b <= ?}\ |
437 xFilter {SELECT rowid, * FROM 'treal' WHERE b >= ? AND b <= ?} 5 10 ] | 434 xFilter {SELECT rowid, a, b, c FROM 'treal' WHERE b >= ? AND b <= ?}\ |
| 435 5 10 ] |
438 do_test vtab1-3.12 { | 436 do_test vtab1-3.12 { |
439 set echo_module "" | 437 set echo_module "" |
440 execsql { | 438 execsql { |
441 SELECT * FROM t1 WHERE b BETWEEN 2 AND 10; | 439 SELECT * FROM t1 WHERE b BETWEEN 2 AND 10; |
442 } | 440 } |
443 } {1 2 3 4 5 6} | 441 } {1 2 3 4 5 6} |
444 do_test vtab1-3.13 { | 442 do_test vtab1-3.13 { |
445 set echo_module | 443 set echo_module |
446 } [list xBestIndex {SELECT rowid, * FROM 'treal' WHERE b >= ? AND b <= ?} \ | 444 } [list xBestIndex {SELECT rowid, a, b, c FROM 'treal' WHERE b >= ? AND b <= ?}\ |
447 xFilter {SELECT rowid, * FROM 'treal' WHERE b >= ? AND b <= ?} 2 10 ] | 445 xFilter {SELECT rowid, a, b, c FROM 'treal' WHERE b >= ? AND b <= ?}\ |
| 446 2 10 ] |
448 | 447 |
449 # Add a function for the MATCH operator. Everything always matches! | 448 # Add a function for the MATCH operator. Everything always matches! |
450 #proc test_match {lhs rhs} { | 449 #proc test_match {lhs rhs} { |
451 # lappend ::echo_module MATCH $lhs $rhs | 450 # lappend ::echo_module MATCH $lhs $rhs |
452 # return 1 | 451 # return 1 |
453 #} | 452 #} |
454 #db function match test_match | 453 #db function match test_match |
455 | 454 |
456 set echo_module "" | 455 set echo_module "" |
457 do_test vtab1-3.12 { | 456 do_test vtab1-3.12 { |
458 set echo_module "" | 457 set echo_module "" |
459 catchsql { | 458 catchsql { |
460 SELECT * FROM t1 WHERE a MATCH 'string'; | 459 SELECT * FROM t1 WHERE a MATCH 'string'; |
461 } | 460 } |
462 } {1 {unable to use function MATCH in the requested context}} | 461 } {1 {unable to use function MATCH in the requested context}} |
463 do_test vtab1-3.13 { | 462 do_test vtab1-3.13 { |
464 set echo_module | 463 set echo_module |
465 } [list xBestIndex {SELECT rowid, * FROM 'treal'} \ | 464 } [list xBestIndex {SELECT rowid, a, b, c FROM 'treal'} \ |
466 xFilter {SELECT rowid, * FROM 'treal'}] | 465 xFilter {SELECT rowid, a, b, c FROM 'treal'}] |
467 ifcapable subquery { | 466 ifcapable subquery { |
468 # The echo module uses a subquery internally to implement the MATCH operator. | 467 # The echo module uses a subquery internally to implement the MATCH operator. |
469 do_test vtab1-3.14 { | 468 do_test vtab1-3.14 { |
470 set echo_module "" | 469 set echo_module "" |
471 execsql { | 470 execsql { |
472 SELECT * FROM t1 WHERE b MATCH 'string'; | 471 SELECT * FROM t1 WHERE b MATCH 'string'; |
473 } | 472 } |
474 } {} | 473 } {} |
475 do_test vtab1-3.15 { | 474 do_test vtab1-3.15 { |
476 set echo_module | 475 set echo_module |
477 } [list xBestIndex \ | 476 } [list xBestIndex \ |
478 {SELECT rowid, * FROM 'treal' WHERE b LIKE (SELECT '%'||?||'%')} \ | 477 {SELECT rowid, a, b, c FROM 'treal' WHERE b LIKE (SELECT '%'||?||'%')} \ |
479 xFilter \ | 478 xFilter \ |
480 {SELECT rowid, * FROM 'treal' WHERE b LIKE (SELECT '%'||?||'%')} \ | 479 {SELECT rowid, a, b, c FROM 'treal' WHERE b LIKE (SELECT '%'||?||'%')} \ |
481 string ] | 480 string ] |
482 }; #ifcapable subquery | 481 }; #ifcapable subquery |
483 | 482 |
484 #---------------------------------------------------------------------- | 483 #---------------------------------------------------------------------- |
485 # Test case vtab1-3 test table scans and the echo module's | 484 # Test case vtab1-3 test table scans and the echo module's |
486 # xBestIndex/xFilter handling of ORDER BY clauses. | 485 # xBestIndex/xFilter handling of ORDER BY clauses. |
487 | 486 |
488 # This procedure executes the SQL. Then it checks to see if the OP_Sort | 487 # This procedure executes the SQL. Then it checks to see if the OP_Sort |
489 # opcode was executed. If an OP_Sort did occur, then "sort" is appended | 488 # opcode was executed. If an OP_Sort did occur, then "sort" is appended |
490 # to the result. If no OP_Sort happened, then "nosort" is appended. | 489 # to the result. If no OP_Sort happened, then "nosort" is appended. |
(...skipping 10 matching lines...) Expand all Loading... |
501 } | 500 } |
502 | 501 |
503 do_test vtab1-4.1 { | 502 do_test vtab1-4.1 { |
504 set echo_module "" | 503 set echo_module "" |
505 cksort { | 504 cksort { |
506 SELECT b FROM t1 ORDER BY b; | 505 SELECT b FROM t1 ORDER BY b; |
507 } | 506 } |
508 } {2 5 nosort} | 507 } {2 5 nosort} |
509 do_test vtab1-4.2 { | 508 do_test vtab1-4.2 { |
510 set echo_module | 509 set echo_module |
511 } [list xBestIndex {SELECT rowid, * FROM 'treal' ORDER BY b ASC} \ | 510 } [list xBestIndex {SELECT rowid, NULL, b, NULL FROM 'treal' ORDER BY b ASC} \ |
512 xFilter {SELECT rowid, * FROM 'treal' ORDER BY b ASC} ] | 511 xFilter {SELECT rowid, NULL, b, NULL FROM 'treal' ORDER BY b ASC} ] |
513 do_test vtab1-4.3 { | 512 do_test vtab1-4.3 { |
514 set echo_module "" | 513 set echo_module "" |
515 cksort { | 514 cksort { |
516 SELECT b FROM t1 ORDER BY b DESC; | 515 SELECT b FROM t1 ORDER BY b DESC; |
517 } | 516 } |
518 } {5 2 nosort} | 517 } {5 2 nosort} |
519 do_test vtab1-4.4 { | 518 do_test vtab1-4.4 { |
520 set echo_module | 519 set echo_module |
521 } [list xBestIndex {SELECT rowid, * FROM 'treal' ORDER BY b DESC} \ | 520 } [list xBestIndex {SELECT rowid, NULL, b, NULL FROM 'treal' ORDER BY b DESC} \ |
522 xFilter {SELECT rowid, * FROM 'treal' ORDER BY b DESC} ] | 521 xFilter {SELECT rowid, NULL, b, NULL FROM 'treal' ORDER BY b DESC} ] |
523 do_test vtab1-4.3 { | 522 do_test vtab1-4.3 { |
524 set echo_module "" | 523 set echo_module "" |
525 cksort { | 524 cksort { |
526 SELECT b FROM t1 ORDER BY b||''; | 525 SELECT b FROM t1 ORDER BY b||''; |
527 } | 526 } |
528 } {2 5 sort} | 527 } {2 5 sort} |
529 do_test vtab1-4.4 { | 528 do_test vtab1-4.4 { |
530 set echo_module | 529 set echo_module |
531 } [list xBestIndex {SELECT rowid, * FROM 'treal'} \ | 530 } [list xBestIndex {SELECT rowid, NULL, b, NULL FROM 'treal'} \ |
532 xFilter {SELECT rowid, * FROM 'treal'} ] | 531 xFilter {SELECT rowid, NULL, b, NULL FROM 'treal'} ] |
533 | 532 |
534 execsql { | 533 execsql { |
535 DROP TABLE t1; | 534 DROP TABLE t1; |
536 DROP TABLE treal; | 535 DROP TABLE treal; |
537 } | 536 } |
538 | 537 |
539 #---------------------------------------------------------------------- | 538 #---------------------------------------------------------------------- |
540 # Test cases vtab1-5 test SELECT queries that include joins on virtual | 539 # Test cases vtab1-5 test SELECT queries that include joins on virtual |
541 # tables. | 540 # tables. |
542 | 541 |
(...skipping 28 matching lines...) Expand all Loading... |
571 } | 570 } |
572 } [list \ | 571 } [list \ |
573 1 red green 1 spades clubs \ | 572 1 red green 1 spades clubs \ |
574 1 red green 2 hearts diamonds \ | 573 1 red green 2 hearts diamonds \ |
575 2 blue black 1 spades clubs \ | 574 2 blue black 1 spades clubs \ |
576 2 blue black 2 hearts diamonds \ | 575 2 blue black 2 hearts diamonds \ |
577 ] | 576 ] |
578 do_test vtab1-5-3 { | 577 do_test vtab1-5-3 { |
579 filter $echo_module | 578 filter $echo_module |
580 } [list \ | 579 } [list \ |
581 xFilter {SELECT rowid, * FROM 't1'} \ | 580 xFilter {SELECT rowid, a, b, c FROM 't1'} \ |
582 xFilter {SELECT rowid, * FROM 't2'} \ | 581 xFilter {SELECT rowid, d, e, f FROM 't2'} \ |
583 xFilter {SELECT rowid, * FROM 't2'} \ | 582 xFilter {SELECT rowid, d, e, f FROM 't2'} \ |
584 ] | 583 ] |
585 do_test vtab1-5-4 { | 584 do_test vtab1-5-4 { |
586 set echo_module "" | 585 set echo_module "" |
587 execsql { | 586 execsql { |
588 SELECT * FROM et1, et2 WHERE et2.d = 2; | 587 SELECT * FROM et1, et2 WHERE et2.d = 2; |
589 } | 588 } |
590 } [list \ | 589 } [list \ |
591 1 red green 2 hearts diamonds \ | 590 1 red green 2 hearts diamonds \ |
592 2 blue black 2 hearts diamonds \ | 591 2 blue black 2 hearts diamonds \ |
593 ] | 592 ] |
594 do_test vtab1-5-5 { | 593 do_test vtab1-5-5 { |
595 filter $echo_module | 594 filter $echo_module |
596 } [list \ | 595 } [list \ |
597 xFilter {SELECT rowid, * FROM 't1'} \ | 596 xFilter {SELECT rowid, a, b, c FROM 't1'} \ |
598 xFilter {SELECT rowid, * FROM 't2'} \ | 597 xFilter {SELECT rowid, d, e, f FROM 't2'} \ |
599 xFilter {SELECT rowid, * FROM 't2'} \ | 598 xFilter {SELECT rowid, d, e, f FROM 't2'} \ |
600 ] | 599 ] |
601 do_test vtab1-5-6 { | 600 do_test vtab1-5-6 { |
602 execsql { | 601 execsql { |
603 CREATE INDEX i1 ON t2(d); | 602 CREATE INDEX i1 ON t2(d); |
604 } | 603 } |
605 | 604 |
606 db close | 605 db close |
607 sqlite3 db test.db | 606 sqlite3 db test.db |
608 register_echo_module [sqlite3_connection_pointer db] | 607 register_echo_module [sqlite3_connection_pointer db] |
609 | 608 |
610 set ::echo_module "" | 609 set ::echo_module "" |
611 execsql { | 610 execsql { |
612 SELECT * FROM et1, et2 WHERE et2.d = 2; | 611 SELECT * FROM et1, et2 WHERE et2.d = 2; |
613 } | 612 } |
614 } [list \ | 613 } [list \ |
615 1 red green 2 hearts diamonds \ | 614 1 red green 2 hearts diamonds \ |
616 2 blue black 2 hearts diamonds \ | 615 2 blue black 2 hearts diamonds \ |
617 ] | 616 ] |
618 do_test vtab1-5-7 { | 617 do_test vtab1-5-7 { |
619 filter $::echo_module | 618 filter $::echo_module |
620 } [list \ | 619 } [list \ |
621 xFilter {SELECT rowid, * FROM 't1'} \ | 620 xFilter {SELECT rowid, a, b, c FROM 't1'} \ |
622 xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \ | 621 xFilter {SELECT rowid, d, e, f FROM 't2' WHERE d = ?} \ |
623 xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \ | 622 xFilter {SELECT rowid, d, e, f FROM 't2' WHERE d = ?} \ |
624 ] | 623 ] |
625 | 624 |
626 execsql { | 625 execsql { |
627 DROP TABLE t1; | 626 DROP TABLE t1; |
628 DROP TABLE t2; | 627 DROP TABLE t2; |
629 DROP TABLE et1; | 628 DROP TABLE et1; |
630 DROP TABLE et2; | 629 DROP TABLE et2; |
631 } | 630 } |
632 | 631 |
633 #---------------------------------------------------------------------- | 632 #---------------------------------------------------------------------- |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 }} | 962 }} |
964 } {0} | 963 } {0} |
965 | 964 |
966 do_test vtab1.10-5 { | 965 do_test vtab1.10-5 { |
967 set echo_module "" | 966 set echo_module "" |
968 execsql { | 967 execsql { |
969 SELECT * FROM e WHERE rowid||'' MATCH 'pattern'; | 968 SELECT * FROM e WHERE rowid||'' MATCH 'pattern'; |
970 } | 969 } |
971 set echo_module | 970 set echo_module |
972 } [list \ | 971 } [list \ |
973 xBestIndex {SELECT rowid, * FROM 'r'} \ | 972 xBestIndex {SELECT rowid, a, b, c FROM 'r'} \ |
974 xFilter {SELECT rowid, * FROM 'r'} \ | 973 xFilter {SELECT rowid, a, b, c FROM 'r'} \ |
975 ] | 974 ] |
976 proc match_func {args} {return ""} | 975 proc match_func {args} {return ""} |
977 do_test vtab1.10-6 { | 976 do_test vtab1.10-6 { |
978 set echo_module "" | 977 set echo_module "" |
979 db function match match_func | 978 db function match match_func |
980 execsql { | 979 execsql { |
981 SELECT * FROM e WHERE match('pattern', rowid, 'pattern2'); | 980 SELECT * FROM e WHERE match('pattern', rowid, 'pattern2'); |
982 } | 981 } |
983 set echo_module | 982 set echo_module |
984 } [list \ | 983 } [list \ |
985 xBestIndex {SELECT rowid, * FROM 'r'} \ | 984 xBestIndex {SELECT rowid, a, b, c FROM 'r'} \ |
986 xFilter {SELECT rowid, * FROM 'r'} \ | 985 xFilter {SELECT rowid, a, b, c FROM 'r'} \ |
987 ] | 986 ] |
988 | 987 |
989 | 988 |
990 # Testing the xFindFunction interface | 989 # Testing the xFindFunction interface |
991 # | 990 # |
992 catch {rename ::echo_glob_overload {}} | 991 catch {rename ::echo_glob_overload {}} |
993 do_test vtab1.11-1 { | 992 do_test vtab1.11-1 { |
994 execsql { | 993 execsql { |
995 INSERT INTO r(a,b,c) VALUES(1,'?',99); | 994 INSERT INTO r(a,b,c) VALUES(1,'?',99); |
996 INSERT INTO r(a,b,c) VALUES(2,3,99); | 995 INSERT INTO r(a,b,c) VALUES(2,3,99); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 INSERT INTO c VALUES(NULL, 15, 16); | 1077 INSERT INTO c VALUES(NULL, 15, 16); |
1079 SELECT * FROM echo_c WHERE a IS NULL | 1078 SELECT * FROM echo_c WHERE a IS NULL |
1080 } | 1079 } |
1081 } {{} 15 16} | 1080 } {{} 15 16} |
1082 do_test vtab1.13-3 { | 1081 do_test vtab1.13-3 { |
1083 execsql { | 1082 execsql { |
1084 INSERT INTO c VALUES(15, NULL, 16); | 1083 INSERT INTO c VALUES(15, NULL, 16); |
1085 SELECT * FROM echo_c WHERE b IS NULL | 1084 SELECT * FROM echo_c WHERE b IS NULL |
1086 } | 1085 } |
1087 } {15 {} 16} | 1086 } {15 {} 16} |
1088 do_test vtab1.13-3 { | 1087 do_test vtab1.13-4 { |
| 1088 unset -nocomplain null |
| 1089 execsql { |
| 1090 SELECT * FROM echo_c WHERE b IS $null |
| 1091 } |
| 1092 } {15 {} 16} |
| 1093 do_test vtab1.13-5 { |
1089 execsql { | 1094 execsql { |
1090 SELECT * FROM echo_c WHERE b IS NULL AND a = 15; | 1095 SELECT * FROM echo_c WHERE b IS NULL AND a = 15; |
1091 } | 1096 } |
1092 } {15 {} 16} | 1097 } {15 {} 16} |
| 1098 do_test vtab1.13-6 { |
| 1099 execsql { |
| 1100 SELECT * FROM echo_c WHERE NULL IS b AND a IS 15; |
| 1101 } |
| 1102 } {15 {} 16} |
1093 | 1103 |
1094 | 1104 |
1095 do_test vtab1-14.001 { | 1105 do_test vtab1-14.001 { |
1096 execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (1,2,3)} | 1106 execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (1,2,3)} |
1097 } {1 3 G H 2 {} 15 16 3 15 {} 16} | 1107 } {1 3 G H 2 {} 15 16 3 15 {} 16} |
1098 do_test vtab1-14.002 { | 1108 do_test vtab1-14.002 { |
1099 execsql {SELECT rowid, * FROM echo_c WHERE rowid IN (1,2,3)} | 1109 execsql {SELECT rowid, * FROM echo_c WHERE rowid IN (1,2,3)} |
1100 } {1 3 G H 2 {} 15 16 3 15 {} 16} | 1110 } {1 3 G H 2 {} 15 16 3 15 {} 16} |
1101 do_test vtab1-14.003 { | 1111 do_test vtab1-14.003 { |
1102 execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (0,1,5,2,'a',3,NULL)} | 1112 execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (0,1,5,2,'a',3,NULL)} |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 # execsql { DELETE FROM c } | 1148 # execsql { DELETE FROM c } |
1139 # set echo_module "" | 1149 # set echo_module "" |
1140 # execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) } | 1150 # execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) } |
1141 # set echo_module | 1151 # set echo_module |
1142 #} {/.*xBestIndex {SELECT rowid, . FROM 'c' WHERE rowid = .} xFilter {SELECT row
id, . FROM 'c'} 1/} | 1152 #} {/.*xBestIndex {SELECT rowid, . FROM 'c' WHERE rowid = .} xFilter {SELECT row
id, . FROM 'c'} 1/} |
1143 | 1153 |
1144 do_test vtab1-14.2 { | 1154 do_test vtab1-14.2 { |
1145 set echo_module "" | 1155 set echo_module "" |
1146 execsql { SELECT * FROM echo_c WHERE rowid = 1 } | 1156 execsql { SELECT * FROM echo_c WHERE rowid = 1 } |
1147 set echo_module | 1157 set echo_module |
1148 } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE rowid = ?} xFilter {SELECT ro
wid, * FROM 'c' WHERE rowid = ?} 1] | 1158 } [list xBestIndex {SELECT rowid, a, b, c FROM 'c' WHERE rowid = ?} \ |
| 1159 xFilter {SELECT rowid, a, b, c FROM 'c' WHERE rowid = ?} 1] |
1149 | 1160 |
1150 do_test vtab1-14.3 { | 1161 do_test vtab1-14.3 { |
1151 set echo_module "" | 1162 set echo_module "" |
1152 execsql { SELECT * FROM echo_c WHERE a = 1 } | 1163 execsql { SELECT * FROM echo_c WHERE a = 1 } |
1153 set echo_module | 1164 set echo_module |
1154 } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE a = ?} xFilter {SELECT rowid,
* FROM 'c' WHERE a = ?} 1] | 1165 } [list xBestIndex {SELECT rowid, a, b, c FROM 'c' WHERE a = ?} \ |
| 1166 xFilter {SELECT rowid, a, b, c FROM 'c' WHERE a = ?} 1] |
1155 | 1167 |
1156 #do_test vtab1-14.4 { | 1168 #do_test vtab1-14.4 { |
1157 # set echo_module "" | 1169 # set echo_module "" |
1158 # execsql { SELECT * FROM echo_c WHERE a IN (1, 2) } | 1170 # execsql { SELECT * FROM echo_c WHERE a IN (1, 2) } |
1159 # set echo_module | 1171 # set echo_module |
1160 #} {/xBestIndex {SELECT rowid, . FROM 'c' WHERE a = .} xFilter {SELECT rowid, .
FROM 'c' WHERE a = .} 1/} | 1172 #} {/xBestIndex {SELECT rowid, . FROM 'c' WHERE a = .} xFilter {SELECT rowid, .
FROM 'c' WHERE a = .} 1/} |
1161 | 1173 |
1162 do_test vtab1-15.1 { | 1174 do_test vtab1-15.1 { |
1163 execsql { | 1175 execsql { |
1164 CREATE TABLE t1(a, b, c); | 1176 CREATE TABLE t1(a, b, c); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1285 INSERT INTO t6 VALUES(2, 'Andrew'); | 1297 INSERT INTO t6 VALUES(2, 'Andrew'); |
1286 INSERT INTO t6 VALUES(3, 'James'); | 1298 INSERT INTO t6 VALUES(3, 'James'); |
1287 INSERT INTO t6 VALUES(4, 'John'); | 1299 INSERT INTO t6 VALUES(4, 'John'); |
1288 INSERT INTO t6 VALUES(5, 'Phillip'); | 1300 INSERT INTO t6 VALUES(5, 'Phillip'); |
1289 INSERT INTO t6 VALUES(6, 'Bartholomew'); | 1301 INSERT INTO t6 VALUES(6, 'Bartholomew'); |
1290 CREATE VIRTUAL TABLE e6 USING echo(t6); | 1302 CREATE VIRTUAL TABLE e6 USING echo(t6); |
1291 } | 1303 } |
1292 | 1304 |
1293 foreach {tn sql res filter} { | 1305 foreach {tn sql res filter} { |
1294 1.1 "SELECT a FROM e6 WHERE b>'James'" {4 1 5} | 1306 1.1 "SELECT a FROM e6 WHERE b>'James'" {4 1 5} |
1295 {xFilter {SELECT rowid, * FROM 't6' WHERE b > ?} James} | 1307 {xFilter {SELECT rowid, a, b FROM 't6' WHERE b > ?} James} |
1296 | 1308 |
1297 1.2 "SELECT a FROM e6 WHERE b>='J' AND b<'K'" {3 4} | 1309 1.2 "SELECT a FROM e6 WHERE b>='J' AND b<'K'" {3 4} |
1298 {xFilter {SELECT rowid, * FROM 't6' WHERE b >= ? AND b < ?} J K} | 1310 {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ?} J K} |
1299 | 1311 |
1300 1.3 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4} | 1312 1.3 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4} |
1301 {xFilter {SELECT rowid, * FROM 't6'}} | 1313 {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} J%} |
1302 | 1314 |
1303 1.4 "SELECT a FROM e6 WHERE b LIKE 'j%'" {3 4} | 1315 1.4 "SELECT a FROM e6 WHERE b LIKE 'j%'" {3 4} |
1304 {xFilter {SELECT rowid, * FROM 't6'}} | 1316 {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} j%} |
1305 } { | 1317 } { |
1306 set echo_module {} | 1318 set echo_module {} |
1307 do_execsql_test 18.$tn.1 $sql $res | 1319 do_execsql_test 18.$tn.1 $sql $res |
1308 do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter | 1320 do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter |
1309 } | 1321 } |
1310 | 1322 |
1311 do_execsql_test 18.2.0 { PRAGMA case_sensitive_like = ON } | 1323 do_execsql_test 18.2.0 { PRAGMA case_sensitive_like = ON } |
1312 foreach {tn sql res filter} { | 1324 foreach {tn sql res filter} { |
1313 2.1 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4} | 1325 2.1 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4} |
1314 {xFilter {SELECT rowid, * FROM 't6'}} | 1326 {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} J%} |
1315 | 1327 |
1316 2.2 "SELECT a FROM e6 WHERE b LIKE 'j%'" {} | 1328 2.2 "SELECT a FROM e6 WHERE b LIKE 'j%'" {} |
1317 {xFilter {SELECT rowid, * FROM 't6'}} | 1329 {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} j%} |
1318 } { | 1330 } { |
1319 set echo_module {} | 1331 set echo_module {} |
1320 do_execsql_test 18.$tn.1 $sql $res | 1332 do_execsql_test 18.$tn.1 $sql $res |
1321 do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter | 1333 do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter |
1322 } | 1334 } |
1323 do_execsql_test 18.2.x { PRAGMA case_sensitive_like = OFF } | 1335 do_execsql_test 18.2.x { PRAGMA case_sensitive_like = OFF } |
1324 | 1336 |
1325 #------------------------------------------------------------------------- | 1337 #------------------------------------------------------------------------- |
1326 # Test that an existing module may not be overridden. | 1338 # Test that an existing module may not be overridden. |
1327 # | 1339 # |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1388 } | 1400 } |
1389 | 1401 |
1390 do_execsql_test 21.2 { | 1402 do_execsql_test 21.2 { |
1391 SELECT * FROM t9v WHERE a<b; | 1403 SELECT * FROM t9v WHERE a<b; |
1392 } {1 2 3} | 1404 } {1 2 3} |
1393 | 1405 |
1394 do_execsql_test 21.3 { | 1406 do_execsql_test 21.3 { |
1395 SELECT * FROM t9v WHERE a=b; | 1407 SELECT * FROM t9v WHERE a=b; |
1396 } {2 2 2} | 1408 } {2 2 2} |
1397 | 1409 |
| 1410 #------------------------------------------------------------------------- |
| 1411 # At one point executing a CREATE VIRTUAL TABLE statement that specified |
| 1412 # a database name but no virtual table arguments was causing an internal |
| 1413 # buffer overread. Valgrind would report errors while running the following |
| 1414 # tests. Specifically: |
| 1415 # |
| 1416 # CREATE VIRTUAL TABLE t1 USING fts4; -- Ok - no db name. |
| 1417 # CREATE VIRTUAL TABLE main.t1 USING fts4(x); -- Ok - has vtab arguments. |
| 1418 # CREATE VIRTUAL TABLE main.t1 USING fts4; -- Had the problem. |
| 1419 # |
| 1420 ifcapable fts3 { |
| 1421 forcedelete test.db2 |
| 1422 set nm [string repeat abcdefghij 100] |
| 1423 do_execsql_test 22.1 { |
| 1424 ATTACH 'test.db2' AS $nm |
| 1425 } |
| 1426 |
| 1427 execsql "SELECT * FROM sqlite_master" |
| 1428 do_execsql_test 22.2 "CREATE VIRTUAL TABLE ${nm}.t1 USING fts4" |
| 1429 |
| 1430 do_test 22.3.1 { |
| 1431 set sql "CREATE VIRTUAL TABLE ${nm}.t2 USING fts4" |
| 1432 set stmt [sqlite3_prepare_v2 db $sql -1 dummy] |
| 1433 sqlite3_step $stmt |
| 1434 } {SQLITE_DONE} |
| 1435 |
| 1436 do_test 22.3.2 { |
| 1437 sqlite3_finalize $stmt |
| 1438 } {SQLITE_OK} |
| 1439 |
| 1440 do_test 22.4.1 { |
| 1441 set sql "CREATE VIRTUAL TABLE ${nm}.t3 USING fts4" |
| 1442 set n [string length $sql] |
| 1443 set stmt [sqlite3_prepare db "${sql}xyz" $n dummy] |
| 1444 sqlite3_step $stmt |
| 1445 } {SQLITE_DONE} |
| 1446 |
| 1447 do_test 22.4.2 { |
| 1448 sqlite3_finalize $stmt |
| 1449 } {SQLITE_OK} |
| 1450 } |
| 1451 |
| 1452 |
| 1453 #------------------------------------------------------------------------- |
| 1454 # The following tests verify that a DROP TABLE command on a virtual |
| 1455 # table does not cause other operations to crash. |
| 1456 # |
| 1457 # 23.1: Dropping a vtab while a SELECT is running on it. |
| 1458 # |
| 1459 # 23.2: Dropping a vtab while a SELECT that will, but has not yet, |
| 1460 # open a cursor on the vtab, is running. In this case the |
| 1461 # DROP TABLE succeeds and the SELECT hits an error. |
| 1462 # |
| 1463 # 23.3: Dropping a vtab from within a user-defined-function callback |
| 1464 # in the middle of an "INSERT INTO vtab SELECT ..." statement. |
| 1465 # |
| 1466 reset_db |
| 1467 load_static_extension db wholenumber |
| 1468 load_static_extension db eval |
| 1469 register_echo_module db |
| 1470 |
| 1471 do_test 23.1 { |
| 1472 execsql { CREATE VIRTUAL TABLE t1 USING wholenumber } |
| 1473 set res "" |
| 1474 db eval { SELECT value FROM t1 WHERE value<10 } { |
| 1475 if {$value == 5} { |
| 1476 set res [catchsql { DROP TABLE t1 }] |
| 1477 } |
| 1478 } |
| 1479 set res |
| 1480 } {1 {database table is locked}} |
| 1481 |
| 1482 do_test 23.2 { |
| 1483 execsql { |
| 1484 CREATE TABLE t2(value); |
| 1485 INSERT INTO t2 VALUES(1), (2), (3); |
| 1486 } |
| 1487 |
| 1488 set res2 [list [catch { |
| 1489 db eval { |
| 1490 SELECT value FROM t2 UNION ALL |
| 1491 SELECT value FROM t1 WHERE value<10 |
| 1492 } { |
| 1493 if {$value == 2} { set res1 [catchsql { DROP TABLE t1 }] } |
| 1494 } |
| 1495 } msg] $msg] |
| 1496 list $res1 $res2 |
| 1497 } {{0 {}} {1 {database table is locked}}} |
| 1498 |
| 1499 do_test 23.3.1 { |
| 1500 execsql { CREATE VIRTUAL TABLE t1e USING echo(t2) } |
| 1501 execsql { INSERT INTO t1e SELECT 4 } |
| 1502 catchsql { INSERT INTO t1e SELECT eval('DROP TABLE t1e') } |
| 1503 } {1 {database table is locked}} |
| 1504 do_execsql_test 23.3.2 { SELECT * FROM t1e } {1 2 3 4} |
| 1505 |
| 1506 #------------------------------------------------------------------------- |
| 1507 # At one point SQL like this: |
| 1508 # |
| 1509 # SAVEPOINT xyz; -- Opens SQL transaction |
| 1510 # INSERT INTO vtab -- Write to virtual table |
| 1511 # ROLLBACK TO xyz; |
| 1512 # RELEASE xyz; |
| 1513 # |
| 1514 # was not invoking the xRollbackTo() callback for the ROLLBACK TO |
| 1515 # operation. Which meant that virtual tables like FTS3 would incorrectly |
| 1516 # commit the results of the INSERT as part of the "RELEASE xyz" command. |
| 1517 # |
| 1518 # The following tests check that this has been fixed. |
| 1519 # |
| 1520 ifcapable fts3 { |
| 1521 do_execsql_test 24.0 { |
| 1522 CREATE VIRTUAL TABLE t4 USING fts3(); |
| 1523 SAVEPOINT a; |
| 1524 INSERT INTO t4 VALUES('a b c'); |
| 1525 ROLLBACK TO a; |
| 1526 RELEASE a; |
| 1527 SELECT * FROM t4; |
| 1528 } {} |
| 1529 |
| 1530 do_execsql_test 24.1 { SELECT * FROM t4 WHERE t4 MATCH 'b' } {} |
| 1531 do_execsql_test 24.2 { INSERT INTO t4(t4) VALUES('integrity-check') } {} |
| 1532 |
| 1533 do_execsql_test 24.3 { |
| 1534 SAVEPOINT a; |
| 1535 CREATE VIRTUAL TABLE t5 USING fts3(); |
| 1536 SAVEPOINT b; |
| 1537 ROLLBACK TO a; |
| 1538 SAVEPOINT c; |
| 1539 RELEASE a; |
| 1540 } |
| 1541 } |
| 1542 |
1398 finish_test | 1543 finish_test |
OLD | NEW |