/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 2163b0013e824bba65499da9e34ea4da41349cc2:


0000: 23 20 32 30 31 35 20 41 75 67 75 73 74 20 30 35  # 2015 August 05
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you 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 2a 2a 2a 0a 23 0a 0a 73 6f 75 72 63 65  ******.#..source
0170: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c   [file join [fil
0180: 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
0190: 73 63 72 69 70 74 5d 5d 20 66 74 73 35 5f 63 6f  script]] fts5_co
01a0: 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 65 74 20 74 65  mmon.tcl].set te
01b0: 73 74 70 72 65 66 69 78 20 66 74 73 35 6d 61 74  stprefix fts5mat
01c0: 63 68 69 6e 66 6f 0a 0a 23 20 49 66 20 53 51 4c  chinfo..# If SQL
01d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 20  ITE_ENABLE_FTS5 
01e0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
01f0: 6f 6d 69 74 20 74 68 69 73 20 66 69 6c 65 2e 0a  omit this file..
0200: 69 66 63 61 70 61 62 6c 65 20 21 66 74 73 35 20  ifcapable !fts5 
0210: 7b 20 66 69 6e 69 73 68 5f 74 65 73 74 20 3b 20  { finish_test ; 
0220: 72 65 74 75 72 6e 20 7d 0a 0a 70 72 6f 63 20 6d  return }..proc m
0230: 69 74 20 7b 62 6c 6f 62 7d 20 7b 0a 20 20 73 65  it {blob} {.  se
0240: 74 20 73 63 61 6e 28 6c 69 74 74 6c 65 45 6e 64  t scan(littleEnd
0250: 69 61 6e 29 20 69 2a 0a 20 20 73 65 74 20 73 63  ian) i*.  set sc
0260: 61 6e 28 62 69 67 45 6e 64 69 61 6e 29 20 49 2a  an(bigEndian) I*
0270: 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24  .  binary scan $
0280: 62 6c 6f 62 20 24 73 63 61 6e 28 24 3a 3a 74 63  blob $scan($::tc
0290: 6c 5f 70 6c 61 74 66 6f 72 6d 28 62 79 74 65 4f  l_platform(byteO
02a0: 72 64 65 72 29 29 20 72 0a 20 20 72 65 74 75 72  rder)) r.  retur
02b0: 6e 20 24 72 0a 7d 0a 64 62 20 66 75 6e 63 20 6d  n $r.}.db func m
02c0: 69 74 20 6d 69 74 0a 0a 73 71 6c 69 74 65 33 5f  it mit..sqlite3_
02d0: 66 74 73 35 5f 72 65 67 69 73 74 65 72 5f 6d 61  fts5_register_ma
02e0: 74 63 68 69 6e 66 6f 20 64 62 0a 0a 64 6f 5f 65  tchinfo db..do_e
02f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 30 20  xecsql_test 1.0 
0300: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  {.  CREATE VIRTU
0310: 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
0320: 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 3b  G fts5(content);
0330: 0a 7d 20 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .} ..do_execsql_
0340: 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 49 4e 53  test 1.1 {.  INS
0350: 45 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74  ERT INTO t1(cont
0360: 65 6e 74 29 20 56 41 4c 55 45 53 28 27 49 20 77  ent) VALUES('I w
0370: 61 6e 64 65 72 65 64 20 6c 6f 6e 65 6c 79 20 61  andered lonely a
0380: 73 20 61 20 63 6c 6f 75 64 27 29 3b 0a 20 20 49  s a cloud');.  I
0390: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63 6f  NSERT INTO t1(co
03a0: 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 27 54  ntent) VALUES('T
03b0: 68 61 74 20 66 6c 6f 61 74 73 20 6f 6e 20 68 69  hat floats on hi
03c0: 67 68 20 6f 27 27 65 72 20 76 61 6c 65 73 20 61  gh o''er vales a
03d0: 6e 64 20 68 69 6c 6c 73 2c 27 29 3b 0a 20 20 49  nd hills,');.  I
03e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63 6f  NSERT INTO t1(co
03f0: 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 27 57  ntent) VALUES('W
0400: 68 65 6e 20 61 6c 6c 20 61 74 20 6f 6e 63 65 20  hen all at once 
0410: 49 20 73 61 77 20 61 20 63 72 6f 77 64 2c 27 29  I saw a crowd,')
0420: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0430: 74 31 28 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  t1(content) VALU
0440: 45 53 28 27 41 20 68 6f 73 74 2c 20 6f 66 20 67  ES('A host, of g
0450: 6f 6c 64 65 6e 20 64 61 66 66 6f 64 69 6c 73 2c  olden daffodils,
0460: 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 6d 69 74  ');.  SELECT mit
0470: 28 6d 61 74 63 68 69 6e 66 6f 28 74 31 29 29 20  (matchinfo(t1)) 
0480: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
0490: 20 4d 41 54 43 48 20 27 49 27 3b 0a 7d 20 7b 7b   MATCH 'I';.} {{
04a0: 31 20 31 20 31 20 32 20 32 7d 20 7b 31 20 31 20  1 1 1 2 2} {1 1 
04b0: 31 20 32 20 32 7d 7d 0a 0a 23 20 4e 6f 77 20 63  1 2 2}}..# Now c
04c0: 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74 61  reate an FTS4 ta
04d0: 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ble that does no
04e0: 74 20 73 70 65 63 69 66 79 20 6d 61 74 63 68 69  t specify matchi
04f0: 6e 66 6f 3d 66 74 73 33 2e 0a 23 0a 64 6f 5f 65  nfo=fts3..#.do_e
0500: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 32 20  xecsql_test 1.2 
0510: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  {.  CREATE VIRTU
0520: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e  AL TABLE t2 USIN
0530: 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 3b  G fts5(content);
0540: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0550: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
0560: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 6d 69 74  t1;.  SELECT mit
0570: 28 6d 61 74 63 68 69 6e 66 6f 28 74 32 29 29 20  (matchinfo(t2)) 
0580: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
0590: 20 4d 41 54 43 48 20 27 49 27 3b 0a 7d 20 7b 7b   MATCH 'I';.} {{
05a0: 31 20 31 20 31 20 32 20 32 7d 20 7b 31 20 31 20  1 1 1 2 2} {1 1 
05b0: 31 20 32 20 32 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  1 2 2}}...#-----
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 0a 23 20 50 72 6f 63 20 5b 64 6f  -----.# Proc [do
0610: 5f 6d 61 74 63 68 69 6e 66 6f 5f 74 65 73 74 5d  _matchinfo_test]
0620: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
0630: 20 74 68 65 20 46 54 53 58 20 6d 61 74 63 68 69   the FTSX matchi
0640: 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  nfo() function..
0650: 23 0a 23 20 54 68 65 20 66 69 72 73 74 20 61 72  #.# The first ar
0660: 67 75 6d 65 6e 74 20 2d 20 24 74 6e 20 2d 20 69  gument - $tn - i
0670: 73 20 61 20 74 65 73 74 20 69 64 65 6e 74 69 66  s a test identif
0680: 69 65 72 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ier. This may be
0690: 20 65 69 74 68 65 72 20 61 0a 23 20 66 75 6c 6c   either a.# full
06a0: 20 69 64 65 6e 74 69 66 69 65 72 20 28 69 2e 65   identifier (i.e
06b0: 2e 20 22 66 74 73 33 6d 61 74 63 68 69 6e 66 6f  . "fts3matchinfo
06c0: 2d 31 2e 31 22 29 20 6f 72 2c 20 69 66 20 67 6c  -1.1") or, if gl
06d0: 6f 62 61 6c 20 76 61 72 20 24 74 65 73 74 70 72  obal var $testpr
06e0: 65 66 69 78 0a 23 20 69 73 20 73 65 74 2c 20 6a  efix.# is set, j
06f0: 75 73 74 20 74 68 65 20 6e 75 6d 65 72 69 63 20  ust the numeric 
0700: 63 6f 6d 70 6f 6e 65 6e 74 20 28 69 2e 65 2e 20  component (i.e. 
0710: 22 31 2e 31 22 29 2e 0a 23 0a 23 20 54 68 65 20  "1.1")..#.# The 
0720: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
0730: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
0740: 6e 20 46 54 53 58 20 74 61 62 6c 65 2e 20 54 68  n FTSX table. Th
0750: 65 20 74 68 69 72 64 20 69 73 20 74 68 65 20 0a  e third is the .
0760: 23 20 66 75 6c 6c 20 74 65 78 74 20 6f 66 20 61  # full text of a
0770: 20 57 48 45 52 45 2f 4d 41 54 43 48 20 65 78 70   WHERE/MATCH exp
0780: 72 65 73 73 69 6f 6e 20 74 6f 20 71 75 65 72 79  ression to query
0790: 20 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 0a   the table for .
07a0: 23 20 28 69 2e 65 2e 20 22 74 31 20 4d 41 54 43  # (i.e. "t1 MATC
07b0: 48 20 27 61 62 63 27 22 29 2e 20 54 68 65 20 66  H 'abc'"). The f
07c0: 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 2d 20  inal argument - 
07d0: 24 72 65 73 75 6c 74 73 20 2d 20 73 68 6f 75 6c  $results - shoul
07e0: 64 20 62 65 20 61 0a 23 20 6b 65 79 2d 76 61 6c  d be a.# key-val
07f0: 75 65 20 6c 69 73 74 20 28 73 65 72 69 61 6c 69  ue list (seriali
0800: 7a 65 64 20 61 72 72 61 79 29 20 77 69 74 68 20  zed array) with 
0810: 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 6f 72 6d  matchinfo() form
0820: 61 74 20 73 70 65 63 69 66 69 65 72 73 0a 23 20  at specifiers.# 
0830: 61 73 20 6b 65 79 73 2c 20 61 6e 64 20 74 68 65  as keys, and the
0840: 20 72 65 73 75 6c 74 73 20 6f 66 20 65 78 65 63   results of exec
0850: 75 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  uting the statem
0860: 65 6e 74 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43  ent:.#.#   SELEC
0870: 54 20 6d 61 74 63 68 69 6e 66 6f 28 24 74 62 6c  T matchinfo($tbl
0880: 2c 20 27 24 6b 65 79 27 29 20 46 52 4f 4d 20 24  , '$key') FROM $
0890: 74 62 6c 20 57 48 45 52 45 20 24 65 78 70 72 0a  tbl WHERE $expr.
08a0: 23 0a 23 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  #.# For example:
08b0: 0a 23 0a 23 20 20 20 43 52 45 41 54 45 20 56 49  .#.#   CREATE VI
08c0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
08d0: 53 49 4e 47 20 66 74 73 34 3b 0a 23 20 20 20 49  SING fts4;.#   I
08e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
08f0: 4c 55 45 53 28 27 61 62 63 27 29 3b 0a 23 20 20  LUES('abc');.#  
0900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0910: 56 41 4c 55 45 53 28 27 64 65 66 27 29 3b 0a 23  VALUES('def');.#
0920: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0930: 31 20 56 41 4c 55 45 53 28 27 61 62 63 20 61 62  1 VALUES('abc ab
0940: 63 27 29 3b 0a 23 0a 23 20 20 20 64 6f 5f 6d 61  c');.#.#   do_ma
0950: 74 63 68 69 6e 66 6f 5f 74 65 73 74 20 31 2e 31  tchinfo_test 1.1
0960: 20 74 31 20 22 74 31 20 4d 41 54 43 48 20 27 61   t1 "t1 MATCH 'a
0970: 62 63 27 22 20 7b 0a 23 20 20 20 20 20 6e 20 7b  bc'" {.#     n {
0980: 33 20 33 7d 0a 23 20 20 20 20 20 70 20 7b 31 20  3 3}.#     p {1 
0990: 31 7d 0a 23 20 20 20 20 20 63 20 7b 31 20 31 7d  1}.#     c {1 1}
09a0: 0a 23 20 20 20 20 20 78 20 7b 7b 31 20 33 20 32  .#     x {{1 3 2
09b0: 7d 20 7b 32 20 33 20 32 7d 7d 0a 23 20 20 20 7d  } {2 3 2}}.#   }
09c0: 0a 23 0a 23 20 49 66 20 74 68 65 20 24 72 65 73  .#.# If the $res
09d0: 75 6c 74 73 20 6c 69 73 74 20 63 6f 6e 74 61 69  ults list contai
09e0: 6e 73 20 6b 65 79 73 20 6d 61 70 70 65 64 20 74  ns keys mapped t
09f0: 6f 20 22 2d 22 20 69 6e 73 74 65 61 64 20 6f 66  o "-" instead of
0a00: 20 61 20 6d 61 74 63 68 69 6e 66 6f 28 29 0a 23   a matchinfo().#
0a10: 20 72 65 73 75 6c 74 2c 20 74 68 65 6e 20 74 68   result, then th
0a20: 69 73 20 63 6f 6d 6d 61 6e 64 20 63 6f 6d 70 75  is command compu
0a30: 74 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  tes the expected
0a40: 20 72 65 73 75 6c 74 73 20 62 61 73 65 64 20 6f   results based o
0a50: 6e 20 6f 74 68 65 72 0a 23 20 6d 61 70 70 69 6e  n other.# mappin
0a60: 67 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 6d  gs to test the m
0a70: 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74  atchinfo() funct
0a80: 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
0a90: 2c 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 62  , the command ab
0aa0: 6f 76 65 0a 23 20 63 6f 75 6c 64 20 62 65 20 63  ove.# could be c
0ab0: 68 61 6e 67 65 64 20 74 6f 3a 0a 23 0a 23 20 20  hanged to:.#.#  
0ac0: 20 64 6f 5f 6d 61 74 63 68 69 6e 66 6f 5f 74 65   do_matchinfo_te
0ad0: 73 74 20 31 2e 31 20 74 31 20 22 74 31 20 4d 41  st 1.1 t1 "t1 MA
0ae0: 54 43 48 20 27 61 62 63 27 22 20 7b 0a 23 20 20  TCH 'abc'" {.#  
0af0: 20 20 20 6e 20 7b 33 20 33 7d 20 70 20 7b 31 20     n {3 3} p {1 
0b00: 31 7d 20 63 20 7b 31 20 31 7d 20 78 20 7b 7b 31  1} c {1 1} x {{1
0b10: 20 33 20 32 7d 20 7b 32 20 33 20 32 7d 7d 0a 23   3 2} {2 3 2}}.#
0b20: 20 20 20 20 20 70 63 78 20 2d 0a 23 20 20 20 7d       pcx -.#   }
0b30: 0a 23 0a 23 20 41 6e 64 20 74 68 69 73 20 63 6f  .#.# And this co
0b40: 6d 6d 61 6e 64 20 77 6f 75 6c 64 20 63 6f 6d 70  mmand would comp
0b50: 75 74 65 20 74 68 65 20 65 78 70 65 63 74 65 64  ute the expected
0b60: 20 72 65 73 75 6c 74 73 20 66 6f 72 20 6d 61 74   results for mat
0b70: 63 68 69 6e 66 6f 28 74 31 2c 20 27 70 63 78 27  chinfo(t1, 'pcx'
0b80: 29 0a 23 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ).# based on the
0b90: 20 72 65 73 75 6c 74 73 20 6f 66 20 6d 61 74 63   results of matc
0ba0: 68 69 6e 66 6f 28 74 31 2c 20 27 70 27 29 2c 20  hinfo(t1, 'p'), 
0bb0: 6d 61 74 63 68 69 6e 66 6f 28 74 31 2c 20 27 63  matchinfo(t1, 'c
0bc0: 27 29 20 61 6e 64 20 0a 23 20 6d 61 74 63 68 69  ') and .# matchi
0bd0: 6e 66 6f 28 74 31 2c 20 27 78 27 29 20 69 6e 20  nfo(t1, 'x') in 
0be0: 6f 72 64 65 72 20 74 6f 20 74 65 73 74 20 27 70  order to test 'p
0bf0: 63 78 27 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 6d  cx'..#.proc do_m
0c00: 61 74 63 68 69 6e 66 6f 5f 74 65 73 74 20 7b 74  atchinfo_test {t
0c10: 6e 20 74 62 6c 20 65 78 70 72 20 72 65 73 75 6c  n tbl expr resul
0c20: 74 73 7d 20 7b 0a 0a 20 20 66 6f 72 65 61 63 68  ts} {..  foreach
0c30: 20 7b 66 6d 74 20 72 65 73 7d 20 24 72 65 73 75   {fmt res} $resu
0c40: 6c 74 73 20 7b 0a 20 20 20 20 69 66 20 7b 24 72  lts {.    if {$r
0c50: 65 73 20 3d 3d 20 22 2d 22 7d 20 63 6f 6e 74 69  es == "-"} conti
0c60: 6e 75 65 0a 20 20 20 20 73 65 74 20 72 65 73 61  nue.    set resa
0c70: 72 72 61 79 28 24 66 6d 74 29 20 24 72 65 73 0a  rray($fmt) $res.
0c80: 20 20 7d 0a 0a 20 20 73 65 74 20 6e 52 6f 77 20    }..  set nRow 
0c90: 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 66 6d 74  0.  foreach {fmt
0ca0: 20 72 65 73 7d 20 5b 61 72 72 61 79 20 67 65 74   res} [array get
0cb0: 20 72 65 73 61 72 72 61 79 5d 20 7b 0a 20 20 20   resarray] {.   
0cc0: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72   if {[llength $r
0cd0: 65 73 5d 3e 24 6e 52 6f 77 7d 20 7b 20 73 65 74  es]>$nRow} { set
0ce0: 20 6e 52 6f 77 20 5b 6c 6c 65 6e 67 74 68 20 24   nRow [llength $
0cf0: 72 65 73 5d 20 7d 0a 20 20 7d 0a 0a 20 20 23 20  res] }.  }..  # 
0d00: 43 6f 6e 73 74 72 75 63 74 20 65 78 70 65 63 74  Construct expect
0d10: 65 64 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61  ed results for a
0d20: 6e 79 20 66 6f 72 6d 61 74 73 20 66 6f 72 20 77  ny formats for w
0d30: 68 69 63 68 20 74 68 65 20 63 61 6c 6c 65 72 20  hich the caller 
0d40: 0a 20 20 23 20 73 75 70 70 6c 69 65 64 20 72 65  .  # supplied re
0d50: 73 75 6c 74 20 69 73 20 22 2d 22 2e 0a 20 20 23  sult is "-"..  #
0d60: 0a 20 20 66 6f 72 65 61 63 68 20 7b 66 6d 74 20  .  foreach {fmt 
0d70: 72 65 73 7d 20 24 72 65 73 75 6c 74 73 20 7b 0a  res} $results {.
0d80: 20 20 20 20 69 66 20 7b 24 72 65 73 20 3d 3d 20      if {$res == 
0d90: 22 2d 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  "-"} {.      set
0da0: 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20   res [list].    
0db0: 20 20 66 6f 72 20 7b 73 65 74 20 69 52 6f 77 20    for {set iRow 
0dc0: 30 7d 20 7b 24 69 52 6f 77 3c 24 6e 52 6f 77 7d  0} {$iRow<$nRow}
0dd0: 20 7b 69 6e 63 72 20 69 52 6f 77 7d 20 7b 0a 20   {incr iRow} {. 
0de0: 20 20 20 20 20 20 20 73 65 74 20 72 6f 77 72 65         set rowre
0df0: 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20 20 20 20  s [list].       
0e00: 20 66 6f 72 65 61 63 68 20 63 20 5b 73 70 6c 69   foreach c [spli
0e10: 74 20 24 66 6d 74 20 22 22 5d 20 7b 0a 20 20 20  t $fmt ""] {.   
0e20: 20 20 20 20 20 20 20 73 65 74 20 72 6f 77 72 65         set rowre
0e30: 73 20 5b 63 6f 6e 63 61 74 20 24 72 6f 77 72 65  s [concat $rowre
0e40: 73 20 5b 6c 69 6e 64 65 78 20 24 72 65 73 61 72  s [lindex $resar
0e50: 72 61 79 28 24 63 29 20 24 69 52 6f 77 5d 5d 0a  ray($c) $iRow]].
0e60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e70: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 24 72    lappend res $r
0e80: 6f 77 72 65 73 0a 20 20 20 20 20 20 7d 0a 20 20  owres.      }.  
0e90: 20 20 20 20 73 65 74 20 72 65 73 61 72 72 61 79      set resarray
0ea0: 28 24 66 6d 74 29 20 24 72 65 73 0a 20 20 20 20  ($fmt) $res.    
0eb0: 7d 0a 20 20 7d 0a 0a 20 20 23 20 54 65 73 74 20  }.  }..  # Test 
0ec0: 65 61 63 68 20 6d 61 74 63 68 69 6e 66 6f 28 29  each matchinfo()
0ed0: 20 72 65 71 75 65 73 74 20 69 6e 64 69 76 69 64   request individ
0ee0: 75 61 6c 6c 79 2e 0a 20 20 23 0a 20 20 66 6f 72  ually..  #.  for
0ef0: 65 61 63 68 20 7b 66 6d 74 20 72 65 73 7d 20 5b  each {fmt res} [
0f00: 61 72 72 61 79 20 67 65 74 20 72 65 73 61 72 72  array get resarr
0f10: 61 79 5d 20 7b 0a 20 20 20 20 73 65 74 20 73 71  ay] {.    set sq
0f20: 6c 20 22 53 45 4c 45 43 54 20 6d 69 74 28 6d 61  l "SELECT mit(ma
0f30: 74 63 68 69 6e 66 6f 28 24 74 62 6c 2c 20 27 24  tchinfo($tbl, '$
0f40: 66 6d 74 27 29 29 20 46 52 4f 4d 20 24 74 62 6c  fmt')) FROM $tbl
0f50: 20 57 48 45 52 45 20 24 65 78 70 72 22 0a 20 20   WHERE $expr".  
0f60: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0f70: 74 20 24 74 6e 2e 24 66 6d 74 20 24 73 71 6c 20  t $tn.$fmt $sql 
0f80: 5b 6e 6f 72 6d 61 6c 69 7a 65 32 20 24 72 65 73  [normalize2 $res
0f90: 5d 0a 20 20 7d 0a 0a 20 20 23 20 54 65 73 74 20  ].  }..  # Test 
0fa0: 74 68 65 6d 20 61 6c 6c 20 65 78 65 63 75 74 65  them all execute
0fb0: 64 20 74 6f 67 65 74 68 65 72 20 28 6d 75 6c 74  d together (mult
0fc0: 69 70 6c 65 20 69 6e 76 6f 63 61 74 69 6f 6e 73  iple invocations
0fd0: 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 28 29 29   of matchinfo())
0fe0: 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 78 70 72  ..  #.  set expr
0ff0: 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 20 20 66 6f  list [list].  fo
1000: 72 65 61 63 68 20 7b 66 6f 72 6d 61 74 20 72 65  reach {format re
1010: 73 7d 20 5b 61 72 72 61 79 20 67 65 74 20 72 65  s} [array get re
1020: 73 61 72 72 61 79 5d 20 7b 0a 20 20 20 20 6c 61  sarray] {.    la
1030: 70 70 65 6e 64 20 65 78 70 72 6c 69 73 74 20 22  ppend exprlist "
1040: 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f 28 24 74  mit(matchinfo($t
1050: 62 6c 2c 20 27 24 66 6f 72 6d 61 74 27 29 29 22  bl, '$format'))"
1060: 0a 20 20 7d 0a 20 20 73 65 74 20 61 6c 6c 72 65  .  }.  set allre
1070: 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 20 7b  s [list].  for {
1080: 73 65 74 20 69 52 6f 77 20 30 7d 20 7b 24 69 52  set iRow 0} {$iR
1090: 6f 77 3c 24 6e 52 6f 77 7d 20 7b 69 6e 63 72 20  ow<$nRow} {incr 
10a0: 69 52 6f 77 7d 20 7b 0a 20 20 20 20 66 6f 72 65  iRow} {.    fore
10b0: 61 63 68 20 7b 66 6f 72 6d 61 74 20 72 65 73 7d  ach {format res}
10c0: 20 5b 61 72 72 61 79 20 67 65 74 20 72 65 73 61   [array get resa
10d0: 72 72 61 79 5d 20 7b 0a 20 20 20 20 20 20 6c 61  rray] {.      la
10e0: 70 70 65 6e 64 20 61 6c 6c 72 65 73 20 5b 6c 69  ppend allres [li
10f0: 6e 64 65 78 20 24 72 65 73 20 24 69 52 6f 77 5d  ndex $res $iRow]
1100: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74  .    }.  }.  set
1110: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 5b 6a 6f   sql "SELECT [jo
1120: 69 6e 20 24 65 78 70 72 6c 69 73 74 20 2c 5d 20  in $exprlist ,] 
1130: 46 52 4f 4d 20 24 74 62 6c 20 57 48 45 52 45 20  FROM $tbl WHERE 
1140: 24 65 78 70 72 22 0a 20 20 64 6f 5f 65 78 65 63  $expr".  do_exec
1150: 73 71 6c 5f 74 65 73 74 20 24 74 6e 2e 6d 75 6c  sql_test $tn.mul
1160: 74 69 20 24 73 71 6c 20 5b 6e 6f 72 6d 61 6c 69  ti $sql [normali
1170: 7a 65 32 20 24 61 6c 6c 72 65 73 5d 0a 7d 0a 70  ze2 $allres].}.p
1180: 72 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65 32 20 7b  roc normalize2 {
1190: 6c 69 73 74 5f 6f 66 5f 6c 69 73 74 73 7d 20 7b  list_of_lists} {
11a0: 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74  .  set res [list
11b0: 5d 0a 20 20 66 6f 72 65 61 63 68 20 65 6c 65 6d  ].  foreach elem
11c0: 20 24 6c 69 73 74 5f 6f 66 5f 6c 69 73 74 73 20   $list_of_lists 
11d0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  {.    lappend re
11e0: 73 20 5b 6c 69 73 74 20 7b 2a 7d 24 65 6c 65 6d  s [list {*}$elem
11f0: 5d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 24  ].  }.  return $
1200: 72 65 73 0a 7d 0a 0a 0a 64 6f 5f 65 78 65 63 73  res.}...do_execs
1210: 71 6c 5f 74 65 73 74 20 34 2e 31 2e 30 20 7b 0a  ql_test 4.1.0 {.
1220: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1230: 20 54 41 42 4c 45 20 74 34 20 55 53 49 4e 47 20   TABLE t4 USING 
1240: 66 74 73 35 28 78 2c 20 79 29 3b 0a 20 20 49 4e  fts5(x, y);.  IN
1250: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
1260: 55 45 53 28 27 61 20 62 20 63 20 64 20 65 27 2c  UES('a b c d e',
1270: 20 27 66 20 67 20 68 20 69 20 6a 27 29 3b 0a 20   'f g h i j');. 
1280: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
1290: 56 41 4c 55 45 53 28 27 66 20 67 20 68 20 69 20  VALUES('f g h i 
12a0: 6a 27 2c 20 27 61 20 62 20 63 20 64 20 65 27 29  j', 'a b c d e')
12b0: 3b 0a 7d 0a 0a 64 6f 5f 6d 61 74 63 68 69 6e 66  ;.}..do_matchinf
12c0: 6f 5f 74 65 73 74 20 34 2e 31 2e 31 20 74 34 20  o_test 4.1.1 t4 
12d0: 7b 74 34 20 4d 41 54 43 48 20 27 61 20 62 20 63  {t4 MATCH 'a b c
12e0: 27 7d 20 7b 0a 20 20 73 20 7b 7b 33 20 30 7d 20  '} {.  s {{3 0} 
12f0: 7b 30 20 33 7d 7d 0a 7d 0a 0a 64 6f 5f 6d 61 74  {0 3}}.}..do_mat
1300: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 31 2e  chinfo_test 4.1.
1310: 31 20 74 34 20 7b 74 34 20 4d 41 54 43 48 20 27  1 t4 {t4 MATCH '
1320: 61 20 62 20 63 27 7d 20 7b 0a 20 20 70 20 7b 33  a b c'} {.  p {3
1330: 20 33 7d 0a 20 20 78 20 7b 0a 20 20 20 20 7b 31   3}.  x {.    {1
1340: 20 31 20 31 20 20 20 30 20 31 20 31 20 20 20 31   1 1   0 1 1   1
1350: 20 31 20 31 20 20 20 30 20 31 20 31 20 20 20 31   1 1   0 1 1   1
1360: 20 31 20 31 20 20 20 30 20 31 20 31 7d 0a 20 20   1 1   0 1 1}.  
1370: 20 20 7b 30 20 31 20 31 20 20 20 31 20 31 20 31    {0 1 1   1 1 1
1380: 20 20 20 30 20 31 20 31 20 20 20 31 20 31 20 31     0 1 1   1 1 1
1390: 20 20 20 30 20 31 20 31 20 20 20 31 20 31 20 31     0 1 1   1 1 1
13a0: 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 6d 61 74 63  }.  }.}..do_matc
13b0: 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 31 2e 31  hinfo_test 4.1.1
13c0: 20 74 34 20 7b 74 34 20 4d 41 54 43 48 20 27 61   t4 {t4 MATCH 'a
13d0: 20 62 20 63 27 7d 20 7b 0a 20 20 70 20 7b 33 20   b c'} {.  p {3 
13e0: 33 7d 0a 20 20 63 20 7b 32 20 32 7d 0a 20 20 78  3}.  c {2 2}.  x
13f0: 20 7b 0a 20 20 20 20 7b 31 20 31 20 31 20 20 20   {.    {1 1 1   
1400: 30 20 31 20 31 20 20 20 31 20 31 20 31 20 20 20  0 1 1   1 1 1   
1410: 30 20 31 20 31 20 20 20 31 20 31 20 31 20 20 20  0 1 1   1 1 1   
1420: 30 20 31 20 31 7d 0a 20 20 20 20 7b 30 20 31 20  0 1 1}.    {0 1 
1430: 31 20 20 20 31 20 31 20 31 20 20 20 30 20 31 20  1   1 1 1   0 1 
1440: 31 20 20 20 31 20 31 20 31 20 20 20 30 20 31 20  1   1 1 1   0 1 
1450: 31 20 20 20 31 20 31 20 31 7d 0a 20 20 7d 0a 20  1   1 1 1}.  }. 
1460: 20 6e 20 7b 32 20 32 7d 0a 20 20 6c 20 7b 7b 35   n {2 2}.  l {{5
1470: 20 35 7d 20 7b 35 20 35 7d 7d 0a 20 20 61 20 7b   5} {5 5}}.  a {
1480: 7b 35 20 35 7d 20 7b 35 20 35 7d 7d 0a 0a 20 20  {5 5} {5 5}}..  
1490: 73 20 7b 7b 33 20 30 7d 20 7b 30 20 33 7d 7d 0a  s {{3 0} {0 3}}.
14a0: 0a 20 20 78 78 78 78 78 78 78 78 78 78 78 78 78  .  xxxxxxxxxxxxx
14b0: 78 78 78 78 78 20 2d 20 70 63 78 20 2d 20 78 70  xxxxx - pcx - xp
14c0: 63 20 2d 20 63 63 63 20 2d 20 70 70 70 78 70 63  c - ccc - pppxpc
14d0: 70 63 78 20 2d 20 6c 61 78 6e 70 63 20 2d 0a 20  pcx - laxnpc -. 
14e0: 20 78 70 78 73 73 63 70 6c 61 78 20 2d 0a 7d 0a   xpxsscplax -.}.
14f0: 0a 64 6f 5f 6d 61 74 63 68 69 6e 66 6f 5f 74 65  .do_matchinfo_te
1500: 73 74 20 34 2e 31 2e 32 20 74 34 20 7b 74 34 20  st 4.1.2 t4 {t4 
1510: 4d 41 54 43 48 20 27 22 67 20 68 20 69 22 27 7d  MATCH '"g h i"'}
1520: 20 7b 0a 20 20 70 20 7b 31 20 31 7d 0a 20 20 63   {.  p {1 1}.  c
1530: 20 7b 32 20 32 7d 0a 20 20 78 20 7b 0a 20 20 20   {2 2}.  x {.   
1540: 20 7b 30 20 31 20 31 20 20 20 31 20 31 20 31 7d   {0 1 1   1 1 1}
1550: 0a 20 20 20 20 7b 31 20 31 20 31 20 20 20 30 20  .    {1 1 1   0 
1560: 31 20 31 7d 0a 20 20 7d 0a 20 20 6e 20 7b 32 20  1 1}.  }.  n {2 
1570: 32 7d 0a 20 20 6c 20 7b 7b 35 20 35 7d 20 7b 35  2}.  l {{5 5} {5
1580: 20 35 7d 7d 0a 20 20 61 20 7b 7b 35 20 35 7d 20   5}}.  a {{5 5} 
1590: 7b 35 20 35 7d 7d 0a 0a 20 20 73 20 7b 7b 30 20  {5 5}}..  s {{0 
15a0: 31 7d 20 7b 31 20 30 7d 7d 0a 0a 20 20 78 78 78  1} {1 0}}..  xxx
15b0: 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 20  xxxxxxxxxxxxxxx 
15c0: 2d 20 70 63 78 20 2d 20 78 70 63 20 2d 20 63 63  - pcx - xpc - cc
15d0: 63 20 2d 20 70 70 70 78 70 63 70 63 78 20 2d 20  c - pppxpcpcx - 
15e0: 6c 61 78 6e 70 63 20 2d 0a 20 20 73 78 73 78 73  laxnpc -.  sxsxs
15f0: 20 2d 0a 7d 0a 0a 64 6f 5f 6d 61 74 63 68 69 6e   -.}..do_matchin
1600: 66 6f 5f 74 65 73 74 20 34 2e 31 2e 33 20 74 34  fo_test 4.1.3 t4
1610: 20 7b 74 34 20 4d 41 54 43 48 20 27 61 20 62 27   {t4 MATCH 'a b'
1620: 7d 20 20 20 20 20 7b 20 73 20 7b 7b 32 20 30 7d  }     { s {{2 0}
1630: 20 7b 30 20 32 7d 7d 20 7d 0a 64 6f 5f 6d 61 74   {0 2}} }.do_mat
1640: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 31 2e  chinfo_test 4.1.
1650: 34 20 74 34 20 7b 74 34 20 4d 41 54 43 48 20 27  4 t4 {t4 MATCH '
1660: 22 61 20 62 22 20 63 27 7d 20 7b 20 73 20 7b 7b  "a b" c'} { s {{
1670: 32 20 30 7d 20 7b 30 20 32 7d 7d 20 7d 0a 64 6f  2 0} {0 2}} }.do
1680: 5f 6d 61 74 63 68 69 6e 66 6f 5f 74 65 73 74 20  _matchinfo_test 
1690: 34 2e 31 2e 35 20 74 34 20 7b 74 34 20 4d 41 54  4.1.5 t4 {t4 MAT
16a0: 43 48 20 27 61 20 22 62 20 63 22 27 7d 20 7b 20  CH 'a "b c"'} { 
16b0: 73 20 7b 7b 32 20 30 7d 20 7b 30 20 32 7d 7d 20  s {{2 0} {0 2}} 
16c0: 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e 66 6f 5f 74  }.do_matchinfo_t
16d0: 65 73 74 20 34 2e 31 2e 36 20 74 34 20 7b 74 34  est 4.1.6 t4 {t4
16e0: 20 4d 41 54 43 48 20 27 64 20 64 27 7d 20 20 20   MATCH 'd d'}   
16f0: 20 20 7b 20 73 20 7b 7b 31 20 30 7d 20 7b 30 20    { s {{1 0} {0 
1700: 31 7d 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e  1}} }.do_matchin
1710: 66 6f 5f 74 65 73 74 20 34 2e 31 2e 37 20 74 34  fo_test 4.1.7 t4
1720: 20 7b 74 34 20 4d 41 54 43 48 20 27 66 20 4f 52   {t4 MATCH 'f OR
1730: 20 61 62 63 64 27 7d 20 7b 0a 20 20 78 20 7b 20   abcd'} {.  x { 
1740: 0a 20 20 20 20 7b 30 20 31 20 31 20 20 31 20 31  .    {0 1 1  1 1
1750: 20 31 20 20 30 20 30 20 30 20 20 30 20 30 20 30   1  0 0 0  0 0 0
1760: 7d 20 0a 20 20 20 20 7b 31 20 31 20 31 20 20 30  } .    {1 1 1  0
1770: 20 31 20 31 20 20 30 20 30 20 30 20 20 30 20 30   1 1  0 0 0  0 0
1780: 20 30 7d 0a 20 20 7d 0a 7d 0a 64 6f 5f 6d 61 74   0}.  }.}.do_mat
1790: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 31 2e  chinfo_test 4.1.
17a0: 38 20 74 34 20 7b 74 34 20 4d 41 54 43 48 20 27  8 t4 {t4 MATCH '
17b0: 66 20 4e 4f 54 20 61 62 63 64 27 7d 20 7b 0a 20  f NOT abcd'} {. 
17c0: 20 78 20 7b 20 0a 20 20 20 20 7b 30 20 31 20 31   x { .    {0 1 1
17d0: 20 20 31 20 31 20 31 20 20 30 20 30 20 30 20 20    1 1 1  0 0 0  
17e0: 30 20 30 20 30 7d 0a 20 20 20 20 7b 31 20 31 20  0 0 0}.    {1 1 
17f0: 31 20 20 30 20 31 20 31 20 20 30 20 30 20 30 20  1  0 1 1  0 0 0 
1800: 20 30 20 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 64   0 0 0}.  }.}..d
1810: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
1820: 2e 32 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .2.0 {.  CREATE 
1830: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 35  VIRTUAL TABLE t5
1840: 20 55 53 49 4e 47 20 66 74 73 35 28 63 6f 6e 74   USING fts5(cont
1850: 65 6e 74 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ent);.  INSERT I
1860: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 61  NTO t5 VALUES('a
1870: 20 61 20 61 20 61 20 61 27 29 3b 0a 20 20 49 4e   a a a a');.  IN
1880: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
1890: 55 45 53 28 27 61 20 62 20 61 20 62 20 61 27 29  UES('a b a b a')
18a0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
18b0: 74 35 20 56 41 4c 55 45 53 28 27 63 20 62 20 63  t5 VALUES('c b c
18c0: 20 62 20 63 27 29 3b 0a 20 20 49 4e 53 45 52 54   b c');.  INSERT
18d0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
18e0: 27 78 20 78 20 78 20 78 20 78 27 29 3b 0a 7d 0a  'x x x x x');.}.
18f0: 64 6f 5f 6d 61 74 63 68 69 6e 66 6f 5f 74 65 73  do_matchinfo_tes
1900: 74 20 34 2e 32 2e 31 20 74 35 20 7b 74 35 20 4d  t 4.2.1 t5 {t5 M
1910: 41 54 43 48 20 27 61 20 61 27 7d 20 20 20 20 20  ATCH 'a a'}     
1920: 20 20 20 20 7b 20 0a 20 20 78 20 7b 7b 35 20 38      { .  x {{5 8
1930: 20 32 20 20 20 35 20 38 20 32 7d 20 7b 33 20 38   2   5 8 2} {3 8
1940: 20 32 20 20 20 33 20 38 20 32 7d 7d 0a 20 20 73   2   3 8 2}}.  s
1950: 20 7b 32 20 31 7d 20 0a 7d 0a 64 6f 5f 6d 61 74   {2 1} .}.do_mat
1960: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 32 2e  chinfo_test 4.2.
1970: 32 20 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27  2 t5 {t5 MATCH '
1980: 61 20 62 27 7d 20 20 20 20 20 20 20 20 20 7b 20  a b'}         { 
1990: 73 20 7b 32 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68  s {2} }.do_match
19a0: 69 6e 66 6f 5f 74 65 73 74 20 34 2e 32 2e 33 20  info_test 4.2.3 
19b0: 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27 61 20  t5 {t5 MATCH 'a 
19c0: 62 20 61 27 7d 20 20 20 20 20 20 20 7b 20 73 20  b a'}       { s 
19d0: 7b 33 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e  {3} }.do_matchin
19e0: 66 6f 5f 74 65 73 74 20 34 2e 32 2e 34 20 74 35  fo_test 4.2.4 t5
19f0: 20 7b 74 35 20 4d 41 54 43 48 20 27 61 20 61 20   {t5 MATCH 'a a 
1a00: 61 27 7d 20 20 20 20 20 20 20 7b 20 73 20 7b 33  a'}       { s {3
1a10: 20 31 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e   1} }.do_matchin
1a20: 66 6f 5f 74 65 73 74 20 34 2e 32 2e 35 20 74 35  fo_test 4.2.5 t5
1a30: 20 7b 74 35 20 4d 41 54 43 48 20 27 22 61 20 62   {t5 MATCH '"a b
1a40: 22 20 22 61 20 62 22 27 7d 20 7b 20 73 20 7b 32  " "a b"'} { s {2
1a50: 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e 66 6f  } }.do_matchinfo
1a60: 5f 74 65 73 74 20 34 2e 32 2e 36 20 74 35 20 7b  _test 4.2.6 t5 {
1a70: 74 35 20 4d 41 54 43 48 20 27 61 20 4f 52 20 62  t5 MATCH 'a OR b
1a80: 27 7d 20 20 20 20 20 20 7b 20 73 20 7b 31 20 32  '}      { s {1 2
1a90: 20 31 7d 20 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   1} }..do_execsq
1aa0: 6c 5f 74 65 73 74 20 34 2e 33 2e 30 20 22 49 4e  l_test 4.3.0 "IN
1ab0: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
1ac0: 55 45 53 28 27 78 20 79 20 5b 73 74 72 69 6e 67  UES('x y [string
1ad0: 20 72 65 70 65 61 74 20 7b 62 20 7d 20 35 30 30   repeat {b } 500
1ae0: 30 30 5d 27 29 22 3b 0a 0a 23 20 49 74 20 75 73  00]')";..# It us
1af0: 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 74 68  ed to be that th
1b00: 65 20 73 65 63 6f 6e 64 20 27 61 27 20 74 6f 6b  e second 'a' tok
1b10: 65 6e 20 77 6f 75 6c 64 20 62 65 20 64 65 66 65  en would be defe
1b20: 72 72 65 64 2e 20 54 68 61 74 20 64 6f 65 73 6e  rred. That doesn
1b30: 27 74 0a 23 20 77 6f 72 6b 20 61 6e 79 20 6c 6f  't.# work any lo
1b40: 6e 67 65 72 2e 0a 69 66 20 30 20 7b 0a 20 20 64  nger..if 0 {.  d
1b50: 6f 5f 6d 61 74 63 68 69 6e 66 6f 5f 74 65 73 74  o_matchinfo_test
1b60: 20 34 2e 33 2e 31 20 74 35 20 7b 74 35 20 4d 41   4.3.1 t5 {t5 MA
1b70: 54 43 48 20 27 61 20 61 27 7d 20 7b 20 0a 20 20  TCH 'a a'} { .  
1b80: 20 20 78 20 7b 7b 35 20 38 20 32 20 20 20 35 20    x {{5 8 2   5 
1b90: 35 20 35 7d 20 7b 33 20 38 20 32 20 20 20 33 20  5 5} {3 8 2   3 
1ba0: 35 20 35 7d 7d 0a 20 20 20 20 73 20 7b 32 20 31  5 5}}.    s {2 1
1bb0: 7d 20 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 6d 61 74  } .  }.}..do_mat
1bc0: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 33 2e  chinfo_test 4.3.
1bd0: 32 20 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27  2 t5 {t5 MATCH '
1be0: 61 20 62 27 7d 20 20 20 20 20 20 20 20 20 7b 20  a b'}         { 
1bf0: 73 20 7b 32 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68  s {2} }.do_match
1c00: 69 6e 66 6f 5f 74 65 73 74 20 34 2e 33 2e 33 20  info_test 4.3.3 
1c10: 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27 61 20  t5 {t5 MATCH 'a 
1c20: 62 20 61 27 7d 20 20 20 20 20 20 20 7b 20 73 20  b a'}       { s 
1c30: 7b 33 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e  {3} }.do_matchin
1c40: 66 6f 5f 74 65 73 74 20 34 2e 33 2e 34 20 74 35  fo_test 4.3.4 t5
1c50: 20 7b 74 35 20 4d 41 54 43 48 20 27 61 20 61 20   {t5 MATCH 'a a 
1c60: 61 27 7d 20 20 20 20 20 20 20 7b 20 73 20 7b 33  a'}       { s {3
1c70: 20 31 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e   1} }.do_matchin
1c80: 66 6f 5f 74 65 73 74 20 34 2e 33 2e 35 20 74 35  fo_test 4.3.5 t5
1c90: 20 7b 74 35 20 4d 41 54 43 48 20 27 22 61 20 62   {t5 MATCH '"a b
1ca0: 22 20 22 61 20 62 22 27 7d 20 7b 20 73 20 7b 32  " "a b"'} { s {2
1cb0: 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e 66 6f  } }.do_matchinfo
1cc0: 5f 74 65 73 74 20 34 2e 33 2e 36 20 74 35 20 7b  _test 4.3.6 t5 {
1cd0: 74 35 20 4d 41 54 43 48 20 27 61 20 4f 52 20 62  t5 MATCH 'a OR b
1ce0: 27 7d 20 20 20 20 20 20 7b 20 73 20 7b 31 20 32  '}      { s {1 2
1cf0: 20 31 20 31 7d 20 7d 0a 0a 64 6f 5f 65 78 65 63   1 1} }..do_exec
1d00: 73 71 6c 5f 74 65 73 74 20 34 2e 34 2e 30 2e 31  sql_test 4.4.0.1
1d10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
1d20: 35 28 74 35 29 20 56 41 4c 55 45 53 28 27 6f 70  5(t5) VALUES('op
1d30: 74 69 6d 69 7a 65 27 29 20 7d 0a 0a 64 6f 5f 6d  timize') }..do_m
1d40: 61 74 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e  atchinfo_test 4.
1d50: 34 2e 32 20 74 35 20 7b 74 35 20 4d 41 54 43 48  4.2 t5 {t5 MATCH
1d60: 20 27 61 20 62 27 7d 20 20 20 20 20 20 20 20 20   'a b'}         
1d70: 7b 20 73 20 7b 32 7d 20 7d 0a 64 6f 5f 6d 61 74  { s {2} }.do_mat
1d80: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 34 2e  chinfo_test 4.4.
1d90: 31 20 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27  1 t5 {t5 MATCH '
1da0: 61 20 61 27 7d 20 20 20 20 20 20 20 20 20 7b 20  a a'}         { 
1db0: 73 20 7b 32 20 31 7d 20 7d 0a 64 6f 5f 6d 61 74  s {2 1} }.do_mat
1dc0: 63 68 69 6e 66 6f 5f 74 65 73 74 20 34 2e 34 2e  chinfo_test 4.4.
1dd0: 32 20 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27  2 t5 {t5 MATCH '
1de0: 61 20 62 27 7d 20 20 20 20 20 20 20 20 20 7b 20  a b'}         { 
1df0: 73 20 7b 32 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68  s {2} }.do_match
1e00: 69 6e 66 6f 5f 74 65 73 74 20 34 2e 34 2e 33 20  info_test 4.4.3 
1e10: 74 35 20 7b 74 35 20 4d 41 54 43 48 20 27 61 20  t5 {t5 MATCH 'a 
1e20: 62 20 61 27 7d 20 20 20 20 20 20 20 7b 20 73 20  b a'}       { s 
1e30: 7b 33 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e  {3} }.do_matchin
1e40: 66 6f 5f 74 65 73 74 20 34 2e 34 2e 34 20 74 35  fo_test 4.4.4 t5
1e50: 20 7b 74 35 20 4d 41 54 43 48 20 27 61 20 61 20   {t5 MATCH 'a a 
1e60: 61 27 7d 20 20 20 20 20 20 20 7b 20 73 20 7b 33  a'}       { s {3
1e70: 20 31 7d 20 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e   1} }.do_matchin
1e80: 66 6f 5f 74 65 73 74 20 34 2e 34 2e 35 20 74 35  fo_test 4.4.5 t5
1e90: 20 7b 74 35 20 4d 41 54 43 48 20 27 22 61 20 62   {t5 MATCH '"a b
1ea0: 22 20 22 61 20 62 22 27 7d 20 7b 20 73 20 7b 32  " "a b"'} { s {2
1eb0: 7d 20 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } }..do_execsql_
1ec0: 74 65 73 74 20 34 2e 35 2e 30 20 7b 0a 20 20 43  test 4.5.0 {.  C
1ed0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1ee0: 42 4c 45 20 74 36 20 55 53 49 4e 47 20 66 74 73  BLE t6 USING fts
1ef0: 35 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 49 4e  5(a, b, c);.  IN
1f00: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
1f10: 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63  UES('a', 'b', 'c
1f20: 27 29 3b 0a 7d 0a 64 6f 5f 6d 61 74 63 68 69 6e  ');.}.do_matchin
1f30: 66 6f 5f 74 65 73 74 20 34 2e 35 2e 31 20 74 36  fo_test 4.5.1 t6
1f40: 20 7b 74 36 20 4d 41 54 43 48 20 27 61 20 62 20   {t6 MATCH 'a b 
1f50: 63 27 7d 20 20 20 20 20 20 20 7b 20 73 20 7b 7b  c'}       { s {{
1f60: 31 20 31 20 31 7d 7d 20 7d 0a 0a 0a 23 2d 2d 2d  1 1 1}} }...#---
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
1fc0: 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 6d 61 74  e outcome of mat
1fd0: 63 68 69 6e 66 6f 28 29 20 77 68 65 6e 20 75 73  chinfo() when us
1fe0: 65 64 20 77 69 74 68 69 6e 20 61 20 71 75 65 72  ed within a quer
1ff0: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  y that does not.
2000: 23 20 75 73 65 20 74 68 65 20 66 75 6c 6c 2d 74  # use the full-t
2010: 65 78 74 20 69 6e 64 65 78 20 28 69 2e 65 2e 20  ext index (i.e. 
2020: 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 20  lookup by rowid 
2030: 6f 72 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63  or full-table sc
2040: 61 6e 29 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  an)..#.do_execsq
2050: 6c 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20 20 43  l_test 7.1 {.  C
2060: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
2070: 42 4c 45 20 74 31 30 20 55 53 49 4e 47 20 66 74  BLE t10 USING ft
2080: 73 35 28 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 49  s5(content);.  I
2090: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56  NSERT INTO t10 V
20a0: 41 4c 55 45 53 28 27 66 69 72 73 74 20 72 65 63  ALUES('first rec
20b0: 6f 72 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ord');.  INSERT 
20c0: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
20d0: 27 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 27 29  'second record')
20e0: 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ;.}.do_execsql_t
20f0: 65 73 74 20 37 2e 32 20 7b 0a 20 20 53 45 4c 45  est 7.2 {.  SELE
2100: 43 54 20 74 79 70 65 6f 66 28 6d 61 74 63 68 69  CT typeof(matchi
2110: 6e 66 6f 28 74 31 30 29 29 2c 20 6c 65 6e 67 74  nfo(t10)), lengt
2120: 68 28 6d 61 74 63 68 69 6e 66 6f 28 74 31 30 29  h(matchinfo(t10)
2130: 29 20 46 52 4f 4d 20 74 31 30 3b 0a 7d 20 7b 62  ) FROM t10;.} {b
2140: 6c 6f 62 20 38 20 62 6c 6f 62 20 38 7d 0a 64 6f  lob 8 blob 8}.do
2150: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
2160: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 79 70  3 {.  SELECT typ
2170: 65 6f 66 28 6d 61 74 63 68 69 6e 66 6f 28 74 31  eof(matchinfo(t1
2180: 30 29 29 2c 20 6c 65 6e 67 74 68 28 6d 61 74 63  0)), length(matc
2190: 68 69 6e 66 6f 28 74 31 30 29 29 20 46 52 4f 4d  hinfo(t10)) FROM
21a0: 20 74 31 30 20 57 48 45 52 45 20 72 6f 77 69 64   t10 WHERE rowid
21b0: 3d 31 3b 0a 7d 20 7b 62 6c 6f 62 20 38 7d 0a 64  =1;.} {blob 8}.d
21c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37  o_execsql_test 7
21d0: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 79  .4 {.  SELECT ty
21e0: 70 65 6f 66 28 6d 61 74 63 68 69 6e 66 6f 28 74  peof(matchinfo(t
21f0: 31 30 29 29 2c 20 6c 65 6e 67 74 68 28 6d 61 74  10)), length(mat
2200: 63 68 69 6e 66 6f 28 74 31 30 29 29 20 0a 20 20  chinfo(t10)) .  
2210: 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20 74  FROM t10 WHERE t
2220: 31 30 20 4d 41 54 43 48 20 27 72 65 63 6f 72 64  10 MATCH 'record
2230: 27 0a 7d 20 7b 62 6c 6f 62 20 32 30 20 62 6c 6f  '.} {blob 20 blo
2240: 62 20 32 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  b 20}..#--------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 0a 23 20 54 65 73 74 20 61 20 73 70 65 63 69  -.# Test a speci
22a0: 61 6c 20 63 61 73 65 20 2d 20 6d 61 74 63 68 69  al case - matchi
22b0: 6e 66 6f 28 27 6e 78 61 27 29 20 77 69 74 68 20  nfo('nxa') with 
22c0: 6d 61 6e 79 20 7a 65 72 6f 20 6c 65 6e 67 74 68  many zero length
22d0: 20 64 6f 63 75 6d 65 6e 74 73 2e 20 0a 23 20 53   documents. .# S
22e0: 70 65 63 69 61 6c 20 62 65 63 61 75 73 65 20 22  pecial because "
22f0: 78 22 20 69 6e 74 65 72 6e 61 6c 6c 79 20 75 73  x" internally us
2300: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 75  es a statement u
2310: 73 65 64 20 62 79 20 62 6f 74 68 20 22 6e 22 20  sed by both "n" 
2320: 61 6e 64 20 22 61 22 2e 20 0a 23 20 54 68 69 73  and "a". .# This
2330: 20 77 61 73 20 63 61 75 73 69 6e 67 20 61 20 70   was causing a p
2340: 72 6f 62 6c 65 6d 20 61 74 20 6f 6e 65 20 70 6f  roblem at one po
2350: 69 6e 74 20 69 6e 20 74 68 65 20 6f 62 73 63 75  int in the obscu
2360: 72 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68  re case where th
2370: 65 0a 23 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  e.# total number
2380: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
2390: 61 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 66  a stored in an f
23a0: 74 73 33 20 74 61 62 6c 65 20 77 61 73 20 67 72  ts3 table was gr
23b0: 65 61 74 65 72 20 74 68 61 6e 0a 23 20 74 68 65  eater than.# the
23c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 2e   number of rows.
23d0: 20 69 2e 65 2e 20 77 68 65 6e 20 74 68 65 20 66   i.e. when the f
23e0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72  ollowing query r
23f0: 65 74 75 72 6e 73 20 74 72 75 65 3a 0a 23 0a 23  eturns true:.#.#
2400: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 6c 65     SELECT sum(le
2410: 6e 67 74 68 28 63 6f 6e 74 65 6e 74 29 29 20 3c  ngth(content)) <
2420: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 66   count(*) FROM f
2430: 74 73 34 74 61 62 6c 65 3b 0a 23 0a 64 6f 5f 65  ts4table;.#.do_e
2440: 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 31 20  xecsql_test 8.1 
2450: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  {.  CREATE VIRTU
2460: 41 4c 20 54 41 42 4c 45 20 74 31 31 20 55 53 49  AL TABLE t11 USI
2470: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29  NG fts5(content)
2480: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2490: 74 31 31 28 74 31 31 2c 20 72 61 6e 6b 29 20 56  t11(t11, rank) V
24a0: 41 4c 55 45 53 28 27 70 67 73 7a 27 2c 20 33 32  ALUES('pgsz', 32
24b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
24c0: 20 74 31 31 20 56 41 4c 55 45 53 28 27 71 75 69   t11 VALUES('qui
24d0: 74 65 61 6c 6f 6e 67 73 74 72 69 6e 67 6f 66 74  tealongstringoft
24e0: 65 78 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ext');.  INSERT 
24f0: 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28  INTO t11 VALUES(
2500: 27 61 6e 6f 74 68 65 72 71 75 69 74 65 61 6c 6f  'anotherquitealo
2510: 6e 67 73 74 72 69 6e 67 6f 66 74 65 78 74 27 29  ngstringoftext')
2520: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2530: 74 31 31 20 56 41 4c 55 45 53 28 27 61 74 68 69  t11 VALUES('athi
2540: 72 64 6c 6f 6e 67 73 74 72 69 6e 67 6f 66 74 65  rdlongstringofte
2550: 78 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  xt');.  INSERT I
2560: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 27  NTO t11 VALUES('
2570: 61 6e 64 6f 6e 65 6d 6f 72 65 66 6f 72 67 6f 6f  andonemoreforgoo
2580: 64 6c 75 63 6b 27 29 3b 0a 7d 0a 64 6f 5f 74 65  dluck');.}.do_te
2590: 73 74 20 38 2e 32 20 7b 0a 20 20 66 6f 72 20 7b  st 8.2 {.  for {
25a0: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32  set i 0} {$i < 2
25b0: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
25c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
25d0: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c  ERT INTO t11 VAL
25e0: 55 45 53 28 27 27 29 20 7d 0a 20 20 7d 0a 20 20  UES('') }.  }.  
25f0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
2600: 20 49 4e 54 4f 20 74 31 31 28 74 31 31 29 20 56   INTO t11(t11) V
2610: 41 4c 55 45 53 28 27 6f 70 74 69 6d 69 7a 65 27  ALUES('optimize'
2620: 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63  ) }.} {}.do_exec
2630: 73 71 6c 5f 74 65 73 74 20 38 2e 33 20 7b 0a 20  sql_test 8.3 {. 
2640: 20 53 45 4c 45 43 54 20 6d 69 74 28 6d 61 74 63   SELECT mit(matc
2650: 68 69 6e 66 6f 28 74 31 31 2c 20 27 6e 78 61 27  hinfo(t11, 'nxa'
2660: 29 29 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52  )) FROM t11 WHER
2670: 45 20 74 31 31 20 4d 41 54 43 48 20 27 61 2a 27  E t11 MATCH 'a*'
2680: 0a 7d 20 7b 7b 32 30 34 20 31 20 33 20 33 20 30  .} {{204 1 3 3 0
2690: 7d 20 7b 32 30 34 20 31 20 33 20 33 20 30 7d 20  } {204 1 3 3 0} 
26a0: 7b 32 30 34 20 31 20 33 20 33 20 30 7d 7d 0a 0a  {204 1 3 3 0}}..
26b0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 65  ----------..do_e
2700: 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 31 20  xecsql_test 9.1 
2710: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  {.  CREATE VIRTU
2720: 41 4c 20 54 41 42 4c 45 20 74 31 32 20 55 53 49  AL TABLE t12 USI
2730: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29  NG fts5(content)
2740: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2750: 74 31 32 20 56 41 4c 55 45 53 28 27 61 20 62 20  t12 VALUES('a b 
2760: 63 20 64 27 29 3b 0a 20 20 53 45 4c 45 43 54 20  c d');.  SELECT 
2770: 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 31  mit(matchinfo(t1
2780: 32 2c 20 27 78 27 29 29 20 46 52 4f 4d 20 74 31  2, 'x')) FROM t1
2790: 32 20 57 48 45 52 45 20 74 31 32 20 4d 41 54 43  2 WHERE t12 MATC
27a0: 48 20 27 4e 45 41 52 28 61 20 64 2c 20 31 29 20  H 'NEAR(a d, 1) 
27b0: 4f 52 20 61 27 3b 0a 7d 20 7b 7b 30 20 31 20 31  OR a';.} {{0 1 1
27c0: 20 30 20 31 20 31 20 31 20 31 20 31 7d 7d 0a 64   0 1 1 1 1 1}}.d
27d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39  o_execsql_test 9
27e0: 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  .2 {.  INSERT IN
27f0: 54 4f 20 74 31 32 20 56 41 4c 55 45 53 28 27 61  TO t12 VALUES('a
2800: 20 64 20 63 20 64 27 29 3b 0a 20 20 53 45 4c 45   d c d');.  SELE
2810: 43 54 20 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f  CT mit(matchinfo
2820: 28 74 31 32 2c 20 27 78 27 29 29 20 46 52 4f 4d  (t12, 'x')) FROM
2830: 20 74 31 32 20 57 48 45 52 45 20 74 31 32 20 4d   t12 WHERE t12 M
2840: 41 54 43 48 20 27 4e 45 41 52 28 61 20 64 2c 20  ATCH 'NEAR(a d, 
2850: 31 29 20 4f 52 20 61 27 3b 0a 7d 20 7b 0a 20 20  1) OR a';.} {.  
2860: 7b 30 20 32 20 32 20 30 20 33 20 32 20 31 20 32  {0 2 2 0 3 2 1 2
2870: 20 32 7d 20 7b 31 20 32 20 32 20 31 20 33 20 32   2} {1 2 2 1 3 2
2880: 20 31 20 32 20 32 7d 0a 7d 0a 64 6f 5f 65 78 65   1 2 2}.}.do_exe
2890: 63 73 71 6c 5f 74 65 73 74 20 39 2e 33 20 7b 0a  csql_test 9.3 {.
28a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
28b0: 32 20 56 41 4c 55 45 53 28 27 61 20 64 20 64 20  2 VALUES('a d d 
28c0: 61 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 6d 69  a');.  SELECT mi
28d0: 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 31 32 2c  t(matchinfo(t12,
28e0: 20 27 78 27 29 29 20 46 52 4f 4d 20 74 31 32 20   'x')) FROM t12 
28f0: 57 48 45 52 45 20 74 31 32 20 4d 41 54 43 48 20  WHERE t12 MATCH 
2900: 27 4e 45 41 52 28 61 20 64 2c 20 31 29 20 4f 52  'NEAR(a d, 1) OR
2910: 20 61 27 3b 0a 7d 20 7b 0a 20 20 7b 30 20 34 20   a';.} {.  {0 4 
2920: 33 20 30 20 35 20 33 20 31 20 34 20 33 7d 20 7b  3 0 5 3 1 4 3} {
2930: 31 20 34 20 33 20 31 20 35 20 33 20 31 20 34 20  1 4 3 1 5 3 1 4 
2940: 33 7d 20 7b 32 20 34 20 33 20 32 20 35 20 33 20  3} {2 4 3 2 5 3 
2950: 32 20 34 20 33 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  2 4 3}.}..#-----
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 6f  ------.# Test fo
29b0: 72 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 0a  r a memory leak.
29c0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
29d0: 74 20 31 30 2e 31 20 7b 0a 20 20 44 52 4f 50 20  t 10.1 {.  DROP 
29e0: 54 41 42 4c 45 20 74 31 30 3b 0a 20 20 43 52 45  TABLE t10;.  CRE
29f0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
2a00: 45 20 74 31 30 20 55 53 49 4e 47 20 66 74 73 35  E t10 USING fts5
2a10: 28 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20  (idx, value);.  
2a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20  INSERT INTO t10 
2a30: 76 61 6c 75 65 73 20 28 31 2c 20 27 6f 6e 65 27  values (1, 'one'
2a40: 29 2c 28 32 2c 20 27 74 77 6f 27 29 2c 28 33 2c  ),(2, 'two'),(3,
2a50: 20 27 74 68 72 65 65 27 29 3b 0a 20 20 53 45 4c   'three');.  SEL
2a60: 45 43 54 20 74 31 30 2e 72 6f 77 69 64 2c 20 74  ECT t10.rowid, t
2a70: 31 30 2e 2a 0a 20 20 20 20 46 52 4f 4d 20 74 31  10.*.    FROM t1
2a80: 30 0a 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45  0.    JOIN (SELE
2a90: 43 54 20 31 20 41 53 20 69 64 78 20 55 4e 49 4f  CT 1 AS idx UNIO
2aa0: 4e 20 53 45 4c 45 43 54 20 32 20 55 4e 49 4f 4e  N SELECT 2 UNION
2ab0: 20 53 45 4c 45 43 54 20 33 29 20 41 53 20 78 0a   SELECT 3) AS x.
2ac0: 20 20 20 57 48 45 52 45 20 74 31 30 20 4d 41 54     WHERE t10 MAT
2ad0: 43 48 20 78 2e 69 64 78 0a 20 20 20 20 20 41 4e  CH x.idx.     AN
2ae0: 44 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 30 29  D matchinfo(t10)
2af0: 20 6e 6f 74 20 6e 75 6c 6c 0a 20 20 20 47 52 4f   not null.   GRO
2b00: 55 50 20 42 59 20 74 31 30 2e 72 6f 77 69 64 0a  UP BY t10.rowid.
2b10: 20 20 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 7d     ORDER BY 1;.}
2b20: 20 7b 31 20 31 20 6f 6e 65 20 32 20 32 20 74 77   {1 1 one 2 2 tw
2b30: 6f 20 33 20 33 20 74 68 72 65 65 7d 0a 20 20 0a  o 3 3 three}.  .
2b40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
2b90: 65 73 74 20 74 68 65 20 27 79 27 20 6d 61 74 63  est the 'y' matc
2ba0: 68 69 6e 66 6f 20 66 6c 61 67 0a 23 0a 72 65 73  hinfo flag.#.res
2bb0: 65 74 5f 64 62 0a 73 71 6c 69 74 65 33 5f 66 74  et_db.sqlite3_ft
2bc0: 73 35 5f 72 65 67 69 73 74 65 72 5f 6d 61 74 63  s5_register_matc
2bd0: 68 69 6e 66 6f 20 64 62 0a 64 6f 5f 65 78 65 63  hinfo db.do_exec
2be0: 73 71 6c 5f 74 65 73 74 20 31 31 2e 30 20 7b 0a  sql_test 11.0 {.
2bf0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
2c00: 20 54 41 42 4c 45 20 74 74 20 55 53 49 4e 47 20   TABLE tt USING 
2c10: 66 74 73 35 28 78 2c 20 79 29 3b 0a 20 20 49 4e  fts5(x, y);.  IN
2c20: 53 45 52 54 20 49 4e 54 4f 20 74 74 20 56 41 4c  SERT INTO tt VAL
2c30: 55 45 53 28 27 63 20 64 20 61 20 63 20 64 20 64  UES('c d a c d d
2c40: 27 2c 20 27 65 20 61 20 67 20 62 20 64 20 61 27  ', 'e a g b d a'
2c50: 29 3b 20 20 20 2d 2d 20 31 0a 20 20 49 4e 53 45  );   -- 1.  INSE
2c60: 52 54 20 49 4e 54 4f 20 74 74 20 56 41 4c 55 45  RT INTO tt VALUE
2c70: 53 28 27 63 20 63 20 67 20 61 20 65 20 62 27 2c  S('c c g a e b',
2c80: 20 27 63 20 67 20 64 20 67 20 65 20 63 27 29 3b   'c g d g e c');
2c90: 20 20 20 2d 2d 20 32 0a 20 20 49 4e 53 45 52 54     -- 2.  INSERT
2ca0: 20 49 4e 54 4f 20 74 74 20 56 41 4c 55 45 53 28   INTO tt VALUES(
2cb0: 27 62 20 65 20 66 20 64 20 65 20 67 27 2c 20 27  'b e f d e g', '
2cc0: 62 20 61 20 63 20 62 20 63 20 67 27 29 3b 20 20  b a c b c g');  
2cd0: 20 2d 2d 20 33 0a 20 20 49 4e 53 45 52 54 20 49   -- 3.  INSERT I
2ce0: 4e 54 4f 20 74 74 20 56 41 4c 55 45 53 28 27 61  NTO tt VALUES('a
2cf0: 20 63 20 66 20 66 20 67 20 64 27 2c 20 27 64 20   c f f g d', 'd 
2d00: 62 20 66 20 64 20 65 20 67 27 29 3b 20 20 20 2d  b f d e g');   -
2d10: 2d 20 34 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  - 4.  INSERT INT
2d20: 4f 20 74 74 20 56 41 4c 55 45 53 28 27 67 20 61  O tt VALUES('g a
2d30: 20 63 20 66 20 63 20 66 27 2c 20 27 64 20 67 20   c f c f', 'd g 
2d40: 67 20 62 20 63 20 63 27 29 3b 20 20 20 2d 2d 20  g b c c');   -- 
2d50: 35 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  5.  INSERT INTO 
2d60: 74 74 20 56 41 4c 55 45 53 28 27 67 20 61 20 63  tt VALUES('g a c
2d70: 20 65 20 62 20 62 27 2c 20 27 64 20 62 20 66 20   e b b', 'd b f 
2d80: 62 20 67 20 67 27 29 3b 20 20 20 2d 2d 20 36 0a  b g g');   -- 6.
2d90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74    INSERT INTO tt
2da0: 20 56 41 4c 55 45 53 28 27 66 20 64 20 61 20 61   VALUES('f d a a
2db0: 20 66 20 63 27 2c 20 27 65 20 65 20 61 20 64 20   f c', 'e e a d 
2dc0: 63 20 66 27 29 3b 20 20 20 2d 2d 20 37 0a 20 20  c f');   -- 7.  
2dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74 20 56  INSERT INTO tt V
2de0: 41 4c 55 45 53 28 27 61 20 63 20 62 20 62 20 67  ALUES('a c b b g
2df0: 20 66 27 2c 20 27 61 20 62 20 61 20 65 20 64 20   f', 'a b a e d 
2e00: 66 27 29 3b 20 20 20 2d 2d 20 38 0a 20 20 49 4e  f');   -- 8.  IN
2e10: 53 45 52 54 20 49 4e 54 4f 20 74 74 20 56 41 4c  SERT INTO tt VAL
2e20: 55 45 53 28 27 62 20 61 20 66 20 65 20 63 20 63  UES('b a f e c c
2e30: 27 2c 20 27 66 20 64 20 62 20 62 20 61 20 62 27  ', 'f d b b a b'
2e40: 29 3b 20 20 20 2d 2d 20 39 0a 20 20 49 4e 53 45  );   -- 9.  INSE
2e50: 52 54 20 49 4e 54 4f 20 74 74 20 56 41 4c 55 45  RT INTO tt VALUE
2e60: 53 28 27 66 20 64 20 63 20 65 20 61 20 63 27 2c  S('f d c e a c',
2e70: 20 27 66 20 61 20 66 20 61 20 61 20 66 27 29 3b   'f a f a a f');
2e80: 20 20 20 2d 2d 20 31 30 0a 7d 0a 0a 64 62 20 66     -- 10.}..db f
2e90: 75 6e 63 20 6d 69 74 20 6d 69 74 0a 66 6f 72 65  unc mit mit.fore
2ea0: 61 63 68 20 7b 74 6e 20 65 78 70 72 20 72 65 73  ach {tn expr res
2eb0: 7d 20 7b 0a 20 20 31 20 22 61 22 20 7b 0a 20 20  } {.  1 "a" {.  
2ec0: 20 20 20 20 31 20 7b 31 20 32 7d 20 20 20 32 20      1 {1 2}   2 
2ed0: 7b 31 20 30 7d 20 20 20 33 20 7b 30 20 31 7d 20  {1 0}   3 {0 1} 
2ee0: 20 20 34 20 7b 31 20 30 7d 20 20 20 35 20 7b 31    4 {1 0}   5 {1
2ef0: 20 30 7d 0a 20 20 20 20 20 20 36 20 7b 31 20 30   0}.      6 {1 0
2f00: 7d 20 20 20 37 20 7b 32 20 31 7d 20 20 20 38 20  }   7 {2 1}   8 
2f10: 7b 31 20 32 7d 20 20 20 39 20 7b 31 20 31 7d 20  {1 2}   9 {1 1} 
2f20: 20 31 30 20 7b 31 20 33 7d 0a 20 20 7d 0a 0a 20   10 {1 3}.  }.. 
2f30: 20 32 20 22 62 22 20 7b 0a 20 20 20 20 20 20 31   2 "b" {.      1
2f40: 20 7b 30 20 31 7d 20 20 20 32 20 7b 31 20 30 7d   {0 1}   2 {1 0}
2f50: 20 20 20 33 20 7b 31 20 32 7d 20 20 20 34 20 7b     3 {1 2}   4 {
2f60: 30 20 31 7d 20 20 20 35 20 7b 30 20 31 7d 0a 20  0 1}   5 {0 1}. 
2f70: 20 20 20 20 20 36 20 7b 32 20 32 7d 20 20 20 20       6 {2 2}    
2f80: 20 20 20 20 20 20 20 20 20 38 20 7b 32 20 31 7d           8 {2 1}
2f90: 20 20 20 39 20 7b 31 20 33 7d 20 20 20 20 20 20     9 {1 3}      
2fa0: 20 20 20 20 20 20 0a 20 20 7d 0a 0a 20 20 33 20        .  }..  3 
2fb0: 22 79 3a 61 22 20 7b 0a 20 20 20 20 20 20 31 20  "y:a" {.      1 
2fc0: 7b 30 20 32 7d 20 20 20 20 20 20 20 20 20 20 20  {0 2}           
2fd0: 20 20 33 20 7b 30 20 31 7d 20 20 20 20 20 20 20    3 {0 1}       
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 20                7 
3000: 7b 30 20 31 7d 20 20 20 38 20 7b 30 20 32 7d 20  {0 1}   8 {0 2} 
3010: 20 20 39 20 7b 30 20 31 7d 20 20 31 30 20 7b 30    9 {0 1}  10 {0
3020: 20 33 7d 0a 20 20 7d 0a 0a 20 20 34 20 22 78 3a   3}.  }..  4 "x:
3030: 61 22 20 7b 0a 20 20 20 20 20 20 31 20 7b 31 20  a" {.      1 {1 
3040: 30 7d 20 20 20 32 20 7b 31 20 30 7d 20 20 20 20  0}   2 {1 0}    
3050: 20 20 20 20 20 20 20 20 20 34 20 7b 31 20 30 7d           4 {1 0}
3060: 20 20 20 35 20 7b 31 20 30 7d 0a 20 20 20 20 20     5 {1 0}.     
3070: 20 36 20 7b 31 20 30 7d 20 20 20 37 20 7b 32 20   6 {1 0}   7 {2 
3080: 30 7d 20 20 20 38 20 7b 31 20 30 7d 20 20 20 39  0}   8 {1 0}   9
3090: 20 7b 31 20 30 7d 20 20 31 30 20 7b 31 20 30 7d   {1 0}  10 {1 0}
30a0: 0a 20 20 7d 0a 0a 20 20 35 20 22 61 20 4f 52 20  .  }..  5 "a OR 
30b0: 62 22 20 7b 0a 20 20 20 20 20 20 31 20 7b 31 20  b" {.      1 {1 
30c0: 32 20 30 20 31 7d 20 20 20 32 20 7b 31 20 30 20  2 0 1}   2 {1 0 
30d0: 31 20 30 7d 20 20 20 33 20 7b 30 20 31 20 31 20  1 0}   3 {0 1 1 
30e0: 32 7d 20 20 20 34 20 7b 31 20 30 20 30 20 31 7d  2}   4 {1 0 0 1}
30f0: 20 20 20 35 20 7b 31 20 30 20 30 20 31 7d 0a 20     5 {1 0 0 1}. 
3100: 20 20 20 20 20 36 20 7b 31 20 30 20 32 20 32 7d       6 {1 0 2 2}
3110: 20 20 20 37 20 7b 32 20 31 20 30 20 30 7d 20 20     7 {2 1 0 0}  
3120: 20 38 20 7b 31 20 32 20 32 20 31 7d 20 20 20 39   8 {1 2 2 1}   9
3130: 20 7b 31 20 31 20 31 20 33 7d 20 20 31 30 20 7b   {1 1 1 3}  10 {
3140: 31 20 33 20 30 20 30 7d 0a 20 20 7d 0a 0a 20 20  1 3 0 0}.  }..  
3150: 36 20 22 61 20 41 4e 44 20 62 22 20 7b 0a 20 20  6 "a AND b" {.  
3160: 20 20 20 20 31 20 7b 31 20 32 20 30 20 31 7d 20      1 {1 2 0 1} 
3170: 20 20 32 20 7b 31 20 30 20 31 20 30 7d 20 20 20    2 {1 0 1 0}   
3180: 33 20 7b 30 20 31 20 31 20 32 7d 20 20 20 34 20  3 {0 1 1 2}   4 
3190: 7b 31 20 30 20 30 20 31 7d 20 20 20 35 20 7b 31  {1 0 0 1}   5 {1
31a0: 20 30 20 30 20 31 7d 0a 20 20 20 20 20 20 36 20   0 0 1}.      6 
31b0: 7b 31 20 30 20 32 20 32 7d 20 20 20 20 20 20 20  {1 0 2 2}       
31c0: 20 20 20 20 20 20 20 20 20 20 38 20 7b 31 20 32            8 {1 2
31d0: 20 32 20 31 7d 20 20 20 39 20 7b 31 20 31 20 31   2 1}   9 {1 1 1
31e0: 20 33 7d 20 20 20 20 20 20 20 20 20 20 20 20 20   3}             
31f0: 20 0a 20 20 7d 0a 0a 20 20 37 20 22 61 20 4f 52   .  }..  7 "a OR
3200: 20 28 61 20 41 4e 44 20 62 29 22 20 7b 0a 20 20   (a AND b)" {.  
3210: 20 20 20 20 31 20 7b 31 20 32 20 31 20 32 20 30      1 {1 2 1 2 0
3220: 20 31 7d 20 20 20 32 20 7b 31 20 30 20 31 20 30   1}   2 {1 0 1 0
3230: 20 31 20 30 7d 20 20 20 33 20 7b 30 20 31 20 30   1 0}   3 {0 1 0
3240: 20 31 20 31 20 32 7d 20 20 20 34 20 7b 31 20 30   1 1 2}   4 {1 0
3250: 20 31 20 30 20 30 20 31 7d 20 20 20 0a 20 20 20   1 0 0 1}   .   
3260: 20 20 20 35 20 7b 31 20 30 20 31 20 30 20 30 20     5 {1 0 1 0 0 
3270: 31 7d 20 20 20 36 20 7b 31 20 30 20 31 20 30 20  1}   6 {1 0 1 0 
3280: 32 20 32 7d 20 20 20 37 20 7b 32 20 31 20 30 20  2 2}   7 {2 1 0 
3290: 30 20 30 20 30 7d 20 20 20 38 20 7b 31 20 32 20  0 0 0}   8 {1 2 
32a0: 31 20 32 20 32 20 31 7d 20 20 20 0a 20 20 20 20  1 2 2 1}   .    
32b0: 20 20 39 20 7b 31 20 31 20 31 20 31 20 31 20 33    9 {1 1 1 1 1 3
32c0: 7d 20 20 31 30 20 7b 31 20 33 20 30 20 30 20 30  }  10 {1 3 0 0 0
32d0: 20 30 7d 0a 20 20 7d 0a 0a 7d 20 7b 0a 20 20 64   0}.  }..} {.  d
32e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
32f0: 31 2e 31 2e 24 74 6e 2e 31 20 20 7b 0a 20 20 20  1.1.$tn.1  {.   
3300: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 6d   SELECT rowid, m
3310: 69 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 74 2c  it(matchinfo(tt,
3320: 20 27 79 27 29 29 20 46 52 4f 4d 20 74 74 20 57   'y')) FROM tt W
3330: 48 45 52 45 20 74 74 20 4d 41 54 43 48 20 24 65  HERE tt MATCH $e
3340: 78 70 72 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20  xpr.  } $res..  
3350: 73 65 74 20 72 32 20 5b 6c 69 73 74 5d 0a 20 20  set r2 [list].  
3360: 66 6f 72 65 61 63 68 20 7b 72 6f 77 69 64 20 4c  foreach {rowid L
3370: 7d 20 24 72 65 73 20 7b 0a 20 20 20 20 6c 61 70  } $res {.    lap
3380: 70 65 6e 64 20 72 32 20 24 72 6f 77 69 64 0a 20  pend r2 $rowid. 
3390: 20 20 20 73 65 74 20 4d 20 5b 6c 69 73 74 5d 0a     set M [list].
33a0: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62      foreach {a b
33b0: 7d 20 24 4c 20 7b 0a 20 20 20 20 20 20 6c 61 70  } $L {.      lap
33c0: 70 65 6e 64 20 4d 20 5b 65 78 70 72 20 28 24 61  pend M [expr ($a
33d0: 20 3f 20 31 20 3a 20 30 29 20 2b 20 28 24 62 20   ? 1 : 0) + ($b 
33e0: 3f 20 32 20 3a 20 30 29 5d 0a 20 20 20 20 7d 0a  ? 2 : 0)].    }.
33f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 32 20 24      lappend r2 $
3400: 4d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 78 65 63  M.  }..  do_exec
3410: 73 71 6c 5f 74 65 73 74 20 31 31 2e 31 2e 24 74  sql_test 11.1.$t
3420: 6e 2e 32 20 20 7b 0a 20 20 20 20 53 45 4c 45 43  n.2  {.    SELEC
3430: 54 20 72 6f 77 69 64 2c 20 6d 69 74 28 6d 61 74  T rowid, mit(mat
3440: 63 68 69 6e 66 6f 28 74 74 2c 20 27 62 27 29 29  chinfo(tt, 'b'))
3450: 20 46 52 4f 4d 20 74 74 20 57 48 45 52 45 20 74   FROM tt WHERE t
3460: 74 20 4d 41 54 43 48 20 24 65 78 70 72 0a 20 20  t MATCH $expr.  
3470: 7d 20 24 72 32 0a 0a 20 20 64 6f 5f 65 78 65 63  } $r2..  do_exec
3480: 73 71 6c 5f 74 65 73 74 20 31 31 2e 31 2e 24 74  sql_test 11.1.$t
3490: 6e 2e 32 20 20 7b 0a 20 20 20 20 53 45 4c 45 43  n.2  {.    SELEC
34a0: 54 20 72 6f 77 69 64 2c 20 6d 69 74 28 6d 61 74  T rowid, mit(mat
34b0: 63 68 69 6e 66 6f 28 74 74 2c 20 27 62 27 29 29  chinfo(tt, 'b'))
34c0: 20 46 52 4f 4d 20 74 74 20 57 48 45 52 45 20 74   FROM tt WHERE t
34d0: 74 20 4d 41 54 43 48 20 24 65 78 70 72 0a 20 20  t MATCH $expr.  
34e0: 7d 20 24 72 32 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  } $r2.}..#------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
3540: 20 27 62 27 20 6d 61 74 63 68 69 6e 66 6f 20 66   'b' matchinfo f
3550: 6c 61 67 0a 23 0a 72 65 73 65 74 5f 64 62 0a 73  lag.#.reset_db.s
3560: 71 6c 69 74 65 33 5f 66 74 73 35 5f 72 65 67 69  qlite3_fts5_regi
3570: 73 74 65 72 5f 6d 61 74 63 68 69 6e 66 6f 20 64  ster_matchinfo d
3580: 62 0a 64 62 20 66 75 6e 63 20 6d 69 74 20 6d 69  b.db func mit mi
3590: 74 0a 0a 64 6f 5f 74 65 73 74 20 31 32 2e 30 20  t..do_test 12.0 
35a0: 7b 0a 20 20 73 65 74 20 63 6f 6c 73 20 5b 6c 69  {.  set cols [li
35b0: 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  st].  for {set i
35c0: 20 30 7d 20 7b 24 69 20 3c 20 35 30 7d 20 7b 69   0} {$i < 50} {i
35d0: 6e 63 72 20 69 7d 20 7b 20 6c 61 70 70 65 6e 64  ncr i} { lappend
35e0: 20 63 6f 6c 73 20 22 63 24 69 22 20 7d 0a 20 20   cols "c$i" }.  
35f0: 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20  execsql "CREATE 
3600: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 74  VIRTUAL TABLE tt
3610: 20 55 53 49 4e 47 20 66 74 73 35 28 5b 6a 6f 69   USING fts5([joi
3620: 6e 20 24 63 6f 6c 73 20 2c 5d 29 22 0a 7d 20 7b  n $cols ,])".} {
3630: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
3640: 73 74 20 31 32 2e 31 20 7b 0a 20 20 49 4e 53 45  st 12.1 {.  INSE
3650: 52 54 20 49 4e 54 4f 20 74 74 20 28 72 6f 77 69  RT INTO tt (rowi
3660: 64 2c 20 63 34 2c 20 63 34 35 29 20 56 41 4c 55  d, c4, c45) VALU
3670: 45 53 28 31 2c 20 27 61 62 63 27 2c 20 27 61 62  ES(1, 'abc', 'ab
3680: 63 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 6d 69  c');.  SELECT mi
3690: 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 74 2c 20  t(matchinfo(tt, 
36a0: 27 62 27 29 29 20 46 52 4f 4d 20 74 74 20 57 48  'b')) FROM tt WH
36b0: 45 52 45 20 74 74 20 4d 41 54 43 48 20 27 61 62  ERE tt MATCH 'ab
36c0: 63 27 3b 0a 7d 20 5b 6c 69 73 74 20 5b 6c 69 73  c';.} [list [lis
36d0: 74 20 5b 65 78 70 72 20 31 3c 3c 34 5d 20 5b 65  t [expr 1<<4] [e
36e0: 78 70 72 20 31 3c 3c 28 34 35 2d 33 32 29 5d 5d  xpr 1<<(45-32)]]
36f0: 5d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a  ]..finish_test..