Annotation of embedaddon/sqlite3/test/fts3sort.test, revision 1.1.1.1

1.1       misho       1: # 2011 May 04
                      2: #
                      3: # The author disclaims copyright to this source code.  In place of
                      4: # a legal notice, here is a blessing:
                      5: #
                      6: #    May you do good and not evil.
                      7: #    May you find forgiveness for yourself and forgive others.
                      8: #    May you share freely, never taking more than you give.
                      9: #
                     10: #*************************************************************************
                     11: # This file implements regression tests for SQLite library.  The
                     12: # focus of this script is testing the FTS3 module.
                     13: #
                     14: 
                     15: set testdir [file dirname $argv0]
                     16: source $testdir/tester.tcl
                     17: 
                     18: # If SQLITE_ENABLE_FTS3 is defined, omit this file.
                     19: ifcapable !fts3 {
                     20:   finish_test
                     21:   return
                     22: }
                     23: 
                     24: 
                     25: proc build_database {nRow param} {
                     26:   db close
                     27:   forcedelete test.db
                     28:   sqlite3 db test.db
                     29: 
                     30:   set vocab [list    aa ab ac   ba bb bc    ca cb cc   da]
                     31:   expr srand(0)
                     32: 
                     33:   execsql "CREATE VIRTUAL TABLE t1 USING fts4($param)"
                     34:   for {set i 0} {$i < $nRow} {incr i} {
                     35:     set v [expr int(rand()*1000000)]
                     36:     set doc [list]
                     37:     for {set div 1} {$div < 1000000} {set div [expr $div*10]} {
                     38:       lappend doc [lindex $vocab [expr ($v/$div) % 10]]
                     39:     }
                     40:     execsql { INSERT INTO t1 VALUES($doc) }
                     41:   }
                     42: }
                     43: 
                     44: set testprefix fts3sort
                     45: 
                     46: unset -nocomplain CONTROL
                     47: foreach {t param} {
                     48:   1     ""
                     49:   2     "order=asc"
                     50:   3     "order=desc"
                     51: } {
                     52: 
                     53:   set testprefix fts3sort-1.$t
                     54: 
                     55:   set nRow 1000
                     56:   do_test 1.0 {
                     57:     build_database $nRow $param
                     58:     execsql { SELECT count(*) FROM t1 }
                     59:   } $nRow
                     60:   
                     61:   foreach {tn query} {
                     62:   1   "SELECT docid, * FROM t1"
                     63:   2   "SELECT docid, * FROM t1 WHERE t1 MATCH 'aa'"
                     64:   3   "SELECT docid, * FROM t1 WHERE t1 MATCH 'a*'"
                     65:   4   "SELECT docid, quote(matchinfo(t1)) FROM t1 WHERE t1 MATCH 'a*'"
                     66:   5   "SELECT docid, quote(matchinfo(t1,'pcnxals')) FROM t1 WHERE t1 MATCH 'b*'"
                     67:   6   "SELECT docid, * FROM t1 WHERE t1 MATCH 'a* b* c*'"
                     68:   7   "SELECT docid, * FROM t1 WHERE t1 MATCH 'aa OR da'"
                     69:   8   "SELECT docid, * FROM t1 WHERE t1 MATCH 'nosuchtoken'"
                     70:   9   "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH 'aa OR da'"
                     71:   10  "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH 'aa OR nosuchtoken'"
                     72:   11  "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH 'aa NEAR bb'"
                     73:   12  "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH '\"aa bb\"'"
                     74:   13  "SELECT docid, content FROM t1 WHERE t1 MATCH 'aa NEAR/2 bb NEAR/3 cc'"
                     75:   14  "SELECT docid, content FROM t1 WHERE t1 MATCH '\"aa bb cc\"'"
                     76:   } {
                     77:   
                     78:     unset -nocomplain A B C D
                     79:     set A_list [list]
                     80:     set B_list [list]
                     81:     set C_list [list]
                     82:     set D_list [list]
                     83:   
                     84:     unset -nocomplain X
                     85:     db eval "$query ORDER BY rowid ASC"  X  { 
                     86:       set A($X(docid)) [array get X] 
                     87:       lappend A_list $X(docid)
                     88:     }
                     89:     unset -nocomplain X
                     90:     db eval "$query ORDER BY rowid DESC" X  { 
                     91:       set B($X(docid)) [array get X] 
                     92:       lappend B_list $X(docid)
                     93:     }
                     94:     unset -nocomplain X
                     95:     db eval "$query ORDER BY docid ASC"  X  { 
                     96:       set C($X(docid)) [array get X] 
                     97:       lappend C_list $X(docid)
                     98:     }
                     99:     unset -nocomplain X
                    100:     db eval "$query ORDER BY docid DESC" X  { 
                    101:       set D($X(docid)) [array get X] 
                    102:       lappend D_list $X(docid)
                    103:     }
                    104:   
                    105:     do_test $tn.1 { set A_list } [lsort -integer -increasing $A_list]
                    106:     do_test $tn.2 { set B_list } [lsort -integer -decreasing $B_list]
                    107:     do_test $tn.3 { set C_list } [lsort -integer -increasing $C_list]
                    108:     do_test $tn.4 { set D_list } [lsort -integer -decreasing $D_list]
                    109:   
                    110:     unset -nocomplain DATA
                    111:     unset -nocomplain X
                    112:     db eval "$query" X  { 
                    113:       set DATA($X(docid)) [array get X] 
                    114:     }
                    115:   
                    116:     do_test $tn.5 { lsort [array get A] } [lsort [array get DATA]]
                    117:     do_test $tn.6 { lsort [array get B] } [lsort [array get DATA]]
                    118:     do_test $tn.7 { lsort [array get C] } [lsort [array get DATA]]
                    119:     do_test $tn.8 { lsort [array get D] } [lsort [array get DATA]]
                    120: 
                    121:     if {[info exists CONTROL($tn)]} {
                    122:       do_test $tn.9 { set CONTROL($tn) } [lsort [array get DATA]]
                    123:     } else {
                    124:       set CONTROL($tn) [lsort [array get DATA]]
                    125:     }
                    126:   }
                    127: }
                    128: unset -nocomplain CONTROL
                    129: 
                    130: set testprefix fts3sort
                    131: 
                    132: #-------------------------------------------------------------------------
                    133: # Tests for parsing the "order=asc" and "order=desc" directives.
                    134: #
                    135: foreach {tn param res} {
                    136:   1 "order=asc"             {0 {}}
                    137:   2 "order=desc"            {0 {}}
                    138:   3 "order=dec"             {1 {unrecognized order: dec}}
                    139:   4 "order=xxx, order=asc"  {1 {unrecognized order: xxx}}
                    140:   5 "order=desc, order=asc" {0 {}}
                    141:   6 "order=xxxx, order=asc" {1 {unrecognized order: xxxx}}
                    142:   7 "order=desk"            {1 {unrecognized order: desk}}
                    143: } {
                    144:   execsql { DROP TABLE IF EXISTS t1 }
                    145:   do_catchsql_test 2.1.$tn "
                    146:     CREATE VIRTUAL TABLE t1 USING fts4(a, b, $param)
                    147:   " $res
                    148: }
                    149: 
                    150: do_execsql_test 2.2 {
                    151:   BEGIN;
                    152:     CREATE VIRTUAL TABLE t2 USING fts4(order=desc);
                    153:     INSERT INTO t2 VALUES('aa bb');
                    154:     INSERT INTO t2 VALUES('bb cc');
                    155:     INSERT INTO t2 VALUES('cc aa');
                    156:     SELECT docid FROM t2 WHERE t2 MATCH 'aa';
                    157:   END;
                    158: } {3 1}
                    159: do_execsql_test 2.3 {
                    160:   SELECT docid FROM t2 WHERE t2 MATCH 'aa';
                    161: } {3 1}
                    162: do_execsql_test 2.4 {
                    163:   SELECT docid FROM t2 WHERE t2 MATCH 'aa' ORDER BY content;
                    164: } {1 3}
                    165: 
                    166: #-------------------------------------------------------------------------
                    167: # Test that ticket [56be976859] has been fixed.
                    168: #
                    169: do_execsql_test 3.1 {
                    170:   CREATE VIRTUAL TABLE t3 USING fts4(x, order=DESC);
                    171:   INSERT INTO t3(docid, x) VALUES(113382409004785664, 'aa');
                    172:   INSERT INTO t3(docid, x) VALUES(1, 'ab');
                    173:   SELECT rowid FROM t3 WHERE x MATCH 'a*' ORDER BY docid DESC;
                    174: } {113382409004785664 1}
                    175: do_execsql_test 3.2 {
                    176:   CREATE VIRTUAL TABLE t4 USING fts4(x);
                    177:   INSERT INTO t4(docid, x) VALUES(-113382409004785664, 'aa');
                    178:   INSERT INTO t4(docid, x) VALUES(1, 'ab');
                    179:   SELECT rowid FROM t4 WHERE x MATCH 'a*';
                    180: } {-113382409004785664 1}
                    181: 
                    182: 
                    183: 
                    184: finish_test
                    185: 

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