Annotation of embedaddon/sqlite3/test/fts3an.test, revision 1.1

1.1     ! misho       1: # 2007 April 26
        !             2: #
        !             3: # The author disclaims copyright to this source code.
        !             4: #
        !             5: #*************************************************************************
        !             6: # This file implements tests for prefix-searching in the fts3
        !             7: # component of the SQLite library.
        !             8: #
        !             9: # $Id: fts3an.test,v 1.2 2007/12/13 21:54:11 drh Exp $
        !            10: #
        !            11: 
        !            12: set testdir [file dirname $argv0]
        !            13: source $testdir/tester.tcl
        !            14: 
        !            15: # If SQLITE_ENABLE_FTS3 is defined, omit this file.
        !            16: ifcapable !fts3 {
        !            17:   finish_test
        !            18:   return
        !            19: }
        !            20: 
        !            21: # A large string to prime the pump with.
        !            22: set text {
        !            23:   Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas
        !            24:   iaculis mollis ipsum. Praesent rhoncus placerat justo. Duis non quam
        !            25:   sed turpis posuere placerat. Curabitur et lorem in lorem porttitor
        !            26:   aliquet. Pellentesque bibendum tincidunt diam. Vestibulum blandit
        !            27:   ante nec elit. In sapien diam, facilisis eget, dictum sed, viverra
        !            28:   at, felis. Vestibulum magna. Sed magna dolor, vestibulum rhoncus,
        !            29:   ornare vel, vulputate sit amet, felis. Integer malesuada, tellus at
        !            30:   luctus gravida, diam nunc porta nibh, nec imperdiet massa metus eu
        !            31:   lectus. Aliquam nisi. Nunc fringilla nulla at lectus. Suspendisse
        !            32:   potenti. Cum sociis natoque penatibus et magnis dis parturient
        !            33:   montes, nascetur ridiculus mus. Pellentesque odio nulla, feugiat eu,
        !            34:   suscipit nec, consequat quis, risus.
        !            35: }
        !            36: 
        !            37: db eval {
        !            38:   CREATE VIRTUAL TABLE t1 USING fts3(c);
        !            39: 
        !            40:   INSERT INTO t1(rowid, c) VALUES(1, $text);
        !            41:   INSERT INTO t1(rowid, c) VALUES(2, 'Another lovely row');
        !            42: }
        !            43: 
        !            44: # Exact match
        !            45: do_test fts3an-1.1 {
        !            46:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lorem'"
        !            47: } {1}
        !            48: 
        !            49: # And a prefix
        !            50: do_test fts3an-1.2 {
        !            51:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lore*'"
        !            52: } {1}
        !            53: 
        !            54: # Prefix includes exact match
        !            55: do_test fts3an-1.3 {
        !            56:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lorem*'"
        !            57: } {1}
        !            58: 
        !            59: # Make certain everything isn't considered a prefix!
        !            60: do_test fts3an-1.4 {
        !            61:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lore'"
        !            62: } {}
        !            63: 
        !            64: # Prefix across multiple rows.
        !            65: do_test fts3an-1.5 {
        !            66:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lo*'"
        !            67: } {1 2}
        !            68: 
        !            69: # Likewise, with multiple hits in one document.
        !            70: do_test fts3an-1.6 {
        !            71:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'l*'"
        !            72: } {1 2}
        !            73: 
        !            74: # Prefix which should only hit one document.
        !            75: do_test fts3an-1.7 {
        !            76:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lov*'"
        !            77: } {2}
        !            78: 
        !            79: # * not at end is dropped.
        !            80: do_test fts3an-1.8 {
        !            81:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH 'lo *'"
        !            82: } {}
        !            83: 
        !            84: # Stand-alone * is dropped.
        !            85: do_test fts3an-1.9 {
        !            86:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH '*'"
        !            87: } {}
        !            88: 
        !            89: # Phrase-query prefix.
        !            90: do_test fts3an-1.10 {
        !            91:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH '\"lovely r*\"'"
        !            92: } {2}
        !            93: do_test fts3an-1.11 {
        !            94:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH '\"lovely r\"'"
        !            95: } {}
        !            96: 
        !            97: # Phrase query with multiple prefix matches.
        !            98: do_test fts3an-1.12 {
        !            99:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH '\"a* l*\"'"
        !           100: } {1 2}
        !           101: 
        !           102: # Phrase query with multiple prefix matches.
        !           103: do_test fts3an-1.13 {
        !           104:   execsql "SELECT rowid FROM t1 WHERE t1 MATCH '\"a* l* row\"'"
        !           105: } {2}
        !           106: 
        !           107: 
        !           108: 
        !           109: 
        !           110: # Test across updates (and, by implication, deletes).
        !           111: 
        !           112: # Version of text without "lorem".
        !           113: regsub -all {[Ll]orem} $text '' ntext
        !           114: 
        !           115: db eval {
        !           116:   CREATE VIRTUAL TABLE t2 USING fts3(c);
        !           117: 
        !           118:   INSERT INTO t2(rowid, c) VALUES(1, $text);
        !           119:   INSERT INTO t2(rowid, c) VALUES(2, 'Another lovely row');
        !           120:   UPDATE t2 SET c = $ntext WHERE rowid = 1;
        !           121: }
        !           122: 
        !           123: # Can't see lorem as an exact match.
        !           124: do_test fts3an-2.1 {
        !           125:   execsql "SELECT rowid FROM t2 WHERE t2 MATCH 'lorem'"
        !           126: } {}
        !           127: 
        !           128: # Can't see a prefix of lorem, either.
        !           129: do_test fts3an-2.2 {
        !           130:   execsql "SELECT rowid FROM t2 WHERE t2 MATCH 'lore*'"
        !           131: } {}
        !           132: 
        !           133: # Can see lovely in the other document.
        !           134: do_test fts3an-2.3 {
        !           135:   execsql "SELECT rowid FROM t2 WHERE t2 MATCH 'lo*'"
        !           136: } {2}
        !           137: 
        !           138: # Can still see other hits.
        !           139: do_test fts3an-2.4 {
        !           140:   execsql "SELECT rowid FROM t2 WHERE t2 MATCH 'l*'"
        !           141: } {1 2}
        !           142: 
        !           143: # Prefix which should only hit one document.
        !           144: do_test fts3an-2.5 {
        !           145:   execsql "SELECT rowid FROM t2 WHERE t2 MATCH 'lov*'"
        !           146: } {2}
        !           147: 
        !           148: 
        !           149: 
        !           150: # Test with a segment which will have multiple levels in the tree.
        !           151: 
        !           152: # Build a big document with lots of unique terms.
        !           153: set bigtext $text
        !           154: foreach c {a b c d e} {
        !           155:   regsub -all {[A-Za-z]+} $bigtext "&$c" t
        !           156:   append bigtext $t
        !           157: }
        !           158: 
        !           159: # Populate a table with many copies of the big document, so that we
        !           160: # can test the number of hits found.  Populate $ret with the expected
        !           161: # hit counts for each row.  offsets() returns 4 elements for every
        !           162: # hit.  We'll have 6 hits for row 1, 1 for row 2, and 6*(2^5)==192 for
        !           163: # $bigtext.
        !           164: set ret {6 1}
        !           165: db eval {
        !           166:   BEGIN;
        !           167:   CREATE VIRTUAL TABLE t3 USING fts3(c);
        !           168: 
        !           169:   INSERT INTO t3(rowid, c) VALUES(1, $text);
        !           170:   INSERT INTO t3(rowid, c) VALUES(2, 'Another lovely row');
        !           171: }
        !           172: for {set i 0} {$i<68} {incr i} {
        !           173:   db eval {INSERT INTO t3(rowid, c) VALUES(3+$i, $bigtext)}
        !           174:   lappend ret 192
        !           175: }
        !           176: db eval {COMMIT;}
        !           177: 
        !           178: # Test that we get the expected number of hits.
        !           179: do_test fts3an-3.1 {
        !           180:   set t {}
        !           181:   db eval {SELECT offsets(t3) as o FROM t3 WHERE t3 MATCH 'l*'} {
        !           182:     set l [llength $o]
        !           183:     lappend t [expr {$l/4}]
        !           184:   }
        !           185:   set t
        !           186: } $ret
        !           187: 
        !           188: # Test a boundary condition: More than 2^16 terms that match a searched for
        !           189: # prefix in a single segment.
        !           190: #
        !           191: puts "This next test can take a little while (~ 30 seconds)..."
        !           192: do_test fts3an-4.1 {
        !           193:   execsql { CREATE VIRTUAL TABLE ft USING fts3(x) }
        !           194:   execsql BEGIN
        !           195:     execsql { INSERT INTO ft VALUES(NULL) }
        !           196:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#      2
        !           197:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#      4
        !           198:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#      8
        !           199:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#     16
        !           200:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#     32
        !           201:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#     64
        !           202:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#    128
        !           203:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#    256
        !           204:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#    512
        !           205:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#   1024
        !           206:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#   2048
        !           207:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#   4096
        !           208:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#   8192
        !           209:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#  16384
        !           210:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#  32768
        !           211:     execsql { INSERT INTO ft SELECT * FROM ft }     ;#  65536
        !           212:     execsql { INSERT INTO ft SELECT * FROM ft }     ;# 131072
        !           213:   execsql COMMIT
        !           214:   execsql { UPDATE ft SET x = 'abc' || rowid }
        !           215:   execsql { SELECT count(*) FROM ft WHERE x MATCH 'abc*' }
        !           216: } {131072}
        !           217: 
        !           218: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>