fts5af.test 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. # 2014 June 17
  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 FTS5 module.
  13. #
  14. # More specifically, the tests in this file focus on the built-in
  15. # snippet() function.
  16. #
  17. source [file join [file dirname [info script]] fts5_common.tcl]
  18. set testprefix fts5af
  19. # If SQLITE_ENABLE_FTS5 is not defined, omit this file.
  20. ifcapable !fts5 {
  21. finish_test
  22. return
  23. }
  24. foreach_detail_mode $testprefix {
  25. do_execsql_test 1.0 {
  26. CREATE VIRTUAL TABLE t1 USING fts5(x, y, detail=%DETAIL%);
  27. }
  28. proc do_snippet_test {tn doc match res} {
  29. uplevel #0 [list set v1 $doc]
  30. uplevel #0 [list set v2 $match]
  31. do_execsql_test $tn.1 {
  32. DELETE FROM t1;
  33. INSERT INTO t1 VALUES($v1, NULL);
  34. SELECT snippet(t1, -1, '[', ']', '...', 7) FROM t1 WHERE t1 MATCH $v2;
  35. } [list $res]
  36. do_execsql_test $tn.2 {
  37. DELETE FROM t1;
  38. INSERT INTO t1 VALUES(NULL, $v1);
  39. SELECT snippet(t1, -1, '[', ']', '...', 7) FROM t1 WHERE t1 MATCH $v2;
  40. } [list $res]
  41. do_execsql_test $tn.3 {
  42. DELETE FROM t1;
  43. INSERT INTO t1 VALUES($v1, NULL);
  44. SELECT snippet(t1, -1, '[', ']', '...', 7) FROM t1 WHERE t1 MATCH $v2
  45. ORDER BY rank DESC;
  46. } [list $res]
  47. }
  48. foreach {tn doc res} {
  49. 1.1 {X o o o o o o} {[X] o o o o o o}
  50. 1.2 {o X o o o o o} {o [X] o o o o o}
  51. 1.3 {o o X o o o o} {o o [X] o o o o}
  52. 1.4 {o o o X o o o} {o o o [X] o o o}
  53. 1.5 {o o o o X o o} {o o o o [X] o o}
  54. 1.6 {o o o o o X o} {o o o o o [X] o}
  55. 1.7 {o o o o o o X} {o o o o o o [X]}
  56. 2.1 {X o o o o o o o} {[X] o o o o o o...}
  57. 2.2 {o X o o o o o o} {o [X] o o o o o...}
  58. 2.3 {o o X o o o o o} {o o [X] o o o o...}
  59. 2.4 {o o o X o o o o} {o o o [X] o o o...}
  60. 2.5 {o o o o X o o o} {o o o o [X] o o...}
  61. 2.6 {o o o o o X o o} {o o o o o [X] o...}
  62. 2.7 {o o o o o o X o} {o o o o o o [X]...}
  63. 2.8 {o o o o o o o X} {...o o o o o o [X]}
  64. 2.9 {o o o o o o o X o} {...o o o o o [X] o}
  65. 2.10 {o o o o o o o X o o} {...o o o o [X] o o}
  66. 2.11 {o o o o o o o X o o o} {...o o o [X] o o o}
  67. 2.12 {o o o o o o o X o o o o} {...o o o [X] o o o...}
  68. 3.1 {X o o o o o o o o} {[X] o o o o o o...}
  69. 3.2 {o X o o o o o o o} {o [X] o o o o o...}
  70. 3.3 {o o X o o o o o o} {o o [X] o o o o...}
  71. 3.4 {o o o X o o o o o} {o o o [X] o o o...}
  72. 3.5 {o o o o o o o X o o o o} {...o o o [X] o o o...}
  73. 3.6 {o o o o o o o o X o o o} {...o o o [X] o o o}
  74. 3.7 {o o o o o o o o o X o o} {...o o o o [X] o o}
  75. 3.8 {o o o o o o o o o o X o} {...o o o o o [X] o}
  76. 3.9 {o o o o o o o o o o o X} {...o o o o o o [X]}
  77. 4.1 {X o o o o o X o o} {[X] o o o o o [X]...}
  78. 4.2 {o o o o o o o X o o o o o X o} {...[X] o o o o o [X]...}
  79. 4.3 {o o o o o o o o X o o o o o X} {...[X] o o o o o [X]}
  80. 5.1 {X o o o o X o o o} {[X] o o o o [X] o...}
  81. 5.2 {o o o o o o o X o o o o X o o} {...[X] o o o o [X] o...}
  82. 5.3 {o o o o o o o o X o o o o X o} {...[X] o o o o [X] o}
  83. 5.4 {o o o o o o o o o X o o o o X} {...o [X] o o o o [X]}
  84. 6.1 {X o o o X o o o} {[X] o o o [X] o o...}
  85. 6.2 {o X o o o X o o o} {o [X] o o o [X] o...}
  86. 6.3 {o o o o o o o X o o o X o o} {...o [X] o o o [X] o...}
  87. 6.4 {o o o o o o o o X o o o X o} {...o [X] o o o [X] o}
  88. 6.5 {o o o o o o o o o X o o o X} {...o o [X] o o o [X]}
  89. 7.1 {X o o X o o o o o} {[X] o o [X] o o o...}
  90. 7.2 {o X o o X o o o o} {o [X] o o [X] o o...}
  91. 7.3 {o o o o o o o X o o X o o o} {...o [X] o o [X] o o...}
  92. 7.4 {o o o o o o o o X o o X o o} {...o [X] o o [X] o o}
  93. 7.5 {o o o o o o o o o X o o X o} {...o o [X] o o [X] o}
  94. 7.6 {o o o o o o o o o o X o o X} {...o o o [X] o o [X]}
  95. 8.1 {o o o o o o o o o X o o o o o o o o o o o o o o o o X X X o o o}
  96. {...o o [X] [X] [X] o o...}
  97. 8.2 {o o o o o o o. o o X o o o o o o o o o o o o o o o o X X X o o o}
  98. {...o o [X] o o o o...}
  99. 8.3 {o o o o X o o o o o o o o o o o o o o o o o o o o o X X X o o o}
  100. {o o o o [X] o o...}
  101. } {
  102. do_snippet_test 1.$tn $doc X $res
  103. }
  104. if {[detail_is_full]} {
  105. foreach {tn doc res} {
  106. 1.1 {X Y o o o o o} {[X Y] o o o o o}
  107. 1.2 {o X Y o o o o} {o [X Y] o o o o}
  108. 1.3 {o o X Y o o o} {o o [X Y] o o o}
  109. 1.4 {o o o X Y o o} {o o o [X Y] o o}
  110. 1.5 {o o o o X Y o} {o o o o [X Y] o}
  111. 1.6 {o o o o o X Y} {o o o o o [X Y]}
  112. 2.1 {X Y o o o o o o} {[X Y] o o o o o...}
  113. 2.2 {o X Y o o o o o} {o [X Y] o o o o...}
  114. 2.3 {o o X Y o o o o} {o o [X Y] o o o...}
  115. 2.4 {o o o o o o o X Y o o o} {...o o [X Y] o o o}
  116. 2.5 {o o o o o o o o X Y o o} {...o o o [X Y] o o}
  117. 2.6 {o o o o o o o o o X Y o} {...o o o o [X Y] o}
  118. 2.7 {o o o o o o o o o o X Y} {...o o o o o [X Y]}
  119. 3.1 {X Y o o o o o o o} {[X Y] o o o o o...}
  120. 3.2 {o X Y o o o o o o} {o [X Y] o o o o...}
  121. 3.3 {o o X Y o o o o o} {o o [X Y] o o o...}
  122. 3.4 {o o o o o o o X Y o o o o} {...o o [X Y] o o o...}
  123. 3.5 {o o o o o o o o X Y o o o} {...o o [X Y] o o o}
  124. 3.6 {o o o o o o o o o X Y o o} {...o o o [X Y] o o}
  125. 3.7 {o o o o o o o o o o X Y o} {...o o o o [X Y] o}
  126. 3.8 {o o o o o o o o o o o X Y} {...o o o o o [X Y]}
  127. } {
  128. do_snippet_test 2.$tn $doc "X + Y" $res
  129. }
  130. }
  131. do_execsql_test 4.0 {
  132. CREATE VIRTUAL TABLE x1 USING fts5(a, b);
  133. INSERT INTO x1 VALUES('xyz', '1 2 3 4 5 6 7 8 9 10 11 12 13');
  134. SELECT snippet(x1, 1, '[', ']', '...', 5) FROM x1('xyz');
  135. } {
  136. {1 2 3 4 5...}
  137. }
  138. do_execsql_test 5.0 {
  139. CREATE VIRTUAL TABLE p1 USING fts5(a, b, detail=%DETAIL%);
  140. INSERT INTO p1 VALUES(
  141. 'x a a a a a a a a a a',
  142. 'a a a a a a a a a a a a a a a a a a a x'
  143. );
  144. }
  145. do_execsql_test 5.1 {
  146. SELECT snippet(p1, 0, '[', ']', '...', 6) FROM p1('x');
  147. } {{[x] a a a a a...}}
  148. do_execsql_test 5.2 {
  149. SELECT snippet(p1, 0, '[', ']', NULL, 6) FROM p1('x');
  150. } {{[x] a a a a a}}
  151. do_execsql_test 5.3 {
  152. SELECT snippet(p1, 0, NULL, ']', '...', 6) FROM p1('x');
  153. } {{x] a a a a a...}}
  154. do_execsql_test 5.4 {
  155. SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x');
  156. } {{[x a a a a a...}}
  157. do_execsql_test 5.5 {
  158. SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ""');
  159. } {{[x a a a a a...}}
  160. do_execsql_test 5.6 {
  161. SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ' || x'DB');
  162. } {{[x a a a a a...}}
  163. } ;# foreach_detail_mode
  164. reset_db
  165. do_execsql_test 6.0 {
  166. CREATE VIRTUAL TABLE t1 USING fts5(colA, colB);
  167. INSERT INTO t1 VALUES('A B C', 'D E F');
  168. }
  169. do_execsql_test 6.1 {
  170. SELECT colA, colB, snippet(t1,0,'[', ']','...',1) FROM t1 WHERE t1 MATCH 'B';
  171. } {{A B C} {D E F} ...[B]...}
  172. breakpoint
  173. do_execsql_test 6.2 {
  174. SELECT colA, colB, snippet(t1, 1,'[',']','...',2) FROM t1 WHERE t1 MATCH 'B';
  175. } {{A B C} {D E F} {D E...}}
  176. do_execsql_test 6.3 {
  177. SELECT colA, colB, snippet(t1, 1,'[',']','...',1) FROM t1 WHERE t1 MATCH 'B';
  178. } {{A B C} {D E F} {D...}}
  179. do_execsql_test 6.1 {
  180. SELECT colA, colB, snippet(t1,0,'[', ']','...',1) FROM t1 WHERE t1 MATCH 'A';
  181. } {{A B C} {D E F} [A]...}
  182. breakpoint
  183. do_execsql_test 6.2 {
  184. SELECT colA, colB, snippet(t1, 1,'[',']','...',2) FROM t1 WHERE t1 MATCH 'A';
  185. } {{A B C} {D E F} {D E...}}
  186. do_execsql_test 6.3 {
  187. SELECT colA, colB, snippet(t1, 1,'[',']','...',1) FROM t1 WHERE t1 MATCH 'A';
  188. } {{A B C} {D E F} {D...}}
  189. finish_test