1
0

fts3first.test 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # 2011 October 18
  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. set testdir [file dirname $argv0]
  12. source $testdir/tester.tcl
  13. source $testdir/malloc_common.tcl
  14. ifcapable !fts3 {
  15. finish_test
  16. return
  17. }
  18. set testprefix fts3first
  19. proc lreverse {L} {
  20. set res [list]
  21. for {set ii [expr [llength $L]-1]} {$ii>=0} {incr ii -1} {
  22. lappend res [lindex $L $ii]
  23. }
  24. set res
  25. }
  26. proc mit {blob} {
  27. set scan(littleEndian) i*
  28. set scan(bigEndian) I*
  29. binary scan $blob $scan($::tcl_platform(byteOrder)) r
  30. return $r
  31. }
  32. db func mit mit
  33. do_execsql_test 1.0 {
  34. CREATE VIRTUAL TABLE x1 USING FTS4(a, b, c);
  35. INSERT INTO x1(docid,a,b,c) VALUES(0, 'K H D S T', 'V M N Y K', 'S Z N Q S');
  36. INSERT INTO x1(docid,a,b,c) VALUES(1, 'K N J L W', 'S Z W J Q', 'D U W S E');
  37. INSERT INTO x1(docid,a,b,c) VALUES(2, 'B P M O I', 'R P H W S', 'R J L L E');
  38. INSERT INTO x1(docid,a,b,c) VALUES(3, 'U R Q M L', 'M J K A V', 'Q W J T J');
  39. INSERT INTO x1(docid,a,b,c) VALUES(4, 'N J C Y N', 'R U D X V', 'B O U A Q');
  40. INSERT INTO x1(docid,a,b,c) VALUES(5, 'Q L X L U', 'I F N X S', 'U Q A N Y');
  41. INSERT INTO x1(docid,a,b,c) VALUES(6, 'M R G U T', 'U V I Q P', 'X Y D L S');
  42. INSERT INTO x1(docid,a,b,c) VALUES(7, 'D Y P O I', 'X J P K R', 'V O T H V');
  43. INSERT INTO x1(docid,a,b,c) VALUES(8, 'R Y D L R', 'U U E S J', 'N W L M R');
  44. INSERT INTO x1(docid,a,b,c) VALUES(9, 'Z P F N P', 'W A X D U', 'V A E Q A');
  45. INSERT INTO x1(docid,a,b,c) VALUES(10, 'Q I A Q M', 'N D K H C', 'A H T Q Z');
  46. INSERT INTO x1(docid,a,b,c) VALUES(11, 'T E R Q B', 'C I B C B', 'F Z U W R');
  47. INSERT INTO x1(docid,a,b,c) VALUES(12, 'E S V U W', 'T P F W H', 'A M D J Q');
  48. INSERT INTO x1(docid,a,b,c) VALUES(13, 'X S B X Y', 'U D N D P', 'X Z Y G F');
  49. INSERT INTO x1(docid,a,b,c) VALUES(14, 'K H A B L', 'S R C C Z', 'D W E H J');
  50. INSERT INTO x1(docid,a,b,c) VALUES(15, 'C E U C C', 'W F M N M', 'T Z U X T');
  51. INSERT INTO x1(docid,a,b,c) VALUES(16, 'Q G C G H', 'H N N B H', 'B Q I H Y');
  52. INSERT INTO x1(docid,a,b,c) VALUES(17, 'Q T S K B', 'W B D Y N', 'V J P E C');
  53. INSERT INTO x1(docid,a,b,c) VALUES(18, 'A J M O Q', 'L G Y Y A', 'G N M R N');
  54. INSERT INTO x1(docid,a,b,c) VALUES(19, 'T R Y P Y', 'N V Y B X', 'L Z T N T');
  55. CREATE VIRTUAL TABLE x2 USING FTS4(a, b, c, order=DESC);
  56. INSERT INTO x2(docid, a, b, c) SELECT docid, a, b, c FROM x1;
  57. }
  58. # Test queries.
  59. #
  60. foreach x {1 2} {
  61. foreach {tn match res} {
  62. 1 "^K" {0 1 14}
  63. 2 "^S" {0 1 14}
  64. 3 "^W" {9 15 17}
  65. 4 "^J" {}
  66. 5 "^E" {12}
  67. 6 "V ^-E" {0 3 4 6 7 9 17 19}
  68. 7 "V -^E" {0 3 4 6 7 9 17 19}
  69. 8 "^-E V" {0 3 4 6 7 9 17 19}
  70. 9 "-^E V" {0 3 4 6 7 9 17 19}
  71. 10 "V" {0 3 4 6 7 9 12 17 19}
  72. 11 {"^K H"} {0 14}
  73. 12 {"K H"} {0 10 14}
  74. 13 {"K ^H"} {}
  75. } {
  76. set rev [lreverse $res]
  77. do_execsql_test 1.$x.$tn.1 {SELECT docid FROM x1 WHERE x1 MATCH $match} $res
  78. do_execsql_test 1.$x.$tn.2 {SELECT docid FROM x2 WHERE x2 MATCH $match} $rev
  79. }
  80. do_execsql_test 1.$x.[expr $tn+1] {
  81. INSERT INTO x1(x1) VALUES('optimize');
  82. INSERT INTO x2(x2) VALUES('optimize');
  83. } {}
  84. }
  85. # Test the snippet() function.
  86. #
  87. foreach {tn match res} {
  88. 1 {^K} {{[K] H D S T} {[K] N J L W} {[K] H A B L}}
  89. 2 {^X} {{[X] Y D L S} {[X] J P K R} {[X] S B X Y}}
  90. 3 {^X Y} {{[X] [Y] D L S} {D [Y] P O I...[X] J P K R} {[X] S B X [Y]}}
  91. } {
  92. set rev [lreverse $res]
  93. do_execsql_test 1.3.$tn.1 {
  94. SELECT snippet(x1, '[', ']', '...') FROM x1 WHERE x1 MATCH $match
  95. } $res
  96. do_execsql_test 1.3.$tn.2 {
  97. SELECT snippet(x2, '[', ']', '...') FROM x2 WHERE x2 MATCH $match
  98. } $rev
  99. }
  100. # Test matchinfo().
  101. #
  102. foreach {tn match res} {
  103. 1 {^K} {
  104. {1 3 3 0 0 0 0 0 0}
  105. {1 3 3 0 0 0 0 0 0}
  106. {1 3 3 0 0 0 0 0 0}
  107. }
  108. 2 {^X} {
  109. {0 1 1 0 1 1 1 2 2}
  110. {0 1 1 1 1 1 0 2 2}
  111. {1 1 1 0 1 1 1 2 2}
  112. }
  113. 3 {^X Y} {
  114. {0 1 1 0 1 1 1 2 2 0 6 5 0 5 4 1 4 4}
  115. {0 1 1 1 1 1 0 2 2 1 6 5 0 5 4 0 4 4}
  116. {1 1 1 0 1 1 1 2 2 1 6 5 0 5 4 1 4 4}
  117. }
  118. } {
  119. set rev [lreverse $res]
  120. do_execsql_test 1.3.$tn.1 {
  121. SELECT mit(matchinfo(x1, 'x')) FROM x1 WHERE x1 MATCH $match
  122. } $res
  123. do_execsql_test 1.3.$tn.2 {
  124. SELECT mit(matchinfo(x2, 'x')) FROM x2 WHERE x2 MATCH $match
  125. } $rev
  126. }
  127. # Test that ^ is ignored for FTS3 tables.
  128. #
  129. do_execsql_test 2.1 {
  130. CREATE VIRTUAL TABLE x3 USING fts3;
  131. INSERT INTO x3 VALUES('A B C');
  132. INSERT INTO x3 VALUES('B A C');
  133. CREATE VIRTUAL TABLE x4 USING fts4;
  134. INSERT INTO x4 VALUES('A B C');
  135. INSERT INTO x4 VALUES('B A C');
  136. }
  137. do_execsql_test 2.2.1 {
  138. SELECT * FROM x3 WHERE x3 MATCH '^A';
  139. } {{A B C} {B A C}}
  140. do_execsql_test 2.2.2 {
  141. SELECT * FROM x4 WHERE x4 MATCH '^A';
  142. } {{A B C}}
  143. finish_test