OLD | NEW |
| (Empty) |
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 | |
15 source [file join [file dirname [info script]] fts5_common.tcl] | |
16 set testprefix fts5aa | |
17 | |
18 # If SQLITE_ENABLE_FTS5 is not defined, omit this file. | |
19 ifcapable !fts5 { | |
20 finish_test | |
21 return | |
22 } | |
23 | |
24 do_execsql_test 1.0 { | |
25 CREATE VIRTUAL TABLE t1 USING fts5(a, b, c); | |
26 SELECT name, sql FROM sqlite_master; | |
27 } { | |
28 t1 {CREATE VIRTUAL TABLE t1 USING fts5(a, b, c)} | |
29 t1_data {CREATE TABLE 't1_data'(id INTEGER PRIMARY KEY, block BLOB)} | |
30 t1_idx {CREATE TABLE 't1_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WIT
HOUT ROWID} | |
31 t1_content {CREATE TABLE 't1_content'(id INTEGER PRIMARY KEY, c0, c1, c2)} | |
32 t1_docsize {CREATE TABLE 't1_docsize'(id INTEGER PRIMARY KEY, sz BLOB)} | |
33 t1_config {CREATE TABLE 't1_config'(k PRIMARY KEY, v) WITHOUT ROWID} | |
34 } | |
35 | |
36 do_execsql_test 1.1 { | |
37 DROP TABLE t1; | |
38 SELECT name, sql FROM sqlite_master; | |
39 } { | |
40 } | |
41 | |
42 #------------------------------------------------------------------------- | |
43 # | |
44 reset_db | |
45 do_execsql_test 2.0 { | |
46 CREATE VIRTUAL TABLE t1 USING fts5(x,y); | |
47 } | |
48 do_execsql_test 2.1 { | |
49 INSERT INTO t1 VALUES('a b c', 'd e f'); | |
50 } | |
51 | |
52 do_test 2.2 { | |
53 execsql { SELECT fts5_decode(id, block) FROM t1_data WHERE id==10 } | |
54 } {/{{structure} {lvl=0 nMerge=0 nSeg=1 {id=[0123456789]* leaves=1..1}}}/} | |
55 | |
56 foreach w {a b c d e f} { | |
57 do_execsql_test 2.3.$w.asc { | |
58 SELECT rowid FROM t1 WHERE t1 MATCH $w; | |
59 } {1} | |
60 do_execsql_test 2.3.$w.desc { | |
61 SELECT rowid FROM t1 WHERE t1 MATCH $w ORDER BY rowid DESC; | |
62 } {1} | |
63 } | |
64 | |
65 do_execsql_test 2.4 { | |
66 INSERT INTO t1(t1) VALUES('integrity-check'); | |
67 } | |
68 | |
69 #------------------------------------------------------------------------- | |
70 # | |
71 reset_db | |
72 do_execsql_test 3.0 { | |
73 CREATE VIRTUAL TABLE t1 USING fts5(x,y); | |
74 } | |
75 foreach {i x y} { | |
76 1 {g f d b f} {h h e i a} | |
77 2 {f i g j e} {i j c f f} | |
78 3 {e e i f a} {e h f d f} | |
79 4 {h j f j i} {h a c f j} | |
80 5 {d b j c g} {f e i b e} | |
81 6 {a j a e e} {j d f d e} | |
82 7 {g i j c h} {j d h c a} | |
83 8 {j j i d d} {e e d f b} | |
84 9 {c j j d c} {h j i f g} | |
85 10 {b f h i a} {c f b b j} | |
86 } { | |
87 do_execsql_test 3.$i.1 { INSERT INTO t1 VALUES($x, $y) } | |
88 do_execsql_test 3.$i.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
89 if {[set_test_counter errors]} break | |
90 } | |
91 | |
92 #------------------------------------------------------------------------- | |
93 # | |
94 reset_db | |
95 do_execsql_test 4.0 { | |
96 CREATE VIRTUAL TABLE t1 USING fts5(x,y); | |
97 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
98 } | |
99 foreach {i x y} { | |
100 1 {g f d b f} {h h e i a} | |
101 2 {f i g j e} {i j c f f} | |
102 3 {e e i f a} {e h f d f} | |
103 4 {h j f j i} {h a c f j} | |
104 5 {d b j c g} {f e i b e} | |
105 6 {a j a e e} {j d f d e} | |
106 7 {g i j c h} {j d h c a} | |
107 8 {j j i d d} {e e d f b} | |
108 9 {c j j d c} {h j i f g} | |
109 10 {b f h i a} {c f b b j} | |
110 } { | |
111 do_execsql_test 4.$i.1 { INSERT INTO t1 VALUES($x, $y) } | |
112 do_execsql_test 4.$i.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
113 if {[set_test_counter errors]} break | |
114 } | |
115 | |
116 #------------------------------------------------------------------------- | |
117 # | |
118 reset_db | |
119 do_execsql_test 5.0 { | |
120 CREATE VIRTUAL TABLE t1 USING fts5(x,y); | |
121 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
122 } | |
123 foreach {i x y} { | |
124 1 {dd abc abc abc abcde} {aaa dd ddd ddd aab} | |
125 2 {dd aab d aaa b} {abcde c aaa aaa aaa} | |
126 3 {abcde dd b b dd} {abc abc d abc ddddd} | |
127 4 {aaa abcde dddd dddd abcde} {abc b b abcde abc} | |
128 5 {aab dddd d dddd c} {ddd abcde dddd abcde c} | |
129 6 {ddd dd b aab abcde} {d ddddd dddd c abc} | |
130 7 {d ddddd ddd c abcde} {c aab d abcde ddd} | |
131 8 {abcde aaa aab c c} {ddd c dddd b aaa} | |
132 9 {abcde aab ddddd c aab} {dddd dddd b c dd} | |
133 10 {ddd abcde dddd dd c} {dddd c c d abcde} | |
134 } { | |
135 do_execsql_test 5.$i.1 { INSERT INTO t1 VALUES($x, $y) } | |
136 do_execsql_test 5.$i.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
137 if {[set_test_counter errors]} break | |
138 } | |
139 | |
140 #------------------------------------------------------------------------- | |
141 # | |
142 reset_db | |
143 do_execsql_test 6.0 { | |
144 CREATE VIRTUAL TABLE t1 USING fts5(x,y); | |
145 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
146 } | |
147 | |
148 do_execsql_test 6.1 { | |
149 INSERT INTO t1(rowid, x, y) VALUES(22, 'a b c', 'c b a'); | |
150 REPLACE INTO t1(rowid, x, y) VALUES(22, 'd e f', 'f e d'); | |
151 } | |
152 | |
153 do_execsql_test 6.2 { | |
154 INSERT INTO t1(t1) VALUES('integrity-check') | |
155 } | |
156 | |
157 do_execsql_test 6.3 { | |
158 REPLACE INTO t1(rowid, x, y) VALUES('22', 'l l l', 'l l l'); | |
159 } | |
160 | |
161 do_execsql_test 6.4 { | |
162 REPLACE INTO t1(x, y) VALUES('x y z', 'x y z'); | |
163 } | |
164 | |
165 do_execsql_test 6.5 { | |
166 INSERT INTO t1(t1) VALUES('integrity-check') | |
167 } | |
168 | |
169 do_execsql_test 6.6 { | |
170 SELECT rowid, * FROM t1; | |
171 } { | |
172 22 {l l l} {l l l} | |
173 23 {x y z} {x y z} | |
174 } | |
175 | |
176 #------------------------------------------------------------------------- | |
177 # | |
178 reset_db | |
179 expr srand(0) | |
180 do_execsql_test 7.0 { | |
181 CREATE VIRTUAL TABLE t1 USING fts5(x,y,z); | |
182 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
183 } | |
184 | |
185 proc doc {} { | |
186 set v [list aaa aab abc abcde b c d dd ddd dddd ddddd] | |
187 set ret [list] | |
188 for {set j 0} {$j < 20} {incr j} { | |
189 lappend ret [lindex $v [expr int(rand()*[llength $v])]] | |
190 } | |
191 return $ret | |
192 } | |
193 | |
194 proc dump_structure {} { | |
195 db eval {SELECT fts5_decode(id, block) AS t FROM t1_data WHERE id=10} { | |
196 foreach lvl [lrange $t 1 end] { | |
197 set seg [string repeat . [expr [llength $lvl]-2]] | |
198 puts "[lrange $lvl 0 1] $seg" | |
199 } | |
200 } | |
201 } | |
202 | |
203 for {set i 1} {$i <= 10} {incr i} { | |
204 do_test 7.$i { | |
205 for {set j 0} {$j < 10} {incr j} { | |
206 set x [doc] | |
207 set y [doc] | |
208 set z [doc] | |
209 set rowid [expr int(rand() * 100)] | |
210 execsql { REPLACE INTO t1(rowid,x,y,z) VALUES($rowid, $x, $y, $z) } | |
211 } | |
212 execsql { INSERT INTO t1(t1) VALUES('integrity-check'); } | |
213 } {} | |
214 if {[set_test_counter errors]} break | |
215 } | |
216 | |
217 #------------------------------------------------------------------------- | |
218 # | |
219 reset_db | |
220 do_execsql_test 8.0 { | |
221 CREATE VIRTUAL TABLE t1 USING fts5(x, prefix="1,2,3"); | |
222 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
223 } | |
224 | |
225 do_execsql_test 8.1 { | |
226 INSERT INTO t1 VALUES('the quick brown fox'); | |
227 INSERT INTO t1(t1) VALUES('integrity-check'); | |
228 } | |
229 | |
230 | |
231 #------------------------------------------------------------------------- | |
232 # | |
233 reset_db | |
234 | |
235 expr srand(0) | |
236 | |
237 do_execsql_test 9.0 { | |
238 CREATE VIRTUAL TABLE t1 USING fts5(x,y,z, prefix="1,2,3"); | |
239 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
240 } | |
241 | |
242 proc doc {} { | |
243 set v [list aaa aab abc abcde b c d dd ddd dddd ddddd] | |
244 set ret [list] | |
245 for {set j 0} {$j < 20} {incr j} { | |
246 lappend ret [lindex $v [expr int(rand()*[llength $v])]] | |
247 } | |
248 return $ret | |
249 } | |
250 | |
251 proc dump_structure {} { | |
252 db eval {SELECT fts5_decode(id, block) AS t FROM t1_data WHERE id=10} { | |
253 foreach lvl [lrange $t 1 end] { | |
254 set seg [string repeat . [expr [llength $lvl]-2]] | |
255 puts "[lrange $lvl 0 1] $seg" | |
256 } | |
257 } | |
258 } | |
259 | |
260 for {set i 1} {$i <= 10} {incr i} { | |
261 do_test 9.$i { | |
262 for {set j 0} {$j < 100} {incr j} { | |
263 set x [doc] | |
264 set y [doc] | |
265 set z [doc] | |
266 set rowid [expr int(rand() * 100)] | |
267 execsql { REPLACE INTO t1(rowid,x,y,z) VALUES($rowid, $x, $y, $z) } | |
268 } | |
269 execsql { INSERT INTO t1(t1) VALUES('integrity-check'); } | |
270 } {} | |
271 if {[set_test_counter errors]} break | |
272 } | |
273 | |
274 | |
275 #------------------------------------------------------------------------- | |
276 # | |
277 reset_db | |
278 do_execsql_test 10.0 { | |
279 CREATE VIRTUAL TABLE t1 USING fts5(x,y); | |
280 } | |
281 set d10 { | |
282 1 {g f d b f} {h h e i a} | |
283 2 {f i g j e} {i j c f f} | |
284 3 {e e i f a} {e h f d f} | |
285 4 {h j f j i} {h a c f j} | |
286 5 {d b j c g} {f e i b e} | |
287 6 {a j a e e} {j d f d e} | |
288 7 {g i j c h} {j d h c a} | |
289 8 {j j i d d} {e e d f b} | |
290 9 {c j j d c} {h j i f g} | |
291 10 {b f h i a} {c f b b j} | |
292 } | |
293 foreach {rowid x y} $d10 { | |
294 do_execsql_test 10.1.$rowid.1 { INSERT INTO t1 VALUES($x, $y) } | |
295 do_execsql_test 10.1.$rowid.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
296 } | |
297 foreach rowid {5 9 8 1 2 4 10 7 3 5 6} { | |
298 do_execsql_test 10.2.$rowid.1 { DELETE FROM t1 WHERE rowid = $rowid } | |
299 do_execsql_test 10.2.$rowid.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
300 } | |
301 foreach {rowid x y} $d10 { | |
302 do_execsql_test 10.3.$rowid.1 { INSERT INTO t1 VALUES($x, $y) } | |
303 do_execsql_test 10.3.$rowid.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
304 } | |
305 | |
306 do_execsql_test 10.4.1 { DELETE FROM t1 } | |
307 do_execsql_test 10.4.2 { INSERT INTO t1(t1) VALUES('integrity-check') } | |
308 | |
309 #------------------------------------------------------------------------- | |
310 # | |
311 do_catchsql_test 11.1 { | |
312 CREATE VIRTUAL TABLE t2 USING fts5(a, b, c, rank); | |
313 } {1 {reserved fts5 column name: rank}} | |
314 do_catchsql_test 11.2 { | |
315 CREATE VIRTUAL TABLE rank USING fts5(a, b, c); | |
316 } {1 {reserved fts5 table name: rank}} | |
317 do_catchsql_test 11.3 { | |
318 CREATE VIRTUAL TABLE t2 USING fts5(a, b, c, rowid); | |
319 } {1 {reserved fts5 column name: rowid}} | |
320 | |
321 #------------------------------------------------------------------------- | |
322 # | |
323 do_execsql_test 12.1 { | |
324 CREATE VIRTUAL TABLE t2 USING fts5(x,y); | |
325 } {} | |
326 | |
327 do_catchsql_test 12.2 { | |
328 SELECT t2 FROM t2 WHERE t2 MATCH '*stuff' | |
329 } {1 {unknown special query: stuff}} | |
330 | |
331 do_test 12.3 { | |
332 set res [db eval { SELECT t2 FROM t2 WHERE t2 MATCH '* reads ' }] | |
333 string is integer $res | |
334 } {1} | |
335 | |
336 #------------------------------------------------------------------------- | |
337 # | |
338 reset_db | |
339 do_execsql_test 13.1 { | |
340 CREATE VIRTUAL TABLE t1 USING fts5(x); | |
341 INSERT INTO t1(rowid, x) VALUES(1, 'o n e'), (2, 't w o'); | |
342 } {} | |
343 | |
344 do_execsql_test 13.2 { | |
345 SELECT rowid FROM t1 WHERE t1 MATCH 'o'; | |
346 } {1 2} | |
347 | |
348 do_execsql_test 13.4 { | |
349 DELETE FROM t1 WHERE rowid=2; | |
350 } {} | |
351 | |
352 do_execsql_test 13.5 { | |
353 SELECT rowid FROM t1 WHERE t1 MATCH 'o'; | |
354 } {1} | |
355 | |
356 do_execsql_test 13.6 { | |
357 SELECT rowid FROM t1 WHERE t1 MATCH '""'; | |
358 } {} | |
359 | |
360 #------------------------------------------------------------------------- | |
361 # | |
362 reset_db | |
363 do_execsql_test 14.1 { | |
364 CREATE VIRTUAL TABLE t1 USING fts5(x, y); | |
365 INSERT INTO t1(t1, rank) VALUES('pgsz', 32); | |
366 WITH d(x,y) AS ( | |
367 SELECT NULL, 'xyz xyz xyz xyz xyz xyz' | |
368 UNION ALL | |
369 SELECT NULL, 'xyz xyz xyz xyz xyz xyz' FROM d | |
370 ) | |
371 INSERT INTO t1 SELECT * FROM d LIMIT 200; | |
372 } | |
373 | |
374 do_test 14.2 { | |
375 set nRow 0 | |
376 db eval { SELECT * FROM t1 WHERE t1 MATCH 'xyz' } { | |
377 db eval { | |
378 BEGIN; | |
379 CREATE TABLE t2(a, b); | |
380 ROLLBACK; | |
381 } | |
382 incr nRow | |
383 } | |
384 set nRow | |
385 } {200} | |
386 | |
387 do_test 14.3 { | |
388 set nRow 0 | |
389 db eval { BEGIN; } | |
390 db eval { SELECT * FROM t1 WHERE t1 MATCH 'xyz' } { | |
391 db eval { | |
392 SAVEPOINT aaa; | |
393 CREATE TABLE t2(a, b); | |
394 ROLLBACK TO aaa; | |
395 RELEASE aaa; | |
396 } | |
397 incr nRow | |
398 } | |
399 set nRow | |
400 } {200} | |
401 | |
402 do_execsql_test 15.0 { | |
403 INSERT INTO t1(t1) VALUES('integrity-check'); | |
404 } | |
405 do_execsql_test 15.1 { | |
406 UPDATE t1_content SET c1 = 'xyz xyz xyz xyz xyz abc' WHERE rowid = 1; | |
407 } | |
408 do_catchsql_test 15.2 { | |
409 INSERT INTO t1(t1) VALUES('integrity-check'); | |
410 } {1 {database disk image is malformed}} | |
411 | |
412 #------------------------------------------------------------------------- | |
413 # | |
414 do_execsql_test 16.1 { | |
415 CREATE VIRTUAL TABLE n1 USING fts5(a); | |
416 INSERT INTO n1 VALUES('a b c d'); | |
417 } | |
418 | |
419 proc funk {} { | |
420 set fd [db incrblob main n1_data block 10] | |
421 fconfigure $fd -encoding binary -translation binary | |
422 puts -nonewline $fd "\x44\x45" | |
423 close $fd | |
424 db eval { UPDATE n1_config SET v=50 WHERE k='version' } | |
425 } | |
426 db func funk funk | |
427 | |
428 do_catchsql_test 16.2 { | |
429 SELECT funk(), bm25(n1), funk() FROM n1 WHERE n1 MATCH 'a+b+c+d' | |
430 } {1 {SQL logic error or missing database}} | |
431 | |
432 #------------------------------------------------------------------------- | |
433 # | |
434 reset_db | |
435 do_execsql_test 17.1 { | |
436 CREATE VIRTUAL TABLE b2 USING fts5(x); | |
437 INSERT INTO b2 VALUES('a'); | |
438 INSERT INTO b2 VALUES('b'); | |
439 INSERT INTO b2 VALUES('c'); | |
440 } | |
441 | |
442 do_test 17.2 { | |
443 set res [list] | |
444 db eval { SELECT * FROM b2 ORDER BY rowid ASC } { | |
445 lappend res [execsql { SELECT * FROM b2 ORDER BY rowid ASC }] | |
446 } | |
447 set res | |
448 } {{a b c} {a b c} {a b c}} | |
449 | |
450 reset_db | |
451 do_execsql_test 18.1 { | |
452 CREATE VIRTUAL TABLE c2 USING fts5(x, y); | |
453 INSERT INTO c2 VALUES('x x x', 'x x x'); | |
454 SELECT rowid FROM c2 WHERE c2 MATCH 'y:x'; | |
455 } {1} | |
456 | |
457 #------------------------------------------------------------------------- | |
458 # | |
459 reset_db | |
460 do_execsql_test 17.1 { | |
461 CREATE VIRTUAL TABLE uio USING fts5(ttt); | |
462 INSERT INTO uio VALUES(NULL); | |
463 INSERT INTO uio SELECT NULL FROM uio; | |
464 INSERT INTO uio SELECT NULL FROM uio; | |
465 INSERT INTO uio SELECT NULL FROM uio; | |
466 INSERT INTO uio SELECT NULL FROM uio; | |
467 INSERT INTO uio SELECT NULL FROM uio; | |
468 INSERT INTO uio SELECT NULL FROM uio; | |
469 INSERT INTO uio SELECT NULL FROM uio; | |
470 INSERT INTO uio SELECT NULL FROM uio; | |
471 SELECT count(*) FROM uio; | |
472 } {256} | |
473 | |
474 do_execsql_test 17.2 { | |
475 SELECT count(*) FROM uio WHERE rowid BETWEEN 8 AND 17 | |
476 } {10} | |
477 do_execsql_test 17.3 { | |
478 SELECT rowid FROM uio WHERE rowid BETWEEN 8 AND 17 | |
479 } {8 9 10 11 12 13 14 15 16 17} | |
480 do_execsql_test 17.4 { | |
481 SELECT rowid FROM uio WHERE rowid BETWEEN 8 AND 17 ORDER BY rowid DESC | |
482 } {17 16 15 14 13 12 11 10 9 8} | |
483 do_execsql_test 17.5 { | |
484 SELECT count(*) FROM uio | |
485 } {256} | |
486 | |
487 do_execsql_test 17.6 { | |
488 INSERT INTO uio(rowid) VALUES(9223372036854775807); | |
489 INSERT INTO uio(rowid) VALUES(-9223372036854775808); | |
490 SELECT count(*) FROM uio; | |
491 } {258} | |
492 do_execsql_test 17.7 { | |
493 SELECT min(rowid), max(rowid) FROM uio; | |
494 } {-9223372036854775808 9223372036854775807} | |
495 | |
496 do_execsql_test 17.8 { | |
497 INSERT INTO uio DEFAULT VALUES; | |
498 SELECT min(rowid), max(rowid), count(*) FROM uio; | |
499 } {-9223372036854775808 9223372036854775807 259} | |
500 | |
501 do_execsql_test 17.9 { | |
502 SELECT min(rowid), max(rowid), count(*) FROM uio WHERE rowid < 10; | |
503 } {-9223372036854775808 9 10} | |
504 | |
505 #-------------------------------------------------------------------- | |
506 # | |
507 do_execsql_test 18.1 { | |
508 CREATE VIRTUAL TABLE t1 USING fts5(a, b); | |
509 CREATE VIRTUAL TABLE t2 USING fts5(c, d); | |
510 INSERT INTO t1 VALUES('abc*', NULL); | |
511 INSERT INTO t2 VALUES(1, 'abcdefg'); | |
512 } | |
513 do_execsql_test 18.2 { | |
514 SELECT t1.rowid, t2.rowid FROM t1, t2 WHERE t2 MATCH t1.a AND t1.rowid = t2.c | |
515 } {1 1} | |
516 do_execsql_test 18.3 { | |
517 SELECT t1.rowid, t2.rowid FROM t2, t1 WHERE t2 MATCH t1.a AND t1.rowid = t2.c | |
518 } {1 1} | |
519 | |
520 #-------------------------------------------------------------------- | |
521 # fts5 table in the temp schema. | |
522 # | |
523 reset_db | |
524 do_execsql_test 19.0 { | |
525 CREATE VIRTUAL TABLE temp.t1 USING fts5(x); | |
526 INSERT INTO t1 VALUES('x y z'); | |
527 INSERT INTO t1 VALUES('w x 1'); | |
528 SELECT rowid FROM t1 WHERE t1 MATCH 'x'; | |
529 } {1 2} | |
530 | |
531 #-------------------------------------------------------------------- | |
532 # Test that 6 and 7 byte varints can be read. | |
533 # | |
534 reset_db | |
535 do_execsql_test 20.0 { | |
536 CREATE VIRTUAL TABLE temp.tmp USING fts5(x); | |
537 } | |
538 set ::ids [list \ | |
539 0 [expr 1<<36] [expr 2<<36] [expr 1<<43] [expr 2<<43] | |
540 ] | |
541 do_test 20.1 { | |
542 foreach id $::ids { | |
543 execsql { INSERT INTO tmp(rowid, x) VALUES($id, 'x y z') } | |
544 } | |
545 execsql { SELECT rowid FROM tmp WHERE tmp MATCH 'y' } | |
546 } $::ids | |
547 | |
548 | |
549 | |
550 finish_test | |
551 | |
552 | |
OLD | NEW |