gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/fts4aa.test (about)

     1  # 2010 February 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  # This file implements regression tests for SQLite library.  The
    12  # focus of this script is testing the FTS4 module.
    13  #
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  
    19  # If SQLITE_ENABLE_FTS3 is defined, omit this file.
    20  ifcapable !fts3 {
    21    finish_test
    22    return
    23  }
    24  
    25  # Create the fts_kjv_genesis procedure which fills and FTS3/4 table with
    26  # the complete text of the Book of Genesis.
    27  #
    28  source $testdir/genesis.tcl
    29  
    30  # The following is a list of queries to perform against the above
    31  # FTS3/FTS4 database.  We will be trying these queries in various
    32  # configurations to ensure that they always return the same answers.
    33  #
    34  set fts4aa_queries {
    35    {abraham}
    36    {the king}
    37    {"the king"}
    38    {abraham OR joseph}
    39    {ab* OR jos*}
    40    {lived t*}
    41    {spake hebrew}
    42    {melchizedek}
    43    {t* melchizedek}
    44    {melchizedek t*}
    45  }
    46  unset -nocomplain fts4aa_res
    47  
    48  # Set up the baseline results
    49  #
    50  do_test fts4aa-1.0 {
    51    db eval {
    52      CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter);
    53    }
    54    fts_kjv_genesis
    55    foreach q $::fts4aa_queries {
    56      set r [db eval {SELECT docid FROM t1 WHERE words MATCH $q ORDER BY docid}]
    57      set ::fts4aa_res($q) $r
    58    }
    59  } {}
    60  
    61  # Legacy test cases
    62  #
    63  do_test fts4aa-1.1 {
    64    db eval {
    65      SELECT docid FROM t1 EXCEPT SELECT docid FROM t1_docsize
    66    }
    67  } {}
    68  do_test fts4aa-1.2 {
    69    db eval {
    70      SELECT docid FROM t1_docsize EXCEPT SELECT docid FROM t1
    71    }
    72  } {}
    73  
    74  proc mit {blob} {
    75    set scan(littleEndian) i*
    76    set scan(bigEndian) I*
    77    binary scan $blob $scan($::tcl_platform(byteOrder)) r
    78    return $r
    79  }
    80  db func mit mit
    81  
    82  do_test fts4aa-1.3 {
    83    db eval {
    84      SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1 WHERE t1 MATCH 'melchizedek';
    85    }
    86  } {1014018 {1 1 1 1 1 1533 25 20}}
    87  do_test fts4aa-1.4 {
    88    db eval {
    89      SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1
    90       WHERE t1 MATCH 'spake hebrew'
    91       ORDER BY docid;
    92    }
    93  } {1039014 {2 1 1 40 40 1 6 6 1533 25 42} 1039017 {2 1 1 40 40 1 6 6 1533 25 26}}
    94  do_test fts4aa-1.5 {
    95    db eval {
    96      SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1
    97       WHERE t1 MATCH 'laban overtook jacob'
    98       ORDER BY docid;
    99    }
   100  } {1031025 {3 1 2 54 46 1 3 3 2 181 160 1533 25 24}}
   101  
   102  do_test fts4aa-1.6 {
   103    db eval {
   104      DELETE FROM t1 WHERE docid!=1050026;
   105      SELECT hex(size) FROM t1_docsize;
   106      SELECT hex(value) FROM t1_stat;
   107    }
   108  } {17 01176F}
   109  
   110  do_test fts4aa-1.7 {
   111    db eval {
   112      SELECT docid FROM t1 EXCEPT SELECT docid FROM t1_docsize
   113    }
   114  } {}
   115  do_test fts4aa-1.8 {
   116    db eval {
   117      SELECT docid FROM t1_docsize EXCEPT SELECT docid FROM t1
   118    }
   119  } {}
   120  ifcapable fts4_deferred {
   121    do_test fts4aa-1.9 {
   122      # Note: Token 'in' is being deferred in the following query. 
   123      db eval {
   124        SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1
   125         WHERE t1 MATCH 'joseph died in egypt'
   126         ORDER BY docid;
   127      }
   128    } {1050026 {4 1 1 1 1 1 1 1 2 1 1 1 1 1 1 23 23}}
   129  }
   130  
   131  # Should get the same search results from FTS3
   132  #
   133  do_test fts4aa-2.0 {
   134    db eval {
   135      DROP TABLE t1;
   136      CREATE VIRTUAL TABLE t1 USING fts3(words, tokenize porter);
   137    }
   138    fts_kjv_genesis
   139  } {}
   140  unset -nocomplain ii
   141  set ii 0
   142  foreach {q r} [array get fts4aa_res] {
   143    incr ii
   144    do_test fts4aa-2.$ii {
   145      db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid}
   146    } $r
   147  }
   148  
   149  # Should get the same search results when the page size is very large
   150  #
   151  do_test fts4aa-3.0 {
   152    db close
   153    forcedelete test.db
   154    sqlite3 db test.db
   155    db eval {
   156      PRAGMA page_size=65536;
   157      CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter);
   158    }
   159    fts_kjv_genesis
   160  } {}
   161  unset -nocomplain ii
   162  set ii 0
   163  foreach {q r} [array get fts4aa_res] {
   164    incr ii
   165    do_test fts4aa-3.$ii {
   166      db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid}
   167    } $r
   168  }
   169  
   170  # Should get the same search results when an authorizer prevents
   171  # all PRAGMA statements.
   172  #
   173  proc no_pragma_auth {code arg1 arg2 arg3 arg4 args} {
   174    if {$code=="SQLITE_PRAGMA"} {return SQLITE_DENY}
   175    return SQLITE_OK;
   176  }
   177  do_test fts4aa-4.0 {
   178    db auth ::no_pragma_auth
   179    db eval {
   180      DROP TABLE t1;
   181      CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter);
   182    }
   183    fts_kjv_genesis
   184  } {}
   185  unset -nocomplain ii
   186  set ii 0
   187  foreach {q r} [array get fts4aa_res] {
   188    incr ii
   189    do_test fts4aa-4.$ii {
   190      db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid}
   191    } $r
   192  }
   193  
   194  # 2019-11-16 https://bugs.chromium.org/p/chromium/issues/detail?id=1025472
   195  #
   196  db close
   197  sqlite3 db :memory:
   198  do_execsql_test fts4aa-5.10 {
   199    CREATE VIRTUAL TABLE t1 USING fts4(a, b, c, d, e,f,g,h,i,j,k,l,m,n,o,p,q,r);
   200    INSERT INTO t1 VALUES('X Y', '2', '3', '4', '5', '6', '7', '8', '9', '0',
   201                          'a','b','c','d','e','f','g','h');
   202    UPDATE t1_docsize SET size=x'88' WHERE docid=1;
   203  } {}
   204  do_catchsql_test fts4aa-5.20 {
   205    SELECT quote(matchinfo(t1, 'l')) FROM t1 WHERE t1 MATCH 'X Y';
   206  } {1 {database disk image is malformed}}
   207  do_execsql_test fts4aa-5.30 {
   208    DROP TABLE t1;
   209    CREATE VIRTUAL TABLE t1 USING fts4(a,b,c,d);
   210    INSERT INTO t1 VALUES('one two','three four','five six','seven eight');
   211  } {}
   212  do_catchsql_test fts4aa-5.40 {
   213    UPDATE t1_stat SET value=x'01010101' WHERE id=0;
   214    SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
   215  } {1 {database disk image is malformed}}
   216  do_catchsql_test fts4aa-5.50 {
   217    UPDATE t1_stat SET value=x'010101' WHERE id=0;
   218    SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
   219  } {1 {database disk image is malformed}}
   220  do_catchsql_test fts4aa-5.60 {
   221    UPDATE t1_stat SET value=x'01' WHERE id=0;
   222    SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
   223  } {1 {database disk image is malformed}}
   224  do_catchsql_test fts4aa-5.70 {
   225    UPDATE t1_stat SET value=x'' WHERE id=0;
   226    SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
   227  } {1 {database disk image is malformed}}
   228  
   229  # 2019-11-18 https://bugs.chromium.org/p/chromium/issues/detail?id=1025467
   230  db close
   231  sqlite3 db :memory:
   232  if {$tcl_platform(byteOrder)=="littleEndian"} {
   233    set res {X'0200000000000000000000000E0000000E00000001000000010000000100000001000000'}
   234  } else {
   235    set res {X'0000000200000000000000000000000E0000000E00000001000000010000000100000001'}
   236  }
   237  do_catchsql_test fts4aa-6.10 {
   238    CREATE VIRTUAL TABLE f USING fts4();
   239    INSERT INTO f_segdir VALUES (77,91,0,0,'255 77',x'0001308000004d5c4ddddddd4d4d7b4d4d4d614d8019ff4d05000001204d4d2e4d6e4d4d4d4b4d6c4d004d4d4d4d4d4d3d000000004d5d4d4d645d4d004d4d4d4d4d4d4d4d4d454d6910004d05ffff054d646c4d004d5d4d4d4d4d3d000000004d4d4d4d4d4d4d4d4d4d4d69624d4d4d04004d4d4d4d4d604d4ce1404d554d45');
   240    INSERT INTO f_segdir VALUES (77,108,0,0,'255 77',x'0001310000fa64004d4d4d3c5d4d654d4d4d614d8000ff4d05000001204d4d2e4d6e4d4d4dff4d4d4d4d4d4d00104d4d4d4d000000004d4d4d0400311d4d4d4d4d4d4d4d4d4d684d6910004d05ffff054d4d6c4d004d4d4d4d4d4d3d000000004d4d4d4d644d4d4d4d4d4d69624d4d4d03ed4d4d4d4d4d604d4ce1404d550080');
   241    INSERT INTO f_stat VALUES (0,x'80808080100000000064004d4d4d3c4d4d654d4d4d614d8000ff4df6ff1a00204d4d2e4d6e4d4d4d104d4d4d4d4d4d00104d4d4d4d4d4d69574d4d4d000031044d4d4d3e4d4d4c4d05004d6910');
   242    SELECT quote(matchinfo(f,'pnax')) from f where f match '0 1';
   243  } {1 {database disk image is malformed}}
   244  
   245  # 2019-11-18 Detect infinite loop in fts3SelectLeaf()
   246  db close
   247  sqlite3 db :memory:
   248  do_catchsql_test fts4aa-7.10 {
   249    CREATE VIRTUAL TABLE f USING fts4();
   250    INSERT INTO f_segdir VALUES (63,60,60,60,'60 60',x'3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c483c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c20003c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c283c3c3c3c3c3c3c3c3c3c3c223c3c3c3c3c3c3c3c3c');
   251    INSERT INTO f_segments VALUES (60,x'3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c5a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c5e3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c803c3c3c3c3c3c233c3c3c3c1c3c3c3c3c3c3c3c3c3c3c3c1b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c273c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1a3c3c3c3c3c3c000200003c3c3c3c3c3c3c3c3c3c3c3c3c383c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d898d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d3c3c3c3c3c3c3c3c3c3cba3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c00023c3c3c3c3c3c383c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cbc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2c3c3c3c403c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c16161616161616163c3c3c3c3c3c3c3c3c3c3c3c3c583c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1c013c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c20003c3c3c3c3c3c3c3c3c3c3c800000003c3c3c3c3c3c3c2c3c3c3c3c3c3c353c08080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808f4080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808083c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c323c3c3c3c3c3c3c3c3c3c3c4f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cfcfcfcfcfcfcfcfcfcfcfc10fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfd02fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc03e8fcfcfcfc3c3c3c3c3c3c8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c553c3c3c3c3c3c3c3c3c3c3c3c3c573c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c000000803c3c4dd5d5a6d52cf3d5d5d5d5d5d5d5d5d5d5d5d5d5d53c3c3c3c3f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c013c3c3c3c00643c3c3c3ce93c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c263c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c363c3c3c3c3c3c3c3c3c3c3c3c3c3c543c3c3c3c3c3c3c3c3c3c273c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c330000003c3c3c3c3c3c3c3c3c3c3c3c3c3c4d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c000010003c3c3c3c3c3c413c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c403c3c3c3c3c3c3c3c3c3c3c3cec0000fa3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c4c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c5e3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c593c3c3c3c3c3c243c3c373c3c3c3c3cff3c3c3c3c3c3c3c3c3c3c3c3c3c000080003c3c3c3c3c3c3c3c3c3c353c3c3c3c3c3d3c3c3c3c3c3c3c3c3c3c3c3c4d3c3c3c3c3c3c3c3c3c3c3c3c3c40003c3c3c3c3c293c3c3c3c3c3c3c3c3c3d3c3c3c3c3c3c3c3c353c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c4f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cff7f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ca43c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cbf3c3c3c3c3c3c3c3c3c008000003c3c3c3c3c3c3c3c343c3c373c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c593c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c');
   252    SELECT * from f where f match '0';
   253  } {1 {database disk image is malformed}}
   254  
   255  
   256  finish_test