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

     1  # 2010 November 02
     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  #
    12  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  
    16  # If SQLITE_ENABLE_FTS3 is not defined, omit this file.
    17  ifcapable !fts3 { finish_test ; return }
    18  
    19  set testprefix fts3offsets
    20  set sqlite_fts3_enable_parentheses 1
    21  
    22  proc extract {offsets text} {
    23    set res ""
    24  
    25    set off [list]
    26    foreach {t i s n} $offsets {
    27      lappend off [list $s $n]
    28    }
    29    set off [lsort -integer -index 0 $off]
    30  
    31    set iOff 0
    32    foreach e $off {
    33      foreach {s n} $e {}
    34      append res [string range $text $iOff $s-1]
    35      append res "("
    36      append res [string range $text $s [expr $s+$n-1]]
    37      append res ")"
    38      set iOff [expr $s+$n]
    39    }
    40    append res [string range $text $iOff end]
    41    
    42    set res
    43  }
    44  db func extract extract
    45  
    46  
    47  do_execsql_test 1.1.0 {
    48    CREATE VIRTUAL TABLE xx USING fts3(x);
    49    INSERT INTO xx VALUES('A x x x B C x x');
    50    INSERT INTO xx VALUES('A B C x B x x C');
    51    INSERT INTO xx VALUES('A x x B C x x x');
    52  }
    53  do_execsql_test 1.1.1 {
    54    SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)';
    55  } {
    56    1 {(A) x x x (B) (C) x x} 
    57    2 {(A) (B) (C) x (B) x x C} 
    58    3 {(A) x x (B) (C) x x x}
    59  }
    60  
    61  do_execsql_test 1.2 {
    62    DELETE FROM xx;
    63    INSERT INTO xx VALUES('A x x x B C x x');
    64    INSERT INTO xx VALUES('A x x C x x x C');
    65    INSERT INTO xx VALUES('A x x B C x x x');
    66  }
    67  do_execsql_test 1.2.1 {
    68    SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)';
    69  } {
    70    1 {(A) x x x (B) (C) x x}
    71    2 {(A) x x C x x x C} 
    72    3 {(A) x x (B) (C) x x x}
    73  }
    74  
    75  do_execsql_test 1.3 {
    76    DELETE FROM xx;
    77    INSERT INTO xx(rowid, x) VALUES(1, 'A B C');
    78    INSERT INTO xx(rowid, x) VALUES(2, 'A x');
    79    INSERT INTO xx(rowid, x) VALUES(3, 'A B C');
    80    INSERT INTO xx(rowid, x) VALUES(4, 'A B C x x x x x x x B');
    81    INSERT INTO xx(rowid, x) VALUES(5, 'A x x x x x x x x x C');
    82    INSERT INTO xx(rowid, x) VALUES(6, 'A x x x x x x x x x x x B');
    83    INSERT INTO xx(rowid, x) VALUES(7, 'A B C');
    84  }
    85  do_execsql_test 1.3.1 {
    86    SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)';
    87  } {
    88    1 {(A) (B) (C)}
    89    2 {(A) x}
    90    3 {(A) (B) (C)}
    91    4 {(A) (B) (C) x x x x x x x B}
    92    5 {(A) x x x x x x x x x C}
    93    6 {(A) x x x x x x x x x x x B} 
    94    7 {(A) (B) (C)}
    95  }
    96  
    97  
    98  do_execsql_test 1.4 {
    99    DELETE FROM xx;
   100    INSERT INTO xx(rowid, x) VALUES(7, 'A B C');
   101    INSERT INTO xx(rowid, x) VALUES(6, 'A x');
   102    INSERT INTO xx(rowid, x) VALUES(5, 'A B C');
   103    INSERT INTO xx(rowid, x) VALUES(4, 'A B C x x x x x x x B');
   104    INSERT INTO xx(rowid, x) VALUES(3, 'A x x x x x x x x x C');
   105    INSERT INTO xx(rowid, x) VALUES(2, 'A x x x x x x x x x x x B');
   106    INSERT INTO xx(rowid, x) VALUES(1, 'A B C');
   107  }
   108  do_execsql_test 1.4.1 {
   109    SELECT oid,extract(offsets(xx), x) FROM xx WHERE xx MATCH 'a OR (b NEAR/1 c)'
   110    ORDER BY docid DESC;
   111  } {
   112    7 {(A) (B) (C)}
   113    6 {(A) x}
   114    5 {(A) (B) (C)}
   115    4 {(A) (B) (C) x x x x x x x B}
   116    3 {(A) x x x x x x x x x C}
   117    2 {(A) x x x x x x x x x x x B} 
   118    1 {(A) (B) (C)}
   119  }
   120  
   121  
   122  set sqlite_fts3_enable_parentheses 0
   123  finish_test