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

Artifact ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318:


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 74 68 65 20 61 75  cusing on the au
0180: 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
0190: 20 41 50 49 73 2e 0a 23 0a 0a 73 6f 75 72 63 65   APIs..#..source
01a0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c   [file join [fil
01b0: 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
01c0: 73 63 72 69 70 74 5d 5d 20 66 74 73 35 5f 63 6f  script]] fts5_co
01d0: 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 65 74 20 74 65  mmon.tcl].set te
01e0: 73 74 70 72 65 66 69 78 20 66 74 73 35 61 75 78  stprefix fts5aux
01f0: 0a 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 45 4e  ..# If SQLITE_EN
0200: 41 42 4c 45 5f 46 54 53 35 20 69 73 20 64 65 66  ABLE_FTS5 is def
0210: 69 6e 65 64 2c 20 6f 6d 69 74 20 74 68 69 73 20  ined, omit this 
0220: 66 69 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65 20  file..ifcapable 
0230: 21 66 74 73 35 20 7b 0a 20 20 66 69 6e 69 73 68  !fts5 {.  finish
0240: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
0250: 0a 0a 70 72 6f 63 20 69 6e 73 74 20 7b 63 6d 64  ..proc inst {cmd
0260: 20 69 7d 20 7b 20 0a 20 20 24 63 6d 64 20 78 49   i} { .  $cmd xI
0270: 6e 73 74 20 24 69 0a 7d 0a 73 71 6c 69 74 65 33  nst $i.}.sqlite3
0280: 5f 66 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e  _fts5_create_fun
0290: 63 74 69 6f 6e 20 64 62 20 69 6e 73 74 20 69 6e  ction db inst in
02a0: 73 74 0a 0a 70 72 6f 63 20 63 6f 6c 73 69 7a 65  st..proc colsize
02b0: 20 7b 63 6d 64 20 69 7d 20 7b 20 0a 20 20 24 63   {cmd i} { .  $c
02c0: 6d 64 20 78 43 6f 6c 75 6d 6e 53 69 7a 65 20 24  md xColumnSize $
02d0: 69 0a 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73 35  i.}.sqlite3_fts5
02e0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
02f0: 20 64 62 20 63 6f 6c 73 69 7a 65 20 63 6f 6c 73   db colsize cols
0300: 69 7a 65 0a 0a 70 72 6f 63 20 74 6f 74 61 6c 73  ize..proc totals
0310: 69 7a 65 20 7b 63 6d 64 20 69 7d 20 7b 20 0a 20  ize {cmd i} { . 
0320: 20 24 63 6d 64 20 78 43 6f 6c 75 6d 6e 54 6f 74   $cmd xColumnTot
0330: 61 6c 53 69 7a 65 20 24 69 0a 7d 0a 73 71 6c 69  alSize $i.}.sqli
0340: 74 65 33 5f 66 74 73 35 5f 63 72 65 61 74 65 5f  te3_fts5_create_
0350: 66 75 6e 63 74 69 6f 6e 20 64 62 20 74 6f 74 61  function db tota
0360: 6c 73 69 7a 65 20 74 6f 74 61 6c 73 69 7a 65 0a  lsize totalsize.
0370: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0380: 20 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20   1.0 {.  CREATE 
0390: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 66 31  VIRTUAL TABLE f1
03a0: 20 55 53 49 4e 47 20 66 74 73 35 28 61 2c 20 62   USING fts5(a, b
03b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
03c0: 20 66 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 20   f1 VALUES('one 
03d0: 74 77 6f 27 2c 20 27 74 77 6f 20 6f 6e 65 20 7a  two', 'two one z
03e0: 65 72 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ero');.  INSERT 
03f0: 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 27  INTO f1 VALUES('
0400: 6f 6e 65 20 6f 6e 65 27 2c 20 27 6f 6e 65 20 6f  one one', 'one o
0410: 6e 65 20 6f 6e 65 27 29 3b 0a 7d 0a 0a 64 6f 5f  ne one');.}..do_
0420: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 2e  catchsql_test 1.
0430: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 6e 73  1 {.  SELECT ins
0440: 74 28 66 31 2c 20 2d 31 29 20 46 52 4f 4d 20 66  t(f1, -1) FROM f
0450: 31 20 57 48 45 52 45 20 66 31 20 4d 41 54 43 48  1 WHERE f1 MATCH
0460: 20 27 74 77 6f 27 3b 0a 7d 20 7b 31 20 53 51 4c   'two';.} {1 SQL
0470: 49 54 45 5f 52 41 4e 47 45 7d 0a 64 6f 5f 63 61  ITE_RANGE}.do_ca
0480: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 2e 32 20  tchsql_test 1.2 
0490: 7b 0a 20 20 53 45 4c 45 43 54 20 69 6e 73 74 28  {.  SELECT inst(
04a0: 66 31 2c 20 30 29 20 46 52 4f 4d 20 66 31 20 57  f1, 0) FROM f1 W
04b0: 48 45 52 45 20 66 31 20 4d 41 54 43 48 20 27 74  HERE f1 MATCH 't
04c0: 77 6f 27 3b 0a 7d 20 7b 30 20 7b 7b 30 20 30 20  wo';.} {0 {{0 0 
04d0: 31 7d 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  1}}}.do_catchsql
04e0: 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 20 53 45  _test 1.3 {.  SE
04f0: 4c 45 43 54 20 69 6e 73 74 28 66 31 2c 20 31 29  LECT inst(f1, 1)
0500: 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20 66   FROM f1 WHERE f
0510: 31 20 4d 41 54 43 48 20 27 74 77 6f 27 3b 0a 7d  1 MATCH 'two';.}
0520: 20 7b 30 20 7b 7b 30 20 31 20 30 7d 7d 7d 0a 64   {0 {{0 1 0}}}.d
0530: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
0540: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 69  1.4 {.  SELECT i
0550: 6e 73 74 28 66 31 2c 20 32 29 20 46 52 4f 4d 20  nst(f1, 2) FROM 
0560: 66 31 20 57 48 45 52 45 20 66 31 20 4d 41 54 43  f1 WHERE f1 MATC
0570: 48 20 27 74 77 6f 27 3b 0a 7d 20 7b 31 20 53 51  H 'two';.} {1 SQ
0580: 4c 49 54 45 5f 52 41 4e 47 45 7d 0a 0a 64 6f 5f  LITE_RANGE}..do_
0590: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 32 2e  catchsql_test 2.
05a0: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 6c  1 {.  SELECT col
05b0: 73 69 7a 65 28 66 31 2c 20 32 29 20 46 52 4f 4d  size(f1, 2) FROM
05c0: 20 66 31 20 57 48 45 52 45 20 66 31 20 4d 41 54   f1 WHERE f1 MAT
05d0: 43 48 20 27 74 77 6f 27 3b 0a 7d 20 7b 31 20 53  CH 'two';.} {1 S
05e0: 51 4c 49 54 45 5f 52 41 4e 47 45 7d 0a 64 6f 5f  QLITE_RANGE}.do_
05f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
0600: 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 6c 73   {.  SELECT cols
0610: 69 7a 65 28 66 31 2c 20 30 29 2c 20 63 6f 6c 73  ize(f1, 0), cols
0620: 69 7a 65 28 66 31 2c 20 31 29 20 46 52 4f 4d 20  ize(f1, 1) FROM 
0630: 66 31 20 57 48 45 52 45 20 66 31 20 4d 41 54 43  f1 WHERE f1 MATC
0640: 48 20 27 7a 65 72 6f 27 3b 0a 7d 20 7b 32 20 33  H 'zero';.} {2 3
0650: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
0660: 74 20 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  t 2.3 {.  SELECT
0670: 20 63 6f 6c 73 69 7a 65 28 66 31 2c 20 2d 31 29   colsize(f1, -1)
0680: 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20 66   FROM f1 WHERE f
0690: 31 20 4d 41 54 43 48 20 27 7a 65 72 6f 27 3b 0a  1 MATCH 'zero';.
06a0: 7d 20 7b 35 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  } {5}..do_execsq
06b0: 6c 5f 74 65 73 74 20 32 2e 34 2e 31 20 7b 0a 20  l_test 2.4.1 {. 
06c0: 20 53 45 4c 45 43 54 20 74 6f 74 61 6c 73 69 7a   SELECT totalsiz
06d0: 65 28 66 31 2c 20 2d 31 29 20 46 52 4f 4d 20 66  e(f1, -1) FROM f
06e0: 31 20 57 48 45 52 45 20 66 31 20 4d 41 54 43 48  1 WHERE f1 MATCH
06f0: 20 27 7a 65 72 6f 27 3b 0a 7d 20 7b 31 30 7d 0a   'zero';.} {10}.
0700: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0710: 32 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  2.4.2 {.  SELECT
0720: 20 74 6f 74 61 6c 73 69 7a 65 28 66 31 2c 20 30   totalsize(f1, 0
0730: 29 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20  ) FROM f1 WHERE 
0740: 66 31 20 4d 41 54 43 48 20 27 7a 65 72 6f 27 3b  f1 MATCH 'zero';
0750: 0a 7d 20 7b 34 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {4}.do_execsq
0760: 6c 5f 74 65 73 74 20 32 2e 34 2e 33 20 7b 0a 20  l_test 2.4.3 {. 
0770: 20 53 45 4c 45 43 54 20 74 6f 74 61 6c 73 69 7a   SELECT totalsiz
0780: 65 28 66 31 2c 20 31 29 20 46 52 4f 4d 20 66 31  e(f1, 1) FROM f1
0790: 20 57 48 45 52 45 20 66 31 20 4d 41 54 43 48 20   WHERE f1 MATCH 
07a0: 27 7a 65 72 6f 27 3b 0a 7d 20 7b 36 7d 0a 64 6f  'zero';.} {6}.do
07b0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 32  _catchsql_test 2
07c0: 2e 34 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.4 {.  SELECT 
07d0: 74 6f 74 61 6c 73 69 7a 65 28 66 31 2c 20 32 29  totalsize(f1, 2)
07e0: 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20 66   FROM f1 WHERE f
07f0: 31 20 4d 41 54 43 48 20 27 7a 65 72 6f 27 3b 0a  1 MATCH 'zero';.
0800: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 52 41 4e 47  } {1 SQLITE_RANG
0810: 45 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  E}..#-----------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0860: 20 54 65 73 74 20 74 68 65 20 78 53 65 74 20 61   Test the xSet a
0870: 6e 64 20 78 47 65 74 41 75 78 64 61 74 61 20 41  nd xGetAuxdata A
0880: 50 49 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  PIs with a NULL 
0890: 64 65 73 74 72 75 63 74 6f 72 2e 0a 23 0a 70 72  destructor..#.pr
08a0: 6f 63 20 70 72 65 76 72 6f 77 69 64 20 7b 61 64  oc prevrowid {ad
08b0: 64 20 63 6d 64 7d 20 7b 0a 20 20 73 65 74 20 72  d cmd} {.  set r
08c0: 65 73 20 5b 24 63 6d 64 20 78 47 65 74 41 75 78  es [$cmd xGetAux
08d0: 64 61 74 61 49 6e 74 20 30 5d 0a 20 20 73 65 74  dataInt 0].  set
08e0: 20 72 20 5b 24 63 6d 64 20 78 52 6f 77 69 64 5d   r [$cmd xRowid]
08f0: 0a 20 20 24 63 6d 64 20 78 53 65 74 41 75 78 64  .  $cmd xSetAuxd
0900: 61 74 61 49 6e 74 20 24 72 0a 20 20 72 65 74 75  ataInt $r.  retu
0910: 72 6e 20 5b 65 78 70 72 20 24 72 65 73 20 2b 20  rn [expr $res + 
0920: 24 61 64 64 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f  $add].}.sqlite3_
0930: 66 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e 63  fts5_create_func
0940: 74 69 6f 6e 20 64 62 20 70 72 65 76 72 6f 77 69  tion db prevrowi
0950: 64 20 20 5b 6c 69 73 74 20 70 72 65 76 72 6f 77  d  [list prevrow
0960: 69 64 20 30 5d 0a 73 71 6c 69 74 65 33 5f 66 74  id 0].sqlite3_ft
0970: 73 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  s5_create_functi
0980: 6f 6e 20 64 62 20 70 72 65 76 72 6f 77 69 64 31  on db prevrowid1
0990: 20 5b 6c 69 73 74 20 70 72 65 76 72 6f 77 69 64   [list prevrowid
09a0: 20 31 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   1]..do_execsql_
09b0: 74 65 73 74 20 33 2e 30 20 7b 0a 20 20 43 52 45  test 3.0 {.  CRE
09c0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
09d0: 45 20 65 35 20 55 53 49 4e 47 20 66 74 73 35 28  E e5 USING fts5(
09e0: 78 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  x);.  INSERT INT
09f0: 4f 20 65 35 20 56 41 4c 55 45 53 28 27 61 20 62  O e5 VALUES('a b
0a00: 20 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   c');.  INSERT I
0a10: 4e 54 4f 20 65 35 20 56 41 4c 55 45 53 28 27 64  NTO e5 VALUES('d
0a20: 20 65 20 66 27 29 3b 0a 20 20 49 4e 53 45 52 54   e f');.  INSERT
0a30: 20 49 4e 54 4f 20 65 35 20 56 41 4c 55 45 53 28   INTO e5 VALUES(
0a40: 27 61 20 62 20 63 27 29 3b 0a 20 20 49 4e 53 45  'a b c');.  INSE
0a50: 52 54 20 49 4e 54 4f 20 65 35 20 56 41 4c 55 45  RT INTO e5 VALUE
0a60: 53 28 27 64 20 65 20 66 27 29 3b 0a 20 20 49 4e  S('d e f');.  IN
0a70: 53 45 52 54 20 49 4e 54 4f 20 65 35 20 56 41 4c  SERT INTO e5 VAL
0a80: 55 45 53 28 27 61 20 62 20 63 27 29 3b 0a 7d 0a  UES('a b c');.}.
0a90: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0aa0: 20 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20   3.1 {.  SELECT 
0ab0: 70 72 65 76 72 6f 77 69 64 28 65 35 29 20 7c 7c  prevrowid(e5) ||
0ac0: 20 27 2b 27 20 7c 7c 20 72 6f 77 69 64 20 46 52   '+' || rowid FR
0ad0: 4f 4d 20 65 35 20 57 48 45 52 45 20 65 35 20 4d  OM e5 WHERE e5 M
0ae0: 41 54 43 48 20 27 63 27 0a 7d 20 7b 30 2b 31 20  ATCH 'c'.} {0+1 
0af0: 20 20 31 2b 33 20 20 20 33 2b 35 7d 0a 0a 64 6f    1+3   3+5}..do
0b00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
0b10: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 70 72 65  2 {.  SELECT pre
0b20: 76 72 6f 77 69 64 28 65 35 29 20 7c 7c 20 27 2b  vrowid(e5) || '+
0b30: 27 20 7c 7c 20 70 72 65 76 72 6f 77 69 64 31 28  ' || prevrowid1(
0b40: 65 35 29 20 7c 7c 20 27 2b 27 20 7c 7c 20 72 6f  e5) || '+' || ro
0b50: 77 69 64 20 0a 20 20 46 52 4f 4d 20 65 35 20 57  wid .  FROM e5 W
0b60: 48 45 52 45 20 65 35 20 4d 41 54 43 48 20 27 65  HERE e5 MATCH 'e
0b70: 27 0a 7d 20 7b 30 2b 31 2b 32 20 20 20 20 32 2b  '.} {0+1+2    2+
0b80: 33 2b 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  3+4}..#---------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20  .# Test that if 
0be0: 74 68 65 20 78 51 75 65 72 79 50 68 72 61 73 65  the xQueryPhrase
0bf0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
0c00: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  s other than SQL
0c10: 49 54 45 5f 4f 4b 2c 0a 23 20 74 68 65 20 71 75  ITE_OK,.# the qu
0c20: 65 72 79 20 69 73 20 61 62 61 6e 64 6f 6e 65 64  ery is abandoned
0c30: 2e 20 41 6e 64 20 74 68 61 74 20 69 66 20 69 74  . And that if it
0c40: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
0c50: 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
0c60: 6e 20 0a 23 20 53 51 4c 49 54 45 5f 44 4f 4e 45  n .# SQLITE_DONE
0c70: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 70  , the error is p
0c80: 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74  ropagated back t
0c90: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 23 0a  o the caller..#.
0ca0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0cb0: 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56  4.0 {.  CREATE V
0cc0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 37 20  IRTUAL TABLE e7 
0cd0: 55 53 49 4e 47 20 66 74 73 35 28 78 29 3b 0a 20  USING fts5(x);. 
0ce0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 37 20   INSERT INTO e7 
0cf0: 56 41 4c 55 45 53 28 27 61 20 78 20 61 27 29 3b  VALUES('a x a');
0d00: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65  .  INSERT INTO e
0d10: 37 20 56 41 4c 55 45 53 28 27 62 20 78 20 62 27  7 VALUES('b x b'
0d20: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0d30: 20 65 37 20 56 41 4c 55 45 53 28 27 63 20 78 20   e7 VALUES('c x 
0d40: 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  c');.  INSERT IN
0d50: 54 4f 20 65 37 20 56 41 4c 55 45 53 28 27 64 20  TO e7 VALUES('d 
0d60: 78 20 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  x d');.  INSERT 
0d70: 49 4e 54 4f 20 65 37 20 56 41 4c 55 45 53 28 27  INTO e7 VALUES('
0d80: 65 20 78 20 65 27 29 3b 0a 7d 0a 0a 70 72 6f 63  e x e');.}..proc
0d90: 20 78 43 61 6c 6c 62 61 63 6b 20 7b 72 6f 77 69   xCallback {rowi
0da0: 64 20 63 6f 64 65 20 63 6d 64 7d 20 7b 0a 20 20  d code cmd} {.  
0db0: 73 65 74 20 72 20 5b 24 63 6d 64 20 78 52 6f 77  set r [$cmd xRow
0dc0: 69 64 5d 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a  id].  lappend ::
0dd0: 63 62 20 24 72 0a 20 20 69 66 20 7b 24 72 3d 3d  cb $r.  if {$r==
0de0: 24 72 6f 77 69 64 7d 20 7b 20 72 65 74 75 72 6e  $rowid} { return
0df0: 20 24 63 6f 64 65 20 7d 0a 20 20 72 65 74 75 72   $code }.  retur
0e00: 6e 20 22 22 0a 7d 0a 0a 70 72 6f 63 20 70 68 72  n "".}..proc phr
0e10: 61 73 65 71 75 65 72 79 20 7b 63 6d 64 20 63 6f  asequery {cmd co
0e20: 64 65 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 63 62  de} {.  set ::cb
0e30: 20 5b 6c 69 73 74 5d 0a 20 20 24 63 6d 64 20 78   [list].  $cmd x
0e40: 51 75 65 72 79 50 68 72 61 73 65 20 31 20 5b 6c  QueryPhrase 1 [l
0e50: 69 73 74 20 78 43 61 6c 6c 62 61 63 6b 20 5b 24  ist xCallback [$
0e60: 63 6d 64 20 78 52 6f 77 69 64 5d 20 24 63 6f 64  cmd xRowid] $cod
0e70: 65 5d 0a 20 20 73 65 74 20 3a 3a 63 62 0a 7d 0a  e].  set ::cb.}.
0e80: 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72  .sqlite3_fts5_cr
0e90: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62  eate_function db
0ea0: 20 70 68 72 61 73 65 71 75 65 72 79 20 70 68 72   phrasequery phr
0eb0: 61 73 65 71 75 65 72 79 0a 0a 64 6f 5f 65 78 65  asequery..do_exe
0ec0: 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 20 7b 0a  csql_test 4.1 {.
0ed0: 20 20 53 45 4c 45 43 54 20 70 68 72 61 73 65 71    SELECT phraseq
0ee0: 75 65 72 79 28 65 37 2c 20 27 53 51 4c 49 54 45  uery(e7, 'SQLITE
0ef0: 5f 4f 4b 27 29 20 46 52 4f 4d 20 65 37 20 57 48  _OK') FROM e7 WH
0f00: 45 52 45 20 65 37 20 4d 41 54 43 48 20 27 63 20  ERE e7 MATCH 'c 
0f10: 78 27 0a 7d 20 7b 7b 31 20 32 20 33 20 34 20 35  x'.} {{1 2 3 4 5
0f20: 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }}..do_execsql_t
0f30: 65 73 74 20 34 2e 32 20 7b 0a 20 20 53 45 4c 45  est 4.2 {.  SELE
0f40: 43 54 20 70 68 72 61 73 65 71 75 65 72 79 28 65  CT phrasequery(e
0f50: 37 2c 20 27 53 51 4c 49 54 45 5f 44 4f 4e 45 27  7, 'SQLITE_DONE'
0f60: 29 20 46 52 4f 4d 20 65 37 20 57 48 45 52 45 20  ) FROM e7 WHERE 
0f70: 65 37 20 4d 41 54 43 48 20 27 63 20 78 27 0a 7d  e7 MATCH 'c x'.}
0f80: 20 7b 7b 31 20 32 20 33 7d 7d 0a 0a 64 6f 5f 63   {{1 2 3}}..do_c
0f90: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34 2e 33  atchsql_test 4.3
0fa0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 70 68 72 61   {.  SELECT phra
0fb0: 73 65 71 75 65 72 79 28 65 37 2c 20 27 53 51 4c  sequery(e7, 'SQL
0fc0: 49 54 45 5f 45 52 52 4f 52 27 29 20 46 52 4f 4d  ITE_ERROR') FROM
0fd0: 20 65 37 20 57 48 45 52 45 20 65 37 20 4d 41 54   e7 WHERE e7 MAT
0fe0: 43 48 20 27 63 20 78 27 0a 7d 20 7b 31 20 53 51  CH 'c x'.} {1 SQ
0ff0: 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 0a 23 2d 2d  LITE_ERROR}..#--
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 75 78 69 6c 69  -------.# Auxili
1050: 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ary function cal
1060: 6c 73 20 77 69 74 68 20 6d 61 6e 79 20 63 75 72  ls with many cur
1070: 73 6f 72 73 20 69 6e 20 74 68 65 20 67 6c 6f 62  sors in the glob
1080: 61 6c 20 63 75 72 73 6f 72 20 6c 69 73 74 2e 0a  al cursor list..
1090: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
10a0: 74 20 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 5.0 {.  CREATE
10b0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
10c0: 39 20 55 53 49 4e 47 20 66 74 73 35 28 79 29 3b  9 USING fts5(y);
10d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65  .  INSERT INTO e
10e0: 39 28 72 6f 77 69 64 2c 20 79 29 20 56 41 4c 55  9(rowid, y) VALU
10f0: 45 53 28 31 2c 20 27 69 20 69 69 69 27 29 3b 0a  ES(1, 'i iii');.
1100: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 39    INSERT INTO e9
1110: 28 72 6f 77 69 64 2c 20 79 29 20 56 41 4c 55 45  (rowid, y) VALUE
1120: 53 28 32 2c 20 27 69 69 20 69 76 27 29 3b 0a 20  S(2, 'ii iv');. 
1130: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 39 28   INSERT INTO e9(
1140: 72 6f 77 69 64 2c 20 79 29 20 56 41 4c 55 45 53  rowid, y) VALUES
1150: 28 33 2c 20 27 69 69 27 29 3b 0a 20 20 49 4e 53  (3, 'ii');.  INS
1160: 45 52 54 20 49 4e 54 4f 20 65 39 28 72 6f 77 69  ERT INTO e9(rowi
1170: 64 2c 20 79 29 20 56 41 4c 55 45 53 28 34 2c 20  d, y) VALUES(4, 
1180: 27 69 20 69 76 27 29 3b 0a 20 20 49 4e 53 45 52  'i iv');.  INSER
1190: 54 20 49 4e 54 4f 20 65 39 28 72 6f 77 69 64 2c  T INTO e9(rowid,
11a0: 20 79 29 20 56 41 4c 55 45 53 28 35 2c 20 27 69   y) VALUES(5, 'i
11b0: 69 69 27 29 3b 0a 7d 0a 0a 70 72 6f 63 20 6d 79  ii');.}..proc my
11c0: 5f 72 6f 77 69 64 20 7b 63 6d 64 7d 20 7b 20 24  _rowid {cmd} { $
11d0: 63 6d 64 20 78 52 6f 77 69 64 20 7d 0a 73 71 6c  cmd xRowid }.sql
11e0: 69 74 65 33 5f 66 74 73 35 5f 63 72 65 61 74 65  ite3_fts5_create
11f0: 5f 66 75 6e 63 74 69 6f 6e 20 64 62 20 6d 79 5f  _function db my_
1200: 72 6f 77 69 64 20 6d 79 5f 72 6f 77 69 64 0a 0a  rowid my_rowid..
1210: 66 6f 72 65 61 63 68 20 7b 76 61 72 20 71 7d 20  foreach {var q} 
1220: 7b 0a 20 20 73 31 20 69 0a 20 20 73 32 20 69 69  {.  s1 i.  s2 ii
1230: 0a 20 20 73 33 20 69 69 69 0a 20 20 73 34 20 69  .  s3 iii.  s4 i
1240: 76 0a 7d 20 7b 0a 20 20 73 65 74 20 73 71 6c 20  v.} {.  set sql 
1250: 22 53 45 4c 45 43 54 20 6d 79 5f 72 6f 77 69 64  "SELECT my_rowid
1260: 28 65 39 29 20 46 52 4f 4d 20 65 39 20 57 48 45  (e9) FROM e9 WHE
1270: 52 45 20 65 39 20 4d 41 54 43 48 20 27 24 71 27  RE e9 MATCH '$q'
1280: 22 0a 20 20 73 65 74 20 24 76 61 72 20 5b 73 71  ".  set $var [sq
1290: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64 62  lite3_prepare db
12a0: 20 24 73 71 6c 20 2d 31 20 64 75 6d 6d 79 5d 0a   $sql -1 dummy].
12b0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 35 2e 31 2e 31  }..do_test 5.1.1
12c0: 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20   { sqlite3_step 
12d0: 24 73 31 20 3b 20 73 71 6c 69 74 65 33 5f 63 6f  $s1 ; sqlite3_co
12e0: 6c 75 6d 6e 5f 69 6e 74 20 24 73 31 20 30 20 7d  lumn_int $s1 0 }
12f0: 20 31 0a 64 6f 5f 74 65 73 74 20 35 2e 31 2e 32   1.do_test 5.1.2
1300: 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20   { sqlite3_step 
1310: 24 73 32 20 3b 20 73 71 6c 69 74 65 33 5f 63 6f  $s2 ; sqlite3_co
1320: 6c 75 6d 6e 5f 69 6e 74 20 24 73 32 20 30 20 7d  lumn_int $s2 0 }
1330: 20 32 0a 64 6f 5f 74 65 73 74 20 35 2e 31 2e 33   2.do_test 5.1.3
1340: 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20   { sqlite3_step 
1350: 24 73 33 20 3b 20 73 71 6c 69 74 65 33 5f 63 6f  $s3 ; sqlite3_co
1360: 6c 75 6d 6e 5f 69 6e 74 20 24 73 33 20 30 20 7d  lumn_int $s3 0 }
1370: 20 31 0a 64 6f 5f 74 65 73 74 20 35 2e 31 2e 34   1.do_test 5.1.4
1380: 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20   { sqlite3_step 
1390: 24 73 34 20 3b 20 73 71 6c 69 74 65 33 5f 63 6f  $s4 ; sqlite3_co
13a0: 6c 75 6d 6e 5f 69 6e 74 20 24 73 34 20 30 20 7d  lumn_int $s4 0 }
13b0: 20 32 0a 0a 64 6f 5f 74 65 73 74 20 35 2e 32 2e   2..do_test 5.2.
13c0: 31 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70  1 { sqlite3_step
13d0: 20 24 73 31 20 3b 20 73 71 6c 69 74 65 33 5f 63   $s1 ; sqlite3_c
13e0: 6f 6c 75 6d 6e 5f 69 6e 74 20 24 73 31 20 30 20  olumn_int $s1 0 
13f0: 7d 20 34 0a 64 6f 5f 74 65 73 74 20 35 2e 32 2e  } 4.do_test 5.2.
1400: 32 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70  2 { sqlite3_step
1410: 20 24 73 32 20 3b 20 73 71 6c 69 74 65 33 5f 63   $s2 ; sqlite3_c
1420: 6f 6c 75 6d 6e 5f 69 6e 74 20 24 73 32 20 30 20  olumn_int $s2 0 
1430: 7d 20 33 0a 64 6f 5f 74 65 73 74 20 35 2e 32 2e  } 3.do_test 5.2.
1440: 33 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70  3 { sqlite3_step
1450: 20 24 73 33 20 3b 20 73 71 6c 69 74 65 33 5f 63   $s3 ; sqlite3_c
1460: 6f 6c 75 6d 6e 5f 69 6e 74 20 24 73 33 20 30 20  olumn_int $s3 0 
1470: 7d 20 35 0a 64 6f 5f 74 65 73 74 20 35 2e 32 2e  } 5.do_test 5.2.
1480: 34 20 7b 20 73 71 6c 69 74 65 33 5f 73 74 65 70  4 { sqlite3_step
1490: 20 24 73 34 20 3b 20 73 71 6c 69 74 65 33 5f 63   $s4 ; sqlite3_c
14a0: 6f 6c 75 6d 6e 5f 69 6e 74 20 24 73 34 20 30 20  olumn_int $s4 0 
14b0: 7d 20 34 0a 0a 73 71 6c 69 74 65 33 5f 66 69 6e  } 4..sqlite3_fin
14c0: 61 6c 69 7a 65 20 24 73 31 0a 73 71 6c 69 74 65  alize $s1.sqlite
14d0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 32 0a 73  3_finalize $s2.s
14e0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
14f0: 24 73 33 0a 73 71 6c 69 74 65 33 5f 66 69 6e 61  $s3.sqlite3_fina
1500: 6c 69 7a 65 20 24 73 34 0a 0a 23 2d 2d 2d 2d 2d  lize $s4..#-----
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 0a 23 20 50 61 73 73 69 6e 67 20 61  ----.# Passing a
1560: 6e 20 69 6e 76 61 6c 69 64 20 66 69 72 73 74 20  n invalid first 
1570: 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 20 61  argument to an a
1580: 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
1590: 6e 20 69 73 20 64 65 74 65 63 74 65 64 2e 0a 23  n is detected..#
15a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
15b0: 20 36 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20   6.0 {.  CREATE 
15c0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 31  VIRTUAL TABLE e1
15d0: 31 20 55 53 49 4e 47 20 66 74 73 35 28 79 2c 20  1 USING fts5(y, 
15e0: 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  z);.  INSERT INT
15f0: 4f 20 65 31 31 28 72 6f 77 69 64 2c 20 79 2c 20  O e11(rowid, y, 
1600: 7a 29 20 56 41 4c 55 45 53 28 31 2c 20 27 61 20  z) VALUES(1, 'a 
1610: 62 27 2c 20 34 35 29 3b 0a 20 20 49 4e 53 45 52  b', 45);.  INSER
1620: 54 20 49 4e 54 4f 20 65 31 31 28 72 6f 77 69 64  T INTO e11(rowid
1630: 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53 28 32  , y, z) VALUES(2
1640: 2c 20 27 62 20 63 27 2c 20 34 36 29 3b 0a 7d 0a  , 'b c', 46);.}.
1650: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
1660: 74 20 36 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  t 6.1 {.  SELECT
1670: 20 6d 79 5f 72 6f 77 69 64 28 7a 29 20 46 52 4f   my_rowid(z) FRO
1680: 4d 20 65 31 31 20 57 48 45 52 45 20 65 31 31 20  M e11 WHERE e11 
1690: 4d 41 54 43 48 20 27 62 27 0a 7d 20 7b 31 20 7b  MATCH 'b'.} {1 {
16a0: 6e 6f 20 73 75 63 68 20 63 75 72 73 6f 72 3a 20  no such cursor: 
16b0: 34 35 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71  45}}..do_catchsq
16c0: 6c 5f 74 65 73 74 20 36 2e 32 20 7b 0a 20 20 53  l_test 6.2 {.  S
16d0: 45 4c 45 43 54 20 6d 79 5f 72 6f 77 69 64 28 79  ELECT my_rowid(y
16e0: 29 20 46 52 4f 4d 20 65 31 31 20 57 48 45 52 45  ) FROM e11 WHERE
16f0: 20 65 31 31 20 4d 41 54 43 48 20 27 62 27 0a 7d   e11 MATCH 'b'.}
1700: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 63 75 72   {1 {no such cur
1710: 73 6f 72 3a 20 30 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  sor: 0}}..#-----
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 70 61 73 73  ----.# Test pass
1770: 69 6e 67 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61  ing an out-of-ra
1780: 6e 67 65 20 70 68 72 61 73 65 20 6e 75 6d 62 65  nge phrase numbe
1790: 72 20 74 6f 20 78 50 68 72 61 73 65 53 69 7a 65  r to xPhraseSize
17a0: 20 28 73 68 6f 75 6c 64 20 0a 23 20 72 65 74 75   (should .# retu
17b0: 72 6e 20 30 29 2e 0a 23 0a 70 72 6f 63 20 6d 79  rn 0)..#.proc my
17c0: 5f 70 68 72 61 73 65 73 69 7a 65 20 7b 63 6d 64  _phrasesize {cmd
17d0: 20 69 50 68 72 61 73 65 7d 20 7b 20 24 63 6d 64   iPhrase} { $cmd
17e0: 20 78 50 68 72 61 73 65 53 69 7a 65 20 24 69 50   xPhraseSize $iP
17f0: 68 72 61 73 65 20 7d 0a 73 71 6c 69 74 65 33 5f  hrase }.sqlite3_
1800: 66 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e 63  fts5_create_func
1810: 74 69 6f 6e 20 64 62 20 6d 79 5f 70 68 72 61 73  tion db my_phras
1820: 65 73 69 7a 65 20 6d 79 5f 70 68 72 61 73 65 73  esize my_phrases
1830: 69 7a 65 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ize..do_execsql_
1840: 74 65 73 74 20 37 2e 31 20 7b 0a 20 20 43 52 45  test 7.1 {.  CRE
1850: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1860: 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28  E t1 USING fts5(
1870: 61 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  a);.  INSERT INT
1880: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 20 62  O t1 VALUES('a b
1890: 20 63 27 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73   c');.}.do_execs
18a0: 71 6c 5f 74 65 73 74 20 37 2e 32 20 7b 0a 20 20  ql_test 7.2 {.  
18b0: 53 45 4c 45 43 54 20 0a 20 20 20 20 6d 79 5f 70  SELECT .    my_p
18c0: 68 72 61 73 65 73 69 7a 65 28 74 31 2c 20 2d 31  hrasesize(t1, -1
18d0: 29 2c 0a 20 20 20 20 6d 79 5f 70 68 72 61 73 65  ),.    my_phrase
18e0: 73 69 7a 65 28 74 31 2c 20 30 29 2c 0a 20 20 20  size(t1, 0),.   
18f0: 20 6d 79 5f 70 68 72 61 73 65 73 69 7a 65 28 74   my_phrasesize(t
1900: 31 2c 20 31 29 2c 0a 20 20 20 20 6d 79 5f 70 68  1, 1),.    my_ph
1910: 72 61 73 65 73 69 7a 65 28 74 31 2c 20 32 29 0a  rasesize(t1, 2).
1920: 20 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20    FROM t1 WHERE 
1930: 74 31 20 4d 41 54 43 48 20 27 61 20 4f 52 20 62  t1 MATCH 'a OR b
1940: 2b 63 27 0a 7d 20 7b 30 20 31 20 32 20 30 7d 0a  +c'.} {0 1 2 0}.
1950: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f  -----------.#.do
19a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e  _execsql_test 8.
19b0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  0 {.  CREATE VIR
19c0: 54 55 41 4c 20 54 41 42 4c 45 20 78 31 20 55 53  TUAL TABLE x1 US
19d0: 49 4e 47 20 66 74 73 35 28 61 29 3b 0a 7d 0a 0a  ING fts5(a);.}..
19e0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 52 6f 77  foreach {tn lRow
19f0: 20 72 65 73 7d 20 7b 0a 20 20 34 20 20 7b 22 61   res} {.  4  {"a
1a00: 20 61 20 61 22 20 22 62 22 20 22 61 20 64 22 7d   a a" "b" "a d"}
1a10: 20 7b 22 5b 61 5d 20 5b 61 5d 20 5b 61 5d 22 20   {"[a] [a] [a]" 
1a20: 22 5b 61 5d 20 64 22 7d 0a 20 20 31 20 20 7b 22  "[a] d"}.  1  {"
1a30: 62 20 64 22 20 22 61 20 62 22 7d 20 20 20 20 20  b d" "a b"}     
1a40: 20 20 7b 22 5b 62 5d 20 5b 64 5d 22 20 22 5b 61    {"[b] [d]" "[a
1a50: 5d 20 62 22 7d 0a 20 20 32 20 20 7b 22 64 20 62  ] b"}.  2  {"d b
1a60: 22 20 22 61 20 64 22 7d 20 20 20 20 20 20 20 7b  " "a d"}       {
1a70: 22 5b 64 5d 20 5b 62 5d 22 20 22 5b 61 5d 20 64  "[d] [b]" "[a] d
1a80: 22 7d 0a 20 20 33 20 20 7b 22 61 20 61 20 64 22  "}.  3  {"a a d"
1a90: 7d 20 20 20 20 20 20 20 20 20 20 20 7b 22 5b 61  }           {"[a
1aa0: 5d 20 5b 61 5d 20 64 22 7d 0a 7d 20 7b 0a 20 20  ] [a] d"}.} {.  
1ab0: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
1ac0: 20 46 52 4f 4d 20 78 31 20 7d 0a 20 20 66 6f 72   FROM x1 }.  for
1ad0: 65 61 63 68 20 72 6f 77 20 24 6c 52 6f 77 20 7b  each row $lRow {
1ae0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
1af0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
1b00: 28 24 72 6f 77 29 20 7d 20 7d 0a 20 20 64 6f 5f  ($row) } }.  do_
1b10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 24  execsql_test 8.$
1b20: 74 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  tn {.    SELECT 
1b30: 68 69 67 68 6c 69 67 68 74 28 78 31 2c 20 30 2c  highlight(x1, 0,
1b40: 20 27 5b 27 2c 20 27 5d 27 29 20 46 52 4f 4d 20   '[', ']') FROM 
1b50: 78 31 20 57 48 45 52 45 20 78 31 20 4d 41 54 43  x1 WHERE x1 MATC
1b60: 48 20 27 61 20 4f 52 20 28 62 20 41 4e 44 20 64  H 'a OR (b AND d
1b70: 29 27 3b 0a 20 20 7d 20 24 72 65 73 0a 7d 0a 0a  )';.  } $res.}..
1b80: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
1bd0: 74 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 62  t the built-in b
1be0: 6d 32 35 28 29 20 64 65 6d 6f 2e 0a 23 0a 72 65  m25() demo..#.re
1bf0: 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71  set_db.do_execsq
1c00: 6c 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20 43  l_test 9.1 {.  C
1c10: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1c20: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
1c30: 35 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52  5(a, b);.  INSER
1c40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1c50: 28 27 61 27 2c 20 20 20 4e 55 4c 4c 29 3b 20 20  ('a',   NULL);  
1c60: 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 20 20           -- 1.  
1c70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1c80: 41 4c 55 45 53 28 27 61 27 2c 20 20 20 4e 55 4c  ALUES('a',   NUL
1c90: 4c 29 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d  L);           --
1ca0: 20 32 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   2.  INSERT INTO
1cb0: 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t1 VALUES('a', 
1cc0: 20 20 4e 55 4c 4c 29 3b 20 20 20 20 20 20 20 20    NULL);        
1cd0: 20 20 20 2d 2d 20 33 0a 20 20 49 4e 53 45 52 54     -- 3.  INSERT
1ce0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1cf0: 27 61 27 2c 20 20 20 4e 55 4c 4c 29 3b 20 20 20  'a',   NULL);   
1d00: 20 20 20 20 20 20 20 20 2d 2d 20 34 0a 20 20 49          -- 4.  I
1d10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1d20: 4c 55 45 53 28 27 61 27 2c 20 20 20 4e 55 4c 4c  LUES('a',   NULL
1d30: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  );           -- 
1d40: 35 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  5.  INSERT INTO 
1d50: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 20  t1 VALUES('a',  
1d60: 20 4e 55 4c 4c 29 3b 20 20 20 20 20 20 20 20 20   NULL);         
1d70: 20 20 2d 2d 20 36 0a 20 20 49 4e 53 45 52 54 20    -- 6.  INSERT 
1d80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
1d90: 61 27 2c 20 20 20 4e 55 4c 4c 29 3b 20 20 20 20  a',   NULL);    
1da0: 20 20 20 20 20 20 20 2d 2d 20 37 0a 20 20 49 4e         -- 7.  IN
1db0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1dc0: 55 45 53 28 27 61 27 2c 20 20 20 4e 55 4c 4c 29  UES('a',   NULL)
1dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 38  ;           -- 8
1de0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1df0: 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 20  1 VALUES(NULL,  
1e00: 27 61 20 61 20 62 27 29 3b 20 20 20 20 20 20 20  'a a b');       
1e10: 20 2d 2d 20 39 0a 20 20 49 4e 53 45 52 54 20 49   -- 9.  INSERT I
1e20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
1e30: 4c 4c 2c 20 20 27 62 20 62 20 61 27 29 3b 20 20  LL,  'b b a');  
1e40: 20 20 20 20 20 20 2d 2d 20 31 30 0a 7d 0a 0a 64        -- 10.}..d
1e50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39  o_execsql_test 9
1e60: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  .2 {.  SELECT ro
1e70: 77 69 64 20 46 52 4f 4d 20 74 31 28 27 61 20 41  wid FROM t1('a A
1e80: 4e 44 20 62 27 29 20 4f 52 44 45 52 20 42 59 20  ND b') ORDER BY 
1e90: 72 61 6e 6b 3b 0a 7d 20 7b 0a 20 20 31 30 20 39  rank;.} {.  10 9
1ea0: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
1eb0: 65 73 74 20 39 2e 33 20 7b 0a 20 20 53 45 4c 45  est 9.3 {.  SELE
1ec0: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  CT rowid FROM t1
1ed0: 28 27 62 3a 61 20 41 4e 44 20 62 3a 62 27 29 20  ('b:a AND b:b') 
1ee0: 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 3b 0a 7d  ORDER BY rank;.}
1ef0: 20 7b 0a 20 20 39 20 31 30 0a 7d 0a 0a 23 2d 2d   {.  9 10.}..#--
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
1f50: 68 61 74 20 61 75 78 2e 20 66 75 6e 63 74 69 6f  hat aux. functio
1f60: 6e 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ns may not be us
1f70: 65 64 20 69 6e 20 61 67 67 72 65 67 61 74 65 20  ed in aggregate 
1f80: 71 75 65 72 69 65 73 2e 0a 23 0a 72 65 73 65 74  queries..#.reset
1f90: 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  _db.do_execsql_t
1fa0: 65 73 74 20 31 30 2e 30 20 7b 0a 20 20 43 52 45  est 10.0 {.  CRE
1fb0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1fc0: 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28  E t1 USING fts5(
1fd0: 78 2c 20 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45  x, y, z);.  INSE
1fe0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1ff0: 53 28 27 61 27 2c 20 27 6f 6e 65 20 74 77 6f 27  S('a', 'one two'
2000: 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 1);.  INSERT I
2010: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 62  NTO t1 VALUES('b
2020: 27 2c 20 27 74 77 6f 20 74 68 72 65 65 27 2c 20  ', 'two three', 
2030: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
2040: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c  O t1 VALUES('c',
2050: 20 27 74 68 72 65 65 20 66 6f 75 72 27 2c 20 31   'three four', 1
2060: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2070: 20 74 31 20 56 41 4c 55 45 53 28 27 64 27 2c 20   t1 VALUES('d', 
2080: 27 66 6f 75 72 20 66 69 76 65 27 2c 20 32 29 3b  'four five', 2);
2090: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
20a0: 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66  1 VALUES('e', 'f
20b0: 69 76 65 20 73 69 78 27 2c 20 31 29 3b 0a 20 20  ive six', 1);.  
20c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
20d0: 41 4c 55 45 53 28 27 66 27 2c 20 27 73 69 78 20  ALUES('f', 'six 
20e0: 73 65 76 65 6e 27 2c 20 32 29 3b 0a 7d 0a 0a 70  seven', 2);.}..p
20f0: 72 6f 63 20 66 69 72 73 74 63 6f 6c 20 7b 63 6d  roc firstcol {cm
2100: 64 7d 20 7b 20 24 63 6d 64 20 78 43 6f 6c 75 6d  d} { $cmd xColum
2110: 6e 54 65 78 74 20 30 20 7d 0a 73 71 6c 69 74 65  nText 0 }.sqlite
2120: 33 5f 66 74 73 35 5f 63 72 65 61 74 65 5f 66 75  3_fts5_create_fu
2130: 6e 63 74 69 6f 6e 20 64 62 20 66 69 72 73 74 63  nction db firstc
2140: 6f 6c 20 66 69 72 73 74 63 6f 6c 0a 0a 64 6f 5f  ol firstcol..do_
2150: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e  execsql_test 10.
2160: 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 66  1.1 {.  SELECT f
2170: 69 72 73 74 63 6f 6c 28 74 31 29 20 46 52 4f 4d  irstcol(t1) FROM
2180: 20 74 31 0a 7d 20 7b 61 20 62 20 63 20 64 20 65   t1.} {a b c d e
2190: 20 66 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   f}.do_execsql_t
21a0: 65 73 74 20 31 30 2e 31 2e 32 20 7b 0a 20 20 53  est 10.1.2 {.  S
21b0: 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63  ELECT group_conc
21c0: 61 74 28 78 2c 20 27 2e 27 29 20 46 52 4f 4d 20  at(x, '.') FROM 
21d0: 74 31 0a 7d 20 7b 61 2e 62 2e 63 2e 64 2e 65 2e  t1.} {a.b.c.d.e.
21e0: 66 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  f}..do_catchsql_
21f0: 74 65 73 74 20 31 30 2e 31 2e 33 20 7b 0a 20 20  test 10.1.3 {.  
2200: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
2210: 63 61 74 28 66 69 72 73 74 63 6f 6c 28 74 31 29  cat(firstcol(t1)
2220: 2c 20 27 2e 27 29 20 46 52 4f 4d 20 74 31 0a 7d  , '.') FROM t1.}
2230: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75   {1 {unable to u
2240: 73 65 20 66 75 6e 63 74 69 6f 6e 20 66 69 72 73  se function firs
2250: 74 63 6f 6c 20 69 6e 20 74 68 65 20 72 65 71 75  tcol in the requ
2260: 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a  ested context}}.
2270: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
2280: 74 20 31 30 2e 31 2e 34 20 7b 0a 20 20 53 45 4c  t 10.1.4 {.  SEL
2290: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
22a0: 28 66 69 72 73 74 63 6f 6c 28 74 31 29 2c 20 27  (firstcol(t1), '
22b0: 2e 27 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  .') FROM t1 GROU
22c0: 50 20 42 59 20 72 6f 77 69 64 0a 7d 20 7b 31 20  P BY rowid.} {1 
22d0: 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66  {unable to use f
22e0: 75 6e 63 74 69 6f 6e 20 66 69 72 73 74 63 6f 6c  unction firstcol
22f0: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
2300: 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 0a 66 69 6e  d context}}..fin
2310: 69 73 68 5f 74 65 73 74 0a 0a                    ish_test..