OLD | NEW |
(Empty) | |
| 1 # 2015 April 28 |
| 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 # This file focuses on testing the planner (xBestIndex function). |
| 13 # |
| 14 |
| 15 source [file join [file dirname [info script]] fts5_common.tcl] |
| 16 set testprefix fts5restart |
| 17 |
| 18 # If SQLITE_ENABLE_FTS5 is defined, omit this file. |
| 19 ifcapable !fts5 { |
| 20 finish_test |
| 21 return |
| 22 } |
| 23 |
| 24 do_execsql_test 1.0 { |
| 25 CREATE VIRTUAL TABLE f1 USING fts5(ff); |
| 26 } |
| 27 |
| 28 #------------------------------------------------------------------------- |
| 29 # Run the 'optimize' command. Check that it does not disturb ongoing |
| 30 # full-text queries. |
| 31 # |
| 32 do_test 1.1 { |
| 33 for {set i 1} {$i < 1000} {incr i} { |
| 34 execsql { INSERT INTO f1 VALUES('a b c d e') } |
| 35 lappend lRowid $i |
| 36 } |
| 37 } {} |
| 38 |
| 39 do_execsql_test 1.2 { |
| 40 SELECT rowid FROM f1 WHERE f1 MATCH 'c'; |
| 41 } $lRowid |
| 42 |
| 43 do_test 1.3 { |
| 44 set res [list] |
| 45 db eval { SELECT rowid FROM f1 WHERE f1 MATCH 'c' } { |
| 46 if {$rowid == 100} { |
| 47 execsql { INSERT INTO f1(f1) VALUES('optimize') } |
| 48 } |
| 49 lappend res $rowid |
| 50 } |
| 51 set res |
| 52 } $lRowid |
| 53 |
| 54 do_test 1.4.1 { |
| 55 sqlite3 db2 test.db |
| 56 set res [list] |
| 57 db2 eval { SELECT rowid FROM f1 WHERE f1 MATCH 'c' } { |
| 58 if {$rowid == 100} { |
| 59 set cres [catchsql { INSERT INTO f1(f1) VALUES('optimize') }] |
| 60 } |
| 61 lappend res $rowid |
| 62 } |
| 63 set res |
| 64 } $lRowid |
| 65 |
| 66 do_test 1.4.2 { |
| 67 db2 close |
| 68 set cres |
| 69 } {1 {database is locked}} |
| 70 |
| 71 #------------------------------------------------------------------------- |
| 72 # Open a couple of cursors. Then close them in the same order. |
| 73 # |
| 74 do_test 2.1 { |
| 75 set ::s1 [sqlite3_prepare db "SELECT rowid FROM f1 WHERE f1 MATCH 'b'" -1 X] |
| 76 set ::s2 [sqlite3_prepare db "SELECT rowid FROM f1 WHERE f1 MATCH 'c'" -1 X] |
| 77 |
| 78 sqlite3_step $::s1 |
| 79 } {SQLITE_ROW} |
| 80 do_test 2.2 { |
| 81 sqlite3_step $::s2 |
| 82 } {SQLITE_ROW} |
| 83 |
| 84 do_test 2.1 { |
| 85 sqlite3_finalize $::s1 |
| 86 sqlite3_finalize $::s2 |
| 87 } {SQLITE_OK} |
| 88 |
| 89 #------------------------------------------------------------------------- |
| 90 # Copy data between two FTS5 tables. |
| 91 # |
| 92 do_execsql_test 3.1 { |
| 93 CREATE VIRTUAL TABLE f2 USING fts5(gg); |
| 94 INSERT INTO f2 SELECT ff FROM f1 WHERE f1 MATCH 'b+c+d'; |
| 95 } |
| 96 do_execsql_test 3.2 { |
| 97 SELECT rowid FROM f2 WHERE f2 MATCH 'a+b+c+d+e' |
| 98 } $lRowid |
| 99 |
| 100 #------------------------------------------------------------------------- |
| 101 # Remove the row that an FTS5 cursor is currently pointing to. And |
| 102 # various other similar things. Check that this does not disturb |
| 103 # ongoing scans. |
| 104 # |
| 105 do_execsql_test 4.0 { |
| 106 CREATE VIRTUAL TABLE n4 USING fts5(n); |
| 107 INSERT INTO n4(rowid, n) VALUES(100, '1 2 3 4 5'); |
| 108 INSERT INTO n4(rowid, n) VALUES(200, '1 2 3 4'); |
| 109 INSERT INTO n4(rowid, n) VALUES(300, '2 3 4'); |
| 110 INSERT INTO n4(rowid, n) VALUES(400, '2 3'); |
| 111 INSERT INTO n4(rowid, n) VALUES(500, '3'); |
| 112 } |
| 113 |
| 114 do_test 4.1 { |
| 115 set res [list] |
| 116 db eval { SELECT rowid FROM n4 WHERE n4 MATCH '3' } { |
| 117 if {$rowid==300} { |
| 118 execsql { DELETE FROM n4 WHERE rowid=300 } |
| 119 } |
| 120 lappend res $rowid |
| 121 } |
| 122 set res |
| 123 } {100 200 300 400 500} |
| 124 |
| 125 do_test 4.2 { |
| 126 execsql { INSERT INTO n4(rowid, n) VALUES(300, '2 3 4') } |
| 127 set res [list] |
| 128 db eval { SELECT rowid FROM n4 WHERE n4 MATCH '3' ORDER BY rowid DESC} { |
| 129 if {$rowid==300} { |
| 130 execsql { DELETE FROM n4 WHERE rowid=300 } |
| 131 } |
| 132 lappend res $rowid |
| 133 } |
| 134 set res |
| 135 } {500 400 300 200 100} |
| 136 |
| 137 do_test 4.3 { |
| 138 execsql { INSERT INTO n4(rowid, n) VALUES(300, '2 3 4') } |
| 139 set res [list] |
| 140 db eval { SELECT rowid FROM n4 WHERE n4 MATCH '3' ORDER BY rowid DESC} { |
| 141 if {$rowid==300} { |
| 142 execsql { DELETE FROM n4 } |
| 143 } |
| 144 lappend res $rowid |
| 145 } |
| 146 set res |
| 147 } {500 400 300} |
| 148 |
| 149 |
| 150 |
| 151 finish_test |
| 152 |
OLD | NEW |