153 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 2015 April 28
 | |
| #
 | |
| # The author disclaims copyright to this source code.  In place of
 | |
| # a legal notice, here is a blessing:
 | |
| #
 | |
| #    May you do good and not evil.
 | |
| #    May you find forgiveness for yourself and forgive others.
 | |
| #    May you share freely, never taking more than you give.
 | |
| #
 | |
| #***********************************************************************
 | |
| #
 | |
| # This file focuses on testing the planner (xBestIndex function).
 | |
| #
 | |
| 
 | |
| source [file join [file dirname [info script]] fts5_common.tcl]
 | |
| set testprefix fts5restart
 | |
| 
 | |
| # If SQLITE_ENABLE_FTS5 is defined, omit this file.
 | |
| ifcapable !fts5 {
 | |
|   finish_test
 | |
|   return
 | |
| }
 | |
| 
 | |
| do_execsql_test 1.0 {
 | |
|   CREATE VIRTUAL TABLE f1 USING fts5(ff);
 | |
| }
 | |
| 
 | |
| #-------------------------------------------------------------------------
 | |
| # Run the 'optimize' command. Check that it does not disturb ongoing
 | |
| # full-text queries.
 | |
| #
 | |
| do_test 1.1 {
 | |
|   for {set i 1} {$i < 1000} {incr i} {
 | |
|     execsql { INSERT INTO f1 VALUES('a b c d e') }
 | |
|     lappend lRowid $i
 | |
|   }
 | |
| } {}
 | |
| 
 | |
| do_execsql_test 1.2 {
 | |
|   SELECT rowid FROM f1 WHERE f1 MATCH 'c';
 | |
| } $lRowid
 | |
| 
 | |
| do_test 1.3 {
 | |
|   set res [list]
 | |
|   db eval { SELECT rowid FROM f1 WHERE f1 MATCH 'c' } {
 | |
|     if {$rowid == 100} {
 | |
|       execsql { INSERT INTO f1(f1) VALUES('optimize') }
 | |
|     }
 | |
|     lappend res $rowid
 | |
|   }
 | |
|   set res
 | |
| } $lRowid
 | |
| 
 | |
| do_test 1.4.1 {
 | |
|   sqlite3 db2 test.db
 | |
|   set res [list]
 | |
|   db2 eval { SELECT rowid FROM f1 WHERE f1 MATCH 'c' } {
 | |
|     if {$rowid == 100} {
 | |
|       set cres [catchsql { INSERT INTO f1(f1) VALUES('optimize') }]
 | |
|     }
 | |
|     lappend res $rowid
 | |
|   }
 | |
|   set res
 | |
| } $lRowid
 | |
| 
 | |
| do_test 1.4.2 {
 | |
|   db2 close
 | |
|   set cres
 | |
| } {1 {database is locked}}
 | |
| 
 | |
| #-------------------------------------------------------------------------
 | |
| # Open a couple of cursors. Then close them in the same order.
 | |
| #
 | |
| do_test 2.1 {
 | |
|   set ::s1 [sqlite3_prepare db "SELECT rowid FROM f1 WHERE f1 MATCH 'b'" -1 X]
 | |
|   set ::s2 [sqlite3_prepare db "SELECT rowid FROM f1 WHERE f1 MATCH 'c'" -1 X]
 | |
| 
 | |
|   sqlite3_step $::s1
 | |
| } {SQLITE_ROW}
 | |
| do_test 2.2 {
 | |
|   sqlite3_step $::s2
 | |
| } {SQLITE_ROW}
 | |
| 
 | |
| do_test 2.1 {
 | |
|   sqlite3_finalize $::s1
 | |
|   sqlite3_finalize $::s2
 | |
| } {SQLITE_OK}
 | |
| 
 | |
| #-------------------------------------------------------------------------
 | |
| # Copy data between two FTS5 tables.
 | |
| #
 | |
| do_execsql_test 3.1 {
 | |
|   CREATE VIRTUAL TABLE f2 USING fts5(gg);
 | |
|   INSERT INTO f2 SELECT ff FROM f1 WHERE f1 MATCH 'b+c+d';
 | |
| }
 | |
| do_execsql_test 3.2 {
 | |
|   SELECT rowid FROM f2 WHERE f2 MATCH 'a+b+c+d+e'
 | |
| } $lRowid
 | |
| 
 | |
| #-------------------------------------------------------------------------
 | |
| # Remove the row that an FTS5 cursor is currently pointing to. And 
 | |
| # various other similar things. Check that this does not disturb 
 | |
| # ongoing scans.
 | |
| #
 | |
| do_execsql_test 4.0 {
 | |
|   CREATE VIRTUAL TABLE n4 USING fts5(n);
 | |
|   INSERT INTO n4(rowid, n) VALUES(100, '1 2 3 4 5');
 | |
|   INSERT INTO n4(rowid, n) VALUES(200, '1 2 3 4');
 | |
|   INSERT INTO n4(rowid, n) VALUES(300, '2 3 4');
 | |
|   INSERT INTO n4(rowid, n) VALUES(400, '2 3');
 | |
|   INSERT INTO n4(rowid, n) VALUES(500, '3');
 | |
| }
 | |
| 
 | |
| do_test 4.1 {
 | |
|   set res [list]
 | |
|   db eval { SELECT rowid FROM n4 WHERE n4 MATCH '3' } {
 | |
|     if {$rowid==300} {
 | |
|       execsql { DELETE FROM n4 WHERE rowid=300 }
 | |
|     }
 | |
|     lappend res $rowid
 | |
|   }
 | |
|   set res
 | |
| } {100 200 300 400 500}
 | |
| 
 | |
| do_test 4.2 {
 | |
|   execsql { INSERT INTO n4(rowid, n) VALUES(300, '2 3 4') }
 | |
|   set res [list]
 | |
|   db eval { SELECT rowid FROM n4 WHERE n4 MATCH '3' ORDER BY rowid DESC} {
 | |
|     if {$rowid==300} {
 | |
|       execsql { DELETE FROM n4 WHERE rowid=300 }
 | |
|     }
 | |
|     lappend res $rowid
 | |
|   }
 | |
|   set res
 | |
| } {500 400 300 200 100}
 | |
| 
 | |
| do_test 4.3 {
 | |
|   execsql { INSERT INTO n4(rowid, n) VALUES(300, '2 3 4') }
 | |
|   set res [list]
 | |
|   db eval { SELECT rowid FROM n4 WHERE n4 MATCH '3' ORDER BY rowid DESC} {
 | |
|     if {$rowid==300} {
 | |
|       execsql { DELETE FROM n4  }
 | |
|     }
 | |
|     lappend res $rowid
 | |
|   }
 | |
|   set res
 | |
| } {500 400 300}
 | |
| 
 | |
| 
 | |
| 
 | |
| finish_test
 | |
| 
 | 
