Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Side by Side Diff: third_party/sqlite/src/test/vtab1.test

Issue 1610963002: Import SQLite 3.10.2. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/sqlite/src/test/view.test ('k') | third_party/sqlite/src/test/vtab2.test » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/sqlite/src/test/view.test ('k') | third_party/sqlite/src/test/vtab2.test » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698