/ Hex Artifact Content
Login

Artifact 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07:


0000: 23 20 32 30 30 39 20 4e 6f 76 65 6d 62 65 72 20  # 2009 November 
0010: 32 38 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  28.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 2a 0a 23 0a 23 20 54 68 69  ********.#.# Thi
0170: 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  s file implement
0180: 73 20 74 65 73 74 73 20 74 6f 20 76 65 72 69 66  s tests to verif
0190: 79 20 74 68 65 20 22 74 65 73 74 61 62 6c 65 20  y the "testable 
01a0: 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20 74  statements" in t
01b0: 68 65 0a 23 20 66 74 73 33 2e 69 6e 20 64 6f 63  he.# fts3.in doc
01c0: 75 6d 65 6e 74 2e 0a 23 0a 0a 73 65 74 20 74 65  ument..#..set te
01d0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
01e0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
01f0: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0200: 65 72 2e 74 63 6c 0a 0a 23 20 49 66 20 74 68 69  er.tcl..# If thi
0210: 73 20 62 75 69 6c 64 20 64 6f 65 73 20 6e 6f 74  s build does not
0220: 20 69 6e 63 6c 75 64 65 20 46 54 53 33 2c 20 73   include FTS3, s
0230: 6b 69 70 20 74 68 65 20 74 65 73 74 73 20 69 6e  kip the tests in
0240: 20 74 68 69 73 20 66 69 6c 65 2e 0a 23 0a 69 66   this file..#.if
0250: 63 61 70 61 62 6c 65 20 21 66 74 73 33 20 7b 20  capable !fts3 { 
0260: 66 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65  finish_test ; re
0270: 74 75 72 6e 20 7d 0a 73 6f 75 72 63 65 20 24 74  turn }.source $t
0280: 65 73 74 64 69 72 2f 66 74 73 33 5f 63 6f 6d 6d  estdir/fts3_comm
0290: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
02a0: 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f  estdir/malloc_co
02b0: 6d 6d 6f 6e 2e 74 63 6c 0a 0a 23 20 50 72 6f 63  mmon.tcl..# Proc
02c0: 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 74  s used to make t
02d0: 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
02e0: 20 66 69 6c 65 20 65 61 73 69 65 72 20 74 6f 20   file easier to 
02f0: 72 65 61 64 2e 0a 23 0a 70 72 6f 63 20 64 64 6c  read..#.proc ddl
0300: 5f 74 65 73 74 20 7b 74 6e 20 64 64 6c 7d 20 7b  _test {tn ddl} {
0310: 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74  .  uplevel [list
0320: 20 64 6f 5f 77 72 69 74 65 5f 74 65 73 74 20 65   do_write_test e
0330: 5f 66 74 73 33 2d 24 74 6e 20 73 71 6c 69 74 65  _fts3-$tn sqlite
0340: 5f 6d 61 73 74 65 72 20 24 64 64 6c 5d 0a 7d 0a  _master $ddl].}.
0350: 70 72 6f 63 20 77 72 69 74 65 5f 74 65 73 74 20  proc write_test 
0360: 7b 74 6e 20 74 62 6c 20 73 71 6c 7d 20 7b 0a 20  {tn tbl sql} {. 
0370: 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64   uplevel [list d
0380: 6f 5f 77 72 69 74 65 5f 74 65 73 74 20 65 5f 66  o_write_test e_f
0390: 74 73 33 2d 24 74 6e 20 24 74 62 6c 20 24 73 71  ts3-$tn $tbl $sq
03a0: 6c 5d 0a 7d 0a 70 72 6f 63 20 72 65 61 64 5f 74  l].}.proc read_t
03b0: 65 73 74 20 7b 74 6e 20 73 71 6c 20 72 65 73 75  est {tn sql resu
03c0: 6c 74 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  lt} {.  uplevel 
03d0: 5b 6c 69 73 74 20 64 6f 5f 73 65 6c 65 63 74 5f  [list do_select_
03e0: 74 65 73 74 20 65 5f 66 74 73 33 2d 24 74 6e 20  test e_fts3-$tn 
03f0: 24 73 71 6c 20 24 72 65 73 75 6c 74 5d 0a 7d 0a  $sql $result].}.
0400: 70 72 6f 63 20 65 72 72 6f 72 5f 74 65 73 74 20  proc error_test 
0410: 7b 74 6e 20 73 71 6c 20 72 65 73 75 6c 74 7d 20  {tn sql result} 
0420: 7b 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73  {.  uplevel [lis
0430: 74 20 64 6f 5f 65 72 72 6f 72 5f 74 65 73 74 20  t do_error_test 
0440: 65 5f 66 74 73 33 2d 24 74 6e 20 24 73 71 6c 20  e_fts3-$tn $sql 
0450: 24 72 65 73 75 6c 74 5d 0a 7d 0a 0a 0a 23 2d 2d  $result].}...#--
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 62 6f  -------.# The bo
04b0: 64 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  dy of the follow
04c0: 69 6e 67 20 5b 66 6f 72 65 61 63 68 5d 20 62 6c  ing [foreach] bl
04d0: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 65 73  ock contains tes
04e0: 74 20 63 61 73 65 73 20 74 6f 20 76 65 72 69 66  t cases to verif
04f0: 79 0a 23 20 74 68 61 74 20 74 68 65 20 65 78 61  y.# that the exa
0500: 6d 70 6c 65 20 63 6f 64 65 20 69 6e 20 66 74 73  mple code in fts
0510: 33 2e 68 74 6d 6c 20 77 6f 72 6b 73 20 61 73 20  3.html works as 
0520: 65 78 70 65 63 74 65 64 2e 20 54 68 65 20 74 65  expected. The te
0530: 73 74 73 20 72 75 6e 20 74 68 72 65 65 0a 23 20  sts run three.# 
0540: 74 69 6d 65 73 2c 20 77 69 74 68 20 64 69 66 66  times, with diff
0550: 65 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  erent values for
0560: 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 2e   DO_MALLOC_TEST.
0570: 0a 23 20 0a 23 20 20 20 44 4f 5f 4d 41 4c 4c 4f  .# .#   DO_MALLO
0580: 43 5f 54 45 53 54 3d 30 3a 20 52 75 6e 20 74 65  C_TEST=0: Run te
0590: 73 74 73 20 77 69 74 68 20 6e 6f 20 4f 4f 4d 20  sts with no OOM 
05a0: 65 72 72 6f 72 73 2e 0a 23 20 20 20 44 4f 5f 4d  errors..#   DO_M
05b0: 41 4c 4c 4f 43 5f 54 45 53 54 3d 31 3a 20 52 75  ALLOC_TEST=1: Ru
05c0: 6e 20 74 65 73 74 73 20 77 69 74 68 20 74 72 61  n tests with tra
05d0: 6e 73 69 65 6e 74 20 4f 4f 4d 20 65 72 72 6f 72  nsient OOM error
05e0: 73 2e 0a 23 20 20 20 44 4f 5f 4d 41 4c 4c 4f 43  s..#   DO_MALLOC
05f0: 5f 54 45 53 54 3d 32 3a 20 52 75 6e 20 74 65 73  _TEST=2: Run tes
0600: 74 73 20 77 69 74 68 20 70 65 72 73 69 73 74 65  ts with persiste
0610: 6e 74 20 4f 4f 4d 20 65 72 72 6f 72 73 2e 0a 23  nt OOM errors..#
0620: 0a 66 6f 72 65 61 63 68 20 7b 44 4f 5f 4d 41 4c  .foreach {DO_MAL
0630: 4c 4f 43 5f 54 45 53 54 20 65 6e 63 7d 20 7b 0a  LOC_TEST enc} {.
0640: 20 20 30 20 75 74 66 2d 38 0a 20 20 31 20 75 74    0 utf-8.  1 ut
0650: 66 2d 38 0a 20 20 32 20 75 74 66 2d 38 0a 20 20  f-8.  2 utf-8.  
0660: 31 20 75 74 66 2d 31 36 0a 7d 20 7b 0a 0a 23 69  1 utf-16.} {..#i
0670: 66 20 7b 24 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45  f {$DO_MALLOC_TE
0680: 53 54 7d 20 62 72 65 61 6b 0a 0a 23 20 52 65 73  ST} break..# Res
0690: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
06a0: 61 6e 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  and database con
06b0: 6e 65 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  nection. If this
06c0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
06d0: 65 20 0a 23 20 5b 66 6f 72 65 61 63 68 5d 20 6c  e .# [foreach] l
06e0: 6f 6f 70 20 69 73 20 74 65 73 74 69 6e 67 20 77  oop is testing w
06f0: 69 74 68 20 4f 4f 4d 20 65 72 72 6f 72 73 2c 20  ith OOM errors, 
0700: 64 69 73 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b  disable the look
0710: 61 73 69 64 65 20 62 75 66 66 65 72 2e 0a 23 0a  aside buffer..#.
0720: 64 62 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65  db close.forcede
0730: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
0740: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c  t.db-journal.sql
0750: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0760: 69 66 20 7b 24 44 4f 5f 4d 41 4c 4c 4f 43 5f 54  if {$DO_MALLOC_T
0770: 45 53 54 7d 20 7b 20 73 71 6c 69 74 65 33 5f 64  EST} { sqlite3_d
0780: 62 5f 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69  b_config_lookasi
0790: 64 65 20 64 62 20 30 20 30 20 30 20 7d 0a 64 62  de db 0 0 0 }.db
07a0: 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 65 6e   eval "PRAGMA en
07b0: 63 6f 64 69 6e 67 20 3d 20 27 24 65 6e 63 27 22  coding = '$enc'"
07c0: 0a 0a 70 72 6f 63 20 6d 69 74 20 7b 62 6c 6f 62  ..proc mit {blob
07d0: 7d 20 7b 0a 20 20 73 65 74 20 73 63 61 6e 28 6c  } {.  set scan(l
07e0: 69 74 74 6c 65 45 6e 64 69 61 6e 29 20 69 2a 0a  ittleEndian) i*.
07f0: 20 20 73 65 74 20 73 63 61 6e 28 62 69 67 45 6e    set scan(bigEn
0800: 64 69 61 6e 29 20 49 2a 0a 20 20 62 69 6e 61 72  dian) I*.  binar
0810: 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63  y scan $blob $sc
0820: 61 6e 28 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  an($::tcl_platfo
0830: 72 6d 28 62 79 74 65 4f 72 64 65 72 29 29 20 72  rm(byteOrder)) r
0840: 0a 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 64  .  return $r.}.d
0850: 62 20 66 75 6e 63 20 6d 69 74 20 6d 69 74 0a 0a  b func mit mit..
0860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
08a0: 23 23 23 23 23 23 23 23 23 23 0a 23 20 54 65 73  ##########.# Tes
08b0: 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 43 52  t the example CR
08c0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
08d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  LE statements in
08e0: 20 73 65 63 74 69 6f 6e 20 31 2e 31 20 0a 23 20   section 1.1 .# 
08f0: 6f 66 20 66 74 73 33 2e 69 6e 2e 0a 23 0a 64 64  of fts3.in..#.dd
0900: 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e 31 2e 31  l_test   1.1.1.1
0910: 20 7b 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   {CREATE VIRTUAL
0920: 20 54 41 42 4c 45 20 64 61 74 61 20 55 53 49 4e   TABLE data USIN
0930: 47 20 66 74 73 33 28 29 7d 0a 72 65 61 64 5f 74  G fts3()}.read_t
0940: 65 73 74 20 20 31 2e 31 2e 31 2e 32 20 7b 50 52  est  1.1.1.2 {PR
0950: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
0960: 64 61 74 61 29 7d 20 7b 30 20 63 6f 6e 74 65 6e  data)} {0 conten
0970: 74 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a 0a 64 64  t {} 0 {} 0}..dd
0980: 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e 32 2e 31  l_test   1.1.2.1
0990: 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54   {.  CREATE VIRT
09a0: 55 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73 20  UAL TABLE pages 
09b0: 55 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65  USING fts3(title
09c0: 2c 20 6b 65 79 77 6f 72 64 73 2c 20 62 6f 64 79  , keywords, body
09d0: 29 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  ).}.read_test  1
09e0: 2e 31 2e 32 2e 32 20 7b 0a 20 20 50 52 41 47 4d  .1.2.2 {.  PRAGM
09f0: 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 70 61 67  A table_info(pag
0a00: 65 73 29 0a 7d 20 7b 30 20 74 69 74 6c 65 20 7b  es).} {0 title {
0a10: 7d 20 30 20 7b 7d 20 30 20 31 20 6b 65 79 77 6f  } 0 {} 0 1 keywo
0a20: 72 64 73 20 7b 7d 20 30 20 7b 7d 20 30 20 32 20  rds {} 0 {} 0 2 
0a30: 62 6f 64 79 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a  body {} 0 {} 0}.
0a40: 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e  .ddl_test   1.1.
0a50: 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56  3.1 {.  CREATE V
0a60: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69  IRTUAL TABLE mai
0a70: 6c 20 55 53 49 4e 47 20 66 74 73 33 28 0a 20 20  l USING fts3(.  
0a80: 20 20 20 20 73 75 62 6a 65 63 74 20 56 41 52 43      subject VARC
0a90: 48 41 52 28 32 35 36 29 20 4e 4f 54 20 4e 55 4c  HAR(256) NOT NUL
0aa0: 4c 2c 0a 20 20 20 20 20 20 62 6f 64 79 20 54 45  L,.      body TE
0ab0: 58 54 20 43 48 45 43 4b 28 6c 65 6e 67 74 68 28  XT CHECK(length(
0ac0: 62 6f 64 79 29 3c 31 30 32 34 30 29 0a 20 20 29  body)<10240).  )
0ad0: 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e  .}.read_test  1.
0ae0: 31 2e 33 2e 32 20 7b 0a 20 20 50 52 41 47 4d 41  1.3.2 {.  PRAGMA
0af0: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 6d 61 69 6c   table_info(mail
0b00: 29 0a 7d 20 7b 30 20 73 75 62 6a 65 63 74 20 7b  ).} {0 subject {
0b10: 7d 20 30 20 7b 7d 20 30 20 31 20 62 6f 64 79 20  } 0 {} 0 1 body 
0b20: 7b 7d 20 30 20 7b 7d 20 30 7d 0a 0a 23 20 41 20  {} 0 {} 0}..# A 
0b30: 76 65 72 79 20 6c 61 72 67 65 20 73 74 72 69 6e  very large strin
0b40: 67 2e 20 55 73 65 64 20 74 6f 20 74 65 73 74 20  g. Used to test 
0b50: 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
0b60: 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 22 62 6f 64  t on column "bod
0b70: 79 22 20 6f 66 0a 23 20 74 61 62 6c 65 20 22 6d  y" of.# table "m
0b80: 61 69 6c 22 20 69 73 20 65 6e 66 6f 72 63 65 64  ail" is enforced
0b90: 20 28 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20   (it should not 
0ba0: 62 65 20 2d 20 46 54 53 33 20 74 61 62 6c 65 73  be - FTS3 tables
0bb0: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 0a   do not support.
0bc0: 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a  # constraints)..
0bd0: 73 65 74 20 6c 61 72 67 65 74 65 78 74 20 5b 73  set largetext [s
0be0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 74 68  tring repeat "th
0bf0: 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f  e quick brown fo
0c00: 78 20 22 20 35 30 30 30 5d 0a 77 72 69 74 65 5f  x " 5000].write_
0c10: 74 65 73 74 20 31 2e 31 2e 33 2e 33 20 6d 61 69  test 1.1.3.3 mai
0c20: 6c 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45  l_content { INSE
0c30: 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c  RT INTO mail VAL
0c40: 55 45 53 28 4e 55 4c 4c 2c 20 24 6c 61 72 67 65  UES(NULL, $large
0c50: 74 65 78 74 29 20 7d 0a 72 65 61 64 5f 74 65 73  text) }.read_tes
0c60: 74 20 20 31 2e 31 2e 33 2e 34 20 7b 0a 20 20 53  t  1.1.3.4 {.  S
0c70: 45 4c 45 43 54 20 73 75 62 6a 65 63 74 20 49 53  ELECT subject IS
0c80: 20 4e 55 4c 4c 2c 20 6c 65 6e 67 74 68 28 62 6f   NULL, length(bo
0c90: 64 79 29 20 46 52 4f 4d 20 6d 61 69 6c 0a 7d 20  dy) FROM mail.} 
0ca0: 5b 6c 69 73 74 20 31 20 31 30 30 30 30 30 5d 0a  [list 1 100000].
0cb0: 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e  .ddl_test   1.1.
0cc0: 34 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56  4.1 {.  CREATE V
0cd0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70  IRTUAL TABLE pap
0ce0: 65 72 73 20 55 53 49 4e 47 20 66 74 73 33 28 61  ers USING fts3(a
0cf0: 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c  uthor, document,
0d00: 20 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72   tokenize=porter
0d10: 29 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  ).}.read_test  1
0d20: 2e 31 2e 34 2e 32 20 7b 0a 20 20 50 52 41 47 4d  .1.4.2 {.  PRAGM
0d30: 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 70 61 70  A table_info(pap
0d40: 65 72 73 29 0a 7d 20 7b 30 20 61 75 74 68 6f 72  ers).} {0 author
0d50: 20 7b 7d 20 30 20 7b 7d 20 30 20 31 20 64 6f 63   {} 0 {} 0 1 doc
0d60: 75 6d 65 6e 74 20 7b 7d 20 30 20 7b 7d 20 30 7d  ument {} 0 {} 0}
0d70: 0a 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31  ..ddl_test   1.1
0d80: 2e 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .5.1 {.  CREATE 
0d90: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 69  VIRTUAL TABLE si
0da0: 6d 70 6c 65 64 61 74 61 20 55 53 49 4e 47 20 66  mpledata USING f
0db0: 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d  ts3(tokenize=sim
0dc0: 70 6c 65 29 0a 7d 0a 72 65 61 64 5f 74 65 73 74  ple).}.read_test
0dd0: 20 20 31 2e 31 2e 35 2e 32 20 7b 0a 20 20 50 52    1.1.5.2 {.  PR
0de0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
0df0: 73 69 6d 70 6c 65 64 61 74 61 29 0a 7d 20 7b 30  simpledata).} {0
0e00: 20 63 6f 6e 74 65 6e 74 20 7b 7d 20 30 20 7b 7d   content {} 0 {}
0e10: 20 30 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 69   0}..ifcapable i
0e20: 63 75 20 7b 0a 20 20 64 64 6c 5f 74 65 73 74 20  cu {.  ddl_test 
0e30: 31 2e 31 2e 36 2e 31 20 7b 0a 20 20 20 20 43 52  1.1.6.1 {.    CR
0e40: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0e50: 4c 45 20 6e 61 6d 65 73 20 55 53 49 4e 47 20 66  LE names USING f
0e60: 74 73 33 28 61 2c 20 62 2c 20 74 6f 6b 65 6e 69  ts3(a, b, tokeni
0e70: 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29 0a 20 20  ze=icu en_AU).  
0e80: 7d 0a 20 20 72 65 61 64 5f 74 65 73 74 20 20 31  }.  read_test  1
0e90: 2e 31 2e 36 2e 32 20 7b 0a 20 20 20 20 50 52 41  .1.6.2 {.    PRA
0ea0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 6e  GMA table_info(n
0eb0: 61 6d 65 73 29 0a 20 20 7d 20 7b 30 20 61 20 7b  ames).  } {0 a {
0ec0: 7d 20 30 20 7b 7d 20 30 20 31 20 62 20 7b 7d 20  } 0 {} 0 1 b {} 
0ed0: 30 20 7b 7d 20 30 7d 0a 7d 0a 0a 64 64 6c 5f 74  0 {} 0}.}..ddl_t
0ee0: 65 73 74 20 20 20 31 2e 31 2e 37 2e 31 20 7b 44  est   1.1.7.1 {D
0ef0: 52 4f 50 20 54 41 42 4c 45 20 64 61 74 61 7d 0a  ROP TABLE data}.
0f00: 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e 37  ddl_test   1.1.7
0f10: 2e 32 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 70  .2 {DROP TABLE p
0f20: 61 67 65 73 7d 0a 64 64 6c 5f 74 65 73 74 20 20  ages}.ddl_test  
0f30: 20 31 2e 31 2e 37 2e 33 20 7b 44 52 4f 50 20 54   1.1.7.3 {DROP T
0f40: 41 42 4c 45 20 6d 61 69 6c 7d 0a 64 64 6c 5f 74  ABLE mail}.ddl_t
0f50: 65 73 74 20 20 20 31 2e 31 2e 37 2e 34 20 7b 44  est   1.1.7.4 {D
0f60: 52 4f 50 20 54 41 42 4c 45 20 70 61 70 65 72 73  ROP TABLE papers
0f70: 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31  }.ddl_test   1.1
0f80: 2e 37 2e 35 20 7b 44 52 4f 50 20 54 41 42 4c 45  .7.5 {DROP TABLE
0f90: 20 73 69 6d 70 6c 65 64 61 74 61 7d 0a 72 65 61   simpledata}.rea
0fa0: 64 5f 74 65 73 74 20 20 31 2e 31 2e 37 2e 36 20  d_test  1.1.7.6 
0fb0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  {SELECT * FROM s
0fc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 20 7b 7d  qlite_master} {}
0fd0: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
0fe0: 67 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20  g is not one of 
0ff0: 74 68 65 20 65 78 61 6d 70 6c 65 73 20 69 6e 20  the examples in 
1000: 73 65 63 74 69 6f 6e 20 31 2e 31 2e 20 49 74 20  section 1.1. It 
1010: 74 65 73 74 73 20 0a 23 20 73 70 65 63 69 66 79  tests .# specify
1020: 69 6e 67 20 61 6e 20 46 54 53 33 20 74 61 62 6c  ing an FTS3 tabl
1030: 65 20 77 69 74 68 20 6e 6f 20 6d 6f 64 75 6c 65  e with no module
1040: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 69 6e 67   arguments using
1050: 20 61 20 73 6c 69 67 68 74 6c 79 0a 23 20 64 69   a slightly.# di
1060: 66 66 65 72 65 6e 74 20 73 79 6e 74 61 78 2e 0a  fferent syntax..
1070: 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e 38  ddl_test   1.1.8
1080: 2e 31 20 7b 43 52 45 41 54 45 20 56 49 52 54 55  .1 {CREATE VIRTU
1090: 41 4c 20 54 41 42 4c 45 20 64 61 74 61 20 55 53  AL TABLE data US
10a0: 49 4e 47 20 66 74 73 33 3b 7d 0a 72 65 61 64 5f  ING fts3;}.read_
10b0: 74 65 73 74 20 20 31 2e 31 2e 38 2e 32 20 7b 50  test  1.1.8.2 {P
10c0: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
10d0: 28 64 61 74 61 29 7d 20 7b 30 20 63 6f 6e 74 65  (data)} {0 conte
10e0: 6e 74 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a 64 64  nt {} 0 {} 0}.dd
10f0: 6c 5f 74 65 73 74 20 20 20 31 2e 31 2e 38 2e 33  l_test   1.1.8.3
1100: 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 64 61 74   {DROP TABLE dat
1110: 61 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  a}..############
1120: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1130: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1140: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
1160: 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c   Test the exampl
1170: 65 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 31 2e  es in section 1.
1180: 32 20 28 70 6f 70 75 6c 61 74 69 6e 67 20 66 74  2 (populating ft
1190: 73 33 20 74 61 62 6c 65 73 29 0a 23 0a 64 64 6c  s3 tables).#.ddl
11a0: 5f 74 65 73 74 20 20 20 31 2e 32 2e 31 2e 31 20  _test   1.2.1.1 
11b0: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  {.  CREATE VIRTU
11c0: 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73 20 55  AL TABLE pages U
11d0: 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c  SING fts3(title,
11e0: 20 62 6f 64 79 29 3b 0a 7d 0a 77 72 69 74 65 5f   body);.}.write_
11f0: 74 65 73 74 20 31 2e 32 2e 31 2e 32 20 70 61 67  test 1.2.1.2 pag
1200: 65 73 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49  es_content {.  I
1210: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73  NSERT INTO pages
1220: 28 64 6f 63 69 64 2c 20 74 69 74 6c 65 2c 20 62  (docid, title, b
1230: 6f 64 79 29 20 0a 20 20 56 41 4c 55 45 53 28 35  ody) .  VALUES(5
1240: 33 2c 20 27 48 6f 6d 65 20 50 61 67 65 27 2c 20  3, 'Home Page', 
1250: 27 53 51 4c 69 74 65 20 69 73 20 61 20 73 6f 66  'SQLite is a sof
1260: 74 77 61 72 65 2e 2e 2e 27 29 3b 0a 7d 0a 72 65  tware...');.}.re
1270: 61 64 5f 74 65 73 74 20 20 31 2e 32 2e 31 2e 33  ad_test  1.2.1.3
1280: 20 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69   {.  SELECT doci
1290: 64 2c 20 2a 20 46 52 4f 4d 20 70 61 67 65 73 0a  d, * FROM pages.
12a0: 7d 20 7b 35 33 20 7b 48 6f 6d 65 20 50 61 67 65  } {53 {Home Page
12b0: 7d 20 7b 53 51 4c 69 74 65 20 69 73 20 61 20 73  } {SQLite is a s
12c0: 6f 66 74 77 61 72 65 2e 2e 2e 7d 7d 0a 0a 77 72  oftware...}}..wr
12d0: 69 74 65 5f 74 65 73 74 20 31 2e 32 2e 31 2e 34  ite_test 1.2.1.4
12e0: 20 70 61 67 65 73 5f 63 6f 6e 74 65 6e 74 20 7b   pages_content {
12f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
1300: 61 67 65 73 28 74 69 74 6c 65 2c 20 62 6f 64 79  ages(title, body
1310: 29 20 0a 20 20 56 41 4c 55 45 53 28 27 44 6f 77  ) .  VALUES('Dow
1320: 6e 6c 6f 61 64 27 2c 20 27 41 6c 6c 20 53 51 4c  nload', 'All SQL
1330: 69 74 65 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  ite source code.
1340: 2e 2e 27 29 3b 0a 7d 0a 72 65 61 64 5f 74 65 73  ..');.}.read_tes
1350: 74 20 20 31 2e 32 2e 31 2e 35 20 7b 0a 20 20 53  t  1.2.1.5 {.  S
1360: 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 2a 20 46  ELECT docid, * F
1370: 52 4f 4d 20 70 61 67 65 73 0a 7d 20 7b 35 33 20  ROM pages.} {53 
1380: 7b 48 6f 6d 65 20 50 61 67 65 7d 20 7b 53 51 4c  {Home Page} {SQL
1390: 69 74 65 20 69 73 20 61 20 73 6f 66 74 77 61 72  ite is a softwar
13a0: 65 2e 2e 2e 7d 20 35 34 20 44 6f 77 6e 6c 6f 61  e...} 54 Downloa
13b0: 64 20 7b 41 6c 6c 20 53 51 4c 69 74 65 20 73 6f  d {All SQLite so
13c0: 75 72 63 65 20 63 6f 64 65 2e 2e 2e 7d 7d 0a 0a  urce code...}}..
13d0: 77 72 69 74 65 5f 74 65 73 74 20 31 2e 32 2e 31  write_test 1.2.1
13e0: 2e 36 20 70 61 67 65 73 5f 63 6f 6e 74 65 6e 74  .6 pages_content
13f0: 20 7b 0a 20 20 55 50 44 41 54 45 20 70 61 67 65   {.  UPDATE page
1400: 73 20 53 45 54 20 74 69 74 6c 65 20 3d 20 27 44  s SET title = 'D
1410: 6f 77 6e 6c 6f 61 64 20 53 51 4c 69 74 65 27 20  ownload SQLite' 
1420: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 35 34  WHERE rowid = 54
1430: 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e  .}.read_test  1.
1440: 32 2e 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54  2.1.7 {.  SELECT
1450: 20 64 6f 63 69 64 2c 20 2a 20 46 52 4f 4d 20 70   docid, * FROM p
1460: 61 67 65 73 0a 7d 20 7b 35 33 20 7b 48 6f 6d 65  ages.} {53 {Home
1470: 20 50 61 67 65 7d 20 7b 53 51 4c 69 74 65 20 69   Page} {SQLite i
1480: 73 20 61 20 73 6f 66 74 77 61 72 65 2e 2e 2e 7d  s a software...}
1490: 20 35 34 20 7b 44 6f 77 6e 6c 6f 61 64 20 53 51   54 {Download SQ
14a0: 4c 69 74 65 7d 20 7b 41 6c 6c 20 53 51 4c 69 74  Lite} {All SQLit
14b0: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 2e 2e  e source code...
14c0: 7d 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74 20 31  }}..write_test 1
14d0: 2e 32 2e 31 2e 38 20 70 61 67 65 73 5f 63 6f 6e  .2.1.8 pages_con
14e0: 74 65 6e 74 20 7b 20 44 45 4c 45 54 45 20 46 52  tent { DELETE FR
14f0: 4f 4d 20 70 61 67 65 73 20 7d 0a 72 65 61 64 5f  OM pages }.read_
1500: 74 65 73 74 20 20 31 2e 32 2e 31 2e 39 20 7b 20  test  1.2.1.9 { 
1510: 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 2a 20  SELECT docid, * 
1520: 46 52 4f 4d 20 70 61 67 65 73 20 7d 20 7b 7d 0a  FROM pages } {}.
1530: 0a 64 6f 5f 65 72 72 6f 72 5f 74 65 73 74 20 66  .do_error_test f
1540: 74 73 33 2d 31 2e 32 2e 31 2e 31 30 20 7b 0a 20  ts3-1.2.1.10 {. 
1550: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
1560: 65 73 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 2c  es(rowid, docid,
1570: 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41   title, body) VA
1580: 4c 55 45 53 28 31 2c 20 32 2c 20 27 41 20 74 69  LUES(1, 2, 'A ti
1590: 74 6c 65 27 2c 20 27 41 20 64 6f 63 75 6d 65 6e  tle', 'A documen
15a0: 74 20 62 6f 64 79 27 29 3b 0a 7d 20 7b 53 51 4c  t body');.} {SQL
15b0: 20 6c 6f 67 69 63 20 65 72 72 6f 72 7d 0a 0a 23   logic error}..#
15c0: 20 54 65 73 74 20 74 68 65 20 6f 70 74 69 6d 69   Test the optimi
15d0: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 78  ze() function ex
15e0: 61 6d 70 6c 65 3a 0a 64 64 6c 5f 74 65 73 74 20  ample:.ddl_test 
15f0: 20 20 31 2e 32 2e 32 2e 31 20 7b 20 43 52 45 41    1.2.2.1 { CREA
1600: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1610: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33   docs USING fts3
1620: 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31 2e   }.write_test 1.
1630: 32 2e 32 2e 32 20 64 6f 63 73 5f 63 6f 6e 74 65  2.2.2 docs_conte
1640: 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  nt {.  INSERT IN
1650: 54 4f 20 64 6f 63 73 20 56 41 4c 55 45 53 28 27  TO docs VALUES('
1660: 4f 74 68 65 72 73 20 74 72 61 6e 73 6c 61 74 65  Others translate
1670: 20 74 68 65 20 66 69 72 73 74 20 63 6c 61 75 73   the first claus
1680: 65 20 61 73 27 29 3b 0a 7d 0a 77 72 69 74 65 5f  e as');.}.write_
1690: 74 65 73 74 20 31 2e 32 2e 32 2e 33 20 64 6f 63  test 1.2.2.3 doc
16a0: 73 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49 4e  s_content {.  IN
16b0: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 20 56  SERT INTO docs V
16c0: 41 4c 55 45 53 28 27 22 77 68 69 63 68 20 69 73  ALUES('"which is
16d0: 20 66 6f 72 20 53 6f 6c 6f 6d 6f 6e 2c 22 20 6d   for Solomon," m
16e0: 65 61 6e 69 6e 67 20 74 68 61 74 27 29 3b 0a 7d  eaning that');.}
16f0: 0a 77 72 69 74 65 5f 74 65 73 74 20 31 2e 32 2e  .write_test 1.2.
1700: 32 2e 34 20 64 6f 63 73 5f 63 6f 6e 74 65 6e 74  2.4 docs_content
1710: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
1720: 20 64 6f 63 73 20 56 41 4c 55 45 53 28 27 74 68   docs VALUES('th
1730: 65 20 62 6f 6f 6b 20 69 73 20 64 65 64 69 63 61  e book is dedica
1740: 74 65 64 20 74 6f 20 53 6f 6c 6f 6d 6f 6e 2e 27  ted to Solomon.'
1750: 29 3b 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20  );.}.read_test  
1760: 31 2e 32 2e 32 2e 35 20 7b 20 53 45 4c 45 43 54  1.2.2.5 { SELECT
1770: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 64   count(*) FROM d
1780: 6f 63 73 5f 73 65 67 64 69 72 20 7d 20 7b 33 7d  ocs_segdir } {3}
1790: 0a 77 72 69 74 65 5f 74 65 73 74 20 31 2e 32 2e  .write_test 1.2.
17a0: 32 2e 36 20 64 6f 63 73 5f 73 65 67 64 69 72 20  2.6 docs_segdir 
17b0: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
17c0: 64 6f 63 73 28 64 6f 63 73 29 20 56 41 4c 55 45  docs(docs) VALUE
17d0: 53 28 27 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 7d  S('optimize');.}
17e0: 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 32 2e  .read_test  1.2.
17f0: 32 2e 37 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  2.7 { SELECT cou
1800: 6e 74 28 2a 29 20 46 52 4f 4d 20 64 6f 63 73 5f  nt(*) FROM docs_
1810: 73 65 67 64 69 72 20 7d 20 7b 31 7d 0a 64 64 6c  segdir } {1}.ddl
1820: 5f 74 65 73 74 20 20 20 31 2e 32 2e 32 2e 38 20  _test   1.2.2.8 
1830: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 64 6f 63  { DROP TABLE doc
1840: 73 20 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  s }..###########
1850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
1890: 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70  # Test the examp
18a0: 6c 65 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 31  les in section 1
18b0: 2e 33 20 28 71 75 65 72 79 69 6e 67 20 46 54 53  .3 (querying FTS
18c0: 33 20 74 61 62 6c 65 73 29 0a 23 0a 64 64 6c 5f  3 tables).#.ddl_
18d0: 74 65 73 74 20 20 20 31 2e 33 2e 31 2e 31 20 7b  test   1.3.1.1 {
18e0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
18f0: 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47  TABLE mail USING
1900: 20 66 74 73 33 28 73 75 62 6a 65 63 74 2c 20 62   fts3(subject, b
1910: 6f 64 79 29 20 7d 0a 72 65 61 64 5f 74 65 73 74  ody) }.read_test
1920: 20 20 31 2e 33 2e 31 2e 32 20 7b 20 0a 20 20 53    1.3.1.2 { .  S
1930: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
1940: 6c 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  l WHERE rowid = 
1950: 31 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  15;             
1960: 20 20 20 2d 2d 20 46 61 73 74 2e 20 52 6f 77 69     -- Fast. Rowi
1970: 64 20 6c 6f 6f 6b 75 70 2e 0a 20 20 53 45 4c 45  d lookup..  SELE
1980: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
1990: 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43 48 20  HERE body MATCH 
19a0: 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20  'sqlite';       
19b0: 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65  -- Fast. Full-te
19c0: 78 74 20 71 75 65 72 79 2e 0a 20 20 53 45 4c 45  xt query..  SELE
19d0: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
19e0: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
19f0: 27 73 65 61 72 63 68 27 3b 20 20 20 20 20 20 20  'search';       
1a00: 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65  -- Fast. Full-te
1a10: 78 74 20 71 75 65 72 79 2e 0a 20 20 53 45 4c 45  xt query..  SELE
1a20: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
1a30: 48 45 52 45 20 72 6f 77 69 64 20 42 45 54 57 45  HERE rowid BETWE
1a40: 45 4e 20 31 35 20 41 4e 44 20 32 30 3b 20 20 20  EN 15 AND 20;   
1a50: 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61 72 20  -- Slow. Linear 
1a60: 73 63 61 6e 2e 0a 20 20 53 45 4c 45 43 54 20 2a  scan..  SELECT *
1a70: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
1a80: 20 73 75 62 6a 65 63 74 20 3d 20 27 64 61 74 61   subject = 'data
1a90: 62 61 73 65 27 3b 20 20 20 20 20 20 2d 2d 20 53  base';      -- S
1aa0: 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e  low. Linear scan
1ab0: 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ..  SELECT * FRO
1ac0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 73 75 62  M mail WHERE sub
1ad0: 6a 65 63 74 20 4d 41 54 43 48 20 27 64 61 74 61  ject MATCH 'data
1ae0: 62 61 73 65 27 3b 20 20 2d 2d 20 46 61 73 74 2e  base';  -- Fast.
1af0: 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   Full-text query
1b00: 2e 0a 7d 20 7b 7d 0a 64 64 6c 5f 74 65 73 74 20  ..} {}.ddl_test 
1b10: 20 20 31 2e 33 2e 31 2e 33 20 7b 20 44 52 4f 50    1.3.1.3 { DROP
1b20: 20 54 41 42 4c 45 20 6d 61 69 6c 20 7d 0a 0a 64   TABLE mail }..d
1b30: 64 6c 5f 74 65 73 74 20 20 20 31 2e 33 2e 32 2e  dl_test   1.3.2.
1b40: 31 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  1 { CREATE VIRTU
1b50: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
1b60: 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74  ING fts3(subject
1b70: 2c 20 62 6f 64 79 29 20 7d 0a 0a 77 72 69 74 65  , body) }..write
1b80: 5f 74 65 73 74 20 31 2e 33 2e 32 2e 32 20 6d 61  _test 1.3.2.2 ma
1b90: 69 6c 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49  il_content {.  I
1ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28  NSERT INTO mail(
1bb0: 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20  docid, subject, 
1bc0: 62 6f 64 79 29 20 0a 20 20 56 41 4c 55 45 53 28  body) .  VALUES(
1bd0: 31 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65  1, 'software fee
1be0: 64 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64 20 69  dback', 'found i
1bf0: 74 20 74 6f 6f 20 73 6c 6f 77 27 29 0a 7d 0a 77  t too slow').}.w
1c00: 72 69 74 65 5f 74 65 73 74 20 31 2e 33 2e 32 2e  rite_test 1.3.2.
1c10: 33 20 6d 61 69 6c 5f 63 6f 6e 74 65 6e 74 20 7b  3 mail_content {
1c20: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d  .  INSERT INTO m
1c30: 61 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65  ail(docid, subje
1c40: 63 74 2c 20 62 6f 64 79 29 20 0a 20 20 56 41 4c  ct, body) .  VAL
1c50: 55 45 53 28 32 2c 20 27 73 6f 66 74 77 61 72 65  UES(2, 'software
1c60: 20 66 65 65 64 62 61 63 6b 27 2c 20 27 6e 6f 20   feedback', 'no 
1c70: 66 65 65 64 62 61 63 6b 27 29 0a 7d 0a 77 72 69  feedback').}.wri
1c80: 74 65 5f 74 65 73 74 20 31 2e 33 2e 32 2e 34 20  te_test 1.3.2.4 
1c90: 6d 61 69 6c 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20  mail_content {. 
1ca0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
1cb0: 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74  l(docid, subject
1cc0: 2c 20 62 6f 64 79 29 20 0a 20 20 56 41 4c 55 45  , body) .  VALUE
1cd0: 53 28 33 2c 20 27 73 6c 6f 77 20 6c 75 6e 63 68  S(3, 'slow lunch
1ce0: 20 6f 72 64 65 72 27 2c 20 20 27 77 61 73 20 61   order',  'was a
1cf0: 20 73 6f 66 74 77 61 72 65 20 70 72 6f 62 6c 65   software proble
1d00: 6d 27 29 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20  m').}.read_test 
1d10: 20 31 2e 33 2e 32 2e 35 20 7b 0a 20 20 53 45 4c   1.3.2.5 {.  SEL
1d20: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20  ECT * FROM mail 
1d30: 57 48 45 52 45 20 73 75 62 6a 65 63 74 20 4d 41  WHERE subject MA
1d40: 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 0a 7d  TCH 'software'.}
1d50: 20 7b 7b 73 6f 66 74 77 61 72 65 20 66 65 65 64   {{software feed
1d60: 62 61 63 6b 7d 20 7b 66 6f 75 6e 64 20 69 74 20  back} {found it 
1d70: 74 6f 6f 20 73 6c 6f 77 7d 20 7b 73 6f 66 74 77  too slow} {softw
1d80: 61 72 65 20 66 65 65 64 62 61 63 6b 7d 20 7b 6e  are feedback} {n
1d90: 6f 20 66 65 65 64 62 61 63 6b 7d 7d 0a 72 65 61  o feedback}}.rea
1da0: 64 5f 74 65 73 74 20 20 31 2e 33 2e 32 2e 36 20  d_test  1.3.2.6 
1db0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
1dc0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 62 6f 64  M mail WHERE bod
1dd0: 79 20 4d 41 54 43 48 20 27 66 65 65 64 62 61 63  y MATCH 'feedbac
1de0: 6b 27 0a 7d 20 7b 7b 73 6f 66 74 77 61 72 65 20  k'.} {{software 
1df0: 66 65 65 64 62 61 63 6b 7d 20 7b 6e 6f 20 66 65  feedback} {no fe
1e00: 65 64 62 61 63 6b 7d 7d 0a 72 65 61 64 5f 74 65  edback}}.read_te
1e10: 73 74 20 20 31 2e 33 2e 32 2e 37 20 7b 0a 20 20  st  1.3.2.7 {.  
1e20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
1e30: 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41  il WHERE mail MA
1e40: 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 0a 7d  TCH 'software'.}
1e50: 20 7b 7b 73 6f 66 74 77 61 72 65 20 66 65 65 64   {{software feed
1e60: 62 61 63 6b 7d 20 7b 66 6f 75 6e 64 20 69 74 20  back} {found it 
1e70: 74 6f 6f 20 73 6c 6f 77 7d 20 7b 73 6f 66 74 77  too slow} {softw
1e80: 61 72 65 20 66 65 65 64 62 61 63 6b 7d 20 7b 6e  are feedback} {n
1e90: 6f 20 66 65 65 64 62 61 63 6b 7d 20 7b 73 6c 6f  o feedback} {slo
1ea0: 77 20 6c 75 6e 63 68 20 6f 72 64 65 72 7d 20 7b  w lunch order} {
1eb0: 77 61 73 20 61 20 73 6f 66 74 77 61 72 65 20 70  was a software p
1ec0: 72 6f 62 6c 65 6d 7d 7d 0a 72 65 61 64 5f 74 65  roblem}}.read_te
1ed0: 73 74 20 20 31 2e 33 2e 32 2e 37 20 7b 0a 20 20  st  1.3.2.7 {.  
1ee0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
1ef0: 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41  il WHERE mail MA
1f00: 54 43 48 20 27 73 6c 6f 77 27 0a 7d 20 7b 7b 73  TCH 'slow'.} {{s
1f10: 6f 66 74 77 61 72 65 20 66 65 65 64 62 61 63 6b  oftware feedback
1f20: 7d 20 7b 66 6f 75 6e 64 20 69 74 20 74 6f 6f 20  } {found it too 
1f30: 73 6c 6f 77 7d 20 7b 73 6c 6f 77 20 6c 75 6e 63  slow} {slow lunc
1f40: 68 20 6f 72 64 65 72 7d 20 7b 77 61 73 20 61 20  h order} {was a 
1f50: 73 6f 66 74 77 61 72 65 20 70 72 6f 62 6c 65 6d  software problem
1f60: 7d 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e  }}.ddl_test   1.
1f70: 33 2e 32 2e 38 20 7b 20 44 52 4f 50 20 54 41 42  3.2.8 { DROP TAB
1f80: 4c 45 20 6d 61 69 6c 20 7d 0a 0a 64 64 6c 5f 74  LE mail }..ddl_t
1f90: 65 73 74 20 20 20 31 2e 33 2e 33 2e 31 20 7b 20  est   1.3.3.1 { 
1fa0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1fb0: 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20  ABLE docs USING 
1fc0: 66 74 73 33 28 63 6f 6e 74 65 6e 74 29 20 7d 0a  fts3(content) }.
1fd0: 72 65 61 64 5f 74 65 73 74 20 20 31 2e 33 2e 33  read_test  1.3.3
1fe0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .2 { SELECT * FR
1ff0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
2000: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
2010: 27 20 7d 20 7b 7d 0a 72 65 61 64 5f 74 65 73 74  ' } {}.read_test
2020: 20 20 31 2e 33 2e 33 2e 33 20 7b 20 53 45 4c 45    1.3.3.3 { SELE
2030: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
2040: 48 45 52 45 20 64 6f 63 73 2e 64 6f 63 73 20 4d  HERE docs.docs M
2050: 41 54 43 48 20 27 73 71 6c 69 74 65 27 20 7d 20  ATCH 'sqlite' } 
2060: 7b 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e  {}.read_test  1.
2070: 33 2e 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a  3.3.4 { SELECT *
2080: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
2090: 20 6d 61 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 20   main.docs.docs 
20a0: 4d 41 54 43 48 20 27 73 71 6c 69 74 65 27 20 7d  MATCH 'sqlite' }
20b0: 20 7b 7d 0a 64 6f 5f 65 72 72 6f 72 5f 74 65 73   {}.do_error_tes
20c0: 74 20 65 5f 66 74 73 33 2d 31 2e 33 2e 33 2e 35  t e_fts3-1.3.3.5
20d0: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46   { .  SELECT * F
20e0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 6d  ROM docs WHERE m
20f0: 61 69 6e 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ain.docs MATCH '
2100: 73 71 6c 69 74 65 27 20 0a 7d 20 7b 6e 6f 20 73  sqlite' .} {no s
2110: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 6d 61 69 6e  uch column: main
2120: 2e 64 6f 63 73 7d 0a 64 64 6c 5f 74 65 73 74 20  .docs}.ddl_test 
2130: 20 20 31 2e 33 2e 32 2e 38 20 7b 20 44 52 4f 50    1.3.2.8 { DROP
2140: 20 54 41 42 4c 45 20 64 6f 63 73 20 7d 0a 0a 23   TABLE docs }..#
2150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2190: 23 23 23 23 23 23 23 23 23 0a 23 20 54 65 73 74  #########.# Test
21a0: 20 74 68 65 20 65 78 61 6d 70 6c 65 73 20 69 6e   the examples in
21b0: 20 73 65 63 74 69 6f 6e 20 33 20 28 66 75 6c 6c   section 3 (full
21c0: 2d 74 65 78 74 20 69 6e 64 65 78 20 71 75 65 72  -text index quer
21d0: 69 65 73 29 2e 0a 23 0a 64 64 6c 5f 74 65 73 74  ies)..#.ddl_test
21e0: 20 20 20 31 2e 34 2e 31 2e 31 20 7b 20 43 52 45     1.4.1.1 { CRE
21f0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
2200: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
2210: 33 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 7d  3(title, body) }
2220: 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  .unset -nocompla
2230: 69 6e 20 52 0a 66 6f 72 65 61 63 68 20 7b 74 6e  in R.foreach {tn
2240: 20 74 69 74 6c 65 20 62 6f 64 79 7d 20 7b 0a 20   title body} {. 
2250: 20 32 20 22 6c 69 6e 75 78 20 64 72 69 76 65 72   2 "linux driver
2260: 22 20 22 61 20 64 65 76 69 63 65 22 0a 20 20 33  " "a device".  3
2270: 20 22 64 72 69 76 65 72 22 20 20 20 20 20 20 20   "driver"       
2280: 22 6c 69 6e 67 75 69 73 74 69 63 20 74 72 69 63  "linguistic tric
2290: 6b 22 0a 20 20 34 20 22 70 72 6f 62 6c 65 6d 73  k".  4 "problems
22a0: 22 20 20 20 20 20 22 6c 69 6e 75 78 20 70 72 6f  "     "linux pro
22b0: 62 6c 65 6d 73 22 0a 20 20 35 20 22 6c 69 6e 75  blems".  5 "linu
22c0: 78 22 20 20 20 20 20 20 20 20 22 62 69 67 20 70  x"        "big p
22d0: 72 6f 62 6c 65 6d 73 22 0a 20 20 36 20 22 6c 69  roblems".  6 "li
22e0: 6e 75 78 20 64 72 69 76 65 72 22 20 22 61 20 64  nux driver" "a d
22f0: 65 76 69 63 65 20 64 72 69 76 65 72 20 70 72 6f  evice driver pro
2300: 62 6c 65 6d 22 0a 20 20 37 20 22 67 6f 6f 64 20  blem".  7 "good 
2310: 74 69 6d 65 73 22 20 20 20 22 61 70 70 6c 69 63  times"   "applic
2320: 61 74 69 6f 6e 73 20 66 6f 72 20 6c 69 6e 75 78  ations for linux
2330: 22 0a 20 20 38 20 22 6e 6f 74 20 73 6f 20 67 6f  ".  8 "not so go
2340: 6f 64 22 20 20 22 6c 69 6e 75 78 20 61 70 70 6c  od"  "linux appl
2350: 69 63 61 74 69 6f 6e 73 22 0a 20 20 39 20 22 61  ications".  9 "a
2360: 6c 74 65 72 6e 61 74 69 76 65 22 20 20 22 6c 69  lternative"  "li
2370: 6e 6f 6c 65 75 6d 20 61 70 70 6c 69 61 6e 63 65  noleum appliance
2380: 73 22 0a 20 31 30 20 22 6e 6f 20 4c 20 49 20 4e  s". 10 "no L I N
2390: 22 20 20 20 20 20 22 74 6f 20 62 65 20 73 65 65  "     "to be see
23a0: 6e 22 0a 7d 20 7b 0a 20 20 77 72 69 74 65 5f 74  n".} {.  write_t
23b0: 65 73 74 20 31 2e 34 2e 31 2e 24 74 6e 20 64 6f  est 1.4.1.$tn do
23c0: 63 73 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53  cs_content { INS
23d0: 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 20 56 41  ERT INTO docs VA
23e0: 4c 55 45 53 28 24 74 69 74 6c 65 2c 24 62 6f 64  LUES($title,$bod
23f0: 79 29 20 7d 0a 20 20 73 65 74 20 52 28 24 74 6e  y) }.  set R($tn
2400: 29 20 5b 6c 69 73 74 20 24 74 69 74 6c 65 20 24  ) [list $title $
2410: 62 6f 64 79 5d 0a 7d 0a 0a 72 65 61 64 5f 74 65  body].}..read_te
2420: 73 74 20 20 31 2e 34 2e 31 2e 31 31 20 7b 20 0a  st  1.4.1.11 { .
2430: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2440: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
2450: 4d 41 54 43 48 20 27 6c 69 6e 75 78 27 0a 7d 20  MATCH 'linux'.} 
2460: 5b 63 6f 6e 63 61 74 20 24 52 28 32 29 20 24 52  [concat $R(2) $R
2470: 28 34 29 20 24 52 28 35 29 20 24 52 28 36 29 20  (4) $R(5) $R(6) 
2480: 24 52 28 37 29 20 24 52 28 38 29 5d 0a 72 65 61  $R(7) $R(8)].rea
2490: 64 5f 74 65 73 74 20 20 31 2e 34 2e 31 2e 31 32  d_test  1.4.1.12
24a0: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46   { .  SELECT * F
24b0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
24c0: 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 6e 2a 27  ocs MATCH 'lin*'
24d0: 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 52 28 32 29  .} [concat $R(2)
24e0: 20 24 52 28 33 29 20 24 52 28 34 29 20 24 52 28   $R(3) $R(4) $R(
24f0: 35 29 20 24 52 28 36 29 20 24 52 28 37 29 20 24  5) $R(6) $R(7) $
2500: 52 28 38 29 20 24 52 28 39 29 5d 0a 72 65 61 64  R(8) $R(9)].read
2510: 5f 74 65 73 74 20 20 31 2e 34 2e 31 2e 31 33 20  _test  1.4.1.13 
2520: 7b 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  { .  SELECT * FR
2530: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
2540: 63 73 20 4d 41 54 43 48 20 27 74 69 74 6c 65 3a  cs MATCH 'title:
2550: 6c 69 6e 75 78 20 70 72 6f 62 6c 65 6d 73 27 0a  linux problems'.
2560: 7d 20 5b 63 6f 6e 63 61 74 20 24 52 28 35 29 5d  } [concat $R(5)]
2570: 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 34 2e  .read_test  1.4.
2580: 31 2e 31 34 20 7b 20 0a 20 20 53 45 4c 45 43 54  1.14 { .  SELECT
2590: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
25a0: 52 45 20 62 6f 64 79 20 4d 41 54 43 48 20 27 74  RE body MATCH 't
25b0: 69 74 6c 65 3a 6c 69 6e 75 78 20 64 72 69 76 65  itle:linux drive
25c0: 72 27 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 52 28  r'.} [concat $R(
25d0: 36 29 5d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  6)].read_test  1
25e0: 2e 34 2e 31 2e 31 35 20 7b 20 0a 20 20 53 45 4c  .4.1.15 { .  SEL
25f0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
2600: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
2610: 20 27 22 6c 69 6e 75 78 20 61 70 70 6c 69 63 61   '"linux applica
2620: 74 69 6f 6e 73 22 27 0a 7d 20 5b 63 6f 6e 63 61  tions"'.} [conca
2630: 74 20 24 52 28 38 29 5d 0a 72 65 61 64 5f 74 65  t $R(8)].read_te
2640: 73 74 20 20 31 2e 34 2e 31 2e 31 36 20 7b 20 0a  st  1.4.1.16 { .
2650: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2660: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
2670: 4d 41 54 43 48 20 27 22 6c 69 6e 2a 20 61 70 70  MATCH '"lin* app
2680: 2a 22 27 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 52  *"'.} [concat $R
2690: 28 38 29 20 24 52 28 39 29 5d 0a 64 64 6c 5f 74  (8) $R(9)].ddl_t
26a0: 65 73 74 20 20 20 31 2e 34 2e 31 2e 31 37 20 7b  est   1.4.1.17 {
26b0: 20 44 52 4f 50 20 54 41 42 4c 45 20 64 6f 63 73   DROP TABLE docs
26c0: 20 7d 0a 75 6e 73 65 74 20 52 0a 0a 64 64 6c 5f   }.unset R..ddl_
26d0: 74 65 73 74 20 20 20 31 2e 34 2e 32 2e 31 20 7b  test   1.4.2.1 {
26e0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
26f0: 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47  TABLE docs USING
2700: 20 66 74 73 33 28 29 20 7d 0a 77 72 69 74 65 5f   fts3() }.write_
2710: 74 65 73 74 20 31 2e 34 2e 32 2e 32 20 64 6f 63  test 1.4.2.2 doc
2720: 73 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20 20 49  s_content { .  I
2730: 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 20  NSERT INTO docs 
2740: 56 41 4c 55 45 53 28 0a 20 20 27 53 51 4c 69 74  VALUES(.  'SQLit
2750: 65 20 69 73 20 61 6e 20 41 43 49 44 20 63 6f 6d  e is an ACID com
2760: 70 6c 69 61 6e 74 20 65 6d 62 65 64 64 65 64 20  pliant embedded 
2770: 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61 62  relational datab
2780: 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ase management s
2790: 79 73 74 65 6d 27 29 0a 7d 0a 66 6f 72 65 61 63  ystem').}.foreac
27a0: 68 20 7b 74 6e 20 71 75 65 72 79 20 68 69 74 7d  h {tn query hit}
27b0: 20 7b 0a 33 20 7b 53 45 4c 45 43 54 20 2a 20 46   {.3 {SELECT * F
27c0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
27d0: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
27e0: 65 20 4e 45 41 52 20 64 61 74 61 62 61 73 65 27  e NEAR database'
27f0: 7d 20 31 0a 34 20 7b 53 45 4c 45 43 54 20 2a 20  } 1.4 {SELECT * 
2800: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
2810: 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61  docs MATCH 'data
2820: 62 61 73 65 20 4e 45 41 52 2f 36 20 73 71 6c 69  base NEAR/6 sqli
2830: 74 65 27 7d 20 31 0a 35 20 7b 53 45 4c 45 43 54  te'} 1.5 {SELECT
2840: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
2850: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
2860: 61 74 61 62 61 73 65 20 4e 45 41 52 2f 35 20 73  atabase NEAR/5 s
2870: 71 6c 69 74 65 27 7d 20 30 0a 36 20 7b 53 45 4c  qlite'} 0.6 {SEL
2880: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
2890: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
28a0: 20 27 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f   'database NEAR/
28b0: 32 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e  2 "ACID complian
28c0: 74 22 27 7d 20 31 0a 37 20 7b 53 45 4c 45 43 54  t"'} 1.7 {SELECT
28d0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
28e0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
28f0: 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20  ACID compliant" 
2900: 4e 45 41 52 2f 32 20 73 71 6c 69 74 65 27 7d 20  NEAR/2 sqlite'} 
2910: 31 0a 38 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  1.8 {SELECT * FR
2920: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
2930: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
2940: 20 4e 45 41 52 2f 32 20 61 63 69 64 20 4e 45 41   NEAR/2 acid NEA
2950: 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 7d  R/2 relational'}
2960: 20 31 0a 39 20 7b 53 45 4c 45 43 54 20 2a 20 46   1.9 {SELECT * F
2970: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
2980: 6f 63 73 20 4d 41 54 43 48 20 27 61 63 69 64 20  ocs MATCH 'acid 
2990: 4e 45 41 52 2f 32 20 73 71 6c 69 74 65 20 4e 45  NEAR/2 sqlite NE
29a0: 41 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27  AR/2 relational'
29b0: 7d 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 65  } 0.} {.  set re
29c0: 73 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  s [db eval {SELE
29d0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
29e0: 48 45 52 45 20 24 68 69 74 7d 5d 0a 20 20 72 65  HERE $hit}].  re
29f0: 61 64 5f 74 65 73 74 20 31 2e 34 2e 32 2e 24 74  ad_test 1.4.2.$t
2a00: 6e 20 24 71 75 65 72 79 20 24 72 65 73 0a 7d 0a  n $query $res.}.
2a10: 64 64 6c 5f 74 65 73 74 20 31 2e 34 2e 32 2e 31  ddl_test 1.4.2.1
2a20: 30 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 64  0 { DROP TABLE d
2a30: 6f 63 73 20 7d 0a 0a 23 23 23 23 23 23 23 23 23  ocs }..#########
2a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a80: 23 0a 23 20 54 65 73 74 20 74 68 65 20 65 78 61  #.# Test the exa
2a90: 6d 70 6c 65 20 69 6e 20 73 65 63 74 69 6f 6e 20  mple in section 
2aa0: 33 2e 31 20 28 73 65 74 20 6f 70 65 72 61 74 6f  3.1 (set operato
2ab0: 72 73 20 77 69 74 68 20 65 6e 68 61 6e 63 65 64  rs with enhanced
2ac0: 20 73 79 6e 74 61 78 29 2e 0a 23 0a 73 65 74 20   syntax)..#.set 
2ad0: 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62  sqlite_fts3_enab
2ae0: 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20 31  le_parentheses 1
2af0: 0a 64 64 6c 5f 74 65 73 74 20 31 2e 35 2e 31 2e  .ddl_test 1.5.1.
2b00: 31 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  1 { CREATE VIRTU
2b10: 41 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53  AL TABLE docs US
2b20: 49 4e 47 20 66 74 73 33 28 29 20 7d 0a 66 6f 72  ING fts3() }.for
2b30: 65 61 63 68 20 7b 74 6e 20 64 6f 63 69 64 20 63  each {tn docid c
2b40: 6f 6e 74 65 6e 74 7d 20 7b 0a 20 20 32 20 31 20  ontent} {.  2 1 
2b50: 22 61 20 64 61 74 61 62 61 73 65 20 69 73 20 61  "a database is a
2b60: 20 73 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d   software system
2b70: 22 0a 20 20 33 20 32 20 22 73 71 6c 69 74 65 20  ".  3 2 "sqlite 
2b80: 69 73 20 61 20 73 6f 66 74 77 61 72 65 20 73 79  is a software sy
2b90: 73 74 65 6d 22 0a 20 20 34 20 33 20 22 73 71 6c  stem".  4 3 "sql
2ba0: 69 74 65 20 69 73 20 61 20 64 61 74 61 62 61 73  ite is a databas
2bb0: 65 22 0a 7d 20 7b 0a 20 20 73 65 74 20 52 28 24  e".} {.  set R($
2bc0: 64 6f 63 69 64 29 20 24 63 6f 6e 74 65 6e 74 0a  docid) $content.
2bd0: 20 20 77 72 69 74 65 5f 74 65 73 74 20 31 2e 35    write_test 1.5
2be0: 2e 31 2e 24 74 6e 20 64 6f 63 73 5f 63 6f 6e 74  .1.$tn docs_cont
2bf0: 65 6e 74 20 7b 20 0a 20 20 20 20 49 4e 53 45 52  ent { .    INSER
2c00: 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69  T INTO docs(doci
2c10: 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  d, content) VALU
2c20: 45 53 28 24 64 6f 63 69 64 2c 20 24 63 6f 6e 74  ES($docid, $cont
2c30: 65 6e 74 29 0a 20 20 7d 0a 7d 0a 72 65 61 64 5f  ent).  }.}.read_
2c40: 74 65 73 74 20 31 2e 35 2e 31 2e 34 20 7b 0a 20  test 1.5.1.4 {. 
2c50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
2c60: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
2c70: 41 54 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44  ATCH 'sqlite AND
2c80: 20 64 61 74 61 62 61 73 65 27 0a 7d 20 5b 6c 69   database'.} [li
2c90: 73 74 20 24 52 28 33 29 5d 0a 72 65 61 64 5f 74  st $R(3)].read_t
2ca0: 65 73 74 20 31 2e 35 2e 31 2e 35 20 7b 0a 20 20  est 1.5.1.5 {.  
2cb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
2cc0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
2cd0: 54 43 48 20 27 64 61 74 61 62 61 73 65 20 73 71  TCH 'database sq
2ce0: 6c 69 74 65 27 0a 7d 20 5b 6c 69 73 74 20 24 52  lite'.} [list $R
2cf0: 28 33 29 5d 0a 72 65 61 64 5f 74 65 73 74 20 31  (3)].read_test 1
2d00: 2e 35 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43  .5.1.6 {.  SELEC
2d10: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
2d20: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
2d30: 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61  sqlite OR databa
2d40: 73 65 27 0a 7d 20 5b 6c 69 73 74 20 24 52 28 31  se'.} [list $R(1
2d50: 29 20 24 52 28 32 29 20 24 52 28 33 29 5d 0a 72  ) $R(2) $R(3)].r
2d60: 65 61 64 5f 74 65 73 74 20 31 2e 35 2e 31 2e 37  ead_test 1.5.1.7
2d70: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
2d80: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
2d90: 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61  cs MATCH 'databa
2da0: 73 65 20 4e 4f 54 20 73 71 6c 69 74 65 27 0a 7d  se NOT sqlite'.}
2db0: 20 5b 6c 69 73 74 20 24 52 28 31 29 5d 0a 72 65   [list $R(1)].re
2dc0: 61 64 5f 74 65 73 74 20 31 2e 35 2e 31 2e 38 20  ad_test 1.5.1.8 
2dd0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
2de0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
2df0: 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  s MATCH 'databas
2e00: 65 20 61 6e 64 20 73 71 6c 69 74 65 27 0a 7d 20  e and sqlite'.} 
2e10: 7b 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74 20 31  {}..write_test 1
2e20: 2e 35 2e 32 2e 31 20 64 6f 63 73 5f 63 6f 6e 74  .5.2.1 docs_cont
2e30: 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  ent {.  INSERT I
2e40: 4e 54 4f 20 64 6f 63 73 20 0a 20 20 20 20 53 45  NTO docs .    SE
2e50: 4c 45 43 54 20 27 73 71 6c 69 74 65 20 69 73 20  LECT 'sqlite is 
2e60: 61 6c 73 6f 20 61 20 6c 69 62 72 61 72 79 27 20  also a library' 
2e70: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45  UNION ALL.    SE
2e80: 4c 45 43 54 20 27 6c 69 62 72 61 72 79 20 73 6f  LECT 'library so
2e90: 66 74 77 61 72 65 27 0a 7d 0a 72 65 61 64 5f 74  ftware'.}.read_t
2ea0: 65 73 74 20 31 2e 35 2e 32 2e 32 20 7b 0a 20 20  est 1.5.2.2 {.  
2eb0: 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
2ec0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
2ed0: 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20  s MATCH 'sqlite 
2ee0: 41 4e 44 20 64 61 74 61 62 61 73 65 20 4f 52 20  AND database OR 
2ef0: 6c 69 62 72 61 72 79 27 0a 7d 20 7b 33 20 34 20  library'.} {3 4 
2f00: 35 7d 0a 72 65 61 64 5f 74 65 73 74 20 31 2e 35  5}.read_test 1.5
2f10: 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.3 {.  SELECT 
2f20: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
2f30: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
2f40: 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74   'sqlite AND dat
2f50: 61 62 61 73 65 27 0a 20 20 20 20 55 4e 49 4f 4e  abase'.    UNION
2f60: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
2f70: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
2f80: 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 62 72  docs MATCH 'libr
2f90: 61 72 79 27 0a 7d 20 7b 33 20 34 20 35 7d 0a 77  ary'.} {3 4 5}.w
2fa0: 72 69 74 65 5f 74 65 73 74 20 31 2e 35 2e 32 2e  rite_test 1.5.2.
2fb0: 34 20 64 6f 63 73 5f 63 6f 6e 74 65 6e 74 20 7b  4 docs_content {
2fc0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
2fd0: 6f 63 73 20 0a 20 20 20 20 53 45 4c 45 43 54 20  ocs .    SELECT 
2fe0: 27 74 68 65 20 73 71 6c 69 74 65 20 6c 69 62 72  'the sqlite libr
2ff0: 61 72 79 20 72 75 6e 73 20 6f 6e 20 6c 69 6e 75  ary runs on linu
3000: 78 27 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20  x' UNION ALL.   
3010: 20 53 45 4c 45 43 54 20 27 61 73 20 64 6f 65 73   SELECT 'as does
3020: 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
3030: 62 61 73 65 20 28 6f 6e 20 6c 69 6e 75 78 29 27  base (on linux)'
3040: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53   UNION ALL.    S
3050: 45 4c 45 43 54 20 27 74 68 65 20 73 71 6c 69 74  ELECT 'the sqlit
3060: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 63  e database is ac
3070: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 73 71  cessed by the sq
3080: 6c 69 74 65 20 6c 69 62 72 61 72 79 27 0a 7d 0a  lite library'.}.
3090: 72 65 61 64 5f 74 65 73 74 20 31 2e 35 2e 32 2e  read_test 1.5.2.
30a0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  2 {.  SELECT doc
30b0: 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 0a 20 20  id FROM docs .  
30c0: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
30d0: 20 27 28 22 73 71 6c 69 74 65 20 64 61 74 61 62   '("sqlite datab
30e0: 61 73 65 22 20 4f 52 20 22 73 71 6c 69 74 65 20  ase" OR "sqlite 
30f0: 6c 69 62 72 61 72 79 22 29 20 41 4e 44 20 6c 69  library") AND li
3100: 6e 75 78 27 3b 0a 7d 20 7b 36 20 37 7d 0a 72 65  nux';.} {6 7}.re
3110: 61 64 5f 74 65 73 74 20 31 2e 35 2e 32 2e 33 20  ad_test 1.5.2.3 
3120: 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  {.  SELECT docid
3130: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
3140: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 6e   docs MATCH 'lin
3150: 75 78 27 0a 20 20 20 20 49 4e 54 45 52 53 45 43  ux'.    INTERSEC
3160: 54 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  T.  SELECT docid
3170: 20 46 52 4f 4d 20 28 0a 20 20 20 20 53 45 4c 45   FROM (.    SELE
3180: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f  CT docid FROM do
3190: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
31a0: 54 43 48 20 27 22 73 71 6c 69 74 65 20 6c 69 62  TCH '"sqlite lib
31b0: 72 61 72 79 22 27 0a 20 20 20 20 20 20 55 4e 49  rary"'.      UNI
31c0: 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f  ON.    SELECT do
31d0: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
31e0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
31f0: 22 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65  "sqlite database
3200: 22 27 0a 20 20 29 3b 0a 7d 20 7b 36 20 37 7d 0a  "'.  );.} {6 7}.
3210: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
3220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3250: 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 54 65  ###########.# Te
3260: 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 73 20  st the examples 
3270: 69 6e 20 73 65 63 74 69 6f 6e 20 33 2e 32 20 28  in section 3.2 (
3280: 73 65 74 20 6f 70 65 72 61 74 6f 72 73 20 77 69  set operators wi
3290: 74 68 20 73 74 61 6e 64 61 72 64 20 73 79 6e 74  th standard synt
32a0: 61 78 29 2e 0a 23 20 54 68 65 73 65 20 74 65 73  ax)..# These tes
32b0: 74 73 20 72 65 75 73 65 20 74 68 65 20 74 61 62  ts reuse the tab
32c0: 6c 65 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20  le populated by 
32d0: 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2e  the block above.
32e0: 0a 23 0a 73 65 74 20 73 71 6c 69 74 65 5f 66 74  .#.set sqlite_ft
32f0: 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
3300: 68 65 73 65 73 20 30 0a 72 65 61 64 5f 74 65 73  heses 0.read_tes
3310: 74 20 31 2e 36 2e 31 2e 31 20 7b 0a 20 20 53 45  t 1.6.1.1 {.  SE
3320: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
3330: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
3340: 48 20 27 73 71 6c 69 74 65 20 2d 64 61 74 61 62  H 'sqlite -datab
3350: 61 73 65 27 0a 7d 20 7b 7b 73 71 6c 69 74 65 20  ase'.} {{sqlite 
3360: 69 73 20 61 20 73 6f 66 74 77 61 72 65 20 73 79  is a software sy
3370: 73 74 65 6d 7d 20 7b 73 71 6c 69 74 65 20 69 73  stem} {sqlite is
3380: 20 61 6c 73 6f 20 61 20 6c 69 62 72 61 72 79 7d   also a library}
3390: 20 7b 74 68 65 20 73 71 6c 69 74 65 20 6c 69 62   {the sqlite lib
33a0: 72 61 72 79 20 72 75 6e 73 20 6f 6e 20 6c 69 6e  rary runs on lin
33b0: 75 78 7d 7d 0a 72 65 61 64 5f 74 65 73 74 20 31  ux}}.read_test 1
33c0: 2e 36 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  .6.1.2 {.  SELEC
33d0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
33e0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
33f0: 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61  sqlite OR databa
3400: 73 65 20 6c 69 62 72 61 72 79 27 0a 7d 20 7b 7b  se library'.} {{
3410: 73 71 6c 69 74 65 20 69 73 20 61 6c 73 6f 20 61  sqlite is also a
3420: 20 6c 69 62 72 61 72 79 7d 20 7b 74 68 65 20 73   library} {the s
3430: 71 6c 69 74 65 20 6c 69 62 72 61 72 79 20 72 75  qlite library ru
3440: 6e 73 20 6f 6e 20 6c 69 6e 75 78 7d 20 7b 74 68  ns on linux} {th
3450: 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73  e sqlite databas
3460: 65 20 69 73 20 61 63 63 65 73 73 65 64 20 62 79  e is accessed by
3470: 20 74 68 65 20 73 71 6c 69 74 65 20 6c 69 62 72   the sqlite libr
3480: 61 72 79 7d 7d 0a 0a 73 65 74 20 73 71 6c 69 74  ary}}..set sqlit
3490: 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  e_fts3_enable_pa
34a0: 72 65 6e 74 68 65 73 65 73 20 31 0a 72 65 61 64  rentheses 1.read
34b0: 5f 74 65 73 74 20 31 2e 36 2e 31 2e 33 20 7b 0a  _test 1.6.1.3 {.
34c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
34d0: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
34e0: 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4f 52  MATCH 'sqlite OR
34f0: 20 64 61 74 61 62 61 73 65 20 6c 69 62 72 61 72   database librar
3500: 79 27 0a 7d 20 7b 7b 73 71 6c 69 74 65 20 69 73  y'.} {{sqlite is
3510: 20 61 20 73 6f 66 74 77 61 72 65 20 73 79 73 74   a software syst
3520: 65 6d 7d 20 7b 73 71 6c 69 74 65 20 69 73 20 61  em} {sqlite is a
3530: 20 64 61 74 61 62 61 73 65 7d 20 7b 73 71 6c 69   database} {sqli
3540: 74 65 20 69 73 20 61 6c 73 6f 20 61 20 6c 69 62  te is also a lib
3550: 72 61 72 79 7d 20 7b 74 68 65 20 73 71 6c 69 74  rary} {the sqlit
3560: 65 20 6c 69 62 72 61 72 79 20 72 75 6e 73 20 6f  e library runs o
3570: 6e 20 6c 69 6e 75 78 7d 20 7b 61 73 20 64 6f 65  n linux} {as doe
3580: 73 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  s the sqlite dat
3590: 61 62 61 73 65 20 28 6f 6e 20 6c 69 6e 75 78 29  abase (on linux)
35a0: 7d 20 7b 74 68 65 20 73 71 6c 69 74 65 20 64 61  } {the sqlite da
35b0: 74 61 62 61 73 65 20 69 73 20 61 63 63 65 73 73  tabase is access
35c0: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
35d0: 20 6c 69 62 72 61 72 79 7d 7d 0a 72 65 61 64 5f   library}}.read_
35e0: 74 65 73 74 20 31 2e 36 2e 31 2e 34 20 7b 0a 20  test 1.6.1.4 {. 
35f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
3600: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
3610: 41 54 43 48 20 27 28 73 71 6c 69 74 65 20 4f 52  ATCH '(sqlite OR
3620: 20 64 61 74 61 62 61 73 65 29 20 6c 69 62 72 61   database) libra
3630: 72 79 27 0a 7d 20 7b 7b 73 71 6c 69 74 65 20 69  ry'.} {{sqlite i
3640: 73 20 61 6c 73 6f 20 61 20 6c 69 62 72 61 72 79  s also a library
3650: 7d 20 7b 74 68 65 20 73 71 6c 69 74 65 20 6c 69  } {the sqlite li
3660: 62 72 61 72 79 20 72 75 6e 73 20 6f 6e 20 6c 69  brary runs on li
3670: 6e 75 78 7d 20 7b 74 68 65 20 73 71 6c 69 74 65  nux} {the sqlite
3680: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 63 63   database is acc
3690: 65 73 73 65 64 20 62 79 20 74 68 65 20 73 71 6c  essed by the sql
36a0: 69 74 65 20 6c 69 62 72 61 72 79 7d 7d 0a 73 65  ite library}}.se
36b0: 74 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e  t sqlite_fts3_en
36c0: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
36d0: 20 30 0a 64 64 6c 5f 74 65 73 74 20 20 31 2e 36   0.ddl_test  1.6
36e0: 2e 31 2e 35 20 7b 20 44 52 4f 50 20 54 41 42 4c  .1.5 { DROP TABL
36f0: 45 20 64 6f 63 73 20 7d 0a 0a 23 23 23 23 23 23  E docs }..######
3700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3740: 23 23 23 23 0a 23 20 54 65 73 74 20 74 68 65 20  ####.# Test the 
3750: 65 78 61 6d 70 6c 65 73 20 69 6e 20 73 65 63 74  examples in sect
3760: 69 6f 6e 20 34 20 28 61 75 78 69 6c 6c 61 72 79  ion 4 (auxillary
3770: 20 66 75 6e 63 74 69 6f 6e 73 29 2e 0a 23 0a 64   functions)..#.d
3780: 64 6c 5f 74 65 73 74 20 20 20 31 2e 37 2e 31 2e  dl_test   1.7.1.
3790: 31 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  1 { CREATE VIRTU
37a0: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
37b0: 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74  ING fts3(subject
37c0: 2c 20 62 6f 64 79 29 20 7d 0a 0a 77 72 69 74 65  , body) }..write
37d0: 5f 74 65 73 74 20 31 2e 37 2e 31 2e 32 20 6d 61  _test 1.7.1.2 ma
37e0: 69 6c 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20 20  il_content { .  
37f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c  INSERT INTO mail
3800: 20 56 41 4c 55 45 53 28 0a 20 20 20 20 27 68 65   VALUES(.    'he
3810: 6c 6c 6f 20 77 6f 72 6c 64 27 2c 20 27 54 68 69  llo world', 'Thi
3820: 73 20 6d 65 73 73 61 67 65 20 69 73 20 61 20 68  s message is a h
3830: 65 6c 6c 6f 20 77 6f 72 6c 64 20 6d 65 73 73 61  ello world messa
3840: 67 65 2e 27 29 3b 0a 7d 0a 77 72 69 74 65 5f 74  ge.');.}.write_t
3850: 65 73 74 20 31 2e 37 2e 31 2e 33 20 6d 61 69 6c  est 1.7.1.3 mail
3860: 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20 20 49 4e  _content { .  IN
3870: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56  SERT INTO mail V
3880: 41 4c 55 45 53 28 0a 20 20 20 20 27 75 72 67 65  ALUES(.    'urge
3890: 6e 74 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54  nt: serious', 'T
38a0: 68 69 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e  his mail is seen
38b0: 20 61 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f   as a more serio
38c0: 75 73 20 6d 61 69 6c 27 29 3b 0a 7d 0a 0a 72 65  us mail');.}..re
38d0: 61 64 5f 74 65 73 74 20 20 31 2e 37 2e 31 2e 34  ad_test  1.7.1.4
38e0: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 6f 66 66   { .  SELECT off
38f0: 73 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20  sets(mail) FROM 
3900: 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20  mail WHERE mail 
3910: 4d 41 54 43 48 20 27 77 6f 72 6c 64 27 3b 0a 7d  MATCH 'world';.}
3920: 20 7b 7b 30 20 30 20 36 20 35 20 31 20 30 20 32   {{0 0 6 5 1 0 2
3930: 34 20 35 7d 7d 0a 72 65 61 64 5f 74 65 73 74 20  4 5}}.read_test 
3940: 20 31 2e 37 2e 31 2e 35 20 7b 20 0a 20 20 53 45   1.7.1.5 { .  SE
3950: 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69  LECT offsets(mai
3960: 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45  l) FROM mail WHE
3970: 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 6d  RE mail MATCH 'm
3980: 65 73 73 61 67 65 27 0a 7d 20 7b 7b 31 20 30 20  essage'.} {{1 0 
3990: 35 20 37 20 31 20 30 20 33 30 20 37 7d 7d 0a 72  5 7 1 0 30 7}}.r
39a0: 65 61 64 5f 74 65 73 74 20 20 31 2e 37 2e 31 2e  ead_test  1.7.1.
39b0: 36 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 6f 66  6 { .  SELECT of
39c0: 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d  fsets(mail) FROM
39d0: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
39e0: 20 4d 41 54 43 48 20 27 22 73 65 72 69 6f 75 73   MATCH '"serious
39f0: 20 6d 61 69 6c 22 27 0a 7d 20 7b 7b 31 20 30 20   mail"'.} {{1 0 
3a00: 32 38 20 37 20 31 20 31 20 33 36 20 34 7d 7d 0a  28 7 1 1 36 4}}.
3a10: 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 37 2e  .ddl_test   1.7.
3a20: 32 2e 31 20 7b 20 43 52 45 41 54 45 20 56 49 52  2.1 { CREATE VIR
3a30: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 78 74 20  TUAL TABLE text 
3a40: 55 53 49 4e 47 20 66 74 73 33 28 29 20 7d 0a 0a  USING fts3() }..
3a50: 77 72 69 74 65 5f 74 65 73 74 20 31 2e 37 2e 32  write_test 1.7.2
3a60: 2e 32 20 74 65 78 74 5f 63 6f 6e 74 65 6e 74 20  .2 text_content 
3a70: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
3a80: 74 65 78 74 20 56 41 4c 55 45 53 28 27 0a 20 20  text VALUES('.  
3a90: 20 20 44 75 72 69 6e 67 20 33 30 20 4e 6f 76 2d    During 30 Nov-
3aa0: 31 20 44 65 63 2c 20 32 2d 33 6f 43 20 64 72 6f  1 Dec, 2-3oC dro
3ab0: 70 73 2e 20 43 6f 6f 6c 20 69 6e 20 74 68 65 20  ps. Cool in the 
3ac0: 75 70 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 6d  upper portion, m
3ad0: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
3ae0: 72 65 20 31 34 2d 31 36 6f 43 20 61 6e 64 20 63  re 14-16oC and c
3af0: 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20 6d  ool elsewhere, m
3b00: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
3b10: 72 65 20 31 37 2d 32 30 6f 43 2e 20 43 6f 6c 64  re 17-20oC. Cold
3b20: 20 74 6f 20 76 65 72 79 20 63 6f 6c 64 20 6f 6e   to very cold on
3b30: 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 6d   mountaintops, m
3b40: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
3b50: 72 65 20 36 2d 31 32 6f 43 2e 20 4e 6f 72 74 68  re 6-12oC. North
3b60: 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31  easterly winds 1
3b70: 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 41 66 74 65  5-30 km/hr. Afte
3b80: 72 20 74 68 61 74 2c 20 74 65 6d 70 65 72 61 74  r that, temperat
3b90: 75 72 65 20 69 6e 63 72 65 61 73 65 73 2e 20 4e  ure increases. N
3ba0: 6f 72 74 68 65 61 73 74 65 72 6c 79 20 77 69 6e  ortheasterly win
3bb0: 64 73 20 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 0a  ds 15-30 km/hr..
3bc0: 20 20 27 29 3b 0a 7d 0a 0a 72 65 61 64 5f 74 65    ');.}..read_te
3bd0: 73 74 20 20 31 2e 37 2e 32 2e 33 20 7b 0a 20 20  st  1.7.2.3 {.  
3be0: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
3bf0: 65 78 74 29 20 46 52 4f 4d 20 74 65 78 74 20 57  ext) FROM text W
3c00: 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48 20  HERE text MATCH 
3c10: 27 63 6f 6c 64 27 0a 7d 20 7b 7b 3c 62 3e 2e 2e  'cold'.} {{<b>..
3c20: 2e 3c 2f 62 3e 63 6f 6f 6c 20 65 6c 73 65 77 68  .</b>cool elsewh
3c30: 65 72 65 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d  ere, minimum tem
3c40: 70 65 72 61 74 75 72 65 20 31 37 2d 32 30 6f 43  perature 17-20oC
3c50: 2e 20 3c 62 3e 43 6f 6c 64 3c 2f 62 3e 20 74 6f  . <b>Cold</b> to
3c60: 20 76 65 72 79 20 3c 62 3e 63 6f 6c 64 3c 2f 62   very <b>cold</b
3c70: 3e 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f 70  > on mountaintop
3c80: 73 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65  s, minimum tempe
3c90: 72 61 74 75 72 65 20 36 3c 62 3e 2e 2e 2e 3c 2f  rature 6<b>...</
3ca0: 62 3e 7d 7d 0a 0a 72 65 61 64 5f 74 65 73 74 20  b>}}..read_test 
3cb0: 20 31 2e 37 2e 32 2e 34 20 7b 0a 20 20 53 45 4c   1.7.2.4 {.  SEL
3cc0: 45 43 54 20 73 6e 69 70 70 65 74 28 74 65 78 74  ECT snippet(text
3cd0: 2c 20 27 5b 27 2c 20 27 5d 27 2c 20 27 2e 2e 2e  , '[', ']', '...
3ce0: 27 29 20 46 52 4f 4d 20 74 65 78 74 20 57 48 45  ') FROM text WHE
3cf0: 52 45 20 74 65 78 74 20 4d 41 54 43 48 20 27 22  RE text MATCH '"
3d00: 6d 69 6e 2a 20 74 65 6d 2a 22 27 0a 7d 20 7b 7b  min* tem*"'.} {{
3d10: 2e 2e 2e 74 68 65 20 75 70 70 65 72 20 70 6f 72  ...the upper por
3d20: 74 69 6f 6e 2c 20 5b 6d 69 6e 69 6d 75 6d 5d 20  tion, [minimum] 
3d30: 5b 74 65 6d 70 65 72 61 74 75 72 65 5d 20 31 34  [temperature] 14
3d40: 2d 31 36 6f 43 20 61 6e 64 20 63 6f 6f 6c 20 65  -16oC and cool e
3d50: 6c 73 65 77 68 65 72 65 2c 20 5b 6d 69 6e 69 6d  lsewhere, [minim
3d60: 75 6d 5d 20 5b 74 65 6d 70 65 72 61 74 75 72 65  um] [temperature
3d70: 5d 20 31 37 2d 32 30 6f 43 2e 20 43 6f 6c 64 2e  ] 17-20oC. Cold.
3d80: 2e 2e 7d 7d 0a 0a 64 64 6c 5f 74 65 73 74 20 20  ..}}..ddl_test  
3d90: 20 31 2e 37 2e 33 2e 31 20 7b 20 44 52 4f 50 20   1.7.3.1 { DROP 
3da0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
3db0: 74 31 20 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20  t1 }.ddl_test   
3dc0: 31 2e 37 2e 33 2e 32 20 7b 20 43 52 45 41 54 45  1.7.3.2 { CREATE
3dd0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
3de0: 31 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20  1 USING fts3(a, 
3df0: 62 29 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  b) }.write_test 
3e00: 31 2e 37 2e 33 2e 33 20 74 31 5f 63 6f 6e 74 65  1.7.3.3 t1_conte
3e10: 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49  nt { .  INSERT I
3e20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 0a 20  NTO t1 VALUES(. 
3e30: 20 20 20 27 74 72 61 6e 73 61 63 74 69 6f 6e 20     'transaction 
3e40: 64 65 66 61 75 6c 74 20 6d 6f 64 65 6c 73 20 64  default models d
3e50: 65 66 61 75 6c 74 27 2c 20 27 4e 6f 6e 20 74 72  efault', 'Non tr
3e60: 61 6e 73 61 63 74 69 6f 6e 20 72 65 61 64 73 27  ansaction reads'
3e70: 29 3b 0a 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  );.}.write_test 
3e80: 31 2e 37 2e 33 2e 34 20 74 31 5f 63 6f 6e 74 65  1.7.3.4 t1_conte
3e90: 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49  nt { .  INSERT I
3ea0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74  NTO t1 VALUES('t
3eb0: 68 65 20 64 65 66 61 75 6c 74 20 74 72 61 6e 73  he default trans
3ec0: 61 63 74 69 6f 6e 27 2c 20 27 74 68 65 73 65 20  action', 'these 
3ed0: 73 65 6d 61 6e 74 69 63 73 20 70 72 65 73 65 6e  semantics presen
3ee0: 74 27 29 3b 0a 7d 0a 77 72 69 74 65 5f 74 65 73  t');.}.write_tes
3ef0: 74 20 31 2e 37 2e 33 2e 35 20 74 31 5f 63 6f 6e  t 1.7.3.5 t1_con
3f00: 74 65 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54  tent { .  INSERT
3f10: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3f20: 27 73 69 6e 67 6c 65 20 72 65 71 75 65 73 74 27  'single request'
3f30: 2c 20 27 64 65 66 61 75 6c 74 20 64 61 74 61 27  , 'default data'
3f40: 29 3b 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20  );.}.read_test  
3f50: 31 2e 37 2e 33 2e 36 20 7b 20 0a 20 20 53 45 4c  1.7.3.6 { .  SEL
3f60: 45 43 54 20 6d 69 74 28 6d 61 74 63 68 69 6e 66  ECT mit(matchinf
3f70: 6f 28 74 31 29 29 20 46 52 4f 4d 20 74 31 20 0a  o(t1)) FROM t1 .
3f80: 20 20 20 20 57 48 45 52 45 20 74 31 20 4d 41 54      WHERE t1 MAT
3f90: 43 48 20 27 64 65 66 61 75 6c 74 20 74 72 61 6e  CH 'default tran
3fa0: 73 61 63 74 69 6f 6e 20 22 74 68 65 73 65 20 73  saction "these s
3fb0: 65 6d 61 6e 74 69 63 73 22 27 3b 0a 7d 20 7b 7b  emantics"';.} {{
3fc0: 33 20 32 20 31 20 33 20 32 20 30 20 31 20 31 20  3 2 1 3 2 0 1 1 
3fd0: 31 20 32 20 32 20 30 20 31 20 31 20 30 20 30 20  1 2 2 0 1 1 0 0 
3fe0: 30 20 31 20 31 20 31 7d 7d 0a 0a 23 23 23 23 23  0 1 1 1}}..#####
3ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4030: 23 23 23 23 23 0a 23 20 54 65 73 74 20 74 68 65  #####.# Test the
4040: 20 65 78 61 6d 70 6c 65 20 69 6e 20 73 65 63 74   example in sect
4050: 69 6f 6e 20 35 20 28 63 75 73 74 6f 6d 20 74 6f  ion 5 (custom to
4060: 6b 65 6e 69 7a 65 72 73 29 2e 0a 23 0a 64 64 6c  kenizers)..#.ddl
4070: 5f 74 65 73 74 20 20 20 31 2e 38 2e 31 2e 31 20  _test   1.8.1.1 
4080: 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  { CREATE VIRTUAL
4090: 20 54 41 42 4c 45 20 73 69 6d 70 6c 65 20 55 53   TABLE simple US
40a0: 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a  ING fts3(tokeniz
40b0: 65 3d 73 69 6d 70 6c 65 29 20 7d 20 0a 77 72 69  e=simple) } .wri
40c0: 74 65 5f 74 65 73 74 20 31 2e 38 2e 31 2e 32 20  te_test 1.8.1.2 
40d0: 73 69 6d 70 6c 65 5f 63 6f 6e 74 65 6e 74 20 7b  simple_content {
40e0: 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20   .  INSERT INTO 
40f0: 73 69 6d 70 6c 65 20 56 41 4c 55 45 53 28 27 52  simple VALUES('R
4100: 69 67 68 74 20 6e 6f 77 20 74 68 65 79 27 27 72  ight now they''r
4110: 65 20 76 65 72 79 20 66 72 75 73 74 72 61 74 65  e very frustrate
4120: 64 27 29 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20  d').}.read_test 
4130: 31 2e 38 2e 31 2e 33 20 7b 53 45 4c 45 43 54 20  1.8.1.3 {SELECT 
4140: 64 6f 63 69 64 20 46 52 4f 4d 20 73 69 6d 70 6c  docid FROM simpl
4150: 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65 20 4d  e WHERE simple M
4160: 41 54 43 48 20 27 46 72 75 73 74 72 61 74 65 64  ATCH 'Frustrated
4170: 27 7d 20 7b 31 7d 20 0a 72 65 61 64 5f 74 65 73  '} {1} .read_tes
4180: 74 20 31 2e 38 2e 31 2e 34 20 7b 53 45 4c 45 43  t 1.8.1.4 {SELEC
4190: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 73 69 6d  T docid FROM sim
41a0: 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65  ple WHERE simple
41b0: 20 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74   MATCH 'Frustrat
41c0: 69 6f 6e 27 7d 20 7b 7d 0a 0a 64 64 6c 5f 74 65  ion'} {}..ddl_te
41d0: 73 74 20 20 20 31 2e 38 2e 32 2e 31 20 7b 20 43  st   1.8.2.1 { C
41e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
41f0: 42 4c 45 20 70 6f 72 74 65 72 20 55 53 49 4e 47  BLE porter USING
4200: 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70   fts3(tokenize=p
4210: 6f 72 74 65 72 29 20 7d 20 0a 77 72 69 74 65 5f  orter) } .write_
4220: 74 65 73 74 20 31 2e 38 2e 32 2e 32 20 70 6f 72  test 1.8.2.2 por
4230: 74 65 72 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20  ter_content { . 
4240: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 6f 72   INSERT INTO por
4250: 74 65 72 20 56 41 4c 55 45 53 28 27 52 69 67 68  ter VALUES('Righ
4260: 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76  t now they''re v
4270: 65 72 79 20 66 72 75 73 74 72 61 74 65 64 27 29  ery frustrated')
4280: 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 31 2e 38  .}.read_test 1.8
4290: 2e 32 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.4 {.  SELECT 
42a0: 64 6f 63 69 64 20 46 52 4f 4d 20 70 6f 72 74 65  docid FROM porte
42b0: 72 20 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d  r WHERE porter M
42c0: 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69 6f  ATCH 'Frustratio
42d0: 6e 27 0a 7d 20 7b 31 7d 0a 0a 7d 0a 23 20 45 6e  n'.} {1}..}.# En
42e0: 64 20 6f 66 20 74 65 73 74 73 20 6f 66 20 65 78  d of tests of ex
42f0: 61 6d 70 6c 65 20 63 6f 64 65 20 69 6e 20 66 74  ample code in ft
4300: 73 33 2e 68 74 6d 6c 0a 23 2d 2d 2d 2d 2d 2d 2d  s3.html.#-------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --..#-----------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
43a0: 20 54 65 73 74 20 74 68 61 74 20 65 72 72 6f 72   Test that error
43b0: 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
43c0: 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
43d0: 20 73 6e 69 70 70 65 74 20 61 6e 64 20 6f 66 66   snippet and off
43e0: 73 65 74 73 0a 23 20 66 75 6e 63 74 69 6f 6e 73  sets.# functions
43f0: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 63 6f 72   are handled cor
4400: 72 65 63 74 6c 79 2e 0a 23 0a 73 65 74 20 44 4f  rectly..#.set DO
4410: 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20 30 0a 64  _MALLOC_TEST 0.d
4420: 64 6c 5f 74 65 73 74 20 20 20 32 2e 31 2e 30 20  dl_test   2.1.0 
4430: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20  { DROP TABLE IF 
4440: 45 58 49 53 54 53 20 74 31 20 7d 0a 64 64 6c 5f  EXISTS t1 }.ddl_
4450: 74 65 73 74 20 20 20 32 2e 31 2e 31 20 7b 20 43  test   2.1.1 { C
4460: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4470: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
4480: 33 28 61 2c 20 62 29 20 7d 0a 77 72 69 74 65 5f  3(a, b) }.write_
4490: 74 65 73 74 20 32 2e 31 2e 32 20 74 31 5f 63 6f  test 2.1.2 t1_co
44a0: 6e 74 65 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52  ntent { .  INSER
44b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
44c0: 28 27 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 27  ('one two three'
44d0: 2c 20 78 27 41 31 42 32 43 33 44 34 45 35 46 36  , x'A1B2C3D4E5F6
44e0: 27 29 3b 0a 7d 0a 65 72 72 6f 72 5f 74 65 73 74  ');.}.error_test
44f0: 20 32 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43   2.1.3 {.  SELEC
4500: 54 20 6f 66 66 73 65 74 73 28 61 29 20 46 52 4f  T offsets(a) FRO
4510: 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54  M t1 WHERE a MAT
4520: 43 48 20 27 6f 6e 65 27 0a 7d 20 7b 69 6c 6c 65  CH 'one'.} {ille
4530: 67 61 6c 20 66 69 72 73 74 20 61 72 67 75 6d 65  gal first argume
4540: 6e 74 20 74 6f 20 6f 66 66 73 65 74 73 7d 0a 65  nt to offsets}.e
4550: 72 72 6f 72 5f 74 65 73 74 20 32 2e 31 2e 34 20  rror_test 2.1.4 
4560: 7b 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65  {.  SELECT offse
4570: 74 73 28 62 29 20 46 52 4f 4d 20 74 31 20 57 48  ts(b) FROM t1 WH
4580: 45 52 45 20 61 20 4d 41 54 43 48 20 27 6f 6e 65  ERE a MATCH 'one
4590: 27 0a 7d 20 7b 69 6c 6c 65 67 61 6c 20 66 69 72  '.} {illegal fir
45a0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  st argument to o
45b0: 66 66 73 65 74 73 7d 0a 65 72 72 6f 72 5f 74 65  ffsets}.error_te
45c0: 73 74 20 32 2e 31 2e 35 20 7b 0a 20 20 53 45 4c  st 2.1.5 {.  SEL
45d0: 45 43 54 20 6f 70 74 69 6d 69 7a 65 28 61 29 20  ECT optimize(a) 
45e0: 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 0a  FROM t1 LIMIT 1.
45f0: 7d 20 7b 69 6c 6c 65 67 61 6c 20 66 69 72 73 74  } {illegal first
4600: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 74   argument to opt
4610: 69 6d 69 7a 65 7d 0a 65 72 72 6f 72 5f 74 65 73  imize}.error_tes
4620: 74 20 32 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45  t 2.1.6 {.  SELE
4630: 43 54 20 73 6e 69 70 70 65 74 28 61 29 20 46 52  CT snippet(a) FR
4640: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41  OM t1 WHERE a MA
4650: 54 43 48 20 27 6f 6e 65 27 0a 7d 20 7b 69 6c 6c  TCH 'one'.} {ill
4660: 65 67 61 6c 20 66 69 72 73 74 20 61 72 67 75 6d  egal first argum
4670: 65 6e 74 20 74 6f 20 73 6e 69 70 70 65 74 7d 0a  ent to snippet}.
4680: 65 72 72 6f 72 5f 74 65 73 74 20 32 2e 31 2e 37  error_test 2.1.7
4690: 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70   {.  SELECT snip
46a0: 70 65 74 28 29 20 46 52 4f 4d 20 74 31 20 57 48  pet() FROM t1 WH
46b0: 45 52 45 20 61 20 4d 41 54 43 48 20 27 6f 6e 65  ERE a MATCH 'one
46c0: 27 0a 7d 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75  '.} {unable to u
46d0: 73 65 20 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70  se function snip
46e0: 70 65 74 20 69 6e 20 74 68 65 20 72 65 71 75 65  pet in the reque
46f0: 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 0a 65 72  sted context}.er
4700: 72 6f 72 5f 74 65 73 74 20 32 2e 31 2e 38 20 7b  ror_test 2.1.8 {
4710: 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65  .  SELECT snippe
4720: 74 28 61 2c 20 62 2c 20 27 41 27 2c 20 27 42 27  t(a, b, 'A', 'B'
4730: 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27 29  , 'C', 'D', 'E')
4740: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
4750: 20 4d 41 54 43 48 20 27 6f 6e 65 27 0a 7d 20 7b   MATCH 'one'.} {
4760: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
4770: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
4780: 63 74 69 6f 6e 20 73 6e 69 70 70 65 74 28 29 7d  ction snippet()}
4790: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d  -----------..#--
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
4830: 68 65 20 65 66 66 65 63 74 20 6f 66 20 61 6e 20  he effect of an 
4840: 4f 4f 4d 20 65 72 72 6f 72 20 77 68 69 6c 65 20  OOM error while 
4850: 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 46  installing the F
4860: 54 53 33 20 6d 6f 64 75 6c 65 20 28 69 2e 65 2e  TS3 module (i.e.
4870: 0a 23 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74  .# opening a dat
4880: 61 62 61 73 65 20 68 61 6e 64 6c 65 29 2e 20 54  abase handle). T
4890: 68 69 73 20 63 61 73 65 20 77 61 73 20 6e 6f 74  his case was not
48a0: 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20 4f   tested by the O
48b0: 4f 4d 20 74 65 73 74 69 6e 67 0a 23 20 6f 66 20  OM testing.# of 
48c0: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 65 78 61  the document exa
48d0: 6d 70 6c 65 73 20 61 62 6f 76 65 2e 0a 23 0a 64  mples above..#.d
48e0: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 65 5f  o_malloc_test e_
48f0: 66 74 73 33 2d 33 20 2d 74 63 6c 62 6f 64 79 20  fts3-3 -tclbody 
4900: 7b 20 0a 20 20 69 66 20 7b 5b 63 61 74 63 68 20  { .  if {[catch 
4910: 7b 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  {sqlite3 db test
4920: 2e 64 62 7d 5d 7d 20 7b 20 65 72 72 6f 72 20 22  .db}]} { error "
4930: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 20 7d  out of memory" }
4940: 0a 7d 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}.#------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23  -------------..#
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69  ---------.# Veri
49e0: 66 79 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  fy the return va
49f0: 6c 75 65 73 20 6f 66 20 74 68 65 20 6f 70 74 69  lues of the opti
4a00: 6d 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  mize() function.
4a10: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
4a20: 75 72 73 2c 0a 23 20 74 68 65 20 72 65 74 75 72  urs,.# the retur
4a30: 6e 65 64 20 76 61 6c 75 65 20 73 68 6f 75 6c 64  ned value should
4a40: 20 62 65 20 22 49 6e 64 65 78 20 6f 70 74 69 6d   be "Index optim
4a50: 69 7a 65 64 22 20 69 66 20 74 68 65 20 64 61 74  ized" if the dat
4a60: 61 20 73 74 72 75 63 74 75 72 65 0a 23 20 77 61  a structure.# wa
4a70: 73 20 6d 6f 64 69 66 69 65 64 2c 20 6f 72 20 22  s modified, or "
4a80: 49 6e 64 65 78 20 61 6c 72 65 61 64 79 20 6f 70  Index already op
4a90: 74 69 6d 61 6c 22 20 69 66 20 69 74 20 77 65 72  timal" if it wer
4aa0: 65 20 6e 6f 74 2e 0a 23 0a 73 65 74 20 44 4f 5f  e not..#.set DO_
4ab0: 4d 41 4c 4c 4f 43 5f 54 45 53 54 20 30 0a 64 64  MALLOC_TEST 0.dd
4ac0: 6c 5f 74 65 73 74 20 20 20 34 2e 31 20 7b 20 43  l_test   4.1 { C
4ad0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4ae0: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73  BLE t4 USING fts
4af0: 33 28 61 2c 20 62 29 20 7d 0a 77 72 69 74 65 5f  3(a, b) }.write_
4b00: 74 65 73 74 20 34 2e 32 20 74 34 5f 63 6f 6e 74  test 4.2 t4_cont
4b10: 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  ent {.  INSERT I
4b20: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 49  NTO t4 VALUES('I
4b30: 6e 20 58 61 6e 61 64 75 27 2c 20 27 64 69 64 20  n Xanadu', 'did 
4b40: 4b 75 62 6c 61 20 4b 68 61 6e 27 29 3b 0a 7d 0a  Kubla Khan');.}.
4b50: 77 72 69 74 65 5f 74 65 73 74 20 34 2e 33 20 74  write_test 4.3 t
4b60: 34 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49 4e  4_content {.  IN
4b70: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
4b80: 55 45 53 28 27 61 20 73 74 61 74 65 6c 79 20 70  UES('a stately p
4b90: 6c 65 61 73 75 72 65 27 2c 20 27 64 6f 6d 65 20  leasure', 'dome 
4ba0: 64 65 63 72 65 65 27 29 3b 0a 7d 0a 64 6f 5f 74  decree');.}.do_t
4bb0: 65 73 74 20 65 5f 66 74 73 33 2d 34 2e 34 20 7b  est e_fts3-4.4 {
4bc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
4bd0: 45 43 54 20 6f 70 74 69 6d 69 7a 65 28 74 34 29  ECT optimize(t4)
4be0: 20 46 52 4f 4d 20 74 34 20 4c 49 4d 49 54 20 31   FROM t4 LIMIT 1
4bf0: 20 7d 20 0a 7d 20 7b 7b 49 6e 64 65 78 20 6f 70   } .} {{Index op
4c00: 74 69 6d 69 7a 65 64 7d 7d 0a 64 6f 5f 74 65 73  timized}}.do_tes
4c10: 74 20 65 5f 66 74 73 33 2d 34 2e 35 20 7b 0a 20  t e_fts3-4.5 {. 
4c20: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
4c30: 54 20 6f 70 74 69 6d 69 7a 65 28 74 34 29 20 46  T optimize(t4) F
4c40: 52 4f 4d 20 74 34 20 4c 49 4d 49 54 20 31 20 7d  ROM t4 LIMIT 1 }
4c50: 20 0a 7d 20 7b 7b 49 6e 64 65 78 20 61 6c 72 65   .} {{Index alre
4c60: 61 64 79 20 6f 70 74 69 6d 61 6c 7d 7d 0a 23 2d  ady optimal}}.#-
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d  --------..#-----
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
4d10: 20 74 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e   the snippet fun
4d20: 63 74 69 6f 6e 20 61 70 70 65 61 72 73 20 74 6f  ction appears to
4d30: 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
4d40: 77 69 74 68 20 31 2c 20 32 2c 20 33 0a 23 20 6f  with 1, 2, 3.# o
4d50: 72 20 34 20 61 72 67 75 6d 65 6e 74 73 20 70 61  r 4 arguments pa
4d60: 73 73 65 64 20 74 6f 20 69 74 2e 0a 23 0a 73 65  ssed to it..#.se
4d70: 74 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54  t DO_MALLOC_TEST
4d80: 20 30 0a 64 64 6c 5f 74 65 73 74 20 20 20 35 2e   0.ddl_test   5.
4d90: 31 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  1 { CREATE VIRTU
4da0: 41 4c 20 54 41 42 4c 45 20 74 35 20 55 53 49 4e  AL TABLE t5 USIN
4db0: 47 20 66 74 73 33 28 78 29 20 7d 0a 77 72 69 74  G fts3(x) }.writ
4dc0: 65 5f 74 65 73 74 20 35 2e 32 20 74 35 5f 63 6f  e_test 5.2 t5_co
4dd0: 6e 74 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54  ntent {.  INSERT
4de0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
4df0: 27 49 6e 20 58 61 6e 61 64 75 20 64 69 64 20 4b  'In Xanadu did K
4e00: 75 62 6c 61 20 4b 68 61 6e 20 41 20 73 74 61 74  ubla Khan A stat
4e10: 65 6c 79 20 70 6c 65 61 73 75 72 65 2d 64 6f 6d  ely pleasure-dom
4e20: 65 20 64 65 63 72 65 65 20 57 68 65 72 65 20 41  e decree Where A
4e30: 6c 70 68 2c 20 74 68 65 20 73 61 63 72 65 64 20  lph, the sacred 
4e40: 72 69 76 65 72 2c 20 72 61 6e 20 54 68 72 6f 75  river, ran Throu
4e50: 67 68 20 63 61 76 65 72 6e 73 20 6d 65 61 73 75  gh caverns measu
4e60: 72 65 6c 65 73 73 20 74 6f 20 6d 61 6e 20 44 6f  reless to man Do
4e70: 77 6e 20 74 6f 20 61 20 73 75 6e 6c 65 73 73 20  wn to a sunless 
4e80: 73 65 61 2e 20 20 53 6f 20 74 77 69 63 65 20 66  sea.  So twice f
4e90: 69 76 65 20 6d 69 6c 65 73 20 6f 66 20 66 65 72  ive miles of fer
4ea0: 74 69 6c 65 20 67 72 6f 75 6e 64 20 57 69 74 68  tile ground With
4eb0: 20 77 61 6c 6c 73 20 61 6e 64 20 74 6f 77 65 72   walls and tower
4ec0: 73 20 77 65 72 65 20 67 69 72 64 6c 65 64 20 72  s were girdled r
4ed0: 6f 75 6e 64 20 3a 20 41 6e 64 20 74 68 65 72 65  ound : And there
4ee0: 20 77 65 72 65 20 67 61 72 64 65 6e 73 20 62 72   were gardens br
4ef0: 69 67 68 74 20 77 69 74 68 20 73 69 6e 75 6f 75  ight with sinuou
4f00: 73 20 72 69 6c 6c 73 2c 20 57 68 65 72 65 20 62  s rills, Where b
4f10: 6c 6f 73 73 6f 6d 65 64 20 6d 61 6e 79 20 61 6e  lossomed many an
4f20: 20 69 6e 63 65 6e 73 65 2d 62 65 61 72 69 6e 67   incense-bearing
4f30: 20 74 72 65 65 20 3b 20 41 6e 64 20 68 65 72 65   tree ; And here
4f40: 20 77 65 72 65 20 66 6f 72 65 73 74 73 20 61 6e   were forests an
4f50: 63 69 65 6e 74 20 61 73 20 74 68 65 20 68 69 6c  cient as the hil
4f60: 6c 73 2c 20 45 6e 66 6f 6c 64 69 6e 67 20 73 75  ls, Enfolding su
4f70: 6e 6e 79 20 73 70 6f 74 73 20 6f 66 20 67 72 65  nny spots of gre
4f80: 65 6e 65 72 79 2e 27 29 3b 0a 7d 0a 72 65 61 64  enery.');.}.read
4f90: 5f 74 65 73 74 20 35 2e 33 20 7b 20 0a 20 20 53  _test 5.3 { .  S
4fa0: 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74 35  ELECT snippet(t5
4fb0: 29 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20  ) FROM t5 WHERE 
4fc0: 74 35 20 4d 41 54 43 48 20 27 6d 69 6c 65 73 27  t5 MATCH 'miles'
4fd0: 0a 7d 20 7b 7b 3c 62 3e 2e 2e 2e 3c 2f 62 3e 74  .} {{<b>...</b>t
4fe0: 6f 20 61 20 73 75 6e 6c 65 73 73 20 73 65 61 2e  o a sunless sea.
4ff0: 20 20 53 6f 20 74 77 69 63 65 20 66 69 76 65 20    So twice five 
5000: 3c 62 3e 6d 69 6c 65 73 3c 2f 62 3e 20 6f 66 20  <b>miles</b> of 
5010: 66 65 72 74 69 6c 65 20 67 72 6f 75 6e 64 20 57  fertile ground W
5020: 69 74 68 20 77 61 6c 6c 73 20 61 6e 64 20 74 6f  ith walls and to
5030: 77 65 72 73 3c 62 3e 2e 2e 2e 3c 2f 62 3e 7d 7d  wers<b>...</b>}}
5040: 0a 72 65 61 64 5f 74 65 73 74 20 35 2e 34 20 7b  .read_test 5.4 {
5050: 20 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70 70   .  SELECT snipp
5060: 65 74 28 74 35 2c 20 27 3c 69 3e 27 29 20 46 52  et(t5, '<i>') FR
5070: 4f 4d 20 74 35 20 57 48 45 52 45 20 74 35 20 4d  OM t5 WHERE t5 M
5080: 41 54 43 48 20 27 6d 69 6c 65 73 27 0a 7d 20 7b  ATCH 'miles'.} {
5090: 7b 3c 62 3e 2e 2e 2e 3c 2f 62 3e 74 6f 20 61 20  {<b>...</b>to a 
50a0: 73 75 6e 6c 65 73 73 20 73 65 61 2e 20 20 53 6f  sunless sea.  So
50b0: 20 74 77 69 63 65 20 66 69 76 65 20 3c 69 3e 6d   twice five <i>m
50c0: 69 6c 65 73 3c 2f 62 3e 20 6f 66 20 66 65 72 74  iles</b> of fert
50d0: 69 6c 65 20 67 72 6f 75 6e 64 20 57 69 74 68 20  ile ground With 
50e0: 77 61 6c 6c 73 20 61 6e 64 20 74 6f 77 65 72 73  walls and towers
50f0: 3c 62 3e 2e 2e 2e 3c 2f 62 3e 7d 7d 0a 72 65 61  <b>...</b>}}.rea
5100: 64 5f 74 65 73 74 20 35 2e 35 20 7b 20 0a 20 20  d_test 5.5 { .  
5110: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
5120: 35 2c 20 27 3c 69 3e 27 2c 20 27 3c 2f 69 3e 27  5, '<i>', '</i>'
5130: 29 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20  ) FROM t5 WHERE 
5140: 74 35 20 4d 41 54 43 48 20 27 6d 69 6c 65 73 27  t5 MATCH 'miles'
5150: 0a 7d 20 7b 7b 3c 62 3e 2e 2e 2e 3c 2f 62 3e 74  .} {{<b>...</b>t
5160: 6f 20 61 20 73 75 6e 6c 65 73 73 20 73 65 61 2e  o a sunless sea.
5170: 20 20 53 6f 20 74 77 69 63 65 20 66 69 76 65 20    So twice five 
5180: 3c 69 3e 6d 69 6c 65 73 3c 2f 69 3e 20 6f 66 20  <i>miles</i> of 
5190: 66 65 72 74 69 6c 65 20 67 72 6f 75 6e 64 20 57  fertile ground W
51a0: 69 74 68 20 77 61 6c 6c 73 20 61 6e 64 20 74 6f  ith walls and to
51b0: 77 65 72 73 3c 62 3e 2e 2e 2e 3c 2f 62 3e 7d 7d  wers<b>...</b>}}
51c0: 0a 72 65 61 64 5f 74 65 73 74 20 35 2e 36 20 7b  .read_test 5.6 {
51d0: 20 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70 70   .  SELECT snipp
51e0: 65 74 28 74 35 2c 20 27 3c 69 3e 27 2c 20 27 3c  et(t5, '<i>', '<
51f0: 2f 69 3e 27 2c 20 27 58 58 58 27 29 20 46 52 4f  /i>', 'XXX') FRO
5200: 4d 20 74 35 20 57 48 45 52 45 20 74 35 20 4d 41  M t5 WHERE t5 MA
5210: 54 43 48 20 27 6d 69 6c 65 73 27 0a 7d 20 7b 7b  TCH 'miles'.} {{
5220: 58 58 58 74 6f 20 61 20 73 75 6e 6c 65 73 73 20  XXXto a sunless 
5230: 73 65 61 2e 20 20 53 6f 20 74 77 69 63 65 20 66  sea.  So twice f
5240: 69 76 65 20 3c 69 3e 6d 69 6c 65 73 3c 2f 69 3e  ive <i>miles</i>
5250: 20 6f 66 20 66 65 72 74 69 6c 65 20 67 72 6f 75   of fertile grou
5260: 6e 64 20 57 69 74 68 20 77 61 6c 6c 73 20 61 6e  nd With walls an
5270: 64 20 74 6f 77 65 72 73 58 58 58 7d 7d 0a 23 2d  d towersXXX}}.#-
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d  --------..#-----
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
5320: 20 61 6e 20 65 6d 70 74 79 20 4d 41 54 43 48 20   an empty MATCH 
5330: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72  expression retur
5340: 6e 73 20 61 6e 20 65 6d 70 74 79 20 72 65 73 75  ns an empty resu
5350: 6c 74 20 73 65 74 2e 20 41 73 0a 23 20 64 6f 65  lt set. As.# doe
5360: 73 20 70 61 73 73 69 6e 67 20 61 20 4e 55 4c 4c  s passing a NULL
5370: 20 76 61 6c 75 65 20 61 73 20 61 20 4d 41 54 43   value as a MATC
5380: 48 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a  H expression..#.
5390: 73 65 74 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45  set DO_MALLOC_TE
53a0: 53 54 20 30 0a 64 64 6c 5f 74 65 73 74 20 20 20  ST 0.ddl_test   
53b0: 36 2e 31 20 7b 20 43 52 45 41 54 45 20 56 49 52  6.1 { CREATE VIR
53c0: 54 55 41 4c 20 54 41 42 4c 45 20 74 36 20 55 53  TUAL TABLE t6 US
53d0: 49 4e 47 20 66 74 73 33 28 78 29 20 7d 0a 77 72  ING fts3(x) }.wr
53e0: 69 74 65 5f 74 65 73 74 20 36 2e 32 20 74 35 5f  ite_test 6.2 t5_
53f0: 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52 54  content { INSERT
5400: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
5410: 27 61 27 29 3b 20 7d 0a 77 72 69 74 65 5f 74 65  'a'); }.write_te
5420: 73 74 20 36 2e 33 20 74 35 5f 63 6f 6e 74 65 6e  st 6.3 t5_conten
5430: 74 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  t { INSERT INTO 
5440: 74 36 20 56 41 4c 55 45 53 28 27 62 27 29 3b 20  t6 VALUES('b'); 
5450: 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 36 2e 34  }.write_test 6.4
5460: 20 74 35 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e   t5_content { IN
5470: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
5480: 55 45 53 28 27 63 27 29 3b 20 7d 0a 72 65 61 64  UES('c'); }.read
5490: 5f 74 65 73 74 20 20 36 2e 35 20 7b 20 53 45 4c  _test  6.5 { SEL
54a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 57 48  ECT * FROM t6 WH
54b0: 45 52 45 20 74 36 20 4d 41 54 43 48 20 27 27 20  ERE t6 MATCH '' 
54c0: 7d 20 7b 7d 0a 72 65 61 64 5f 74 65 73 74 20 20  } {}.read_test  
54d0: 36 2e 36 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  6.6 { SELECT * F
54e0: 52 4f 4d 20 74 36 20 57 48 45 52 45 20 78 20 4d  ROM t6 WHERE x M
54f0: 41 54 43 48 20 27 27 20 7d 20 7b 7d 0a 72 65 61  ATCH '' } {}.rea
5500: 64 5f 74 65 73 74 20 20 36 2e 37 20 7b 20 53 45  d_test  6.7 { SE
5510: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 57  LECT * FROM t6 W
5520: 48 45 52 45 20 74 36 20 4d 41 54 43 48 20 4e 55  HERE t6 MATCH NU
5530: 4c 4c 20 7d 20 7b 7d 0a 72 65 61 64 5f 74 65 73  LL } {}.read_tes
5540: 74 20 20 36 2e 38 20 7b 20 53 45 4c 45 43 54 20  t  6.8 { SELECT 
5550: 2a 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  * FROM t6 WHERE 
5560: 78 20 4d 41 54 43 48 20 4e 55 4c 4c 20 7d 20 7b  x MATCH NULL } {
5570: 7d 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.#-------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d  ------------..#-
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
5610: 61 20 66 65 77 20 66 61 63 65 74 73 20 6f 66 20  a few facets of 
5620: 74 68 65 20 46 54 53 33 20 78 46 69 6c 74 65 72  the FTS3 xFilter
5630: 28 29 20 63 61 6c 6c 62 61 63 6b 20 69 6d 70 6c  () callback impl
5640: 65 6d 65 6e 74 61 74 69 6f 6e 3a 0a 23 0a 23 20  ementation:.#.# 
5650: 20 20 31 2e 20 54 68 61 74 20 74 68 65 20 73 71    1. That the sq
5660: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
5670: 74 72 61 69 6e 74 2e 75 73 61 62 6c 65 20 66 6c  traint.usable fl
5680: 61 67 20 69 73 20 72 65 73 70 65 63 74 65 64 2e  ag is respected.
5690: 0a 23 0a 23 20 20 20 32 2e 20 54 68 61 74 20 69  .#.#   2. That i
56a0: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
56b0: 20 75 73 65 20 74 68 65 20 22 64 6f 63 69 64 22   use the "docid"
56c0: 20 6f 72 20 22 72 6f 77 69 64 22 20 63 6f 6c 75   or "rowid" colu
56d0: 6d 6e 20 6f 66 0a 23 20 20 20 20 20 20 61 6e 20  mn of.#      an 
56e0: 46 54 53 33 20 74 61 62 6c 65 20 61 73 20 74 68  FTS3 table as th
56f0: 65 20 4c 48 53 20 6f 66 20 61 20 4d 41 54 43 48  e LHS of a MATCH
5700: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 20   operator..#.#  
5710: 20 33 2e 20 54 68 61 74 20 69 74 20 69 73 20 61   3. That it is a
5720: 6e 20 65 72 72 6f 72 20 74 6f 20 41 4e 44 20 74  n error to AND t
5730: 6f 67 65 74 68 65 72 20 74 77 6f 20 4d 41 54 43  ogether two MATC
5740: 48 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  H expressions in
5750: 20 0a 23 20 20 20 20 20 20 74 68 61 74 20 72 65   .#      that re
5760: 66 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  fer to a single 
5770: 46 54 53 33 20 74 61 62 6c 65 20 69 6e 20 61 20  FTS3 table in a 
5780: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 23 0a  WHERE clause..#.
5790: 23 0a 73 65 74 20 44 4f 5f 4d 41 4c 4c 4f 43 5f  #.set DO_MALLOC_
57a0: 54 45 53 54 20 30 0a 64 64 6c 5f 74 65 73 74 20  TEST 0.ddl_test 
57b0: 20 20 37 2e 31 2e 31 20 7b 20 43 52 45 41 54 45    7.1.1 { CREATE
57c0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
57d0: 37 20 55 53 49 4e 47 20 66 74 73 33 28 61 29 20  7 USING fts3(a) 
57e0: 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20 37 2e 31  }.ddl_test   7.1
57f0: 2e 32 20 7b 20 43 52 45 41 54 45 20 56 49 52 54  .2 { CREATE VIRT
5800: 55 41 4c 20 54 41 42 4c 45 20 74 38 20 55 53 49  UAL TABLE t8 USI
5810: 4e 47 20 66 74 73 33 28 62 29 20 7d 0a 77 72 69  NG fts3(b) }.wri
5820: 74 65 5f 74 65 73 74 20 37 2e 31 2e 33 20 74 37  te_test 7.1.3 t7
5830: 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52  _content { INSER
5840: 54 20 49 4e 54 4f 20 74 37 28 64 6f 63 69 64 2c  T INTO t7(docid,
5850: 20 61 29 20 56 41 4c 55 45 53 28 34 2c 27 6e 75   a) VALUES(4,'nu
5860: 6d 62 65 72 20 66 6f 75 72 27 29 20 7d 0a 77 72  mber four') }.wr
5870: 69 74 65 5f 74 65 73 74 20 37 2e 31 2e 34 20 74  ite_test 7.1.4 t
5880: 37 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45  7_content { INSE
5890: 52 54 20 49 4e 54 4f 20 74 37 28 64 6f 63 69 64  RT INTO t7(docid
58a0: 2c 20 61 29 20 56 41 4c 55 45 53 28 35 2c 27 6e  , a) VALUES(5,'n
58b0: 75 6d 62 65 72 20 66 69 76 65 27 29 20 7d 0a 77  umber five') }.w
58c0: 72 69 74 65 5f 74 65 73 74 20 37 2e 31 2e 35 20  rite_test 7.1.5 
58d0: 74 38 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53  t8_content { INS
58e0: 45 52 54 20 49 4e 54 4f 20 74 38 28 64 6f 63 69  ERT INTO t8(doci
58f0: 64 2c 20 62 29 20 56 41 4c 55 45 53 28 34 2c 27  d, b) VALUES(4,'
5900: 6c 65 74 74 65 72 20 44 27 29 20 7d 0a 77 72 69  letter D') }.wri
5910: 74 65 5f 74 65 73 74 20 37 2e 31 2e 36 20 74 38  te_test 7.1.6 t8
5920: 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52  _content { INSER
5930: 54 20 49 4e 54 4f 20 74 38 28 64 6f 63 69 64 2c  T INTO t8(docid,
5940: 20 62 29 20 56 41 4c 55 45 53 28 35 2c 27 6c 65   b) VALUES(5,'le
5950: 74 74 65 72 20 45 27 29 20 7d 0a 72 65 61 64 5f  tter E') }.read_
5960: 74 65 73 74 20 20 37 2e 31 2e 37 20 7b 0a 20 20  test  7.1.7 {.  
5970: 53 45 4c 45 43 54 20 61 20 7c 7c 20 27 3a 27 20  SELECT a || ':' 
5980: 7c 7c 20 62 20 46 52 4f 4d 20 74 37 20 4a 4f 49  || b FROM t7 JOI
5990: 4e 20 74 38 20 55 53 49 4e 47 28 64 6f 63 69 64  N t8 USING(docid
59a0: 29 0a 7d 20 7b 7b 6e 75 6d 62 65 72 20 66 6f 75  ).} {{number fou
59b0: 72 3a 6c 65 74 74 65 72 20 44 7d 20 7b 6e 75 6d  r:letter D} {num
59c0: 62 65 72 20 66 69 76 65 3a 6c 65 74 74 65 72 20  ber five:letter 
59d0: 45 7d 7d 0a 0a 65 72 72 6f 72 5f 74 65 73 74 20  E}}..error_test 
59e0: 37 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  7.2.1 {.  SELECT
59f0: 20 2a 20 46 52 4f 4d 20 74 37 20 57 48 45 52 45   * FROM t7 WHERE
5a00: 20 64 6f 63 69 64 20 4d 41 54 43 48 20 27 6e 75   docid MATCH 'nu
5a10: 6d 62 65 72 27 0a 7d 20 7b 75 6e 61 62 6c 65 20  mber'.} {unable 
5a20: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20  to use function 
5a30: 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71  MATCH in the req
5a40: 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 0a  uested context}.
5a50: 65 72 72 6f 72 5f 74 65 73 74 20 37 2e 32 2e 32  error_test 7.2.2
5a60: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5a70: 4f 4d 20 74 37 20 57 48 45 52 45 20 72 6f 77 69  OM t7 WHERE rowi
5a80: 64 20 4d 41 54 43 48 20 27 6e 75 6d 62 65 72 27  d MATCH 'number'
5a90: 0a 7d 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73  .} {unable to us
5aa0: 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48  e function MATCH
5ab0: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
5ac0: 64 20 63 6f 6e 74 65 78 74 7d 0a 0a 65 72 72 6f  d context}..erro
5ad0: 72 5f 74 65 73 74 20 37 2e 33 2e 31 20 7b 0a 20  r_test 7.3.1 {. 
5ae0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5af0: 37 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20  7 WHERE a MATCH 
5b00: 27 6e 75 6d 62 65 72 27 20 41 4e 44 20 61 20 4d  'number' AND a M
5b10: 41 54 43 48 20 27 66 6f 75 72 27 0a 7d 20 7b 75  ATCH 'four'.} {u
5b20: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e  nable to use fun
5b30: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
5b40: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
5b50: 74 65 78 74 7d 0a 65 72 72 6f 72 5f 74 65 73 74  text}.error_test
5b60: 20 37 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43   7.3.2 {.  SELEC
5b70: 54 20 2a 20 46 52 4f 4d 20 74 37 2c 20 74 38 20  T * FROM t7, t8 
5b80: 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 6e  WHERE a MATCH 'n
5b90: 75 6d 62 65 72 27 20 41 4e 44 20 61 20 4d 41 54  umber' AND a MAT
5ba0: 43 48 20 27 66 6f 75 72 27 0a 7d 20 7b 75 6e 61  CH 'four'.} {una
5bb0: 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74  ble to use funct
5bc0: 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65  ion MATCH in the
5bd0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65   requested conte
5be0: 78 74 7d 0a 65 72 72 6f 72 5f 74 65 73 74 20 37  xt}.error_test 7
5bf0: 2e 33 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .3.3 {.  SELECT 
5c00: 2a 20 46 52 4f 4d 20 74 37 2c 20 74 38 20 57 48  * FROM t7, t8 WH
5c10: 45 52 45 20 62 20 4d 41 54 43 48 20 27 6c 65 74  ERE b MATCH 'let
5c20: 74 65 72 27 20 41 4e 44 20 62 20 4d 41 54 43 48  ter' AND b MATCH
5c30: 20 27 64 27 0a 7d 20 7b 75 6e 61 62 6c 65 20 74   'd'.} {unable t
5c40: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d  o use function M
5c50: 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75  ATCH in the requ
5c60: 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 0a 72  ested context}.r
5c70: 65 61 64 5f 74 65 73 74 20 37 2e 33 2e 34 20 7b  ead_test 7.3.4 {
5c80: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5c90: 20 74 37 2c 20 74 38 20 57 48 45 52 45 20 61 20   t7, t8 WHERE a 
5ca0: 4d 41 54 43 48 20 27 6e 75 6d 62 65 72 27 20 41  MATCH 'number' A
5cb0: 4e 44 20 62 20 4d 41 54 43 48 20 27 6c 65 74 74  ND b MATCH 'lett
5cc0: 65 72 27 0a 7d 20 7b 7b 6e 75 6d 62 65 72 20 66  er'.} {{number f
5cd0: 6f 75 72 7d 20 7b 6c 65 74 74 65 72 20 44 7d 20  our} {letter D} 
5ce0: 7b 6e 75 6d 62 65 72 20 66 6f 75 72 7d 20 7b 6c  {number four} {l
5cf0: 65 74 74 65 72 20 45 7d 20 7b 6e 75 6d 62 65 72  etter E} {number
5d00: 20 66 69 76 65 7d 20 7b 6c 65 74 74 65 72 20 44   five} {letter D
5d10: 7d 20 7b 6e 75 6d 62 65 72 20 66 69 76 65 7d 20  } {number five} 
5d20: 7b 6c 65 74 74 65 72 20 45 7d 7d 0a 72 65 61 64  {letter E}}.read
5d30: 5f 74 65 73 74 20 37 2e 33 2e 35 20 7b 0a 20 20  _test 7.3.5 {.  
5d40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37  SELECT * FROM t7
5d50: 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27   WHERE a MATCH '
5d60: 6e 75 6d 62 65 72 27 20 41 4e 44 20 64 6f 63 69  number' AND doci
5d70: 64 20 3d 20 34 0a 7d 20 7b 7b 6e 75 6d 62 65 72  d = 4.} {{number
5d80: 20 66 6f 75 72 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   four}}..#------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dd0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 71  ---.# Test the q
5de0: 75 6f 74 69 6e 67 20 6f 66 20 46 54 53 33 20 74  uoting of FTS3 t
5df0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  able column name
5e00: 73 2e 20 4e 61 6d 65 73 20 6d 61 79 20 62 65 20  s. Names may be 
5e10: 71 75 6f 74 65 64 20 75 73 69 6e 67 0a 23 20 61  quoted using.# a
5e20: 6e 79 20 6f 66 20 22 22 2c 20 27 27 2c 20 60 60  ny of "", '', ``
5e30: 60 20 6f 72 20 5b 5d 2e 0a 23 0a 73 65 74 20 44  ` or []..#.set D
5e40: 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20 30 0a  O_MALLOC_TEST 0.
5e50: 64 64 6c 5f 74 65 73 74 20 20 38 2e 31 2e 31 20  ddl_test  8.1.1 
5e60: 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  { CREATE VIRTUAL
5e70: 20 54 41 42 4c 45 20 74 39 61 20 55 53 49 4e 47   TABLE t9a USING
5e80: 20 66 74 73 33 28 22 63 31 22 2c 20 5b 63 32 5d   fts3("c1", [c2]
5e90: 29 20 7d 0a 64 64 6c 5f 74 65 73 74 20 20 38 2e  ) }.ddl_test  8.
5ea0: 31 2e 32 20 7b 20 43 52 45 41 54 45 20 56 49 52  1.2 { CREATE VIR
5eb0: 54 55 41 4c 20 54 41 42 4c 45 20 74 39 62 20 55  TUAL TABLE t9b U
5ec0: 53 49 4e 47 20 66 74 73 33 28 27 63 31 27 2c 20  SING fts3('c1', 
5ed0: 60 63 32 60 29 20 7d 0a 72 65 61 64 5f 74 65 73  `c2`) }.read_tes
5ee0: 74 20 38 2e 31 2e 33 20 7b 20 50 52 41 47 4d 41  t 8.1.3 { PRAGMA
5ef0: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 39 61 29   table_info(t9a)
5f00: 20 7d 20 7b 30 20 63 31 20 7b 7d 20 30 20 7b 7d   } {0 c1 {} 0 {}
5f10: 20 30 20 31 20 63 32 20 7b 7d 20 30 20 7b 7d 20   0 1 c2 {} 0 {} 
5f20: 30 7d 0a 72 65 61 64 5f 74 65 73 74 20 38 2e 31  0}.read_test 8.1
5f30: 2e 34 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c  .4 { PRAGMA tabl
5f40: 65 5f 69 6e 66 6f 28 74 39 62 29 20 7d 20 7b 30  e_info(t9b) } {0
5f50: 20 63 31 20 7b 7d 20 30 20 7b 7d 20 30 20 31 20   c1 {} 0 {} 0 1 
5f60: 63 32 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a 64 64  c2 {} 0 {} 0}.dd
5f70: 6c 5f 74 65 73 74 20 20 38 2e 32 2e 31 20 7b 20  l_test  8.2.1 { 
5f80: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5f90: 41 42 4c 45 20 74 39 63 20 55 53 49 4e 47 20 66  ABLE t9c USING f
5fa0: 74 73 33 28 22 63 22 22 31 22 2c 20 27 63 27 27  ts3("c""1", 'c''
5fb0: 32 27 29 20 7d 0a 72 65 61 64 5f 74 65 73 74 20  2') }.read_test 
5fc0: 38 2e 32 2e 32 20 7b 20 50 52 41 47 4d 41 20 74  8.2.2 { PRAGMA t
5fd0: 61 62 6c 65 5f 69 6e 66 6f 28 74 39 63 29 20 7d  able_info(t9c) }
5fe0: 20 7b 30 20 63 5c 22 31 20 7b 7d 20 30 20 7b 7d   {0 c\"1 {} 0 {}
5ff0: 20 30 20 31 20 63 27 32 20 7b 7d 20 30 20 7b 7d   0 1 c'2 {} 0 {}
6000: 20 30 7d 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   0}.#-----------
6010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a  --------------..
6050: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
60a0: 74 20 74 68 61 74 20 46 54 53 33 20 74 61 62 6c  t that FTS3 tabl
60b0: 65 73 20 63 61 6e 20 62 65 20 72 65 6e 61 6d 65  es can be rename
60c0: 64 20 75 73 69 6e 67 20 74 68 65 20 41 4c 54 45  d using the ALTE
60d0: 52 20 52 45 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  R RENAME command
60e0: 2e 0a 23 20 4f 4f 4d 20 65 72 72 6f 72 73 20 61  ..# OOM errors a
60f0: 72 65 20 74 65 73 74 65 64 20 64 75 72 69 6e 67  re tested during
6100: 20 41 4c 54 45 52 20 52 45 4e 41 4d 45 20 63 6f   ALTER RENAME co
6110: 6d 6d 61 6e 64 73 20 61 6c 73 6f 2e 0a 23 0a 66  mmands also..#.f
6120: 6f 72 65 61 63 68 20 44 4f 5f 4d 41 4c 4c 4f 43  oreach DO_MALLOC
6130: 5f 54 45 53 54 20 7b 30 20 31 20 32 7d 20 7b 0a  _TEST {0 1 2} {.
6140: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72    db close.  for
6150: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
6160: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6170: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
6180: 73 74 2e 64 62 0a 20 20 69 66 20 7b 24 44 4f 5f  st.db.  if {$DO_
6190: 4d 41 4c 4c 4f 43 5f 54 45 53 54 7d 20 7b 20 73  MALLOC_TEST} { s
61a0: 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
61b0: 5f 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20 30 20  _lookaside db 0 
61c0: 30 20 30 20 7d 0a 0a 20 20 64 64 6c 5f 74 65 73  0 0 }..  ddl_tes
61d0: 74 20 20 20 39 2e 31 2e 31 20 20 20 20 20 20 20  t   9.1.1       
61e0: 20 20 20 20 20 20 7b 20 43 52 45 41 54 45 20 56        { CREATE V
61f0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 30  IRTUAL TABLE t10
6200: 20 55 53 49 4e 47 20 66 74 73 33 28 78 29 20 7d   USING fts3(x) }
6210: 0a 20 20 77 72 69 74 65 5f 74 65 73 74 20 39 2e  .  write_test 9.
6220: 31 2e 32 20 74 31 30 5f 63 6f 6e 74 65 6e 74 20  1.2 t10_content 
6230: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
6240: 30 20 56 41 4c 55 45 53 28 27 66 74 73 33 20 74  0 VALUES('fts3 t
6250: 61 62 6c 65 73 27 29 20 7d 0a 20 20 77 72 69 74  ables') }.  writ
6260: 65 5f 74 65 73 74 20 39 2e 31 2e 33 20 74 31 30  e_test 9.1.3 t10
6270: 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52  _content { INSER
6280: 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45  T INTO t10 VALUE
6290: 53 28 27 61 72 65 20 72 65 6e 61 6d 65 61 62 6c  S('are renameabl
62a0: 65 27 29 20 7d 0a 0a 20 20 72 65 61 64 5f 74 65  e') }..  read_te
62b0: 73 74 20 20 39 2e 31 2e 34 20 7b 0a 20 20 20 20  st  9.1.4 {.    
62c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
62d0: 30 20 57 48 45 52 45 20 74 31 30 20 4d 41 54 43  0 WHERE t10 MATC
62e0: 48 20 27 74 61 62 6c 65 2a 27 0a 20 20 7d 20 7b  H 'table*'.  } {
62f0: 7b 66 74 73 33 20 74 61 62 6c 65 73 7d 7d 0a 20  {fts3 tables}}. 
6300: 20 72 65 61 64 5f 74 65 73 74 20 20 39 2e 31 2e   read_test  9.1.
6310: 35 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  5 {.    SELECT *
6320: 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20   FROM t10 WHERE 
6330: 78 20 4d 41 54 43 48 20 27 72 65 6e 61 6d 65 2a  x MATCH 'rename*
6340: 27 0a 20 20 7d 20 7b 7b 61 72 65 20 72 65 6e 61  '.  } {{are rena
6350: 6d 65 61 62 6c 65 7d 7d 0a 0a 20 20 64 64 6c 5f  meable}}..  ddl_
6360: 74 65 73 74 20 20 20 39 2e 31 2e 36 20 20 20 20  test   9.1.6    
6370: 20 20 20 20 20 20 20 20 20 7b 20 41 4c 54 45 52           { ALTER
6380: 20 54 41 42 4c 45 20 74 31 30 20 52 45 4e 41 4d   TABLE t10 RENAM
6390: 45 20 54 4f 20 74 31 31 20 7d 0a 0a 20 20 72 65  E TO t11 }..  re
63a0: 61 64 5f 74 65 73 74 20 20 39 2e 31 2e 37 20 7b  ad_test  9.1.7 {
63b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
63c0: 4f 4d 20 74 31 31 20 57 48 45 52 45 20 74 31 31  OM t11 WHERE t11
63d0: 20 4d 41 54 43 48 20 27 74 61 62 6c 65 2a 27 0a   MATCH 'table*'.
63e0: 20 20 7d 20 7b 7b 66 74 73 33 20 74 61 62 6c 65    } {{fts3 table
63f0: 73 7d 7d 0a 20 20 72 65 61 64 5f 74 65 73 74 20  s}}.  read_test 
6400: 20 39 2e 31 2e 38 20 7b 0a 20 20 20 20 53 45 4c   9.1.8 {.    SEL
6410: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 57  ECT * FROM t11 W
6420: 48 45 52 45 20 78 20 4d 41 54 43 48 20 27 72 65  HERE x MATCH 're
6430: 6e 61 6d 65 2a 27 0a 20 20 7d 20 7b 7b 61 72 65  name*'.  } {{are
6440: 20 72 65 6e 61 6d 65 61 62 6c 65 7d 7d 0a 7d 0a   renameable}}.}.
6450: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d  ----------..#---
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20  ------.# Test a 
64f0: 63 6f 75 70 6c 65 20 6f 66 20 63 61 73 65 73 20  couple of cases 
6500: 69 6e 76 6f 6c 76 69 6e 67 20 63 6f 72 72 75 70  involving corrup
6510: 74 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  t data structure
6520: 73 3a 0a 23 0a 23 20 20 20 31 29 20 41 20 63 61  s:.#.#   1) A ca
6530: 73 65 20 77 68 65 72 65 20 61 20 64 6f 63 75 6d  se where a docum
6540: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 64 20 62  ent referenced b
6550: 79 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  y the full-text 
6560: 69 6e 64 65 78 20 69 73 0a 23 20 20 20 20 20 20  index is.#      
6570: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
6580: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
6590: 6c 65 2e 0a 23 0a 23 20 20 20 32 29 20 41 20 62  le..#.#   2) A b
65a0: 61 64 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 62  adly formatted b
65b0: 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 20 6e 6f  -tree segment no
65c0: 64 65 2e 0a 23 0a 73 65 74 20 44 4f 5f 4d 41 4c  de..#.set DO_MAL
65d0: 4c 4f 43 5f 54 45 53 54 20 30 0a 64 64 6c 5f 74  LOC_TEST 0.ddl_t
65e0: 65 73 74 20 20 20 31 30 2e 31 2e 31 20 7b 20 43  est   10.1.1 { C
65f0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
6600: 42 4c 45 20 74 61 20 55 53 49 4e 47 20 66 74 73  BLE ta USING fts
6610: 33 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31  3 }.write_test 1
6620: 30 2e 31 2e 32 20 74 61 5f 63 6f 6e 74 65 6e 74  0.1.2 ta_content
6630: 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54   { .  INSERT INT
6640: 4f 20 74 61 20 56 41 4c 55 45 53 28 27 44 75 72  O ta VALUES('Dur
6650: 69 6e 67 20 61 20 73 75 6d 6d 65 72 20 76 61 63  ing a summer vac
6660: 61 74 69 6f 6e 20 69 6e 20 31 37 39 30 27 29 20  ation in 1790') 
6670: 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31 30 2e  }.write_test 10.
6680: 31 2e 33 20 74 61 5f 63 6f 6e 74 65 6e 74 20 7b  1.3 ta_content {
6690: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
66a0: 61 20 56 41 4c 55 45 53 28 27 57 6f 72 64 73 77  a VALUES('Wordsw
66b0: 6f 72 74 68 20 77 65 6e 74 20 6f 6e 20 61 20 77  orth went on a w
66c0: 61 6c 6b 69 6e 67 20 74 6f 75 72 27 29 20 7d 0a  alking tour') }.
66d0: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
66e0: 67 20 64 62 20 44 45 46 45 4e 53 49 56 45 20 30  g db DEFENSIVE 0
66f0: 0a 77 72 69 74 65 5f 74 65 73 74 20 31 30 2e 31  .write_test 10.1
6700: 2e 34 20 74 61 5f 63 6f 6e 74 65 6e 74 20 7b 20  .4 ta_content { 
6710: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 5f 63  DELETE FROM ta_c
6720: 6f 6e 74 65 6e 74 20 57 48 45 52 45 20 72 6f 77  ontent WHERE row
6730: 69 64 20 3d 20 32 20 7d 0a 72 65 61 64 5f 74 65  id = 2 }.read_te
6740: 73 74 20 20 31 30 2e 31 2e 35 20 7b 0a 20 20 53  st  10.1.5 {.  S
6750: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 20  ELECT * FROM ta 
6760: 57 48 45 52 45 20 74 61 20 4d 41 54 43 48 20 27  WHERE ta MATCH '
6770: 73 75 6d 6d 65 72 27 0a 7d 20 7b 7b 44 75 72 69  summer'.} {{Duri
6780: 6e 67 20 61 20 73 75 6d 6d 65 72 20 76 61 63 61  ng a summer vaca
6790: 74 69 6f 6e 20 69 6e 20 31 37 39 30 7d 7d 0a 65  tion in 1790}}.e
67a0: 72 72 6f 72 5f 74 65 73 74 20 31 30 2e 31 2e 36  rror_test 10.1.6
67b0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
67c0: 4f 4d 20 74 61 20 57 48 45 52 45 20 74 61 20 4d  OM ta WHERE ta M
67d0: 41 54 43 48 20 27 77 61 6c 6b 69 6e 67 27 0a 7d  ATCH 'walking'.}
67e0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
67f0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
6800: 65 64 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74 20  ed}..write_test 
6810: 31 30 2e 32 2e 31 20 74 61 5f 63 6f 6e 74 65 6e  10.2.1 ta_conten
6820: 74 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  t { DELETE FROM 
6830: 74 61 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  ta }.write_test 
6840: 31 30 2e 32 2e 32 20 74 61 5f 63 6f 6e 74 65 6e  10.2.2 ta_conten
6850: 74 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49 4e  t { .  INSERT IN
6860: 54 4f 20 74 61 20 56 41 4c 55 45 53 28 27 64 65  TO ta VALUES('de
6870: 62 61 74 65 20 64 65 6d 6f 6e 73 74 72 61 74 65  bate demonstrate
6880: 64 20 74 68 65 20 72 69 73 69 6e 67 20 64 69 66  d the rising dif
6890: 66 69 63 75 6c 74 79 27 29 20 7d 0a 77 72 69 74  ficulty') }.writ
68a0: 65 5f 74 65 73 74 20 31 30 2e 32 2e 33 20 74 61  e_test 10.2.3 ta
68b0: 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20 20 49 4e  _content { .  IN
68c0: 53 45 52 54 20 49 4e 54 4f 20 74 61 20 56 41 4c  SERT INTO ta VAL
68d0: 55 45 53 28 27 47 6f 6f 67 6c 65 20 72 65 6c 65  UES('Google rele
68e0: 61 73 65 64 20 69 74 73 20 62 72 6f 77 73 65 72  ased its browser
68f0: 20 62 65 74 61 27 29 20 7d 0a 0a 73 65 74 20 62   beta') }..set b
6900: 6c 6f 62 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c  lob [db one {SEL
6910: 45 43 54 20 72 6f 6f 74 20 46 52 4f 4d 20 74 61  ECT root FROM ta
6920: 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 72 6f  _segdir WHERE ro
6930: 77 69 64 20 3d 20 32 7d 5d 0a 62 69 6e 61 72 79  wid = 2}].binary
6940: 20 73 63 61 6e 20 24 62 6c 6f 62 20 22 61 36 20   scan $blob "a6 
6950: 61 33 20 61 2a 22 20 73 74 61 72 74 20 6d 69 64  a3 a*" start mid
6960: 64 6c 65 20 65 6e 64 0a 73 65 74 20 6d 69 64 64  dle end.set midd
6970: 6c 65 20 22 5c 78 30 45 5c 78 46 46 5c 78 46 46  le "\x0E\xFF\xFF
6980: 5c 78 46 46 5c 78 46 46 5c 78 46 46 5c 78 46 46  \xFF\xFF\xFF\xFF
6990: 5c 78 46 46 5c 78 46 46 5c 78 46 46 5c 78 46 46  \xFF\xFF\xFF\xFF
69a0: 5c 78 46 46 5c 78 30 36 5c 78 30 36 22 0a 73 65  \xFF\x06\x06".se
69b0: 74 20 62 6c 6f 62 20 5b 62 69 6e 61 72 79 20 66  t blob [binary f
69c0: 6f 72 6d 61 74 20 22 61 36 20 61 2a 20 61 2a 22  ormat "a6 a* a*"
69d0: 20 24 73 74 61 72 74 20 24 6d 69 64 64 6c 65 20   $start $middle 
69e0: 24 65 6e 64 5d 0a 77 72 69 74 65 5f 74 65 73 74  $end].write_test
69f0: 20 31 30 2e 32 2e 34 20 74 61 5f 73 65 67 64 69   10.2.4 ta_segdi
6a00: 72 20 7b 20 0a 20 20 55 50 44 41 54 45 20 74 61  r { .  UPDATE ta
6a10: 5f 73 65 67 64 69 72 20 53 45 54 20 72 6f 6f 74  _segdir SET root
6a20: 20 3d 20 24 62 6c 6f 62 20 57 48 45 52 45 20 72   = $blob WHERE r
6a30: 6f 77 69 64 20 3d 20 32 0a 7d 0a 65 72 72 6f 72  owid = 2.}.error
6a40: 5f 74 65 73 74 20 31 30 2e 32 2e 35 20 7b 0a 20  _test 10.2.5 {. 
6a50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6a60: 61 20 57 48 45 52 45 20 74 61 20 4d 41 54 43 48  a WHERE ta MATCH
6a70: 20 27 62 65 74 61 27 0a 7d 20 7b 64 61 74 61 62   'beta'.} {datab
6a80: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
6a90: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 0a 0a 0a 66  s malformed}...f
6aa0: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.