github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/fts3sort.test (about)

     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