/ Hex Artifact Content
Login

Artifact b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a:


0000: 23 20 32 30 31 34 20 44 65 63 20 32 30 0a 23 0a  # 2014 Dec 20.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 0a 23 0a 23 20 54 65 73 74 73 20 66 6f  ***.#.# Tests fo
0170: 63 75 73 69 6e 67 20 6f 6e 20 63 75 73 74 6f 6d  cusing on custom
0180: 20 74 6f 6b 65 6e 69 7a 65 72 73 20 74 68 61 74   tokenizers that
0190: 20 73 75 70 70 6f 72 74 20 73 79 6e 6f 6e 79 6d   support synonym
01a0: 73 2e 0a 23 0a 0a 73 6f 75 72 63 65 20 5b 66 69  s..#..source [fi
01b0: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
01c0: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
01d0: 70 74 5d 5d 20 66 74 73 35 5f 63 6f 6d 6d 6f 6e  pt]] fts5_common
01e0: 2e 74 63 6c 5d 0a 73 65 74 20 74 65 73 74 70 72  .tcl].set testpr
01f0: 65 66 69 78 20 66 74 73 35 73 79 6e 6f 6e 79 6d  efix fts5synonym
0200: 32 0a 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 45  2..# If SQLITE_E
0210: 4e 41 42 4c 45 5f 46 54 53 35 20 69 73 20 64 65  NABLE_FTS5 is de
0220: 66 69 6e 65 64 2c 20 6f 6d 69 74 20 74 68 69 73  fined, omit this
0230: 20 66 69 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65   file..ifcapable
0240: 20 21 66 74 73 35 20 7b 0a 20 20 66 69 6e 69 73   !fts5 {.  finis
0250: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0260: 7d 0a 0a 66 6f 72 65 61 63 68 20 74 6f 6b 20 7b  }..foreach tok {
0270: 71 75 65 72 79 20 64 6f 63 75 6d 65 6e 74 7d 20  query document} 
0280: 7b 0a 66 6f 72 65 61 63 68 5f 64 65 74 61 69 6c  {.foreach_detail
0290: 5f 6d 6f 64 65 20 24 74 65 73 74 70 72 65 66 69  _mode $testprefi
02a0: 78 20 7b 0a 0a 66 74 73 35 5f 74 63 6c 6e 75 6d  x {..fts5_tclnum
02b0: 5f 72 65 67 69 73 74 65 72 20 64 62 0a 66 74 73  _register db.fts
02c0: 35 5f 61 75 78 5f 74 65 73 74 5f 66 75 6e 63 74  5_aux_test_funct
02d0: 69 6f 6e 73 20 64 62 0a 0a 70 72 6f 63 20 66 74  ions db..proc ft
02e0: 73 35 5f 74 65 73 74 5f 62 6f 74 68 6c 69 73 74  s5_test_bothlist
02f0: 20 7b 63 6d 64 7d 20 7b 0a 0a 20 20 66 6f 72 20   {cmd} {..  for 
0300: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
0310: 5b 24 63 6d 64 20 78 50 68 72 61 73 65 43 6f 75  [$cmd xPhraseCou
0320: 6e 74 5d 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  nt]} {incr i} {.
0330: 20 20 20 20 73 65 74 20 62 46 69 72 73 74 20 31      set bFirst 1
0340: 0a 20 20 20 20 24 63 6d 64 20 78 50 68 72 61 73  .    $cmd xPhras
0350: 65 43 6f 6c 75 6d 6e 46 6f 72 65 61 63 68 20 24  eColumnForeach $
0360: 69 20 63 20 7b 20 0a 20 20 20 20 20 20 6c 61 70  i c { .      lap
0370: 70 65 6e 64 20 43 4c 20 24 69 2e 24 63 20 0a 20  pend CL $i.$c . 
0380: 20 20 20 20 20 69 66 20 7b 24 62 46 69 72 73 74       if {$bFirst
0390: 7d 20 7b 20 24 63 6d 64 20 78 50 68 72 61 73 65  } { $cmd xPhrase
03a0: 46 6f 72 65 61 63 68 20 24 69 20 63 20 6f 20 7b  Foreach $i c o {
03b0: 20 6c 61 70 70 65 6e 64 20 50 4c 20 24 69 2e 24   lappend PL $i.$
03c0: 63 2e 24 6f 20 7d 20 7d 0a 20 20 20 20 20 20 73  c.$o } }.      s
03d0: 65 74 20 62 46 69 72 73 74 20 30 0a 20 20 20 20  et bFirst 0.    
03e0: 7d 0a 20 20 7d 0a 0a 20 20 6c 69 73 74 20 5b 73  }.  }..  list [s
03f0: 6f 72 74 5f 70 6f 73 6c 69 73 74 20 24 50 4c 5d  ort_poslist $PL]
0400: 20 24 43 4c 0a 7d 0a 73 71 6c 69 74 65 33 5f 66   $CL.}.sqlite3_f
0410: 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  ts5_create_funct
0420: 69 6f 6e 20 64 62 20 66 74 73 35 5f 74 65 73 74  ion db fts5_test
0430: 5f 62 6f 74 68 6c 69 73 74 20 66 74 73 35 5f 74  _bothlist fts5_t
0440: 65 73 74 5f 62 6f 74 68 6c 69 73 74 0a 0a 70 72  est_bothlist..pr
0450: 6f 63 20 66 74 73 35 5f 72 6f 77 69 64 20 7b 63  oc fts5_rowid {c
0460: 6d 64 7d 20 7b 20 65 78 70 72 20 5b 24 63 6d 64  md} { expr [$cmd
0470: 20 78 43 6f 6c 75 6d 6e 54 65 78 74 20 2d 31 5d   xColumnText -1]
0480: 20 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f   }.sqlite3_fts5_
0490: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
04a0: 64 62 20 66 74 73 35 5f 72 6f 77 69 64 20 66 74  db fts5_rowid ft
04b0: 73 35 5f 72 6f 77 69 64 0a 0a 64 6f 5f 65 78 65  s5_rowid..do_exe
04c0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 24 74 6f 6b  csql_test 1.$tok
04d0: 2e 30 2e 31 20 22 0a 20 20 43 52 45 41 54 45 20  .0.1 ".  CREATE 
04e0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 73  VIRTUAL TABLE ss
04f0: 20 55 53 49 4e 47 20 66 74 73 35 28 61 2c 20 62   USING fts5(a, b
0500: 2c 20 0a 20 20 20 20 20 20 20 74 6f 6b 65 6e 69  , .       tokeni
0510: 7a 65 3d 27 74 63 6c 6e 75 6d 20 24 74 6f 6b 27  ze='tclnum $tok'
0520: 2c 20 64 65 74 61 69 6c 3d 25 44 45 54 41 49 4c  , detail=%DETAIL
0530: 25 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  %);.  INSERT INT
0540: 4f 20 73 73 28 73 73 2c 20 72 61 6e 6b 29 20 56  O ss(ss, rank) V
0550: 41 4c 55 45 53 28 27 72 61 6e 6b 27 2c 20 27 66  ALUES('rank', 'f
0560: 74 73 35 5f 72 6f 77 69 64 28 29 27 29 3b 0a 22  ts5_rowid()');."
0570: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0580: 74 20 31 2e 24 74 6f 6b 2e 30 2e 32 20 7b 0a 20  t 1.$tok.0.2 {. 
0590: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20   INSERT INTO ss 
05a0: 56 41 4c 55 45 53 28 27 35 20 35 20 66 69 76 65  VALUES('5 5 five
05b0: 20 73 65 76 65 6e 20 33 20 73 65 76 65 6e 20 69   seven 3 seven i
05c0: 27 2c 20 27 32 20 31 20 35 20 30 20 74 77 6f 20  ', '2 1 5 0 two 
05d0: 31 20 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  1 i');.  INSERT 
05e0: 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28 27  INTO ss VALUES('
05f0: 73 69 78 20 69 78 20 69 69 69 20 37 20 69 20 76  six ix iii 7 i v
0600: 69 69 20 69 69 69 27 2c 20 27 6f 6e 65 20 73 65  ii iii', 'one se
0610: 76 65 6e 20 6e 69 6e 65 20 34 20 39 20 31 20 76  ven nine 4 9 1 v
0620: 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  i');.  INSERT IN
0630: 54 4f 20 73 73 20 56 41 4c 55 45 53 28 27 36 20  TO ss VALUES('6 
0640: 76 69 69 69 20 69 20 66 69 76 65 20 73 69 78 20  viii i five six 
0650: 7a 65 72 6f 20 73 65 76 65 6e 27 2c 20 27 35 20  zero seven', '5 
0660: 76 20 69 69 69 20 69 76 20 69 76 20 33 27 29 3b  v iii iv iv 3');
0670: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73  .  INSERT INTO s
0680: 73 20 56 41 4c 55 45 53 28 27 39 20 69 69 20 73  s VALUES('9 ii s
0690: 69 78 20 38 20 31 20 36 27 2c 20 27 73 69 78 20  ix 8 1 6', 'six 
06a0: 34 20 69 76 20 69 76 20 37 27 29 3b 0a 20 20 49  4 iv iv 7');.  I
06b0: 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41  NSERT INTO ss VA
06c0: 4c 55 45 53 28 27 31 20 35 20 34 20 65 69 67 68  LUES('1 5 4 eigh
06d0: 74 20 69 69 20 69 76 20 69 69 69 27 2c 20 27 6e  t ii iv iii', 'n
06e0: 69 6e 65 20 32 20 65 69 67 68 74 20 69 78 20 76  ine 2 eight ix v
06f0: 20 76 69 69 27 29 3b 0a 20 20 49 4e 53 45 52 54   vii');.  INSERT
0700: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
0710: 27 6f 6e 65 20 37 20 73 65 76 65 6e 20 73 69 78  'one 7 seven six
0720: 20 32 20 74 77 6f 27 2c 20 27 31 20 32 20 66 6f   2 two', '1 2 fo
0730: 75 72 20 37 20 34 20 33 20 34 27 29 3b 0a 20 20  ur 7 4 3 4');.  
0740: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56  INSERT INTO ss V
0750: 41 4c 55 45 53 28 27 65 69 67 68 74 20 69 76 20  ALUES('eight iv 
0760: 34 20 6e 69 6e 65 20 76 69 69 20 73 69 78 20 31  4 nine vii six 1
0770: 27 2c 20 27 35 20 36 20 76 20 6f 6e 65 20 7a 65  ', '5 6 v one ze
0780: 72 6f 20 34 27 29 3b 0a 20 20 49 4e 53 45 52 54  ro 4');.  INSERT
0790: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
07a0: 27 76 20 39 20 38 20 69 69 69 20 34 27 2c 20 27  'v 9 8 iii 4', '
07b0: 39 20 34 20 73 65 76 65 6e 20 74 77 6f 20 76 69  9 4 seven two vi
07c0: 20 76 69 69 27 29 3b 0a 20 20 49 4e 53 45 52 54   vii');.  INSERT
07d0: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
07e0: 27 33 20 69 78 20 74 77 6f 20 39 20 30 20 6e 69  '3 ix two 9 0 ni
07f0: 6e 65 20 69 27 2c 20 27 66 69 76 65 20 69 69 20  ne i', 'five ii 
0800: 6e 69 6e 65 20 74 77 6f 20 76 69 69 69 20 69 20  nine two viii i 
0810: 66 69 76 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  five');.  INSERT
0820: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
0830: 27 73 69 78 20 69 69 69 20 39 20 74 77 6f 20 65  'six iii 9 two e
0840: 69 67 68 74 20 32 27 2c 20 27 6e 69 6e 65 20 69  ight 2', 'nine i
0850: 20 6e 69 6e 65 20 76 69 69 20 6e 69 6e 65 27 29   nine vii nine')
0860: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0870: 73 73 20 56 41 4c 55 45 53 28 27 36 20 74 68 72  ss VALUES('6 thr
0880: 65 65 20 7a 65 72 6f 20 73 65 76 65 6e 20 76 69  ee zero seven vi
0890: 69 20 66 69 76 65 27 2c 20 27 38 20 76 69 69 20  i five', '8 vii 
08a0: 69 78 20 30 20 37 20 73 65 76 65 6e 27 29 3b 0a  ix 0 7 seven');.
08b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73    INSERT INTO ss
08c0: 20 56 41 4c 55 45 53 28 27 38 20 76 69 69 20 38   VALUES('8 vii 8
08d0: 20 37 20 33 20 34 27 2c 20 27 65 69 67 68 74 20   7 3 4', 'eight 
08e0: 69 69 69 20 66 6f 75 72 20 76 69 69 69 20 6e 69  iii four viii ni
08f0: 6e 65 20 69 76 20 74 68 72 65 65 27 29 3b 0a 20  ne iv three');. 
0900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20   INSERT INTO ss 
0910: 56 41 4c 55 45 53 28 27 34 20 76 20 37 20 74 77  VALUES('4 v 7 tw
0920: 6f 20 30 20 6f 6e 65 20 38 27 2c 20 27 76 69 69  o 0 one 8', 'vii
0930: 20 31 20 74 77 6f 20 66 69 76 65 20 69 20 7a 65   1 two five i ze
0940: 72 6f 20 39 27 29 3b 0a 20 20 49 4e 53 45 52 54  ro 9');.  INSERT
0950: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
0960: 27 33 20 69 69 20 76 69 69 20 76 69 20 65 69 67  '3 ii vii vi eig
0970: 68 74 27 2c 20 27 38 20 34 20 69 78 20 6f 6e 65  ht', '8 4 ix one
0980: 20 74 68 72 65 65 20 65 69 67 68 74 27 29 3b 0a   three eight');.
0990: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73    INSERT INTO ss
09a0: 20 56 41 4c 55 45 53 28 27 69 76 20 65 69 67 68   VALUES('iv eigh
09b0: 74 20 73 65 76 65 6e 20 36 20 39 20 73 65 76 65  t seven 6 9 seve
09c0: 6e 27 2c 20 27 6f 6e 65 20 76 69 20 74 77 6f 20  n', 'one vi two 
09d0: 66 69 76 65 20 73 65 76 65 6e 27 29 3b 0a 20 20  five seven');.  
09e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56  INSERT INTO ss V
09f0: 41 4c 55 45 53 28 27 69 20 69 20 35 20 69 20 76  ALUES('i i 5 i v
0a00: 20 76 69 69 20 65 69 67 68 74 27 2c 20 27 32 20   vii eight', '2 
0a10: 73 65 76 65 6e 20 69 20 32 20 32 20 66 6f 75 72  seven i 2 2 four
0a20: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
0a30: 4f 20 73 73 20 56 41 4c 55 45 53 28 27 30 20 69  O ss VALUES('0 i
0a40: 20 69 69 69 20 6e 69 6e 65 20 33 20 69 78 20 66   iii nine 3 ix f
0a50: 69 76 65 27 2c 20 27 30 20 65 69 67 68 74 20 69  ive', '0 eight i
0a60: 76 20 30 20 73 69 78 20 32 27 29 3b 0a 20 20 49  v 0 six 2');.  I
0a70: 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41  NSERT INTO ss VA
0a80: 4c 55 45 53 28 27 69 76 20 76 69 69 20 74 68 72  LUES('iv vii thr
0a90: 65 65 20 33 20 39 20 6f 6e 65 20 38 27 2c 20 27  ee 3 9 one 8', '
0aa0: 32 20 69 69 20 36 20 65 69 67 68 74 20 69 69 20  2 ii 6 eight ii 
0ab0: 73 69 78 20 73 69 78 27 29 3b 0a 20 20 49 4e 53  six six');.  INS
0ac0: 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55  ERT INTO ss VALU
0ad0: 45 53 28 27 65 69 67 68 74 20 6f 6e 65 20 74 77  ES('eight one tw
0ae0: 6f 20 6e 69 6e 65 20 73 69 78 27 2c 20 27 38 20  o nine six', '8 
0af0: 39 20 33 20 76 69 69 69 20 76 69 27 29 3b 0a 20  9 3 viii vi');. 
0b00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20   INSERT INTO ss 
0b10: 56 41 4c 55 45 53 28 27 6f 6e 65 20 30 20 66 6f  VALUES('one 0 fo
0b20: 75 72 20 69 69 20 65 69 67 68 74 20 6f 6e 65 20  ur ii eight one 
0b30: 33 27 2c 20 27 69 69 69 20 65 69 67 68 74 20 76  3', 'iii eight v
0b40: 69 20 76 69 20 76 69 27 29 3b 0a 20 20 49 4e 53  i vi vi');.  INS
0b50: 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55  ERT INTO ss VALU
0b60: 45 53 28 27 34 20 30 20 65 69 67 68 74 20 30 20  ES('4 0 eight 0 
0b70: 30 27 2c 20 27 31 20 66 6f 75 72 20 6f 6e 65 20  0', '1 four one 
0b80: 76 69 69 20 73 65 76 65 6e 20 69 69 27 29 3b 0a  vii seven ii');.
0b90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73    INSERT INTO ss
0ba0: 20 56 41 4c 55 45 53 28 27 31 20 7a 65 72 6f 20   VALUES('1 zero 
0bb0: 6e 69 6e 65 20 32 20 32 27 2c 20 27 76 69 69 69  nine 2 2', 'viii
0bc0: 20 69 76 20 74 77 6f 20 76 69 20 6e 69 6e 65 20   iv two vi nine 
0bd0: 76 20 69 69 69 27 29 3b 0a 20 20 49 4e 53 45 52  v iii');.  INSER
0be0: 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53  T INTO ss VALUES
0bf0: 28 27 35 20 66 69 76 65 20 76 69 69 69 20 66 6f  ('5 five viii fo
0c00: 75 72 20 66 6f 75 72 20 76 69 27 2c 20 27 38 20  ur four vi', '8 
0c10: 66 69 76 65 20 37 20 76 69 69 20 36 20 34 27 29  five 7 vii 6 4')
0c20: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0c30: 73 73 20 56 41 4c 55 45 53 28 27 37 20 69 78 20  ss VALUES('7 ix 
0c40: 66 6f 75 72 20 38 20 76 69 69 27 2c 20 27 6e 69  four 8 vii', 'ni
0c50: 6e 65 20 74 68 72 65 65 20 6e 69 6e 65 20 69 69  ne three nine ii
0c60: 20 69 78 20 76 69 69 27 29 3b 0a 20 20 49 4e 53   ix vii');.  INS
0c70: 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55  ERT INTO ss VALU
0c80: 45 53 28 27 6e 69 6e 65 20 69 76 20 76 20 69 20  ES('nine iv v i 
0c90: 30 20 76 27 2c 20 27 74 77 6f 20 69 76 20 76 69  0 v', 'two iv vi
0ca0: 69 20 73 69 78 20 69 20 69 78 20 34 27 29 3b 0a  i six i ix 4');.
0cb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73    INSERT INTO ss
0cc0: 20 56 41 4c 55 45 53 28 27 6f 6e 65 20 76 20 76   VALUES('one v v
0cd0: 20 6f 6e 65 20 76 69 69 69 20 33 20 38 27 2c 20   one viii 3 8', 
0ce0: 27 32 20 31 20 33 20 66 69 76 65 20 69 69 69 27  '2 1 3 five iii'
0cf0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0d00: 20 73 73 20 56 41 4c 55 45 53 28 27 73 69 78 20   ss VALUES('six 
0d10: 69 69 20 35 20 6e 69 6e 65 20 34 20 76 69 69 69  ii 5 nine 4 viii
0d20: 20 73 65 76 65 6e 27 2c 20 27 65 69 67 68 74 20   seven', 'eight 
0d30: 69 20 69 78 20 69 78 20 37 20 66 6f 75 72 27 29  i ix ix 7 four')
0d40: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0d50: 73 73 20 56 41 4c 55 45 53 28 27 39 20 69 69 20  ss VALUES('9 ii 
0d60: 74 77 6f 20 73 65 76 65 6e 20 74 68 72 65 65 20  two seven three 
0d70: 37 20 30 27 2c 20 27 73 69 78 20 76 69 69 69 20  7 0', 'six viii 
0d80: 73 65 76 65 6e 20 37 20 66 69 76 65 27 29 3b 0a  seven 7 five');.
0d90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73    INSERT INTO ss
0da0: 20 56 41 4c 55 45 53 28 27 66 69 76 65 20 74 77   VALUES('five tw
0db0: 6f 20 34 20 76 69 69 69 20 6e 69 6e 65 27 2c 20  o 4 viii nine', 
0dc0: 27 39 20 37 20 6e 69 6e 65 20 7a 65 72 6f 20 31  '9 7 nine zero 1
0dd0: 20 74 77 6f 20 6f 6e 65 27 29 3b 0a 20 20 49 4e   two one');.  IN
0de0: 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c  SERT INTO ss VAL
0df0: 55 45 53 28 27 76 69 69 69 20 38 20 69 69 69 20  UES('viii 8 iii 
0e00: 69 20 69 69 20 38 20 33 27 2c 20 27 34 20 32 20  i ii 8 3', '4 2 
0e10: 37 20 76 20 38 20 38 27 29 3b 0a 20 20 49 4e 53  7 v 8 8');.  INS
0e20: 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55  ERT INTO ss VALU
0e30: 45 53 28 27 66 6f 75 72 20 76 69 69 20 34 20 69  ES('four vii 4 i
0e40: 69 69 20 7a 65 72 6f 20 30 20 76 69 69 27 2c 20  ii zero 0 vii', 
0e50: 27 33 20 76 69 69 69 20 69 69 69 20 7a 65 72 6f  '3 viii iii zero
0e60: 20 39 20 69 27 29 3b 0a 20 20 49 4e 53 45 52 54   9 i');.  INSERT
0e70: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
0e80: 27 30 20 73 65 76 65 6e 20 76 20 66 69 76 65 20  '0 seven v five 
0e90: 69 20 66 69 76 65 20 76 27 2c 20 27 6f 6e 65 20  i five v', 'one 
0ea0: 34 20 32 20 69 78 20 39 27 29 3b 0a 20 20 49 4e  4 2 ix 9');.  IN
0eb0: 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c  SERT INTO ss VAL
0ec0: 55 45 53 28 27 74 77 6f 20 35 20 74 77 6f 20 74  UES('two 5 two t
0ed0: 77 6f 20 69 78 20 34 20 31 27 2c 20 27 33 20 6e  wo ix 4 1', '3 n
0ee0: 69 6e 65 20 69 69 20 76 20 6e 69 6e 65 20 33 20  ine ii v nine 3 
0ef0: 66 69 76 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  five');.  INSERT
0f00: 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28   INTO ss VALUES(
0f10: 27 66 69 76 65 20 35 20 37 20 34 20 36 20 76 69  'five 5 7 4 6 vi
0f20: 69 27 2c 20 27 74 68 72 65 65 20 32 20 69 78 20  i', 'three 2 ix 
0f30: 32 20 38 20 36 27 29 3b 0a 20 20 49 4e 53 45 52  2 8 6');.  INSER
0f40: 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53  T INTO ss VALUES
0f50: 28 27 73 69 78 20 69 69 69 20 76 69 20 69 76 20  ('six iii vi iv 
0f60: 73 65 76 65 6e 20 65 69 67 68 74 27 2c 20 27 38  seven eight', '8
0f70: 20 73 69 78 20 37 20 30 20 34 27 29 3b 0a 20 20   six 7 0 4');.  
0f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56  INSERT INTO ss V
0f90: 41 4c 55 45 53 28 27 76 69 20 76 69 20 69 76 20  ALUES('vi vi iv 
0fa0: 33 20 30 20 6f 6e 65 20 6f 6e 65 27 2c 20 27 39  3 0 one one', '9
0fb0: 20 36 20 65 69 67 68 74 20 69 78 20 69 76 27 29   6 eight ix iv')
0fc0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0fd0: 73 73 20 56 41 4c 55 45 53 28 27 37 20 32 20 32  ss VALUES('7 2 2
0fe0: 20 69 69 69 20 30 27 2c 20 27 30 20 30 20 73 65   iii 0', '0 0 se
0ff0: 76 65 6e 20 31 20 6e 69 6e 65 27 29 3b 0a 20 20  ven 1 nine');.  
1000: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56  INSERT INTO ss V
1010: 41 4c 55 45 53 28 27 38 20 36 20 69 76 20 73 69  ALUES('8 6 iv si
1020: 78 20 69 69 27 2c 20 27 69 76 20 36 20 33 20 34  x ii', 'iv 6 3 4
1030: 20 69 69 20 66 69 76 65 27 29 3b 0a 20 20 49 4e   ii five');.  IN
1040: 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c  SERT INTO ss VAL
1050: 55 45 53 28 27 30 20 74 77 6f 20 74 77 6f 20 73  UES('0 two two s
1060: 65 76 65 6e 20 69 69 27 2c 20 27 76 69 69 20 69  even ii', 'vii i
1070: 78 20 66 6f 75 72 20 34 20 7a 65 72 6f 20 76 69  x four 4 zero vi
1080: 20 76 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   vi');.  INSERT 
1090: 49 4e 54 4f 20 73 73 20 56 41 4c 55 45 53 28 27  INTO ss VALUES('
10a0: 32 20 6f 6e 65 20 65 69 67 68 74 20 38 20 39 20  2 one eight 8 9 
10b0: 37 27 2c 20 27 76 69 20 33 20 30 20 33 20 76 69  7', 'vi 3 0 3 vi
10c0: 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  i');.  INSERT IN
10d0: 54 4f 20 73 73 20 56 41 4c 55 45 53 28 27 69 69  TO ss VALUES('ii
10e0: 69 20 69 69 20 69 78 20 69 76 20 74 68 72 65 65  i ii ix iv three
10f0: 27 2c 20 27 76 69 20 69 20 36 20 31 20 74 77 6f  ', 'vi i 6 1 two
1100: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
1110: 4f 20 73 73 20 56 41 4c 55 45 53 28 27 65 69 67  O ss VALUES('eig
1120: 68 74 20 66 6f 75 72 20 6e 69 6e 65 20 38 20 73  ht four nine 8 s
1130: 65 76 65 6e 27 2c 20 27 6f 6e 65 20 74 68 72 65  even', 'one thre
1140: 65 20 69 20 6e 69 6e 65 20 69 69 69 20 6f 6e 65  e i nine iii one
1150: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
1160: 4f 20 73 73 20 56 41 4c 55 45 53 28 27 69 69 69  O ss VALUES('iii
1170: 20 73 65 76 65 6e 20 66 69 76 65 20 69 78 20 38   seven five ix 8
1180: 27 2c 20 27 69 69 20 37 20 73 65 76 65 6e 20 30  ', 'ii 7 seven 0
1190: 20 66 6f 75 72 20 69 69 27 29 3b 0a 20 20 49 4e   four ii');.  IN
11a0: 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c  SERT INTO ss VAL
11b0: 55 45 53 28 27 66 6f 75 72 20 30 20 31 20 35 20  UES('four 0 1 5 
11c0: 74 77 6f 27 2c 20 27 69 69 69 20 39 20 35 20 69  two', 'iii 9 5 i
11d0: 69 20 69 69 20 32 20 34 27 29 3b 0a 20 20 49 4e  i ii 2 4');.  IN
11e0: 53 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c  SERT INTO ss VAL
11f0: 55 45 53 28 27 69 69 69 20 6e 69 6e 65 20 66 6f  UES('iii nine fo
1200: 75 72 20 76 69 20 38 20 66 69 76 65 20 73 69 78  ur vi 8 five six
1210: 27 2c 20 27 69 20 69 20 69 69 20 73 65 76 65 6e  ', 'i i ii seven
1220: 20 76 69 20 76 69 69 27 29 3b 0a 20 20 49 4e 53   vi vii');.  INS
1230: 45 52 54 20 49 4e 54 4f 20 73 73 20 56 41 4c 55  ERT INTO ss VALU
1240: 45 53 28 27 65 69 67 68 74 20 76 69 69 20 65 69  ES('eight vii ei
1250: 67 68 74 20 73 69 78 20 33 27 2c 20 27 69 20 76  ght six 3', 'i v
1260: 69 69 20 31 20 73 69 78 20 39 20 76 69 69 27 29  ii 1 six 9 vii')
1270: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1280: 73 73 20 56 41 4c 55 45 53 28 27 39 20 30 20 76  ss VALUES('9 0 v
1290: 69 69 69 20 76 69 69 69 20 66 69 76 65 27 2c 20  iii viii five', 
12a0: 27 69 20 31 20 76 69 69 69 20 69 78 20 33 20 34  'i 1 viii ix 3 4
12b0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12c0: 4f 20 73 73 20 56 41 4c 55 45 53 28 27 74 68 72  O ss VALUES('thr
12d0: 65 65 20 6e 69 6e 65 20 35 20 6e 69 6e 65 20 76  ee nine 5 nine v
12e0: 69 69 69 20 66 6f 75 72 20 7a 65 72 6f 27 2c 20  iii four zero', 
12f0: 27 69 69 20 69 20 31 20 35 20 32 20 76 69 69 69  'ii i 1 5 2 viii
1300: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
1310: 4f 20 73 73 20 56 41 4c 55 45 53 28 27 35 20 76  O ss VALUES('5 v
1320: 69 69 20 74 68 72 65 65 20 39 20 66 6f 75 72 27  ii three 9 four'
1330: 2c 20 27 74 68 72 65 65 20 66 69 76 65 20 6f 6e  , 'three five on
1340: 65 20 37 20 32 20 65 69 67 68 74 20 6f 6e 65 27  e 7 2 eight one'
1350: 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  );.}..foreach {t
1360: 6e 20 65 78 70 72 7d 20 7b 0a 20 20 32 2e 31 20  n expr} {.  2.1 
1370: 22 6f 6e 65 20 4f 52 20 74 77 6f 20 4f 52 20 74  "one OR two OR t
1380: 68 72 65 65 20 4f 52 20 66 6f 75 72 22 0a 0a 20  hree OR four".. 
1390: 20 31 2e 31 20 22 6f 6e 65 22 20 20 20 31 2e 32   1.1 "one"   1.2
13a0: 20 22 74 77 6f 22 20 20 20 31 2e 33 20 22 74 68   "two"   1.3 "th
13b0: 72 65 65 22 20 20 20 31 2e 34 20 22 66 6f 75 72  ree"   1.4 "four
13c0: 22 0a 20 20 31 2e 35 20 22 76 22 20 20 20 20 20  ".  1.5 "v"     
13d0: 31 2e 36 20 22 76 69 22 20 20 20 20 31 2e 37 20  1.6 "vi"    1.7 
13e0: 22 76 69 69 22 20 20 20 20 20 31 2e 38 20 22 76  "vii"     1.8 "v
13f0: 69 69 69 22 0a 20 20 31 2e 39 20 22 39 22 20 20  iii".  1.9 "9"  
1400: 20 20 31 2e 31 30 20 22 30 22 20 20 20 20 31 2e    1.10 "0"    1.
1410: 31 31 20 22 31 22 20 20 20 20 20 20 31 2e 31 32  11 "1"      1.12
1420: 20 22 32 22 0a 0a 20 20 32 2e 31 20 22 6f 6e 65   "2"..  2.1 "one
1430: 20 4f 52 20 74 77 6f 20 4f 52 20 74 68 72 65 65   OR two OR three
1440: 20 4f 52 20 66 6f 75 72 22 0a 20 20 32 2e 32 20   OR four".  2.2 
1450: 22 28 6f 6e 65 20 41 4e 44 20 74 77 6f 29 20 4f  "(one AND two) O
1460: 52 20 28 74 68 72 65 65 20 41 4e 44 20 66 6f 75  R (three AND fou
1470: 72 29 22 0a 20 20 32 2e 33 20 22 28 6f 6e 65 20  r)".  2.3 "(one 
1480: 41 4e 44 20 74 77 6f 29 20 4f 52 20 28 74 68 72  AND two) OR (thr
1490: 65 65 20 41 4e 44 20 66 6f 75 72 29 20 4e 4f 54  ee AND four) NOT
14a0: 20 66 69 76 65 22 0a 20 20 32 2e 34 20 22 28 6f   five".  2.4 "(o
14b0: 6e 65 20 41 4e 44 20 74 77 6f 29 20 4e 4f 54 20  ne AND two) NOT 
14c0: 36 22 0a 0a 20 20 33 2e 31 20 22 62 3a 6f 6e 65  6"..  3.1 "b:one
14d0: 20 41 4e 44 20 61 3a 74 77 6f 22 0a 20 20 33 2e   AND a:two".  3.
14e0: 32 20 22 62 3a 6f 6e 65 20 4f 52 20 61 3a 74 77  2 "b:one OR a:tw
14f0: 6f 22 0a 20 20 33 2e 33 20 22 61 3a 6f 6e 65 20  o".  3.3 "a:one 
1500: 4f 52 20 62 3a 31 20 4f 52 20 7b 61 20 62 7d 20  OR b:1 OR {a b} 
1510: 3a 20 69 22 0a 0a 20 20 34 2e 31 20 22 4e 45 41  : i"..  4.1 "NEA
1520: 52 28 6f 6e 65 20 74 77 6f 2c 20 32 29 22 0a 20  R(one two, 2)". 
1530: 20 34 2e 32 20 22 4e 45 41 52 28 6f 6e 65 20 74   4.2 "NEAR(one t
1540: 77 6f 20 74 68 72 65 65 2c 20 32 29 22 0a 20 20  wo three, 2)".  
1550: 34 2e 33 20 22 4e 45 41 52 28 65 69 67 68 74 20  4.3 "NEAR(eight 
1560: 6e 69 6e 65 2c 20 31 29 20 4f 52 20 4e 45 41 52  nine, 1) OR NEAR
1570: 28 73 69 78 20 73 65 76 65 6e 2c 20 31 29 22 0a  (six seven, 1)".
1580: 7d 20 7b 0a 20 20 69 66 20 7b 5b 66 74 73 35 5f  } {.  if {[fts5_
1590: 65 78 70 72 5f 6f 6b 20 24 65 78 70 72 20 73 73  expr_ok $expr ss
15a0: 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 64 6f 5f 74  ]==0} {.    do_t
15b0: 65 73 74 20 31 2e 24 74 6f 6b 2e 24 74 6e 2e 4f  est 1.$tok.$tn.O
15c0: 4d 49 54 54 45 44 20 7b 20 6c 69 73 74 20 7d 20  MITTED { list } 
15d0: 5b 6c 69 73 74 5d 0a 20 20 20 20 63 6f 6e 74 69  [list].    conti
15e0: 6e 75 65 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72  nue.  }..  set r
15f0: 65 73 20 5b 66 74 73 35 5f 71 75 65 72 79 5f 64  es [fts5_query_d
1600: 61 74 61 20 24 65 78 70 72 20 73 73 20 41 53 43  ata $expr ss ASC
1610: 20 3a 3a 74 63 6c 6e 75 6d 5f 73 79 6e 5d 0a 20   ::tclnum_syn]. 
1620: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
1630: 20 31 2e 24 74 6f 6b 2e 24 74 6e 2e 5b 6c 6c 65   1.$tok.$tn.[lle
1640: 6e 67 74 68 20 24 72 65 73 5d 2e 61 73 63 2e 31  ngth $res].asc.1
1650: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
1660: 77 69 64 2c 20 66 74 73 35 5f 74 65 73 74 5f 70  wid, fts5_test_p
1670: 6f 73 6c 69 73 74 32 28 73 73 29 2c 20 66 74 73  oslist2(ss), fts
1680: 35 5f 74 65 73 74 5f 63 6f 6c 6c 69 73 74 28 73  5_test_collist(s
1690: 73 29 20 46 52 4f 4d 20 73 73 28 24 65 78 70 72  s) FROM ss($expr
16a0: 29 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 64 6f  ).  } $res..  do
16b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
16c0: 24 74 6f 6b 2e 24 74 6e 2e 5b 6c 6c 65 6e 67 74  $tok.$tn.[llengt
16d0: 68 20 24 72 65 73 5d 2e 61 73 63 2e 32 20 7b 0a  h $res].asc.2 {.
16e0: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
16f0: 2c 20 66 74 73 35 5f 74 65 73 74 5f 70 6f 73 6c  , fts5_test_posl
1700: 69 73 74 28 73 73 29 2c 20 66 74 73 35 5f 74 65  ist(ss), fts5_te
1710: 73 74 5f 63 6f 6c 6c 69 73 74 28 73 73 29 20 46  st_collist(ss) F
1720: 52 4f 4d 20 73 73 28 24 65 78 70 72 29 0a 20 20  ROM ss($expr).  
1730: 7d 20 24 72 65 73 0a 0a 20 20 64 6f 5f 65 78 65  } $res..  do_exe
1740: 63 73 71 6c 5f 74 65 73 74 20 31 2e 24 74 6f 6b  csql_test 1.$tok
1750: 2e 24 74 6e 2e 5b 6c 6c 65 6e 67 74 68 20 24 72  .$tn.[llength $r
1760: 65 73 5d 2e 61 73 63 2e 32 20 7b 0a 20 20 20 20  es].asc.2 {.    
1770: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 66 74  SELECT rowid, ft
1780: 73 35 5f 74 65 73 74 5f 70 6f 73 6c 69 73 74 32  s5_test_poslist2
1790: 28 73 73 29 2c 20 66 74 73 35 5f 74 65 73 74 5f  (ss), fts5_test_
17a0: 63 6f 6c 6c 69 73 74 28 73 73 29 20 46 52 4f 4d  collist(ss) FROM
17b0: 20 73 73 28 24 65 78 70 72 29 0a 20 20 20 20 4f   ss($expr).    O
17c0: 52 44 45 52 20 42 59 20 72 61 6e 6b 20 41 53 43  RDER BY rank ASC
17d0: 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 73 65 74  .  } $res..  set
17e0: 20 72 65 73 32 20 5b 6c 69 73 74 5d 0a 20 20 66   res2 [list].  f
17f0: 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 24  oreach {a b c} $
1800: 72 65 73 20 7b 20 6c 61 70 70 65 6e 64 20 72 65  res { lappend re
1810: 73 32 20 24 61 20 24 63 20 24 62 20 7d 0a 20 20  s2 $a $c $b }.  
1820: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1830: 31 2e 24 74 6f 6b 2e 24 74 6e 2e 5b 6c 6c 65 6e  1.$tok.$tn.[llen
1840: 67 74 68 20 24 72 65 73 5d 2e 61 73 63 2e 33 20  gth $res].asc.3 
1850: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  {.    SELECT row
1860: 69 64 2c 20 66 74 73 35 5f 74 65 73 74 5f 63 6f  id, fts5_test_co
1870: 6c 6c 69 73 74 28 73 73 29 2c 20 66 74 73 35 5f  llist(ss), fts5_
1880: 74 65 73 74 5f 70 6f 73 6c 69 73 74 32 28 73 73  test_poslist2(ss
1890: 29 20 46 52 4f 4d 20 73 73 28 24 65 78 70 72 29  ) FROM ss($expr)
18a0: 0a 20 20 7d 20 24 72 65 73 32 0a 0a 20 20 73 65  .  } $res2..  se
18b0: 74 20 72 65 73 33 20 5b 6c 69 73 74 5d 0a 20 20  t res3 [list].  
18c0: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
18d0: 24 72 65 73 20 7b 20 6c 61 70 70 65 6e 64 20 72  $res { lappend r
18e0: 65 73 33 20 24 61 20 5b 6c 69 73 74 20 24 62 20  es3 $a [list $b 
18f0: 24 63 5d 20 7d 0a 20 20 64 6f 5f 65 78 65 63 73  $c] }.  do_execs
1900: 71 6c 5f 74 65 73 74 20 31 2e 24 74 6f 6b 2e 24  ql_test 1.$tok.$
1910: 74 6e 2e 5b 6c 6c 65 6e 67 74 68 20 24 72 65 73  tn.[llength $res
1920: 5d 2e 61 73 63 2e 33 20 7b 0a 20 20 20 20 53 45  ].asc.3 {.    SE
1930: 4c 45 43 54 20 72 6f 77 69 64 2c 20 66 74 73 35  LECT rowid, fts5
1940: 5f 74 65 73 74 5f 62 6f 74 68 6c 69 73 74 28 73  _test_bothlist(s
1950: 73 29 20 46 52 4f 4d 20 73 73 28 24 65 78 70 72  s) FROM ss($expr
1960: 29 0a 20 20 7d 20 24 72 65 73 33 0a 0a 0a 7d 0a  ).  } $res3...}.
1970: 0a 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  .}.}..finish_tes
1980: 74 0a                                            t.