OLD | NEW |
1 # 2005 August 13 | 1 # 2005 August 13 |
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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; | 108 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; |
109 } | 109 } |
110 } {ABC abc} | 110 } {ABC abc} |
111 | 111 |
112 # Tests of the REGEXP operator | 112 # Tests of the REGEXP operator |
113 # | 113 # |
114 do_test like-2.1 { | 114 do_test like-2.1 { |
115 proc test_regexp {a b} { | 115 proc test_regexp {a b} { |
116 return [regexp $a $b] | 116 return [regexp $a $b] |
117 } | 117 } |
118 db function regexp test_regexp | 118 db function regexp -argcount 2 test_regexp |
119 execsql { | 119 execsql { |
120 SELECT x FROM t1 WHERE x REGEXP 'abc' ORDER BY 1; | 120 SELECT x FROM t1 WHERE x REGEXP 'abc' ORDER BY 1; |
121 } | 121 } |
122 } {{ABC abc xyz} abc abcd} | 122 } {{ABC abc xyz} abc abcd} |
123 do_test like-2.2 { | 123 do_test like-2.2 { |
124 execsql { | 124 execsql { |
125 SELECT x FROM t1 WHERE x REGEXP '^abc' ORDER BY 1; | 125 SELECT x FROM t1 WHERE x REGEXP '^abc' ORDER BY 1; |
126 } | 126 } |
127 } {abc abcd} | 127 } {abc abcd} |
128 | 128 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 CREATE INDEX i1 ON t1(x); | 187 CREATE INDEX i1 ON t1(x); |
188 } | 188 } |
189 queryplan { | 189 queryplan { |
190 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; | 190 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; |
191 } | 191 } |
192 } {abc abcd nosort {} i1} | 192 } {abc abcd nosort {} i1} |
193 do_test like-3.4 { | 193 do_test like-3.4 { |
194 set sqlite_like_count | 194 set sqlite_like_count |
195 } 0 | 195 } 0 |
196 | 196 |
| 197 # The LIKE optimization still works when the RHS is a string with no |
| 198 # wildcard. Ticket [e090183531fc2747] |
| 199 # |
| 200 do_test like-3.4.2 { |
| 201 queryplan { |
| 202 SELECT x FROM t1 WHERE x LIKE 'a' ORDER BY 1; |
| 203 } |
| 204 } {a nosort {} i1} |
| 205 do_test like-3.4.3 { |
| 206 queryplan { |
| 207 SELECT x FROM t1 WHERE x LIKE 'ab' ORDER BY 1; |
| 208 } |
| 209 } {ab nosort {} i1} |
| 210 do_test like-3.4.4 { |
| 211 queryplan { |
| 212 SELECT x FROM t1 WHERE x LIKE 'abcd' ORDER BY 1; |
| 213 } |
| 214 } {abcd nosort {} i1} |
| 215 do_test like-3.4.5 { |
| 216 queryplan { |
| 217 SELECT x FROM t1 WHERE x LIKE 'abcde' ORDER BY 1; |
| 218 } |
| 219 } {nosort {} i1} |
| 220 |
| 221 |
197 # Partial optimization when the pattern does not end in '%' | 222 # Partial optimization when the pattern does not end in '%' |
198 # | 223 # |
199 do_test like-3.5 { | 224 do_test like-3.5 { |
200 set sqlite_like_count 0 | 225 set sqlite_like_count 0 |
201 queryplan { | 226 queryplan { |
202 SELECT x FROM t1 WHERE x LIKE 'a_c' ORDER BY 1; | 227 SELECT x FROM t1 WHERE x LIKE 'a_c' ORDER BY 1; |
203 } | 228 } |
204 } {abc nosort {} i1} | 229 } {abc nosort {} i1} |
205 do_test like-3.6 { | 230 do_test like-3.6 { |
206 set sqlite_like_count | 231 set sqlite_like_count |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 set sqlite_like_count 0 | 327 set sqlite_like_count 0 |
303 queryplan { | 328 queryplan { |
304 PRAGMA case_sensitive_like=off; | 329 PRAGMA case_sensitive_like=off; |
305 SELECT x FROM t1 WHERE x GLOB 'a[bc]d' ORDER BY 1; | 330 SELECT x FROM t1 WHERE x GLOB 'a[bc]d' ORDER BY 1; |
306 } | 331 } |
307 } {abd acd nosort {} i1} | 332 } {abd acd nosort {} i1} |
308 do_test like-3.24 { | 333 do_test like-3.24 { |
309 set sqlite_like_count | 334 set sqlite_like_count |
310 } 6 | 335 } 6 |
311 | 336 |
| 337 # GLOB optimization when there is no wildcard. Ticket [e090183531fc2747] |
| 338 # |
| 339 do_test like-3.25 { |
| 340 queryplan { |
| 341 SELECT x FROM t1 WHERE x GLOB 'a' ORDER BY 1; |
| 342 } |
| 343 } {a nosort {} i1} |
| 344 do_test like-3.26 { |
| 345 queryplan { |
| 346 SELECT x FROM t1 WHERE x GLOB 'abcd' ORDER BY 1; |
| 347 } |
| 348 } {abcd nosort {} i1} |
| 349 do_test like-3.27 { |
| 350 queryplan { |
| 351 SELECT x FROM t1 WHERE x GLOB 'abcde' ORDER BY 1; |
| 352 } |
| 353 } {nosort {} i1} |
| 354 |
| 355 |
| 356 |
312 # No optimization if the LHS of the LIKE is not a column name or | 357 # No optimization if the LHS of the LIKE is not a column name or |
313 # if the RHS is not a string. | 358 # if the RHS is not a string. |
314 # | 359 # |
315 do_test like-4.1 { | 360 do_test like-4.1 { |
316 execsql {PRAGMA case_sensitive_like=on} | 361 execsql {PRAGMA case_sensitive_like=on} |
317 set sqlite_like_count 0 | 362 set sqlite_like_count 0 |
318 queryplan { | 363 queryplan { |
319 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1 | 364 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1 |
320 } | 365 } |
321 } {abc abcd nosort {} i1} | 366 } {abc abcd nosort {} i1} |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 } {1 abcdef 1 ghijkl 1 mnopqr 2 ghijkl} | 601 } {1 abcdef 1 ghijkl 1 mnopqr 2 ghijkl} |
557 do_test like-8.4 { | 602 do_test like-8.4 { |
558 db function like -argcount 3 newlike | 603 db function like -argcount 3 newlike |
559 db eval { | 604 db eval { |
560 SELECT 1, x FROM t8 WHERE x LIKE '%h%'; | 605 SELECT 1, x FROM t8 WHERE x LIKE '%h%'; |
561 SELECT 2, x FROM t8 WHERE x LIKE '%h%' ESCAPE 'x'; | 606 SELECT 2, x FROM t8 WHERE x LIKE '%h%' ESCAPE 'x'; |
562 } | 607 } |
563 } {1 abcdef 1 ghijkl 1 mnopqr 2 abcdef 2 ghijkl 2 mnopqr} | 608 } {1 abcdef 1 ghijkl 1 mnopqr 2 abcdef 2 ghijkl 2 mnopqr} |
564 | 609 |
565 | 610 |
566 ifcapable like_opt { | 611 ifcapable like_opt&&!icu { |
567 # Evaluate SQL. Return the result set followed by the | 612 # Evaluate SQL. Return the result set followed by the |
568 # and the number of full-scan steps. | 613 # and the number of full-scan steps. |
569 # | 614 # |
570 db close | 615 db close |
571 sqlite3 db test.db | 616 sqlite3 db test.db |
572 proc count_steps {sql} { | 617 proc count_steps {sql} { |
573 set r [db eval $sql] | 618 set r [db eval $sql] |
574 lappend r scan [db status step] sort [db status sort] | 619 lappend r scan [db status step] sort [db status sort] |
575 } | 620 } |
576 do_test like-9.1 { | 621 do_test like-9.1 { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 }] | 666 }] |
622 } {0 {}} | 667 } {0 {}} |
623 ifcapable explain { | 668 ifcapable explain { |
624 do_test like-9.5.2 { | 669 do_test like-9.5.2 { |
625 set res [sqlite3_exec_hex db { | 670 set res [sqlite3_exec_hex db { |
626 EXPLAIN QUERY PLAN SELECT x FROM t2 WHERE x LIKE '%fe%25' | 671 EXPLAIN QUERY PLAN SELECT x FROM t2 WHERE x LIKE '%fe%25' |
627 }] | 672 }] |
628 regexp {INDEX i2} $res | 673 regexp {INDEX i2} $res |
629 } {1} | 674 } {1} |
630 } | 675 } |
| 676 |
| 677 # Do an SQL statement. Append the search count to the end of the result. |
| 678 # |
| 679 proc count sql { |
| 680 set ::sqlite_search_count 0 |
| 681 set ::sqlite_like_count 0 |
| 682 return [concat [execsql $sql] scan $::sqlite_search_count \ |
| 683 like $::sqlite_like_count] |
| 684 } |
| 685 |
| 686 # The LIKE and GLOB optimizations do not work on columns with |
| 687 # affinity other than TEXT. |
| 688 # Ticket #3901 |
| 689 # |
| 690 do_test like-10.1 { |
| 691 db close |
| 692 sqlite3 db test.db |
| 693 execsql { |
| 694 CREATE TABLE t10( |
| 695 a INTEGER PRIMARY KEY, |
| 696 b INTEGER COLLATE nocase UNIQUE, |
| 697 c NUMBER COLLATE nocase UNIQUE, |
| 698 d BLOB COLLATE nocase UNIQUE, |
| 699 e COLLATE nocase UNIQUE, |
| 700 f TEXT COLLATE nocase UNIQUE |
| 701 ); |
| 702 INSERT INTO t10 VALUES(1,1,1,1,1,1); |
| 703 INSERT INTO t10 VALUES(12,12,12,12,12,12); |
| 704 INSERT INTO t10 VALUES(123,123,123,123,123,123); |
| 705 INSERT INTO t10 VALUES(234,234,234,234,234,234); |
| 706 INSERT INTO t10 VALUES(345,345,345,345,345,345); |
| 707 INSERT INTO t10 VALUES(45,45,45,45,45,45); |
| 708 } |
| 709 count { |
| 710 SELECT a FROM t10 WHERE b LIKE '12%' ORDER BY +a; |
| 711 } |
| 712 } {12 123 scan 5 like 6} |
| 713 do_test like-10.2 { |
| 714 count { |
| 715 SELECT a FROM t10 WHERE c LIKE '12%' ORDER BY +a; |
| 716 } |
| 717 } {12 123 scan 5 like 6} |
| 718 do_test like-10.3 { |
| 719 count { |
| 720 SELECT a FROM t10 WHERE d LIKE '12%' ORDER BY +a; |
| 721 } |
| 722 } {12 123 scan 5 like 6} |
| 723 do_test like-10.4 { |
| 724 count { |
| 725 SELECT a FROM t10 WHERE e LIKE '12%' ORDER BY +a; |
| 726 } |
| 727 } {12 123 scan 5 like 6} |
| 728 do_test like-10.5 { |
| 729 count { |
| 730 SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY +a; |
| 731 } |
| 732 } {12 123 scan 3 like 0} |
| 733 do_test like-10.6 { |
| 734 count { |
| 735 SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY +a; |
| 736 } |
| 737 } {12 123 scan 5 like 6} |
| 738 do_test like-10.10 { |
| 739 execsql { |
| 740 CREATE TABLE t10b( |
| 741 a INTEGER PRIMARY KEY, |
| 742 b INTEGER UNIQUE, |
| 743 c NUMBER UNIQUE, |
| 744 d BLOB UNIQUE, |
| 745 e UNIQUE, |
| 746 f TEXT UNIQUE |
| 747 ); |
| 748 INSERT INTO t10b SELECT * FROM t10; |
| 749 } |
| 750 count { |
| 751 SELECT a FROM t10b WHERE b GLOB '12*' ORDER BY +a; |
| 752 } |
| 753 } {12 123 scan 5 like 6} |
| 754 do_test like-10.11 { |
| 755 count { |
| 756 SELECT a FROM t10b WHERE c GLOB '12*' ORDER BY +a; |
| 757 } |
| 758 } {12 123 scan 5 like 6} |
| 759 do_test like-10.12 { |
| 760 count { |
| 761 SELECT a FROM t10b WHERE d GLOB '12*' ORDER BY +a; |
| 762 } |
| 763 } {12 123 scan 5 like 6} |
| 764 do_test like-10.13 { |
| 765 count { |
| 766 SELECT a FROM t10b WHERE e GLOB '12*' ORDER BY +a; |
| 767 } |
| 768 } {12 123 scan 5 like 6} |
| 769 do_test like-10.14 { |
| 770 count { |
| 771 SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY +a; |
| 772 } |
| 773 } {12 123 scan 3 like 0} |
| 774 do_test like-10.15 { |
| 775 count { |
| 776 SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY +a; |
| 777 } |
| 778 } {12 123 scan 5 like 6} |
631 } | 779 } |
632 | 780 |
633 # Do an SQL statement. Append the search count to the end of the result. | 781 # LIKE and GLOB where the default collating sequence is not appropriate |
| 782 # but an index with the appropriate collating sequence exists. |
634 # | 783 # |
635 proc count sql { | 784 do_test like-11.0 { |
636 set ::sqlite_search_count 0 | |
637 set ::sqlite_like_count 0 | |
638 return [concat [execsql $sql] scan $::sqlite_search_count \ | |
639 like $::sqlite_like_count] | |
640 } | |
641 | |
642 # The LIKE and GLOB optimizations do not work on columns with | |
643 # affinity other than TEXT. | |
644 # Ticket #3901 | |
645 # | |
646 do_test like-10.1 { | |
647 db close | |
648 sqlite3 db test.db | |
649 execsql { | 785 execsql { |
650 CREATE TABLE t10( | 786 CREATE TABLE t11( |
651 a INTEGER PRIMARY KEY, | 787 a INTEGER PRIMARY KEY, |
652 b INTEGER COLLATE nocase UNIQUE, | 788 b TEXT COLLATE nocase, |
653 c NUMBER COLLATE nocase UNIQUE, | 789 c TEXT COLLATE binary |
654 d BLOB COLLATE nocase UNIQUE, | |
655 e COLLATE nocase UNIQUE, | |
656 f TEXT COLLATE nocase UNIQUE | |
657 ); | 790 ); |
658 INSERT INTO t10 VALUES(1,1,1,1,1,1); | 791 INSERT INTO t11 VALUES(1, 'a','a'); |
659 INSERT INTO t10 VALUES(12,12,12,12,12,12); | 792 INSERT INTO t11 VALUES(2, 'ab','ab'); |
660 INSERT INTO t10 VALUES(123,123,123,123,123,123); | 793 INSERT INTO t11 VALUES(3, 'abc','abc'); |
661 INSERT INTO t10 VALUES(234,234,234,234,234,234); | 794 INSERT INTO t11 VALUES(4, 'abcd','abcd'); |
662 INSERT INTO t10 VALUES(345,345,345,345,345,345); | 795 INSERT INTO t11 VALUES(5, 'A','A'); |
663 INSERT INTO t10 VALUES(45,45,45,45,45,45); | 796 INSERT INTO t11 VALUES(6, 'AB','AB'); |
| 797 INSERT INTO t11 VALUES(7, 'ABC','ABC'); |
| 798 INSERT INTO t11 VALUES(8, 'ABCD','ABCD'); |
| 799 INSERT INTO t11 VALUES(9, 'x','x'); |
| 800 INSERT INTO t11 VALUES(10, 'yz','yz'); |
| 801 INSERT INTO t11 VALUES(11, 'X','X'); |
| 802 INSERT INTO t11 VALUES(12, 'YZ','YZ'); |
| 803 SELECT count(*) FROM t11; |
664 } | 804 } |
665 count { | 805 } {12} |
666 SELECT a FROM t10 WHERE b LIKE '12%' ORDER BY a; | 806 do_test like-11.1 { |
| 807 queryplan { |
| 808 PRAGMA case_sensitive_like=OFF; |
| 809 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a; |
667 } | 810 } |
668 } {12 123 scan 5 like 6} | 811 } {abc abcd ABC ABCD nosort t11 *} |
669 do_test like-10.2 { | 812 do_test like-11.2 { |
670 count { | 813 queryplan { |
671 SELECT a FROM t10 WHERE c LIKE '12%' ORDER BY a; | 814 PRAGMA case_sensitive_like=ON; |
| 815 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a; |
672 } | 816 } |
673 } {12 123 scan 5 like 6} | 817 } {abc abcd nosort t11 *} |
674 do_test like-10.3 { | 818 do_test like-11.3 { |
675 count { | 819 queryplan { |
676 SELECT a FROM t10 WHERE d LIKE '12%' ORDER BY a; | 820 PRAGMA case_sensitive_like=OFF; |
| 821 CREATE INDEX t11b ON t11(b); |
| 822 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
677 } | 823 } |
678 } {12 123 scan 5 like 6} | 824 } {abc abcd ABC ABCD sort {} t11b} |
679 do_test like-10.4 { | 825 do_test like-11.4 { |
680 count { | 826 queryplan { |
681 SELECT a FROM t10 WHERE e LIKE '12%' ORDER BY a; | 827 PRAGMA case_sensitive_like=ON; |
| 828 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a; |
682 } | 829 } |
683 } {12 123 scan 5 like 6} | 830 } {abc abcd nosort t11 *} |
684 do_test like-10.5 { | 831 do_test like-11.5 { |
685 count { | 832 queryplan { |
686 SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY a; | 833 PRAGMA case_sensitive_like=OFF; |
| 834 DROP INDEX t11b; |
| 835 CREATE INDEX t11bnc ON t11(b COLLATE nocase); |
| 836 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
687 } | 837 } |
688 } {12 123 scan 3 like 0} | 838 } {abc abcd ABC ABCD sort {} t11bnc} |
689 do_test like-10.6 { | 839 do_test like-11.6 { |
690 count { | 840 queryplan { |
691 SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY a; | 841 CREATE INDEX t11bb ON t11(b COLLATE binary); |
| 842 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
692 } | 843 } |
693 } {12 123 scan 5 like 6} | 844 } {abc abcd ABC ABCD sort {} t11bnc} |
694 do_test like-10.10 { | 845 do_test like-11.7 { |
695 execsql { | 846 queryplan { |
696 CREATE TABLE t10b( | 847 PRAGMA case_sensitive_like=ON; |
697 a INTEGER PRIMARY KEY, | 848 SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
698 b INTEGER UNIQUE, | |
699 c NUMBER UNIQUE, | |
700 d BLOB UNIQUE, | |
701 e UNIQUE, | |
702 f TEXT UNIQUE | |
703 ); | |
704 INSERT INTO t10b SELECT * FROM t10; | |
705 } | 849 } |
706 count { | 850 } {abc abcd sort {} t11bb} |
707 SELECT a FROM t10b WHERE b GLOB '12*' ORDER BY a; | 851 do_test like-11.8 { |
| 852 queryplan { |
| 853 PRAGMA case_sensitive_like=OFF; |
| 854 SELECT b FROM t11 WHERE b GLOB 'abc*' ORDER BY +a; |
708 } | 855 } |
709 } {12 123 scan 5 like 6} | 856 } {abc abcd sort {} t11bb} |
710 do_test like-10.11 { | 857 do_test like-11.9 { |
711 count { | 858 queryplan { |
712 SELECT a FROM t10b WHERE c GLOB '12*' ORDER BY a; | 859 CREATE INDEX t11cnc ON t11(c COLLATE nocase); |
| 860 CREATE INDEX t11cb ON t11(c COLLATE binary); |
| 861 SELECT c FROM t11 WHERE c LIKE 'abc%' ORDER BY +a; |
713 } | 862 } |
714 } {12 123 scan 5 like 6} | 863 } {abc abcd ABC ABCD sort {} t11cnc} |
715 do_test like-10.12 { | 864 do_test like-11.10 { |
716 count { | 865 queryplan { |
717 SELECT a FROM t10b WHERE d GLOB '12*' ORDER BY a; | 866 SELECT c FROM t11 WHERE c GLOB 'abc*' ORDER BY +a; |
718 } | 867 } |
719 } {12 123 scan 5 like 6} | 868 } {abc abcd sort {} t11cb} |
720 do_test like-10.13 { | |
721 count { | |
722 SELECT a FROM t10b WHERE e GLOB '12*' ORDER BY a; | |
723 } | |
724 } {12 123 scan 5 like 6} | |
725 do_test like-10.14 { | |
726 count { | |
727 SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY a; | |
728 } | |
729 } {12 123 scan 3 like 0} | |
730 do_test like-10.15 { | |
731 count { | |
732 SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY a; | |
733 } | |
734 } {12 123 scan 5 like 6} | |
735 | 869 |
736 | 870 |
737 finish_test | 871 finish_test |
OLD | NEW |