/ Hex Artifact Content
Login

Artifact 75bb0aee26384ef586165e21018a17f7cd843469:


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 69 6c 65 20 64 65  db close.file de
0730: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
0740: 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  .db test.db-jour
0750: 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 74  nal.sqlite3 db t
0760: 65 73 74 2e 64 62 0a 69 66 20 7b 24 44 4f 5f 4d  est.db.if {$DO_M
0770: 41 4c 4c 4f 43 5f 54 45 53 54 7d 20 7b 20 73 71  ALLOC_TEST} { sq
0780: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 5f  lite3_db_config_
0790: 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20 30 20 30  lookaside db 0 0
07a0: 20 30 20 7d 0a 64 62 20 65 76 61 6c 20 22 50 52   0 }.db eval "PR
07b0: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
07c0: 27 24 65 6e 63 27 22 0a 0a 70 72 6f 63 20 6d 69  '$enc'"..proc mi
07d0: 74 20 7b 62 6c 6f 62 7d 20 7b 0a 20 20 73 65 74  t {blob} {.  set
07e0: 20 73 63 61 6e 28 6c 69 74 74 6c 65 45 6e 64 69   scan(littleEndi
07f0: 61 6e 29 20 69 2a 0a 20 20 73 65 74 20 73 63 61  an) i*.  set sca
0800: 6e 28 62 69 67 45 6e 64 69 61 6e 29 20 49 2a 0a  n(bigEndian) I*.
0810: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 62    binary scan $b
0820: 6c 6f 62 20 24 73 63 61 6e 28 24 3a 3a 74 63 6c  lob $scan($::tcl
0830: 5f 70 6c 61 74 66 6f 72 6d 28 62 79 74 65 4f 72  _platform(byteOr
0840: 64 65 72 29 29 20 72 0a 20 20 72 65 74 75 72 6e  der)) r.  return
0850: 20 24 72 0a 7d 0a 64 62 20 66 75 6e 63 20 6d 69   $r.}.db func mi
0860: 74 20 6d 69 74 0a 0a 23 23 23 23 23 23 23 23 23  t mit..#########
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 23 23 23 23 23 23  ################
08b0: 23 0a 23 20 54 65 73 74 20 74 68 65 20 65 78 61  #.# Test the exa
08c0: 6d 70 6c 65 20 43 52 45 41 54 45 20 56 49 52 54  mple CREATE VIRT
08d0: 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d  UAL TABLE statem
08e0: 65 6e 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20  ents in section 
08f0: 31 2e 31 20 0a 23 20 6f 66 20 66 74 73 33 2e 69  1.1 .# of fts3.i
0900: 6e 2e 0a 23 0a 64 64 6c 5f 74 65 73 74 20 20 20  n..#.ddl_test   
0910: 31 2e 31 2e 31 2e 31 20 7b 43 52 45 41 54 45 20  1.1.1.1 {CREATE 
0920: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61  VIRTUAL TABLE da
0930: 74 61 20 55 53 49 4e 47 20 66 74 73 33 28 29 7d  ta USING fts3()}
0940: 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 31 2e  .read_test  1.1.
0950: 31 2e 32 20 7b 50 52 41 47 4d 41 20 74 61 62 6c  1.2 {PRAGMA tabl
0960: 65 5f 69 6e 66 6f 28 64 61 74 61 29 7d 20 7b 30  e_info(data)} {0
0970: 20 63 6f 6e 74 65 6e 74 20 7b 7d 20 30 20 7b 7d   content {} 0 {}
0980: 20 30 7d 0a 0a 64 64 6c 5f 74 65 73 74 20 20 20   0}..ddl_test   
0990: 31 2e 31 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41  1.1.2.1 {.  CREA
09a0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
09b0: 20 70 61 67 65 73 20 55 53 49 4e 47 20 66 74 73   pages USING fts
09c0: 33 28 74 69 74 6c 65 2c 20 6b 65 79 77 6f 72 64  3(title, keyword
09d0: 73 2c 20 62 6f 64 79 29 0a 7d 0a 72 65 61 64 5f  s, body).}.read_
09e0: 74 65 73 74 20 20 31 2e 31 2e 32 2e 32 20 7b 0a  test  1.1.2.2 {.
09f0: 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69    PRAGMA table_i
0a00: 6e 66 6f 28 70 61 67 65 73 29 0a 7d 20 7b 30 20  nfo(pages).} {0 
0a10: 74 69 74 6c 65 20 7b 7d 20 30 20 7b 7d 20 30 20  title {} 0 {} 0 
0a20: 31 20 6b 65 79 77 6f 72 64 73 20 7b 7d 20 30 20  1 keywords {} 0 
0a30: 7b 7d 20 30 20 32 20 62 6f 64 79 20 7b 7d 20 30  {} 0 2 body {} 0
0a40: 20 7b 7d 20 30 7d 0a 0a 64 64 6c 5f 74 65 73 74   {} 0}..ddl_test
0a50: 20 20 20 31 2e 31 2e 33 2e 31 20 7b 0a 20 20 43     1.1.3.1 {.  C
0a60: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0a70: 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66  BLE mail USING f
0a80: 74 73 33 28 0a 20 20 20 20 20 20 73 75 62 6a 65  ts3(.      subje
0a90: 63 74 20 56 41 52 43 48 41 52 28 32 35 36 29 20  ct VARCHAR(256) 
0aa0: 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  NOT NULL,.      
0ab0: 62 6f 64 79 20 54 45 58 54 20 43 48 45 43 4b 28  body TEXT CHECK(
0ac0: 6c 65 6e 67 74 68 28 62 6f 64 79 29 3c 31 30 32  length(body)<102
0ad0: 34 30 29 0a 20 20 29 0a 7d 0a 72 65 61 64 5f 74  40).  ).}.read_t
0ae0: 65 73 74 20 20 31 2e 31 2e 33 2e 32 20 7b 0a 20  est  1.1.3.2 {. 
0af0: 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e   PRAGMA table_in
0b00: 66 6f 28 6d 61 69 6c 29 0a 7d 20 7b 30 20 73 75  fo(mail).} {0 su
0b10: 62 6a 65 63 74 20 7b 7d 20 30 20 7b 7d 20 30 20  bject {} 0 {} 0 
0b20: 31 20 62 6f 64 79 20 7b 7d 20 30 20 7b 7d 20 30  1 body {} 0 {} 0
0b30: 7d 0a 0a 23 20 41 20 76 65 72 79 20 6c 61 72 67  }..# A very larg
0b40: 65 20 73 74 72 69 6e 67 2e 20 55 73 65 64 20 74  e string. Used t
0b50: 6f 20 74 65 73 74 20 69 66 20 74 68 65 20 63 6f  o test if the co
0b60: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75  nstraint on colu
0b70: 6d 6e 20 22 62 6f 64 79 22 20 6f 66 0a 23 20 74  mn "body" of.# t
0b80: 61 62 6c 65 20 22 6d 61 69 6c 22 20 69 73 20 65  able "mail" is e
0b90: 6e 66 6f 72 63 65 64 20 28 69 74 20 73 68 6f 75  nforced (it shou
0ba0: 6c 64 20 6e 6f 74 20 62 65 20 2d 20 46 54 53 33  ld not be - FTS3
0bb0: 20 74 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 73   tables do not s
0bc0: 75 70 70 6f 72 74 0a 23 20 63 6f 6e 73 74 72 61  upport.# constra
0bd0: 69 6e 74 73 29 2e 0a 73 65 74 20 6c 61 72 67 65  ints)..set large
0be0: 74 65 78 74 20 5b 73 74 72 69 6e 67 20 72 65 70  text [string rep
0bf0: 65 61 74 20 22 74 68 65 20 71 75 69 63 6b 20 62  eat "the quick b
0c00: 72 6f 77 6e 20 66 6f 78 20 22 20 35 30 30 30 5d  rown fox " 5000]
0c10: 0a 77 72 69 74 65 5f 74 65 73 74 20 31 2e 31 2e  .write_test 1.1.
0c20: 33 2e 33 20 6d 61 69 6c 5f 63 6f 6e 74 65 6e 74  3.3 mail_content
0c30: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d   { INSERT INTO m
0c40: 61 69 6c 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  ail VALUES(NULL,
0c50: 20 24 6c 61 72 67 65 74 65 78 74 29 20 7d 0a 72   $largetext) }.r
0c60: 65 61 64 5f 74 65 73 74 20 20 31 2e 31 2e 33 2e  ead_test  1.1.3.
0c70: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 62  4 {.  SELECT sub
0c80: 6a 65 63 74 20 49 53 20 4e 55 4c 4c 2c 20 6c 65  ject IS NULL, le
0c90: 6e 67 74 68 28 62 6f 64 79 29 20 46 52 4f 4d 20  ngth(body) FROM 
0ca0: 6d 61 69 6c 0a 7d 20 5b 6c 69 73 74 20 31 20 31  mail.} [list 1 1
0cb0: 30 30 30 30 30 5d 0a 0a 64 64 6c 5f 74 65 73 74  00000]..ddl_test
0cc0: 20 20 20 31 2e 31 2e 34 2e 31 20 7b 0a 20 20 43     1.1.4.1 {.  C
0cd0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0ce0: 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
0cf0: 20 66 74 73 33 28 61 75 74 68 6f 72 2c 20 64 6f   fts3(author, do
0d00: 63 75 6d 65 6e 74 2c 20 74 6f 6b 65 6e 69 7a 65  cument, tokenize
0d10: 3d 70 6f 72 74 65 72 29 0a 7d 0a 72 65 61 64 5f  =porter).}.read_
0d20: 74 65 73 74 20 20 31 2e 31 2e 34 2e 32 20 7b 0a  test  1.1.4.2 {.
0d30: 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69    PRAGMA table_i
0d40: 6e 66 6f 28 70 61 70 65 72 73 29 0a 7d 20 7b 30  nfo(papers).} {0
0d50: 20 61 75 74 68 6f 72 20 7b 7d 20 30 20 7b 7d 20   author {} 0 {} 
0d60: 30 20 31 20 64 6f 63 75 6d 65 6e 74 20 7b 7d 20  0 1 document {} 
0d70: 30 20 7b 7d 20 30 7d 0a 0a 64 64 6c 5f 74 65 73  0 {} 0}..ddl_tes
0d80: 74 20 20 20 31 2e 31 2e 35 2e 31 20 7b 0a 20 20  t   1.1.5.1 {.  
0d90: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0da0: 41 42 4c 45 20 73 69 6d 70 6c 65 64 61 74 61 20  ABLE simpledata 
0db0: 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e  USING fts3(token
0dc0: 69 7a 65 3d 73 69 6d 70 6c 65 29 0a 7d 0a 72 65  ize=simple).}.re
0dd0: 61 64 5f 74 65 73 74 20 20 31 2e 31 2e 35 2e 32  ad_test  1.1.5.2
0de0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 74 61 62 6c   {.  PRAGMA tabl
0df0: 65 5f 69 6e 66 6f 28 73 69 6d 70 6c 65 64 61 74  e_info(simpledat
0e00: 61 29 0a 7d 20 7b 30 20 63 6f 6e 74 65 6e 74 20  a).} {0 content 
0e10: 7b 7d 20 30 20 7b 7d 20 30 7d 0a 0a 69 66 63 61  {} 0 {} 0}..ifca
0e20: 70 61 62 6c 65 20 69 63 75 20 7b 0a 20 20 64 64  pable icu {.  dd
0e30: 6c 5f 74 65 73 74 20 31 2e 31 2e 36 2e 31 20 7b  l_test 1.1.6.1 {
0e40: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
0e50: 55 41 4c 20 54 41 42 4c 45 20 6e 61 6d 65 73 20  UAL TABLE names 
0e60: 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20 62 2c  USING fts3(a, b,
0e70: 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20 65 6e   tokenize=icu en
0e80: 5f 41 55 29 0a 20 20 7d 0a 20 20 72 65 61 64 5f  _AU).  }.  read_
0e90: 74 65 73 74 20 20 31 2e 31 2e 36 2e 32 20 7b 0a  test  1.1.6.2 {.
0ea0: 20 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65      PRAGMA table
0eb0: 5f 69 6e 66 6f 28 6e 61 6d 65 73 29 0a 20 20 7d  _info(names).  }
0ec0: 20 7b 30 20 61 20 7b 7d 20 30 20 7b 7d 20 30 20   {0 a {} 0 {} 0 
0ed0: 31 20 62 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a 7d  1 b {} 0 {} 0}.}
0ee0: 0a 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31  ..ddl_test   1.1
0ef0: 2e 37 2e 31 20 7b 44 52 4f 50 20 54 41 42 4c 45  .7.1 {DROP TABLE
0f00: 20 64 61 74 61 7d 0a 64 64 6c 5f 74 65 73 74 20   data}.ddl_test 
0f10: 20 20 31 2e 31 2e 37 2e 32 20 7b 44 52 4f 50 20    1.1.7.2 {DROP 
0f20: 54 41 42 4c 45 20 70 61 67 65 73 7d 0a 64 64 6c  TABLE pages}.ddl
0f30: 5f 74 65 73 74 20 20 20 31 2e 31 2e 37 2e 33 20  _test   1.1.7.3 
0f40: 7b 44 52 4f 50 20 54 41 42 4c 45 20 6d 61 69 6c  {DROP TABLE mail
0f50: 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 31  }.ddl_test   1.1
0f60: 2e 37 2e 34 20 7b 44 52 4f 50 20 54 41 42 4c 45  .7.4 {DROP TABLE
0f70: 20 70 61 70 65 72 73 7d 0a 64 64 6c 5f 74 65 73   papers}.ddl_tes
0f80: 74 20 20 20 31 2e 31 2e 37 2e 35 20 7b 44 52 4f  t   1.1.7.5 {DRO
0f90: 50 20 54 41 42 4c 45 20 73 69 6d 70 6c 65 64 61  P TABLE simpleda
0fa0: 74 61 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  ta}.read_test  1
0fb0: 2e 31 2e 37 2e 36 20 7b 53 45 4c 45 43 54 20 2a  .1.7.6 {SELECT *
0fc0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
0fd0: 74 65 72 7d 20 7b 7d 0a 0a 23 20 54 68 65 20 66  ter} {}..# The f
0fe0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 6f 74 20  ollowing is not 
0ff0: 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 61 6d 70  one of the examp
1000: 6c 65 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 31  les in section 1
1010: 2e 31 2e 20 49 74 20 74 65 73 74 73 20 0a 23 20  .1. It tests .# 
1020: 73 70 65 63 69 66 79 69 6e 67 20 61 6e 20 46 54  specifying an FT
1030: 53 33 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f  S3 table with no
1040: 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74   module argument
1050: 73 20 75 73 69 6e 67 20 61 20 73 6c 69 67 68 74  s using a slight
1060: 6c 79 0a 23 20 64 69 66 66 65 72 65 6e 74 20 73  ly.# different s
1070: 79 6e 74 61 78 2e 0a 64 64 6c 5f 74 65 73 74 20  yntax..ddl_test 
1080: 20 20 31 2e 31 2e 38 2e 31 20 7b 43 52 45 41 54    1.1.8.1 {CREAT
1090: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
10a0: 64 61 74 61 20 55 53 49 4e 47 20 66 74 73 33 3b  data USING fts3;
10b0: 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 31  }.read_test  1.1
10c0: 2e 38 2e 32 20 7b 50 52 41 47 4d 41 20 74 61 62  .8.2 {PRAGMA tab
10d0: 6c 65 5f 69 6e 66 6f 28 64 61 74 61 29 7d 20 7b  le_info(data)} {
10e0: 30 20 63 6f 6e 74 65 6e 74 20 7b 7d 20 30 20 7b  0 content {} 0 {
10f0: 7d 20 30 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20  } 0}.ddl_test   
1100: 31 2e 31 2e 38 2e 33 20 7b 44 52 4f 50 20 54 41  1.1.8.3 {DROP TA
1110: 42 4c 45 20 64 61 74 61 7d 0a 0a 23 23 23 23 23  BLE data}..#####
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 23 23  ################
1160: 23 23 23 23 23 0a 23 20 54 65 73 74 20 74 68 65  #####.# Test the
1170: 20 65 78 61 6d 70 6c 65 73 20 69 6e 20 73 65 63   examples in sec
1180: 74 69 6f 6e 20 31 2e 32 20 28 70 6f 70 75 6c 61  tion 1.2 (popula
1190: 74 69 6e 67 20 66 74 73 33 20 74 61 62 6c 65 73  ting fts3 tables
11a0: 29 0a 23 0a 64 64 6c 5f 74 65 73 74 20 20 20 31  ).#.ddl_test   1
11b0: 2e 32 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54  .2.1.1 {.  CREAT
11c0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
11d0: 70 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 33  pages USING fts3
11e0: 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 7d  (title, body);.}
11f0: 0a 77 72 69 74 65 5f 74 65 73 74 20 31 2e 32 2e  .write_test 1.2.
1200: 31 2e 32 20 70 61 67 65 73 5f 63 6f 6e 74 65 6e  1.2 pages_conten
1210: 74 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t {.  INSERT INT
1220: 4f 20 70 61 67 65 73 28 64 6f 63 69 64 2c 20 74  O pages(docid, t
1230: 69 74 6c 65 2c 20 62 6f 64 79 29 20 0a 20 20 56  itle, body) .  V
1240: 41 4c 55 45 53 28 35 33 2c 20 27 48 6f 6d 65 20  ALUES(53, 'Home 
1250: 50 61 67 65 27 2c 20 27 53 51 4c 69 74 65 20 69  Page', 'SQLite i
1260: 73 20 61 20 73 6f 66 74 77 61 72 65 2e 2e 2e 27  s a software...'
1270: 29 3b 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 20  );.}.read_test  
1280: 31 2e 32 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  1.2.1.3 {.  SELE
1290: 43 54 20 64 6f 63 69 64 2c 20 2a 20 46 52 4f 4d  CT docid, * FROM
12a0: 20 70 61 67 65 73 0a 7d 20 7b 35 33 20 7b 48 6f   pages.} {53 {Ho
12b0: 6d 65 20 50 61 67 65 7d 20 7b 53 51 4c 69 74 65  me Page} {SQLite
12c0: 20 69 73 20 61 20 73 6f 66 74 77 61 72 65 2e 2e   is a software..
12d0: 2e 7d 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74 20  .}}..write_test 
12e0: 31 2e 32 2e 31 2e 34 20 70 61 67 65 73 5f 63 6f  1.2.1.4 pages_co
12f0: 6e 74 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54  ntent {.  INSERT
1300: 20 49 4e 54 4f 20 70 61 67 65 73 28 74 69 74 6c   INTO pages(titl
1310: 65 2c 20 62 6f 64 79 29 20 0a 20 20 56 41 4c 55  e, body) .  VALU
1320: 45 53 28 27 44 6f 77 6e 6c 6f 61 64 27 2c 20 27  ES('Download', '
1330: 41 6c 6c 20 53 51 4c 69 74 65 20 73 6f 75 72 63  All SQLite sourc
1340: 65 20 63 6f 64 65 2e 2e 2e 27 29 3b 0a 7d 0a 72  e code...');.}.r
1350: 65 61 64 5f 74 65 73 74 20 20 31 2e 32 2e 31 2e  ead_test  1.2.1.
1360: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  5 {.  SELECT doc
1370: 69 64 2c 20 2a 20 46 52 4f 4d 20 70 61 67 65 73  id, * FROM pages
1380: 0a 7d 20 7b 35 33 20 7b 48 6f 6d 65 20 50 61 67  .} {53 {Home Pag
1390: 65 7d 20 7b 53 51 4c 69 74 65 20 69 73 20 61 20  e} {SQLite is a 
13a0: 73 6f 66 74 77 61 72 65 2e 2e 2e 7d 20 35 34 20  software...} 54 
13b0: 44 6f 77 6e 6c 6f 61 64 20 7b 41 6c 6c 20 53 51  Download {All SQ
13c0: 4c 69 74 65 20 73 6f 75 72 63 65 20 63 6f 64 65  Lite source code
13d0: 2e 2e 2e 7d 7d 0a 0a 77 72 69 74 65 5f 74 65 73  ...}}..write_tes
13e0: 74 20 31 2e 32 2e 31 2e 36 20 70 61 67 65 73 5f  t 1.2.1.6 pages_
13f0: 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 55 50 44 41  content {.  UPDA
1400: 54 45 20 70 61 67 65 73 20 53 45 54 20 74 69 74  TE pages SET tit
1410: 6c 65 20 3d 20 27 44 6f 77 6e 6c 6f 61 64 20 53  le = 'Download S
1420: 51 4c 69 74 65 27 20 57 48 45 52 45 20 72 6f 77  QLite' WHERE row
1430: 69 64 20 3d 20 35 34 0a 7d 0a 72 65 61 64 5f 74  id = 54.}.read_t
1440: 65 73 74 20 20 31 2e 32 2e 31 2e 37 20 7b 0a 20  est  1.2.1.7 {. 
1450: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 2a   SELECT docid, *
1460: 20 46 52 4f 4d 20 70 61 67 65 73 0a 7d 20 7b 35   FROM pages.} {5
1470: 33 20 7b 48 6f 6d 65 20 50 61 67 65 7d 20 7b 53  3 {Home Page} {S
1480: 51 4c 69 74 65 20 69 73 20 61 20 73 6f 66 74 77  QLite is a softw
1490: 61 72 65 2e 2e 2e 7d 20 35 34 20 7b 44 6f 77 6e  are...} 54 {Down
14a0: 6c 6f 61 64 20 53 51 4c 69 74 65 7d 20 7b 41 6c  load SQLite} {Al
14b0: 6c 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20  l SQLite source 
14c0: 63 6f 64 65 2e 2e 2e 7d 7d 0a 0a 77 72 69 74 65  code...}}..write
14d0: 5f 74 65 73 74 20 31 2e 32 2e 31 2e 38 20 70 61  _test 1.2.1.8 pa
14e0: 67 65 73 5f 63 6f 6e 74 65 6e 74 20 7b 20 44 45  ges_content { DE
14f0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 67 65 73 20  LETE FROM pages 
1500: 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 32  }.read_test  1.2
1510: 2e 31 2e 39 20 7b 20 53 45 4c 45 43 54 20 64 6f  .1.9 { SELECT do
1520: 63 69 64 2c 20 2a 20 46 52 4f 4d 20 70 61 67 65  cid, * FROM page
1530: 73 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 72 72 6f 72  s } {}..do_error
1540: 5f 74 65 73 74 20 66 74 73 33 2d 31 2e 32 2e 31  _test fts3-1.2.1
1550: 2e 31 30 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  .10 {.  INSERT I
1560: 4e 54 4f 20 70 61 67 65 73 28 72 6f 77 69 64 2c  NTO pages(rowid,
1570: 20 64 6f 63 69 64 2c 20 74 69 74 6c 65 2c 20 62   docid, title, b
1580: 6f 64 79 29 20 56 41 4c 55 45 53 28 31 2c 20 32  ody) VALUES(1, 2
1590: 2c 20 27 41 20 74 69 74 6c 65 27 2c 20 27 41 20  , 'A title', 'A 
15a0: 64 6f 63 75 6d 65 6e 74 20 62 6f 64 79 27 29 3b  document body');
15b0: 0a 7d 20 7b 53 51 4c 20 6c 6f 67 69 63 20 65 72  .} {SQL logic er
15c0: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
15d0: 61 74 61 62 61 73 65 7d 0a 0a 23 20 54 65 73 74  atabase}..# Test
15e0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 28 29 20   the optimize() 
15f0: 66 75 6e 63 74 69 6f 6e 20 65 78 61 6d 70 6c 65  function example
1600: 3a 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 32  :.ddl_test   1.2
1610: 2e 32 2e 31 20 7b 20 43 52 45 41 54 45 20 56 49  .2.1 { CREATE VI
1620: 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 73  RTUAL TABLE docs
1630: 20 55 53 49 4e 47 20 66 74 73 33 20 7d 0a 77 72   USING fts3 }.wr
1640: 69 74 65 5f 74 65 73 74 20 31 2e 32 2e 32 2e 32  ite_test 1.2.2.2
1650: 20 64 6f 63 73 5f 63 6f 6e 74 65 6e 74 20 7b 0a   docs_content {.
1660: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f    INSERT INTO do
1670: 63 73 20 56 41 4c 55 45 53 28 27 4f 74 68 65 72  cs VALUES('Other
1680: 73 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20  s translate the 
1690: 66 69 72 73 74 20 63 6c 61 75 73 65 20 61 73 27  first clause as'
16a0: 29 3b 0a 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  );.}.write_test 
16b0: 31 2e 32 2e 32 2e 33 20 64 6f 63 73 5f 63 6f 6e  1.2.2.3 docs_con
16c0: 74 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54 20  tent {.  INSERT 
16d0: 49 4e 54 4f 20 64 6f 63 73 20 56 41 4c 55 45 53  INTO docs VALUES
16e0: 28 27 22 77 68 69 63 68 20 69 73 20 66 6f 72 20  ('"which is for 
16f0: 53 6f 6c 6f 6d 6f 6e 2c 22 20 6d 65 61 6e 69 6e  Solomon," meanin
1700: 67 20 74 68 61 74 27 29 3b 0a 7d 0a 77 72 69 74  g that');.}.writ
1710: 65 5f 74 65 73 74 20 31 2e 32 2e 32 2e 34 20 64  e_test 1.2.2.4 d
1720: 6f 63 73 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20  ocs_content {.  
1730: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73  INSERT INTO docs
1740: 20 56 41 4c 55 45 53 28 27 74 68 65 20 62 6f 6f   VALUES('the boo
1750: 6b 20 69 73 20 64 65 64 69 63 61 74 65 64 20 74  k is dedicated t
1760: 6f 20 53 6f 6c 6f 6d 6f 6e 2e 27 29 3b 0a 7d 0a  o Solomon.');.}.
1770: 72 65 61 64 5f 74 65 73 74 20 20 31 2e 32 2e 32  read_test  1.2.2
1780: 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  .5 { SELECT coun
1790: 74 28 2a 29 20 46 52 4f 4d 20 64 6f 63 73 5f 73  t(*) FROM docs_s
17a0: 65 67 64 69 72 20 7d 20 7b 33 7d 0a 77 72 69 74  egdir } {3}.writ
17b0: 65 5f 74 65 73 74 20 31 2e 32 2e 32 2e 36 20 64  e_test 1.2.2.6 d
17c0: 6f 63 73 5f 73 65 67 64 69 72 20 7b 0a 20 20 49  ocs_segdir {.  I
17d0: 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28  NSERT INTO docs(
17e0: 64 6f 63 73 29 20 56 41 4c 55 45 53 28 27 6f 70  docs) VALUES('op
17f0: 74 69 6d 69 7a 65 27 29 3b 0a 7d 0a 72 65 61 64  timize');.}.read
1800: 5f 74 65 73 74 20 20 31 2e 32 2e 32 2e 37 20 7b  _test  1.2.2.7 {
1810: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1820: 20 46 52 4f 4d 20 64 6f 63 73 5f 73 65 67 64 69   FROM docs_segdi
1830: 72 20 7d 20 7b 31 7d 0a 64 64 6c 5f 74 65 73 74  r } {1}.ddl_test
1840: 20 20 20 31 2e 32 2e 32 2e 38 20 7b 20 44 52 4f     1.2.2.8 { DRO
1850: 50 20 54 41 42 4c 45 20 64 6f 63 73 20 7d 0a 0a  P TABLE docs }..
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 23  ################
1890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18a0: 23 23 23 23 23 23 23 23 23 23 0a 23 20 54 65 73  ##########.# Tes
18b0: 74 20 74 68 65 20 65 78 61 6d 70 6c 65 73 20 69  t the examples i
18c0: 6e 20 73 65 63 74 69 6f 6e 20 31 2e 33 20 28 71  n section 1.3 (q
18d0: 75 65 72 79 69 6e 67 20 46 54 53 33 20 74 61 62  uerying FTS3 tab
18e0: 6c 65 73 29 0a 23 0a 64 64 6c 5f 74 65 73 74 20  les).#.ddl_test 
18f0: 20 20 31 2e 33 2e 31 2e 31 20 7b 20 43 52 45 41    1.3.1.1 { CREA
1900: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1910: 20 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33   mail USING fts3
1920: 28 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20  (subject, body) 
1930: 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 33  }.read_test  1.3
1940: 2e 31 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54  .1.2 { .  SELECT
1950: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
1960: 52 45 20 72 6f 77 69 64 20 3d 20 31 35 3b 20 20  RE rowid = 15;  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1980: 20 46 61 73 74 2e 20 52 6f 77 69 64 20 6c 6f 6f   Fast. Rowid loo
1990: 6b 75 70 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20  kup..  SELECT * 
19a0: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
19b0: 62 6f 64 79 20 4d 41 54 43 48 20 27 73 71 6c 69  body MATCH 'sqli
19c0: 74 65 27 3b 20 20 20 20 20 20 20 2d 2d 20 46 61  te';       -- Fa
19d0: 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75  st. Full-text qu
19e0: 65 72 79 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20  ery..  SELECT * 
19f0: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
1a00: 6d 61 69 6c 20 4d 41 54 43 48 20 27 73 65 61 72  mail MATCH 'sear
1a10: 63 68 27 3b 20 20 20 20 20 20 20 2d 2d 20 46 61  ch';       -- Fa
1a20: 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75  st. Full-text qu
1a30: 65 72 79 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20  ery..  SELECT * 
1a40: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
1a50: 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 31 35  rowid BETWEEN 15
1a60: 20 41 4e 44 20 32 30 3b 20 20 20 2d 2d 20 53 6c   AND 20;   -- Sl
1a70: 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e 2e  ow. Linear scan.
1a80: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1a90: 20 6d 61 69 6c 20 57 48 45 52 45 20 73 75 62 6a   mail WHERE subj
1aa0: 65 63 74 20 3d 20 27 64 61 74 61 62 61 73 65 27  ect = 'database'
1ab0: 3b 20 20 20 20 20 20 2d 2d 20 53 6c 6f 77 2e 20  ;      -- Slow. 
1ac0: 4c 69 6e 65 61 72 20 73 63 61 6e 2e 0a 20 20 53  Linear scan..  S
1ad0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
1ae0: 6c 20 57 48 45 52 45 20 73 75 62 6a 65 63 74 20  l WHERE subject 
1af0: 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65 27  MATCH 'database'
1b00: 3b 20 20 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c  ;  -- Fast. Full
1b10: 2d 74 65 78 74 20 71 75 65 72 79 2e 0a 7d 20 7b  -text query..} {
1b20: 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 33  }.ddl_test   1.3
1b30: 2e 31 2e 33 20 7b 20 44 52 4f 50 20 54 41 42 4c  .1.3 { DROP TABL
1b40: 45 20 6d 61 69 6c 20 7d 0a 0a 64 64 6c 5f 74 65  E mail }..ddl_te
1b50: 73 74 20 20 20 31 2e 33 2e 32 2e 31 20 7b 20 43  st   1.3.2.1 { C
1b60: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1b70: 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66  BLE mail USING f
1b80: 74 73 33 28 73 75 62 6a 65 63 74 2c 20 62 6f 64  ts3(subject, bod
1b90: 79 29 20 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74  y) }..write_test
1ba0: 20 31 2e 33 2e 32 2e 32 20 6d 61 69 6c 5f 63 6f   1.3.2.2 mail_co
1bb0: 6e 74 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54  ntent {.  INSERT
1bc0: 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64   INTO mail(docid
1bd0: 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29  , subject, body)
1be0: 20 0a 20 20 56 41 4c 55 45 53 28 31 2c 20 27 73   .  VALUES(1, 's
1bf0: 6f 66 74 77 61 72 65 20 66 65 65 64 62 61 63 6b  oftware feedback
1c00: 27 2c 20 27 66 6f 75 6e 64 20 69 74 20 74 6f 6f  ', 'found it too
1c10: 20 73 6c 6f 77 27 29 0a 7d 0a 77 72 69 74 65 5f   slow').}.write_
1c20: 74 65 73 74 20 31 2e 33 2e 32 2e 33 20 6d 61 69  test 1.3.2.3 mai
1c30: 6c 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49 4e  l_content {.  IN
1c40: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28 64  SERT INTO mail(d
1c50: 6f 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20 62  ocid, subject, b
1c60: 6f 64 79 29 20 0a 20 20 56 41 4c 55 45 53 28 32  ody) .  VALUES(2
1c70: 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65 64  , 'software feed
1c80: 62 61 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64 62  back', 'no feedb
1c90: 61 63 6b 27 29 0a 7d 0a 77 72 69 74 65 5f 74 65  ack').}.write_te
1ca0: 73 74 20 31 2e 33 2e 32 2e 34 20 6d 61 69 6c 5f  st 1.3.2.4 mail_
1cb0: 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49 4e 53 45  content {.  INSE
1cc0: 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63  RT INTO mail(doc
1cd0: 69 64 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64  id, subject, bod
1ce0: 79 29 20 0a 20 20 56 41 4c 55 45 53 28 33 2c 20  y) .  VALUES(3, 
1cf0: 27 73 6c 6f 77 20 6c 75 6e 63 68 20 6f 72 64 65  'slow lunch orde
1d00: 72 27 2c 20 20 27 77 61 73 20 61 20 73 6f 66 74  r',  'was a soft
1d10: 77 61 72 65 20 70 72 6f 62 6c 65 6d 27 29 0a 7d  ware problem').}
1d20: 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 33 2e  .read_test  1.3.
1d30: 32 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  2.5 {.  SELECT *
1d40: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
1d50: 20 73 75 62 6a 65 63 74 20 4d 41 54 43 48 20 27   subject MATCH '
1d60: 73 6f 66 74 77 61 72 65 27 0a 7d 20 7b 7b 73 6f  software'.} {{so
1d70: 66 74 77 61 72 65 20 66 65 65 64 62 61 63 6b 7d  ftware feedback}
1d80: 20 7b 66 6f 75 6e 64 20 69 74 20 74 6f 6f 20 73   {found it too s
1d90: 6c 6f 77 7d 20 7b 73 6f 66 74 77 61 72 65 20 66  low} {software f
1da0: 65 65 64 62 61 63 6b 7d 20 7b 6e 6f 20 66 65 65  eedback} {no fee
1db0: 64 62 61 63 6b 7d 7d 0a 72 65 61 64 5f 74 65 73  dback}}.read_tes
1dc0: 74 20 20 31 2e 33 2e 32 2e 36 20 7b 0a 20 20 53  t  1.3.2.6 {.  S
1dd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
1de0: 6c 20 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54  l WHERE body MAT
1df0: 43 48 20 27 66 65 65 64 62 61 63 6b 27 0a 7d 20  CH 'feedback'.} 
1e00: 7b 7b 73 6f 66 74 77 61 72 65 20 66 65 65 64 62  {{software feedb
1e10: 61 63 6b 7d 20 7b 6e 6f 20 66 65 65 64 62 61 63  ack} {no feedbac
1e20: 6b 7d 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  k}}.read_test  1
1e30: 2e 33 2e 32 2e 37 20 7b 0a 20 20 53 45 4c 45 43  .3.2.7 {.  SELEC
1e40: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
1e50: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27  ERE mail MATCH '
1e60: 73 6f 66 74 77 61 72 65 27 0a 7d 20 7b 7b 73 6f  software'.} {{so
1e70: 66 74 77 61 72 65 20 66 65 65 64 62 61 63 6b 7d  ftware feedback}
1e80: 20 7b 66 6f 75 6e 64 20 69 74 20 74 6f 6f 20 73   {found it too s
1e90: 6c 6f 77 7d 20 7b 73 6f 66 74 77 61 72 65 20 66  low} {software f
1ea0: 65 65 64 62 61 63 6b 7d 20 7b 6e 6f 20 66 65 65  eedback} {no fee
1eb0: 64 62 61 63 6b 7d 20 7b 73 6c 6f 77 20 6c 75 6e  dback} {slow lun
1ec0: 63 68 20 6f 72 64 65 72 7d 20 7b 77 61 73 20 61  ch order} {was a
1ed0: 20 73 6f 66 74 77 61 72 65 20 70 72 6f 62 6c 65   software proble
1ee0: 6d 7d 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  m}}.read_test  1
1ef0: 2e 33 2e 32 2e 37 20 7b 0a 20 20 53 45 4c 45 43  .3.2.7 {.  SELEC
1f00: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
1f10: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27  ERE mail MATCH '
1f20: 73 6c 6f 77 27 0a 7d 20 7b 7b 73 6f 66 74 77 61  slow'.} {{softwa
1f30: 72 65 20 66 65 65 64 62 61 63 6b 7d 20 7b 66 6f  re feedback} {fo
1f40: 75 6e 64 20 69 74 20 74 6f 6f 20 73 6c 6f 77 7d  und it too slow}
1f50: 20 7b 73 6c 6f 77 20 6c 75 6e 63 68 20 6f 72 64   {slow lunch ord
1f60: 65 72 7d 20 7b 77 61 73 20 61 20 73 6f 66 74 77  er} {was a softw
1f70: 61 72 65 20 70 72 6f 62 6c 65 6d 7d 7d 0a 64 64  are problem}}.dd
1f80: 6c 5f 74 65 73 74 20 20 20 31 2e 33 2e 32 2e 38  l_test   1.3.2.8
1f90: 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 6d 61   { DROP TABLE ma
1fa0: 69 6c 20 7d 0a 0a 64 64 6c 5f 74 65 73 74 20 20  il }..ddl_test  
1fb0: 20 31 2e 33 2e 33 2e 31 20 7b 20 43 52 45 41 54   1.3.3.1 { CREAT
1fc0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1fd0: 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33 28  docs USING fts3(
1fe0: 63 6f 6e 74 65 6e 74 29 20 7d 0a 72 65 61 64 5f  content) }.read_
1ff0: 74 65 73 74 20 20 31 2e 33 2e 33 2e 32 20 7b 20  test  1.3.3.2 { 
2000: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
2010: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
2020: 54 43 48 20 27 73 71 6c 69 74 65 27 20 7d 20 7b  TCH 'sqlite' } {
2030: 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 33  }.read_test  1.3
2040: 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  .3.3 { SELECT * 
2050: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
2060: 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20  docs.docs MATCH 
2070: 27 73 71 6c 69 74 65 27 20 7d 20 7b 7d 0a 72 65  'sqlite' } {}.re
2080: 61 64 5f 74 65 73 74 20 20 31 2e 33 2e 33 2e 34  ad_test  1.3.3.4
2090: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
20a0: 20 64 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e   docs WHERE main
20b0: 2e 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48  .docs.docs MATCH
20c0: 20 27 73 71 6c 69 74 65 27 20 7d 20 7b 7d 0a 64   'sqlite' } {}.d
20d0: 6f 5f 65 72 72 6f 72 5f 74 65 73 74 20 65 5f 66  o_error_test e_f
20e0: 74 73 33 2d 31 2e 33 2e 33 2e 35 20 7b 20 0a 20  ts3-1.3.3.5 { . 
20f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
2100: 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64  ocs WHERE main.d
2110: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
2120: 65 27 20 0a 7d 20 7b 6e 6f 20 73 75 63 68 20 63  e' .} {no such c
2130: 6f 6c 75 6d 6e 3a 20 6d 61 69 6e 2e 64 6f 63 73  olumn: main.docs
2140: 7d 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 33  }.ddl_test   1.3
2150: 2e 32 2e 38 20 7b 20 44 52 4f 50 20 54 41 42 4c  .2.8 { DROP TABL
2160: 45 20 64 6f 63 73 20 7d 0a 0a 23 23 23 23 23 23  E docs }..######
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 23 23 23 23 23 23 23  ################
21a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21b0: 23 23 23 23 0a 23 20 54 65 73 74 20 74 68 65 20  ####.# Test the 
21c0: 65 78 61 6d 70 6c 65 73 20 69 6e 20 73 65 63 74  examples in sect
21d0: 69 6f 6e 20 33 20 28 66 75 6c 6c 2d 74 65 78 74  ion 3 (full-text
21e0: 20 69 6e 64 65 78 20 71 75 65 72 69 65 73 29 2e   index queries).
21f0: 0a 23 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e  .#.ddl_test   1.
2200: 34 2e 31 2e 31 20 7b 20 43 52 45 41 54 45 20 56  4.1.1 { CREATE V
2210: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63  IRTUAL TABLE doc
2220: 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74  s USING fts3(tit
2230: 6c 65 2c 20 62 6f 64 79 29 20 7d 0a 75 6e 73 65  le, body) }.unse
2240: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 52 0a  t -nocomplain R.
2250: 66 6f 72 65 61 63 68 20 7b 74 6e 20 74 69 74 6c  foreach {tn titl
2260: 65 20 62 6f 64 79 7d 20 7b 0a 20 20 32 20 22 6c  e body} {.  2 "l
2270: 69 6e 75 78 20 64 72 69 76 65 72 22 20 22 61 20  inux driver" "a 
2280: 64 65 76 69 63 65 22 0a 20 20 33 20 22 64 72 69  device".  3 "dri
2290: 76 65 72 22 20 20 20 20 20 20 20 22 6c 69 6e 67  ver"       "ling
22a0: 75 69 73 74 69 63 20 74 72 69 63 6b 22 0a 20 20  uistic trick".  
22b0: 34 20 22 70 72 6f 62 6c 65 6d 73 22 20 20 20 20  4 "problems"    
22c0: 20 22 6c 69 6e 75 78 20 70 72 6f 62 6c 65 6d 73   "linux problems
22d0: 22 0a 20 20 35 20 22 6c 69 6e 75 78 22 20 20 20  ".  5 "linux"   
22e0: 20 20 20 20 20 22 62 69 67 20 70 72 6f 62 6c 65       "big proble
22f0: 6d 73 22 0a 20 20 36 20 22 6c 69 6e 75 78 20 64  ms".  6 "linux d
2300: 72 69 76 65 72 22 20 22 61 20 64 65 76 69 63 65  river" "a device
2310: 20 64 72 69 76 65 72 20 70 72 6f 62 6c 65 6d 22   driver problem"
2320: 0a 20 20 37 20 22 67 6f 6f 64 20 74 69 6d 65 73  .  7 "good times
2330: 22 20 20 20 22 61 70 70 6c 69 63 61 74 69 6f 6e  "   "application
2340: 73 20 66 6f 72 20 6c 69 6e 75 78 22 0a 20 20 38  s for linux".  8
2350: 20 22 6e 6f 74 20 73 6f 20 67 6f 6f 64 22 20 20   "not so good"  
2360: 22 6c 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69  "linux applicati
2370: 6f 6e 73 22 0a 20 20 39 20 22 61 6c 74 65 72 6e  ons".  9 "altern
2380: 61 74 69 76 65 22 20 20 22 6c 69 6e 6f 6c 65 75  ative"  "linoleu
2390: 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 0a 20 31  m appliances". 1
23a0: 30 20 22 6e 6f 20 4c 20 49 20 4e 22 20 20 20 20  0 "no L I N"    
23b0: 20 22 74 6f 20 62 65 20 73 65 65 6e 22 0a 7d 20   "to be seen".} 
23c0: 7b 0a 20 20 77 72 69 74 65 5f 74 65 73 74 20 31  {.  write_test 1
23d0: 2e 34 2e 31 2e 24 74 6e 20 64 6f 63 73 5f 63 6f  .4.1.$tn docs_co
23e0: 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52 54 20 49  ntent { INSERT I
23f0: 4e 54 4f 20 64 6f 63 73 20 56 41 4c 55 45 53 28  NTO docs VALUES(
2400: 24 74 69 74 6c 65 2c 24 62 6f 64 79 29 20 7d 0a  $title,$body) }.
2410: 20 20 73 65 74 20 52 28 24 74 6e 29 20 5b 6c 69    set R($tn) [li
2420: 73 74 20 24 74 69 74 6c 65 20 24 62 6f 64 79 5d  st $title $body]
2430: 0a 7d 0a 0a 72 65 61 64 5f 74 65 73 74 20 20 31  .}..read_test  1
2440: 2e 34 2e 31 2e 31 31 20 7b 20 0a 20 20 53 45 4c  .4.1.11 { .  SEL
2450: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
2460: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
2470: 20 27 6c 69 6e 75 78 27 0a 7d 20 5b 63 6f 6e 63   'linux'.} [conc
2480: 61 74 20 24 52 28 32 29 20 24 52 28 34 29 20 24  at $R(2) $R(4) $
2490: 52 28 35 29 20 24 52 28 36 29 20 24 52 28 37 29  R(5) $R(6) $R(7)
24a0: 20 24 52 28 38 29 5d 0a 72 65 61 64 5f 74 65 73   $R(8)].read_tes
24b0: 74 20 20 31 2e 34 2e 31 2e 31 32 20 7b 20 0a 20  t  1.4.1.12 { . 
24c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
24d0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
24e0: 41 54 43 48 20 27 6c 69 6e 2a 27 0a 7d 20 5b 63  ATCH 'lin*'.} [c
24f0: 6f 6e 63 61 74 20 24 52 28 32 29 20 24 52 28 33  oncat $R(2) $R(3
2500: 29 20 24 52 28 34 29 20 24 52 28 35 29 20 24 52  ) $R(4) $R(5) $R
2510: 28 36 29 20 24 52 28 37 29 20 24 52 28 38 29 20  (6) $R(7) $R(8) 
2520: 24 52 28 39 29 5d 0a 72 65 61 64 5f 74 65 73 74  $R(9)].read_test
2530: 20 20 31 2e 34 2e 31 2e 31 33 20 7b 20 0a 20 20    1.4.1.13 { .  
2540: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
2550: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
2560: 54 43 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78  TCH 'title:linux
2570: 20 70 72 6f 62 6c 65 6d 73 27 0a 7d 20 5b 63 6f   problems'.} [co
2580: 6e 63 61 74 20 24 52 28 35 29 5d 0a 72 65 61 64  ncat $R(5)].read
2590: 5f 74 65 73 74 20 20 31 2e 34 2e 31 2e 31 34 20  _test  1.4.1.14 
25a0: 7b 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  { .  SELECT * FR
25b0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 62 6f  OM docs WHERE bo
25c0: 64 79 20 4d 41 54 43 48 20 27 74 69 74 6c 65 3a  dy MATCH 'title:
25d0: 6c 69 6e 75 78 20 64 72 69 76 65 72 27 0a 7d 20  linux driver'.} 
25e0: 5b 63 6f 6e 63 61 74 20 24 52 28 36 29 5d 0a 72  [concat $R(6)].r
25f0: 65 61 64 5f 74 65 73 74 20 20 31 2e 34 2e 31 2e  ead_test  1.4.1.
2600: 31 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 2a  15 { .  SELECT *
2610: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
2620: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
2630: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
2640: 22 27 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 52 28  "'.} [concat $R(
2650: 38 29 5d 0a 72 65 61 64 5f 74 65 73 74 20 20 31  8)].read_test  1
2660: 2e 34 2e 31 2e 31 36 20 7b 20 0a 20 20 53 45 4c  .4.1.16 { .  SEL
2670: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
2680: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
2690: 20 27 22 6c 69 6e 2a 20 61 70 70 2a 22 27 0a 7d   '"lin* app*"'.}
26a0: 20 5b 63 6f 6e 63 61 74 20 24 52 28 38 29 20 24   [concat $R(8) $
26b0: 52 28 39 29 5d 0a 64 64 6c 5f 74 65 73 74 20 20  R(9)].ddl_test  
26c0: 20 31 2e 34 2e 31 2e 31 37 20 7b 20 44 52 4f 50   1.4.1.17 { DROP
26d0: 20 54 41 42 4c 45 20 64 6f 63 73 20 7d 0a 75 6e   TABLE docs }.un
26e0: 73 65 74 20 52 0a 0a 64 64 6c 5f 74 65 73 74 20  set R..ddl_test 
26f0: 20 20 31 2e 34 2e 32 2e 31 20 7b 20 43 52 45 41    1.4.2.1 { CREA
2700: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
2710: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33   docs USING fts3
2720: 28 29 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  () }.write_test 
2730: 31 2e 34 2e 32 2e 32 20 64 6f 63 73 5f 63 6f 6e  1.4.2.2 docs_con
2740: 74 65 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54  tent { .  INSERT
2750: 20 49 4e 54 4f 20 64 6f 63 73 20 56 41 4c 55 45   INTO docs VALUE
2760: 53 28 0a 20 20 27 53 51 4c 69 74 65 20 69 73 20  S(.  'SQLite is 
2770: 61 6e 20 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e  an ACID complian
2780: 74 20 65 6d 62 65 64 64 65 64 20 72 65 6c 61 74  t embedded relat
2790: 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65 20 6d  ional database m
27a0: 61 6e 61 67 65 6d 65 6e 74 20 73 79 73 74 65 6d  anagement system
27b0: 27 29 0a 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ').}.foreach {tn
27c0: 20 71 75 65 72 79 20 68 69 74 7d 20 7b 0a 33 20   query hit} {.3 
27d0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  {SELECT * FROM d
27e0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
27f0: 41 54 43 48 20 27 73 71 6c 69 74 65 20 4e 45 41  ATCH 'sqlite NEA
2800: 52 20 64 61 74 61 62 61 73 65 27 7d 20 31 0a 34  R database'} 1.4
2810: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
2820: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
2830: 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65 20  MATCH 'database 
2840: 4e 45 41 52 2f 36 20 73 71 6c 69 74 65 27 7d 20  NEAR/6 sqlite'} 
2850: 31 0a 35 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  1.5 {SELECT * FR
2860: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
2870: 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61  cs MATCH 'databa
2880: 73 65 20 4e 45 41 52 2f 35 20 73 71 6c 69 74 65  se NEAR/5 sqlite
2890: 27 7d 20 30 0a 36 20 7b 53 45 4c 45 43 54 20 2a  '} 0.6 {SELECT *
28a0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
28b0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
28c0: 61 62 61 73 65 20 4e 45 41 52 2f 32 20 22 41 43  abase NEAR/2 "AC
28d0: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 27 7d 20  ID compliant"'} 
28e0: 31 0a 37 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  1.7 {SELECT * FR
28f0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
2900: 63 73 20 4d 41 54 43 48 20 27 22 41 43 49 44 20  cs MATCH '"ACID 
2910: 63 6f 6d 70 6c 69 61 6e 74 22 20 4e 45 41 52 2f  compliant" NEAR/
2920: 32 20 73 71 6c 69 74 65 27 7d 20 31 0a 38 20 7b  2 sqlite'} 1.8 {
2930: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
2940: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
2950: 54 43 48 20 27 73 71 6c 69 74 65 20 4e 45 41 52  TCH 'sqlite NEAR
2960: 2f 32 20 61 63 69 64 20 4e 45 41 52 2f 32 20 72  /2 acid NEAR/2 r
2970: 65 6c 61 74 69 6f 6e 61 6c 27 7d 20 31 0a 39 20  elational'} 1.9 
2980: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  {SELECT * FROM d
2990: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
29a0: 41 54 43 48 20 27 61 63 69 64 20 4e 45 41 52 2f  ATCH 'acid NEAR/
29b0: 32 20 73 71 6c 69 74 65 20 4e 45 41 52 2f 32 20  2 sqlite NEAR/2 
29c0: 72 65 6c 61 74 69 6f 6e 61 6c 27 7d 20 30 0a 7d  relational'} 0.}
29d0: 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 64 62   {.  set res [db
29e0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
29f0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
2a00: 24 68 69 74 7d 5d 0a 20 20 72 65 61 64 5f 74 65  $hit}].  read_te
2a10: 73 74 20 31 2e 34 2e 32 2e 24 74 6e 20 24 71 75  st 1.4.2.$tn $qu
2a20: 65 72 79 20 24 72 65 73 0a 7d 0a 64 64 6c 5f 74  ery $res.}.ddl_t
2a30: 65 73 74 20 31 2e 34 2e 32 2e 31 30 20 7b 20 44  est 1.4.2.10 { D
2a40: 52 4f 50 20 54 41 42 4c 45 20 64 6f 63 73 20 7d  ROP TABLE docs }
2a50: 0a 0a 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a90: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 54  ############.# T
2aa0: 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20  est the example 
2ab0: 69 6e 20 73 65 63 74 69 6f 6e 20 33 2e 31 20 28  in section 3.1 (
2ac0: 73 65 74 20 6f 70 65 72 61 74 6f 72 73 20 77 69  set operators wi
2ad0: 74 68 20 65 6e 68 61 6e 63 65 64 20 73 79 6e 74  th enhanced synt
2ae0: 61 78 29 2e 0a 23 0a 73 65 74 20 73 71 6c 69 74  ax)..#.set sqlit
2af0: 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  e_fts3_enable_pa
2b00: 72 65 6e 74 68 65 73 65 73 20 31 0a 64 64 6c 5f  rentheses 1.ddl_
2b10: 74 65 73 74 20 31 2e 35 2e 31 2e 31 20 7b 20 43  test 1.5.1.1 { C
2b20: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
2b30: 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66  BLE docs USING f
2b40: 74 73 33 28 29 20 7d 0a 66 6f 72 65 61 63 68 20  ts3() }.foreach 
2b50: 7b 74 6e 20 64 6f 63 69 64 20 63 6f 6e 74 65 6e  {tn docid conten
2b60: 74 7d 20 7b 0a 20 20 32 20 31 20 22 61 20 64 61  t} {.  2 1 "a da
2b70: 74 61 62 61 73 65 20 69 73 20 61 20 73 6f 66 74  tabase is a soft
2b80: 77 61 72 65 20 73 79 73 74 65 6d 22 0a 20 20 33  ware system".  3
2b90: 20 32 20 22 73 71 6c 69 74 65 20 69 73 20 61 20   2 "sqlite is a 
2ba0: 73 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 22  software system"
2bb0: 0a 20 20 34 20 33 20 22 73 71 6c 69 74 65 20 69  .  4 3 "sqlite i
2bc0: 73 20 61 20 64 61 74 61 62 61 73 65 22 0a 7d 20  s a database".} 
2bd0: 7b 0a 20 20 73 65 74 20 52 28 24 64 6f 63 69 64  {.  set R($docid
2be0: 29 20 24 63 6f 6e 74 65 6e 74 0a 20 20 77 72 69  ) $content.  wri
2bf0: 74 65 5f 74 65 73 74 20 31 2e 35 2e 31 2e 24 74  te_test 1.5.1.$t
2c00: 6e 20 64 6f 63 73 5f 63 6f 6e 74 65 6e 74 20 7b  n docs_content {
2c10: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
2c20: 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f  O docs(docid, co
2c30: 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 24 64  ntent) VALUES($d
2c40: 6f 63 69 64 2c 20 24 63 6f 6e 74 65 6e 74 29 0a  ocid, $content).
2c50: 20 20 7d 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20    }.}.read_test 
2c60: 31 2e 35 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45  1.5.1.4 {.  SELE
2c70: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
2c80: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
2c90: 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74 61  'sqlite AND data
2ca0: 62 61 73 65 27 0a 7d 20 5b 6c 69 73 74 20 24 52  base'.} [list $R
2cb0: 28 33 29 5d 0a 72 65 61 64 5f 74 65 73 74 20 31  (3)].read_test 1
2cc0: 2e 35 2e 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43  .5.1.5 {.  SELEC
2cd0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
2ce0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
2cf0: 64 61 74 61 62 61 73 65 20 73 71 6c 69 74 65 27  database sqlite'
2d00: 0a 7d 20 5b 6c 69 73 74 20 24 52 28 33 29 5d 0a  .} [list $R(3)].
2d10: 72 65 61 64 5f 74 65 73 74 20 31 2e 35 2e 31 2e  read_test 1.5.1.
2d20: 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  6 {.  SELECT * F
2d30: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
2d40: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
2d50: 65 20 4f 52 20 64 61 74 61 62 61 73 65 27 0a 7d  e OR database'.}
2d60: 20 5b 6c 69 73 74 20 24 52 28 31 29 20 24 52 28   [list $R(1) $R(
2d70: 32 29 20 24 52 28 33 29 5d 0a 72 65 61 64 5f 74  2) $R(3)].read_t
2d80: 65 73 74 20 31 2e 35 2e 31 2e 37 20 7b 0a 20 20  est 1.5.1.7 {.  
2d90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
2da0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
2db0: 54 43 48 20 27 64 61 74 61 62 61 73 65 20 4e 4f  TCH 'database NO
2dc0: 54 20 73 71 6c 69 74 65 27 0a 7d 20 5b 6c 69 73  T sqlite'.} [lis
2dd0: 74 20 24 52 28 31 29 5d 0a 72 65 61 64 5f 74 65  t $R(1)].read_te
2de0: 73 74 20 31 2e 35 2e 31 2e 38 20 7b 0a 20 20 53  st 1.5.1.8 {.  S
2df0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
2e00: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
2e10: 43 48 20 27 64 61 74 61 62 61 73 65 20 61 6e 64  CH 'database and
2e20: 20 73 71 6c 69 74 65 27 0a 7d 20 7b 7d 0a 0a 77   sqlite'.} {}..w
2e30: 72 69 74 65 5f 74 65 73 74 20 31 2e 35 2e 32 2e  rite_test 1.5.2.
2e40: 31 20 64 6f 63 73 5f 63 6f 6e 74 65 6e 74 20 7b  1 docs_content {
2e50: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
2e60: 6f 63 73 20 0a 20 20 20 20 53 45 4c 45 43 54 20  ocs .    SELECT 
2e70: 27 73 71 6c 69 74 65 20 69 73 20 61 6c 73 6f 20  'sqlite is also 
2e80: 61 20 6c 69 62 72 61 72 79 27 20 55 4e 49 4f 4e  a library' UNION
2e90: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
2ea0: 27 6c 69 62 72 61 72 79 20 73 6f 66 74 77 61 72  'library softwar
2eb0: 65 27 0a 7d 0a 72 65 61 64 5f 74 65 73 74 20 31  e'.}.read_test 1
2ec0: 2e 35 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43  .5.2.2 {.  SELEC
2ed0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
2ee0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
2ef0: 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64  CH 'sqlite AND d
2f00: 61 74 61 62 61 73 65 20 4f 52 20 6c 69 62 72 61  atabase OR libra
2f10: 72 79 27 0a 7d 20 7b 33 20 34 20 35 7d 0a 72 65  ry'.} {3 4 5}.re
2f20: 61 64 5f 74 65 73 74 20 31 2e 35 2e 32 2e 33 20  ad_test 1.5.2.3 
2f30: 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  {.  SELECT docid
2f40: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
2f50: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
2f60: 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73 65  ite AND database
2f70: 27 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 53 45  '.    UNION.  SE
2f80: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
2f90: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
2fa0: 4d 41 54 43 48 20 27 6c 69 62 72 61 72 79 27 0a  MATCH 'library'.
2fb0: 7d 20 7b 33 20 34 20 35 7d 0a 77 72 69 74 65 5f  } {3 4 5}.write_
2fc0: 74 65 73 74 20 31 2e 35 2e 32 2e 34 20 64 6f 63  test 1.5.2.4 doc
2fd0: 73 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49 4e  s_content {.  IN
2fe0: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 20 0a  SERT INTO docs .
2ff0: 20 20 20 20 53 45 4c 45 43 54 20 27 74 68 65 20      SELECT 'the 
3000: 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 20 72  sqlite library r
3010: 75 6e 73 20 6f 6e 20 6c 69 6e 75 78 27 20 55 4e  uns on linux' UN
3020: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45  ION ALL.    SELE
3030: 43 54 20 27 61 73 20 64 6f 65 73 20 74 68 65 20  CT 'as does the 
3040: 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  sqlite database 
3050: 28 6f 6e 20 6c 69 6e 75 78 29 27 20 55 4e 49 4f  (on linux)' UNIO
3060: 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54  N ALL.    SELECT
3070: 20 27 74 68 65 20 73 71 6c 69 74 65 20 64 61 74   'the sqlite dat
3080: 61 62 61 73 65 20 69 73 20 61 63 63 65 73 73 65  abase is accesse
3090: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 20  d by the sqlite 
30a0: 6c 69 62 72 61 72 79 27 0a 7d 0a 72 65 61 64 5f  library'.}.read_
30b0: 74 65 73 74 20 31 2e 35 2e 32 2e 32 20 7b 0a 20  test 1.5.2.2 {. 
30c0: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
30d0: 4f 4d 20 64 6f 63 73 20 0a 20 20 57 48 45 52 45  OM docs .  WHERE
30e0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 28 22 73   docs MATCH '("s
30f0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 22 20  qlite database" 
3100: 4f 52 20 22 73 71 6c 69 74 65 20 6c 69 62 72 61  OR "sqlite libra
3110: 72 79 22 29 20 41 4e 44 20 6c 69 6e 75 78 27 3b  ry") AND linux';
3120: 0a 7d 20 7b 36 20 37 7d 0a 72 65 61 64 5f 74 65  .} {6 7}.read_te
3130: 73 74 20 31 2e 35 2e 32 2e 33 20 7b 0a 20 20 53  st 1.5.2.3 {.  S
3140: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
3150: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
3160: 20 4d 41 54 43 48 20 27 6c 69 6e 75 78 27 0a 20   MATCH 'linux'. 
3170: 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 53     INTERSECT.  S
3180: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
3190: 20 28 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f   (.    SELECT do
31a0: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
31b0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
31c0: 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22  "sqlite library"
31d0: 27 0a 20 20 20 20 20 20 55 4e 49 4f 4e 0a 20 20  '.      UNION.  
31e0: 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
31f0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
3200: 6f 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c 69  ocs MATCH '"sqli
3210: 74 65 20 64 61 74 61 62 61 73 65 22 27 0a 20 20  te database"'.  
3220: 29 3b 0a 7d 20 7b 36 20 37 7d 0a 0a 23 23 23 23  );.} {6 7}..####
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 23 23 23 23 23  ################
3260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3270: 23 23 23 23 23 23 0a 23 20 54 65 73 74 20 74 68  ######.# Test th
3280: 65 20 65 78 61 6d 70 6c 65 73 20 69 6e 20 73 65  e examples in se
3290: 63 74 69 6f 6e 20 33 2e 32 20 28 73 65 74 20 6f  ction 3.2 (set o
32a0: 70 65 72 61 74 6f 72 73 20 77 69 74 68 20 73 74  perators with st
32b0: 61 6e 64 61 72 64 20 73 79 6e 74 61 78 29 2e 0a  andard syntax)..
32c0: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 72 65  # These tests re
32d0: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 6f  use the table po
32e0: 70 75 6c 61 74 65 64 20 62 79 20 74 68 65 20 62  pulated by the b
32f0: 6c 6f 63 6b 20 61 62 6f 76 65 2e 0a 23 0a 73 65  lock above..#.se
3300: 74 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e  t sqlite_fts3_en
3310: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
3320: 20 30 0a 72 65 61 64 5f 74 65 73 74 20 31 2e 36   0.read_test 1.6
3330: 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.1 {.  SELECT 
3340: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
3350: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
3360: 6c 69 74 65 20 2d 64 61 74 61 62 61 73 65 27 0a  lite -database'.
3370: 7d 20 7b 7b 73 71 6c 69 74 65 20 69 73 20 61 20  } {{sqlite is a 
3380: 73 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 7d  software system}
3390: 20 7b 73 71 6c 69 74 65 20 69 73 20 61 6c 73 6f   {sqlite is also
33a0: 20 61 20 6c 69 62 72 61 72 79 7d 20 7b 74 68 65   a library} {the
33b0: 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 20   sqlite library 
33c0: 72 75 6e 73 20 6f 6e 20 6c 69 6e 75 78 7d 7d 0a  runs on linux}}.
33d0: 72 65 61 64 5f 74 65 73 74 20 31 2e 36 2e 31 2e  read_test 1.6.1.
33e0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
33f0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
3400: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
3410: 65 20 4f 52 20 64 61 74 61 62 61 73 65 20 6c 69  e OR database li
3420: 62 72 61 72 79 27 0a 7d 20 7b 7b 73 71 6c 69 74  brary'.} {{sqlit
3430: 65 20 69 73 20 61 6c 73 6f 20 61 20 6c 69 62 72  e is also a libr
3440: 61 72 79 7d 20 7b 74 68 65 20 73 71 6c 69 74 65  ary} {the sqlite
3450: 20 6c 69 62 72 61 72 79 20 72 75 6e 73 20 6f 6e   library runs on
3460: 20 6c 69 6e 75 78 7d 20 7b 74 68 65 20 73 71 6c   linux} {the sql
3470: 69 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20  ite database is 
3480: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
3490: 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 7d 7d  sqlite library}}
34a0: 0a 0a 73 65 74 20 73 71 6c 69 74 65 5f 66 74 73  ..set sqlite_fts
34b0: 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
34c0: 65 73 65 73 20 31 0a 72 65 61 64 5f 74 65 73 74  eses 1.read_test
34d0: 20 31 2e 36 2e 31 2e 33 20 7b 0a 20 20 53 45 4c   1.6.1.3 {.  SEL
34e0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
34f0: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
3500: 20 27 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61   'sqlite OR data
3510: 62 61 73 65 20 6c 69 62 72 61 72 79 27 0a 7d 20  base library'.} 
3520: 7b 7b 73 71 6c 69 74 65 20 69 73 20 61 20 73 6f  {{sqlite is a so
3530: 66 74 77 61 72 65 20 73 79 73 74 65 6d 7d 20 7b  ftware system} {
3540: 73 71 6c 69 74 65 20 69 73 20 61 20 64 61 74 61  sqlite is a data
3550: 62 61 73 65 7d 20 7b 73 71 6c 69 74 65 20 69 73  base} {sqlite is
3560: 20 61 6c 73 6f 20 61 20 6c 69 62 72 61 72 79 7d   also a library}
3570: 20 7b 74 68 65 20 73 71 6c 69 74 65 20 6c 69 62   {the sqlite lib
3580: 72 61 72 79 20 72 75 6e 73 20 6f 6e 20 6c 69 6e  rary runs on lin
3590: 75 78 7d 20 7b 61 73 20 64 6f 65 73 20 74 68 65  ux} {as does the
35a0: 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   sqlite database
35b0: 20 28 6f 6e 20 6c 69 6e 75 78 29 7d 20 7b 74 68   (on linux)} {th
35c0: 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61 73  e sqlite databas
35d0: 65 20 69 73 20 61 63 63 65 73 73 65 64 20 62 79  e is accessed by
35e0: 20 74 68 65 20 73 71 6c 69 74 65 20 6c 69 62 72   the sqlite libr
35f0: 61 72 79 7d 7d 0a 72 65 61 64 5f 74 65 73 74 20  ary}}.read_test 
3600: 31 2e 36 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45  1.6.1.4 {.  SELE
3610: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
3620: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
3630: 27 28 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61  '(sqlite OR data
3640: 62 61 73 65 29 20 6c 69 62 72 61 72 79 27 0a 7d  base) library'.}
3650: 20 7b 7b 73 71 6c 69 74 65 20 69 73 20 61 6c 73   {{sqlite is als
3660: 6f 20 61 20 6c 69 62 72 61 72 79 7d 20 7b 74 68  o a library} {th
3670: 65 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79  e sqlite library
3680: 20 72 75 6e 73 20 6f 6e 20 6c 69 6e 75 78 7d 20   runs on linux} 
3690: 7b 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61  {the sqlite data
36a0: 62 61 73 65 20 69 73 20 61 63 63 65 73 73 65 64  base is accessed
36b0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 20 6c   by the sqlite l
36c0: 69 62 72 61 72 79 7d 7d 0a 73 65 74 20 73 71 6c  ibrary}}.set sql
36d0: 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  ite_fts3_enable_
36e0: 70 61 72 65 6e 74 68 65 73 65 73 20 30 0a 64 64  parentheses 0.dd
36f0: 6c 5f 74 65 73 74 20 20 31 2e 36 2e 31 2e 35 20  l_test  1.6.1.5 
3700: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 64 6f 63  { DROP TABLE doc
3710: 73 20 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  s }..###########
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 23 23 23 23 23 23 23 23 23 23 23 23  ################
3750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
3760: 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70  # Test the examp
3770: 6c 65 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 34  les in section 4
3780: 20 28 61 75 78 69 6c 6c 61 72 79 20 66 75 6e 63   (auxillary func
3790: 74 69 6f 6e 73 29 2e 0a 23 0a 64 64 6c 5f 74 65  tions)..#.ddl_te
37a0: 73 74 20 20 20 31 2e 37 2e 31 2e 31 20 7b 20 43  st   1.7.1.1 { C
37b0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
37c0: 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66  BLE mail USING f
37d0: 74 73 33 28 73 75 62 6a 65 63 74 2c 20 62 6f 64  ts3(subject, bod
37e0: 79 29 20 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74  y) }..write_test
37f0: 20 31 2e 37 2e 31 2e 32 20 6d 61 69 6c 5f 63 6f   1.7.1.2 mail_co
3800: 6e 74 65 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52  ntent { .  INSER
3810: 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55  T INTO mail VALU
3820: 45 53 28 0a 20 20 20 20 27 68 65 6c 6c 6f 20 77  ES(.    'hello w
3830: 6f 72 6c 64 27 2c 20 27 54 68 69 73 20 6d 65 73  orld', 'This mes
3840: 73 61 67 65 20 69 73 20 61 20 68 65 6c 6c 6f 20  sage is a hello 
3850: 77 6f 72 6c 64 20 6d 65 73 73 61 67 65 2e 27 29  world message.')
3860: 3b 0a 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31  ;.}.write_test 1
3870: 2e 37 2e 31 2e 33 20 6d 61 69 6c 5f 63 6f 6e 74  .7.1.3 mail_cont
3880: 65 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54 20  ent { .  INSERT 
3890: 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55 45 53  INTO mail VALUES
38a0: 28 0a 20 20 20 20 27 75 72 67 65 6e 74 3a 20 73  (.    'urgent: s
38b0: 65 72 69 6f 75 73 27 2c 20 27 54 68 69 73 20 6d  erious', 'This m
38c0: 61 69 6c 20 69 73 20 73 65 65 6e 20 61 73 20 61  ail is seen as a
38d0: 20 6d 6f 72 65 20 73 65 72 69 6f 75 73 20 6d 61   more serious ma
38e0: 69 6c 27 29 3b 0a 7d 0a 0a 72 65 61 64 5f 74 65  il');.}..read_te
38f0: 73 74 20 20 31 2e 37 2e 31 2e 34 20 7b 20 0a 20  st  1.7.1.4 { . 
3900: 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28   SELECT offsets(
3910: 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20  mail) FROM mail 
3920: 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48  WHERE mail MATCH
3930: 20 27 77 6f 72 6c 64 27 3b 0a 7d 20 7b 7b 30 20   'world';.} {{0 
3940: 30 20 36 20 35 20 31 20 30 20 32 34 20 35 7d 7d  0 6 5 1 0 24 5}}
3950: 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 37 2e  .read_test  1.7.
3960: 31 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.5 { .  SELECT 
3970: 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52  offsets(mail) FR
3980: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
3990: 69 6c 20 4d 41 54 43 48 20 27 6d 65 73 73 61 67  il MATCH 'messag
39a0: 65 27 0a 7d 20 7b 7b 31 20 30 20 35 20 37 20 31  e'.} {{1 0 5 7 1
39b0: 20 30 20 33 30 20 37 7d 7d 0a 72 65 61 64 5f 74   0 30 7}}.read_t
39c0: 65 73 74 20 20 31 2e 37 2e 31 2e 36 20 7b 20 0a  est  1.7.1.6 { .
39d0: 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73    SELECT offsets
39e0: 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c  (mail) FROM mail
39f0: 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43   WHERE mail MATC
3a00: 48 20 27 22 73 65 72 69 6f 75 73 20 6d 61 69 6c  H '"serious mail
3a10: 22 27 0a 7d 20 7b 7b 31 20 30 20 32 38 20 37 20  "'.} {{1 0 28 7 
3a20: 31 20 31 20 33 36 20 34 7d 7d 0a 0a 64 64 6c 5f  1 1 36 4}}..ddl_
3a30: 74 65 73 74 20 20 20 31 2e 37 2e 32 2e 31 20 7b  test   1.7.2.1 {
3a40: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
3a50: 54 41 42 4c 45 20 74 65 78 74 20 55 53 49 4e 47  TABLE text USING
3a60: 20 66 74 73 33 28 29 20 7d 0a 0a 77 72 69 74 65   fts3() }..write
3a70: 5f 74 65 73 74 20 31 2e 37 2e 32 2e 32 20 74 65  _test 1.7.2.2 te
3a80: 78 74 5f 63 6f 6e 74 65 6e 74 20 7b 0a 20 20 49  xt_content {.  I
3a90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 78 74 20  NSERT INTO text 
3aa0: 56 41 4c 55 45 53 28 27 0a 20 20 20 20 44 75 72  VALUES('.    Dur
3ab0: 69 6e 67 20 33 30 20 4e 6f 76 2d 31 20 44 65 63  ing 30 Nov-1 Dec
3ac0: 2c 20 32 2d 33 6f 43 20 64 72 6f 70 73 2e 20 43  , 2-3oC drops. C
3ad0: 6f 6f 6c 20 69 6e 20 74 68 65 20 75 70 70 65 72  ool in the upper
3ae0: 20 70 6f 72 74 69 6f 6e 2c 20 6d 69 6e 69 6d 75   portion, minimu
3af0: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 34  m temperature 14
3b00: 2d 31 36 6f 43 20 61 6e 64 20 63 6f 6f 6c 20 65  -16oC and cool e
3b10: 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75  lsewhere, minimu
3b20: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 37  m temperature 17
3b30: 2d 32 30 6f 43 2e 20 43 6f 6c 64 20 74 6f 20 76  -20oC. Cold to v
3b40: 65 72 79 20 63 6f 6c 64 20 6f 6e 20 6d 6f 75 6e  ery cold on moun
3b50: 74 61 69 6e 74 6f 70 73 2c 20 6d 69 6e 69 6d 75  taintops, minimu
3b60: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 36 2d  m temperature 6-
3b70: 31 32 6f 43 2e 20 4e 6f 72 74 68 65 61 73 74 65  12oC. Northeaste
3b80: 72 6c 79 20 77 69 6e 64 73 20 31 35 2d 33 30 20  rly winds 15-30 
3b90: 6b 6d 2f 68 72 2e 20 41 66 74 65 72 20 74 68 61  km/hr. After tha
3ba0: 74 2c 20 74 65 6d 70 65 72 61 74 75 72 65 20 69  t, temperature i
3bb0: 6e 63 72 65 61 73 65 73 2e 20 4e 6f 72 74 68 65  ncreases. Northe
3bc0: 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31 35  asterly winds 15
3bd0: 2d 33 30 20 6b 6d 2f 68 72 2e 0a 20 20 27 29 3b  -30 km/hr..  ');
3be0: 0a 7d 0a 0a 72 65 61 64 5f 74 65 73 74 20 20 31  .}..read_test  1
3bf0: 2e 37 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43  .7.2.3 {.  SELEC
3c00: 54 20 73 6e 69 70 70 65 74 28 74 65 78 74 29 20  T snippet(text) 
3c10: 46 52 4f 4d 20 74 65 78 74 20 57 48 45 52 45 20  FROM text WHERE 
3c20: 74 65 78 74 20 4d 41 54 43 48 20 27 63 6f 6c 64  text MATCH 'cold
3c30: 27 0a 7d 20 7b 7b 3c 62 3e 2e 2e 2e 3c 2f 62 3e  '.} {{<b>...</b>
3c40: 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20  cool elsewhere, 
3c50: 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74  minimum temperat
3c60: 75 72 65 20 31 37 2d 32 30 6f 43 2e 20 3c 62 3e  ure 17-20oC. <b>
3c70: 43 6f 6c 64 3c 2f 62 3e 20 74 6f 20 76 65 72 79  Cold</b> to very
3c80: 20 3c 62 3e 63 6f 6c 64 3c 2f 62 3e 20 6f 6e 20   <b>cold</b> on 
3c90: 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 6d 69  mountaintops, mi
3ca0: 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72  nimum temperatur
3cb0: 65 20 36 3c 62 3e 2e 2e 2e 3c 2f 62 3e 7d 7d 0a  e 6<b>...</b>}}.
3cc0: 0a 72 65 61 64 5f 74 65 73 74 20 20 31 2e 37 2e  .read_test  1.7.
3cd0: 32 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 73  2.4 {.  SELECT s
3ce0: 6e 69 70 70 65 74 28 74 65 78 74 2c 20 27 5b 27  nippet(text, '['
3cf0: 2c 20 27 5d 27 2c 20 27 2e 2e 2e 27 29 20 46 52  , ']', '...') FR
3d00: 4f 4d 20 74 65 78 74 20 57 48 45 52 45 20 74 65  OM text WHERE te
3d10: 78 74 20 4d 41 54 43 48 20 27 22 6d 69 6e 2a 20  xt MATCH '"min* 
3d20: 74 65 6d 2a 22 27 0a 7d 20 7b 7b 2e 2e 2e 74 68  tem*"'.} {{...th
3d30: 65 20 75 70 70 65 72 20 70 6f 72 74 69 6f 6e 2c  e upper portion,
3d40: 20 5b 6d 69 6e 69 6d 75 6d 5d 20 5b 74 65 6d 70   [minimum] [temp
3d50: 65 72 61 74 75 72 65 5d 20 31 34 2d 31 36 6f 43  erature] 14-16oC
3d60: 20 61 6e 64 20 63 6f 6f 6c 20 65 6c 73 65 77 68   and cool elsewh
3d70: 65 72 65 2c 20 5b 6d 69 6e 69 6d 75 6d 5d 20 5b  ere, [minimum] [
3d80: 74 65 6d 70 65 72 61 74 75 72 65 5d 20 31 37 2d  temperature] 17-
3d90: 32 30 6f 43 2e 20 43 6f 6c 64 2e 2e 2e 7d 7d 0a  20oC. Cold...}}.
3da0: 0a 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 37 2e  .ddl_test   1.7.
3db0: 33 2e 31 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  3.1 { DROP TABLE
3dc0: 20 49 46 20 45 58 49 53 54 53 20 74 31 20 7d 0a   IF EXISTS t1 }.
3dd0: 64 64 6c 5f 74 65 73 74 20 20 20 31 2e 37 2e 33  ddl_test   1.7.3
3de0: 2e 32 20 7b 20 43 52 45 41 54 45 20 56 49 52 54  .2 { CREATE VIRT
3df0: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
3e00: 4e 47 20 66 74 73 33 28 61 2c 20 62 29 20 7d 0a  NG fts3(a, b) }.
3e10: 77 72 69 74 65 5f 74 65 73 74 20 31 2e 37 2e 33  write_test 1.7.3
3e20: 2e 33 20 74 31 5f 63 6f 6e 74 65 6e 74 20 7b 20  .3 t1_content { 
3e30: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3e40: 31 20 56 41 4c 55 45 53 28 0a 20 20 20 20 27 74  1 VALUES(.    't
3e50: 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 66 61 75  ransaction defau
3e60: 6c 74 20 6d 6f 64 65 6c 73 20 64 65 66 61 75 6c  lt models defaul
3e70: 74 27 2c 20 27 4e 6f 6e 20 74 72 61 6e 73 61 63  t', 'Non transac
3e80: 74 69 6f 6e 20 72 65 61 64 73 27 29 3b 0a 7d 0a  tion reads');.}.
3e90: 77 72 69 74 65 5f 74 65 73 74 20 31 2e 37 2e 33  write_test 1.7.3
3ea0: 2e 34 20 74 31 5f 63 6f 6e 74 65 6e 74 20 7b 20  .4 t1_content { 
3eb0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3ec0: 31 20 56 41 4c 55 45 53 28 27 74 68 65 20 64 65  1 VALUES('the de
3ed0: 66 61 75 6c 74 20 74 72 61 6e 73 61 63 74 69 6f  fault transactio
3ee0: 6e 27 2c 20 27 74 68 65 73 65 20 73 65 6d 61 6e  n', 'these seman
3ef0: 74 69 63 73 20 70 72 65 73 65 6e 74 27 29 3b 0a  tics present');.
3f00: 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31 2e 37  }.write_test 1.7
3f10: 2e 33 2e 35 20 74 31 5f 63 6f 6e 74 65 6e 74 20  .3.5 t1_content 
3f20: 7b 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  { .  INSERT INTO
3f30: 20 74 31 20 56 41 4c 55 45 53 28 27 73 69 6e 67   t1 VALUES('sing
3f40: 6c 65 20 72 65 71 75 65 73 74 27 2c 20 27 64 65  le request', 'de
3f50: 66 61 75 6c 74 20 64 61 74 61 27 29 3b 0a 7d 0a  fault data');.}.
3f60: 72 65 61 64 5f 74 65 73 74 20 20 31 2e 37 2e 33  read_test  1.7.3
3f70: 2e 36 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 6d  .6 { .  SELECT m
3f80: 69 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 31 29  it(matchinfo(t1)
3f90: 29 20 46 52 4f 4d 20 74 31 20 0a 20 20 20 20 57  ) FROM t1 .    W
3fa0: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 64  HERE t1 MATCH 'd
3fb0: 65 66 61 75 6c 74 20 74 72 61 6e 73 61 63 74 69  efault transacti
3fc0: 6f 6e 20 22 74 68 65 73 65 20 73 65 6d 61 6e 74  on "these semant
3fd0: 69 63 73 22 27 3b 0a 7d 20 7b 7b 33 20 32 20 31  ics"';.} {{3 2 1
3fe0: 20 33 20 32 20 30 20 31 20 31 20 31 20 32 20 32   3 2 0 1 1 1 2 2
3ff0: 20 30 20 31 20 31 20 30 20 30 20 30 20 31 20 31   0 1 1 0 0 0 1 1
4000: 20 31 7d 7d 0a 0a 23 23 23 23 23 23 23 23 23 23   1}}..##########
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 23 23 23 23 23 23 23 23 23 23 23  ################
4040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4050: 0a 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d  .# Test the exam
4060: 70 6c 65 20 69 6e 20 73 65 63 74 69 6f 6e 20 35  ple in section 5
4070: 20 28 63 75 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a   (custom tokeniz
4080: 65 72 73 29 2e 0a 23 0a 64 64 6c 5f 74 65 73 74  ers)..#.ddl_test
4090: 20 20 20 31 2e 38 2e 31 2e 31 20 7b 20 43 52 45     1.8.1.1 { CRE
40a0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
40b0: 45 20 73 69 6d 70 6c 65 20 55 53 49 4e 47 20 66  E simple USING f
40c0: 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d  ts3(tokenize=sim
40d0: 70 6c 65 29 20 7d 20 0a 77 72 69 74 65 5f 74 65  ple) } .write_te
40e0: 73 74 20 31 2e 38 2e 31 2e 32 20 73 69 6d 70 6c  st 1.8.1.2 simpl
40f0: 65 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20 20 49  e_content { .  I
4100: 4e 53 45 52 54 20 49 4e 54 4f 20 73 69 6d 70 6c  NSERT INTO simpl
4110: 65 20 56 41 4c 55 45 53 28 27 52 69 67 68 74 20  e VALUES('Right 
4120: 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76 65 72  now they''re ver
4130: 79 20 66 72 75 73 74 72 61 74 65 64 27 29 0a 7d  y frustrated').}
4140: 0a 72 65 61 64 5f 74 65 73 74 20 31 2e 38 2e 31  .read_test 1.8.1
4150: 2e 33 20 7b 53 45 4c 45 43 54 20 64 6f 63 69 64  .3 {SELECT docid
4160: 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45   FROM simple WHE
4170: 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20  RE simple MATCH 
4180: 27 46 72 75 73 74 72 61 74 65 64 27 7d 20 7b 31  'Frustrated'} {1
4190: 7d 20 0a 72 65 61 64 5f 74 65 73 74 20 31 2e 38  } .read_test 1.8
41a0: 2e 31 2e 34 20 7b 53 45 4c 45 43 54 20 64 6f 63  .1.4 {SELECT doc
41b0: 69 64 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57  id FROM simple W
41c0: 48 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43  HERE simple MATC
41d0: 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27 7d  H 'Frustration'}
41e0: 20 7b 7d 0a 0a 64 64 6c 5f 74 65 73 74 20 20 20   {}..ddl_test   
41f0: 31 2e 38 2e 32 2e 31 20 7b 20 43 52 45 41 54 45  1.8.2.1 { CREATE
4200: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
4210: 6f 72 74 65 72 20 55 53 49 4e 47 20 66 74 73 33  orter USING fts3
4220: 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72  (tokenize=porter
4230: 29 20 7d 20 0a 77 72 69 74 65 5f 74 65 73 74 20  ) } .write_test 
4240: 31 2e 38 2e 32 2e 32 20 70 6f 72 74 65 72 5f 63  1.8.2.2 porter_c
4250: 6f 6e 74 65 6e 74 20 7b 20 0a 20 20 49 4e 53 45  ontent { .  INSE
4260: 52 54 20 49 4e 54 4f 20 70 6f 72 74 65 72 20 56  RT INTO porter V
4270: 41 4c 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77  ALUES('Right now
4280: 20 74 68 65 79 27 27 72 65 20 76 65 72 79 20 66   they''re very f
4290: 72 75 73 74 72 61 74 65 64 27 29 0a 7d 0a 72 65  rustrated').}.re
42a0: 61 64 5f 74 65 73 74 20 31 2e 38 2e 32 2e 34 20  ad_test 1.8.2.4 
42b0: 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  {.  SELECT docid
42c0: 20 46 52 4f 4d 20 70 6f 72 74 65 72 20 57 48 45   FROM porter WHE
42d0: 52 45 20 70 6f 72 74 65 72 20 4d 41 54 43 48 20  RE porter MATCH 
42e0: 27 46 72 75 73 74 72 61 74 69 6f 6e 27 0a 7d 20  'Frustration'.} 
42f0: 7b 31 7d 0a 0a 7d 0a 23 20 45 6e 64 20 6f 66 20  {1}..}.# End of 
4300: 74 65 73 74 73 20 6f 66 20 65 78 61 6d 70 6c 65  tests of example
4310: 20 63 6f 64 65 20 69 6e 20 66 74 73 33 2e 68 74   code in fts3.ht
4320: 6d 6c 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ml.#------------
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 2d 2d 2d 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 0a 0a 23  -------------..#
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 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
43c0: 20 74 68 61 74 20 65 72 72 6f 72 73 20 69 6e 20   that errors in 
43d0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61  the arguments pa
43e0: 73 73 65 64 20 74 6f 20 74 68 65 20 73 6e 69 70  ssed to the snip
43f0: 70 65 74 20 61 6e 64 20 6f 66 66 73 65 74 73 0a  pet and offsets.
4400: 23 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  # functions are 
4410: 68 61 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c  handled correctl
4420: 79 2e 0a 23 0a 73 65 74 20 44 4f 5f 4d 41 4c 4c  y..#.set DO_MALL
4430: 4f 43 5f 54 45 53 54 20 30 0a 64 64 6c 5f 74 65  OC_TEST 0.ddl_te
4440: 73 74 20 20 20 32 2e 31 2e 30 20 7b 20 44 52 4f  st   2.1.0 { DRO
4450: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
4460: 53 20 74 31 20 7d 0a 64 64 6c 5f 74 65 73 74 20  S t1 }.ddl_test 
4470: 20 20 32 2e 31 2e 31 20 7b 20 43 52 45 41 54 45    2.1.1 { CREATE
4480: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
4490: 31 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20  1 USING fts3(a, 
44a0: 62 29 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  b) }.write_test 
44b0: 32 2e 31 2e 32 20 74 31 5f 63 6f 6e 74 65 6e 74  2.1.2 t1_content
44c0: 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54   { .  INSERT INT
44d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 6f 6e 65  O t1 VALUES('one
44e0: 20 74 77 6f 20 74 68 72 65 65 27 2c 20 78 27 41   two three', x'A
44f0: 31 42 32 43 33 44 34 45 35 46 36 27 29 3b 0a 7d  1B2C3D4E5F6');.}
4500: 0a 65 72 72 6f 72 5f 74 65 73 74 20 32 2e 31 2e  .error_test 2.1.
4510: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 6f 66 66  3 {.  SELECT off
4520: 73 65 74 73 28 61 29 20 46 52 4f 4d 20 74 31 20  sets(a) FROM t1 
4530: 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 6f  WHERE a MATCH 'o
4540: 6e 65 27 0a 7d 20 7b 69 6c 6c 65 67 61 6c 20 66  ne'.} {illegal f
4550: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
4560: 20 6f 66 66 73 65 74 73 7d 0a 65 72 72 6f 72 5f   offsets}.error_
4570: 74 65 73 74 20 32 2e 31 2e 34 20 7b 0a 20 20 53  test 2.1.4 {.  S
4580: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 62 29  ELECT offsets(b)
4590: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
45a0: 20 4d 41 54 43 48 20 27 6f 6e 65 27 0a 7d 20 7b   MATCH 'one'.} {
45b0: 69 6c 6c 65 67 61 6c 20 66 69 72 73 74 20 61 72  illegal first ar
45c0: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
45d0: 73 7d 0a 65 72 72 6f 72 5f 74 65 73 74 20 32 2e  s}.error_test 2.
45e0: 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 6f  1.5 {.  SELECT o
45f0: 70 74 69 6d 69 7a 65 28 61 29 20 46 52 4f 4d 20  ptimize(a) FROM 
4600: 74 31 20 4c 49 4d 49 54 20 31 0a 7d 20 7b 69 6c  t1 LIMIT 1.} {il
4610: 6c 65 67 61 6c 20 66 69 72 73 74 20 61 72 67 75  legal first argu
4620: 6d 65 6e 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65  ment to optimize
4630: 7d 0a 65 72 72 6f 72 5f 74 65 73 74 20 32 2e 31  }.error_test 2.1
4640: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 6e  .6 {.  SELECT sn
4650: 69 70 70 65 74 28 61 29 20 46 52 4f 4d 20 74 31  ippet(a) FROM t1
4660: 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27   WHERE a MATCH '
4670: 6f 6e 65 27 0a 7d 20 7b 69 6c 6c 65 67 61 6c 20  one'.} {illegal 
4680: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
4690: 6f 20 73 6e 69 70 70 65 74 7d 0a 65 72 72 6f 72  o snippet}.error
46a0: 5f 74 65 73 74 20 32 2e 31 2e 37 20 7b 0a 20 20  _test 2.1.7 {.  
46b0: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 29  SELECT snippet()
46c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
46d0: 20 4d 41 54 43 48 20 27 6f 6e 65 27 0a 7d 20 7b   MATCH 'one'.} {
46e0: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75  unable to use fu
46f0: 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65 74 20 69  nction snippet i
4700: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
4710: 63 6f 6e 74 65 78 74 7d 0a 65 72 72 6f 72 5f 74  context}.error_t
4720: 65 73 74 20 32 2e 31 2e 38 20 7b 0a 20 20 53 45  est 2.1.8 {.  SE
4730: 4c 45 43 54 20 73 6e 69 70 70 65 74 28 61 2c 20  LECT snippet(a, 
4740: 62 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27  b, 'A', 'B', 'C'
4750: 2c 20 27 44 27 2c 20 27 45 27 29 20 46 52 4f 4d  , 'D', 'E') FROM
4760: 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43   t1 WHERE a MATC
4770: 48 20 27 6f 6e 65 27 0a 7d 20 7b 77 72 6f 6e 67  H 'one'.} {wrong
4780: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
4790: 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
47a0: 20 73 6e 69 70 70 65 74 28 29 7d 0a 23 2d 2d 2d   snippet()}.#---
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 2d 2d 2d 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 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 65 66  --.# Test the ef
4850: 66 65 63 74 20 6f 66 20 61 6e 20 4f 4f 4d 20 65  fect of an OOM e
4860: 72 72 6f 72 20 77 68 69 6c 65 20 69 6e 73 74 61  rror while insta
4870: 6c 6c 69 6e 67 20 74 68 65 20 46 54 53 33 20 6d  lling the FTS3 m
4880: 6f 64 75 6c 65 20 28 69 2e 65 2e 0a 23 20 6f 70  odule (i.e..# op
4890: 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
48a0: 20 68 61 6e 64 6c 65 29 2e 20 54 68 69 73 20 63   handle). This c
48b0: 61 73 65 20 77 61 73 20 6e 6f 74 20 74 65 73 74  ase was not test
48c0: 65 64 20 62 79 20 74 68 65 20 4f 4f 4d 20 74 65  ed by the OOM te
48d0: 73 74 69 6e 67 0a 23 20 6f 66 20 74 68 65 20 64  sting.# of the d
48e0: 6f 63 75 6d 65 6e 74 20 65 78 61 6d 70 6c 65 73  ocument examples
48f0: 20 61 62 6f 76 65 2e 0a 23 0a 64 6f 5f 6d 61 6c   above..#.do_mal
4900: 6c 6f 63 5f 74 65 73 74 20 65 5f 66 74 73 33 2d  loc_test e_fts3-
4910: 33 20 2d 74 63 6c 62 6f 64 79 20 7b 20 0a 20 20  3 -tclbody { .  
4920: 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 69  if {[catch {sqli
4930: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 7d 5d  te3 db test.db}]
4940: 7d 20 7b 20 65 72 72 6f 72 20 22 6f 75 74 20 6f  } { error "out o
4950: 66 20 6d 65 6d 6f 72 79 22 20 7d 0a 7d 0a 23 2d  f memory" }.}.#-
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 2d 2d 2d  ----------------
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 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68  ----.# Verify th
4a00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
4a10: 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 28  of the optimize(
4a20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 6e  ) function. If n
4a30: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  o error occurs,.
4a40: 23 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  # the returned v
4a50: 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65 20 22  alue should be "
4a60: 49 6e 64 65 78 20 6f 70 74 69 6d 69 7a 65 64 22  Index optimized"
4a70: 20 69 66 20 74 68 65 20 64 61 74 61 20 73 74 72   if the data str
4a80: 75 63 74 75 72 65 0a 23 20 77 61 73 20 6d 6f 64  ucture.# was mod
4a90: 69 66 69 65 64 2c 20 6f 72 20 22 49 6e 64 65 78  ified, or "Index
4aa0: 20 61 6c 72 65 61 64 79 20 6f 70 74 69 6d 61 6c   already optimal
4ab0: 22 20 69 66 20 69 74 20 77 65 72 65 20 6e 6f 74  " if it were not
4ac0: 2e 0a 23 0a 73 65 74 20 44 4f 5f 4d 41 4c 4c 4f  ..#.set DO_MALLO
4ad0: 43 5f 54 45 53 54 20 30 0a 64 64 6c 5f 74 65 73  C_TEST 0.ddl_tes
4ae0: 74 20 20 20 34 2e 31 20 7b 20 43 52 45 41 54 45  t   4.1 { CREATE
4af0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
4b00: 34 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20  4 USING fts3(a, 
4b10: 62 29 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20  b) }.write_test 
4b20: 34 2e 32 20 74 34 5f 63 6f 6e 74 65 6e 74 20 7b  4.2 t4_content {
4b30: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
4b40: 34 20 56 41 4c 55 45 53 28 27 49 6e 20 58 61 6e  4 VALUES('In Xan
4b50: 61 64 75 27 2c 20 27 64 69 64 20 4b 75 62 6c 61  adu', 'did Kubla
4b60: 20 4b 68 61 6e 27 29 3b 0a 7d 0a 77 72 69 74 65   Khan');.}.write
4b70: 5f 74 65 73 74 20 34 2e 33 20 74 34 5f 63 6f 6e  _test 4.3 t4_con
4b80: 74 65 6e 74 20 7b 0a 20 20 49 4e 53 45 52 54 20  tent {.  INSERT 
4b90: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27  INTO t4 VALUES('
4ba0: 61 20 73 74 61 74 65 6c 79 20 70 6c 65 61 73 75  a stately pleasu
4bb0: 72 65 27 2c 20 27 64 6f 6d 65 20 64 65 63 72 65  re', 'dome decre
4bc0: 65 27 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 65  e');.}.do_test e
4bd0: 5f 66 74 73 33 2d 34 2e 34 20 7b 0a 20 20 65 78  _fts3-4.4 {.  ex
4be0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6f  ecsql { SELECT o
4bf0: 70 74 69 6d 69 7a 65 28 74 34 29 20 46 52 4f 4d  ptimize(t4) FROM
4c00: 20 74 34 20 4c 49 4d 49 54 20 31 20 7d 20 0a 7d   t4 LIMIT 1 } .}
4c10: 20 7b 7b 49 6e 64 65 78 20 6f 70 74 69 6d 69 7a   {{Index optimiz
4c20: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
4c30: 74 73 33 2d 34 2e 35 20 7b 0a 20 20 65 78 65 63  ts3-4.5 {.  exec
4c40: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6f 70 74  sql { SELECT opt
4c50: 69 6d 69 7a 65 28 74 34 29 20 46 52 4f 4d 20 74  imize(t4) FROM t
4c60: 34 20 4c 49 4d 49 54 20 31 20 7d 20 0a 7d 20 7b  4 LIMIT 1 } .} {
4c70: 7b 49 6e 64 65 78 20 61 6c 72 65 61 64 79 20 6f  {Index already o
4c80: 70 74 69 6d 61 6c 7d 7d 0a 23 2d 2d 2d 2d 2d 2d  ptimal}}.#------
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 2d 2d 2d 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 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4d20: 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  # Test that the 
4d30: 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e  snippet function
4d40: 20 61 70 70 65 61 72 73 20 74 6f 20 77 6f 72 6b   appears to work
4d50: 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 20   correctly with 
4d60: 31 2c 20 32 2c 20 33 0a 23 20 6f 72 20 34 20 61  1, 2, 3.# or 4 a
4d70: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
4d80: 74 6f 20 69 74 2e 0a 23 0a 73 65 74 20 44 4f 5f  to it..#.set DO_
4d90: 4d 41 4c 4c 4f 43 5f 54 45 53 54 20 30 0a 64 64  MALLOC_TEST 0.dd
4da0: 6c 5f 74 65 73 74 20 20 20 35 2e 31 20 7b 20 43  l_test   5.1 { C
4db0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4dc0: 42 4c 45 20 74 35 20 55 53 49 4e 47 20 66 74 73  BLE t5 USING fts
4dd0: 33 28 78 29 20 7d 0a 77 72 69 74 65 5f 74 65 73  3(x) }.write_tes
4de0: 74 20 35 2e 32 20 74 35 5f 63 6f 6e 74 65 6e 74  t 5.2 t5_content
4df0: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
4e00: 20 74 35 20 56 41 4c 55 45 53 28 27 49 6e 20 58   t5 VALUES('In X
4e10: 61 6e 61 64 75 20 64 69 64 20 4b 75 62 6c 61 20  anadu did Kubla 
4e20: 4b 68 61 6e 20 41 20 73 74 61 74 65 6c 79 20 70  Khan A stately p
4e30: 6c 65 61 73 75 72 65 2d 64 6f 6d 65 20 64 65 63  leasure-dome dec
4e40: 72 65 65 20 57 68 65 72 65 20 41 6c 70 68 2c 20  ree Where Alph, 
4e50: 74 68 65 20 73 61 63 72 65 64 20 72 69 76 65 72  the sacred river
4e60: 2c 20 72 61 6e 20 54 68 72 6f 75 67 68 20 63 61  , ran Through ca
4e70: 76 65 72 6e 73 20 6d 65 61 73 75 72 65 6c 65 73  verns measureles
4e80: 73 20 74 6f 20 6d 61 6e 20 44 6f 77 6e 20 74 6f  s to man Down to
4e90: 20 61 20 73 75 6e 6c 65 73 73 20 73 65 61 2e 20   a sunless sea. 
4ea0: 20 53 6f 20 74 77 69 63 65 20 66 69 76 65 20 6d   So twice five m
4eb0: 69 6c 65 73 20 6f 66 20 66 65 72 74 69 6c 65 20  iles of fertile 
4ec0: 67 72 6f 75 6e 64 20 57 69 74 68 20 77 61 6c 6c  ground With wall
4ed0: 73 20 61 6e 64 20 74 6f 77 65 72 73 20 77 65 72  s and towers wer
4ee0: 65 20 67 69 72 64 6c 65 64 20 72 6f 75 6e 64 20  e girdled round 
4ef0: 3a 20 41 6e 64 20 74 68 65 72 65 20 77 65 72 65  : And there were
4f00: 20 67 61 72 64 65 6e 73 20 62 72 69 67 68 74 20   gardens bright 
4f10: 77 69 74 68 20 73 69 6e 75 6f 75 73 20 72 69 6c  with sinuous ril
4f20: 6c 73 2c 20 57 68 65 72 65 20 62 6c 6f 73 73 6f  ls, Where blosso
4f30: 6d 65 64 20 6d 61 6e 79 20 61 6e 20 69 6e 63 65  med many an ince
4f40: 6e 73 65 2d 62 65 61 72 69 6e 67 20 74 72 65 65  nse-bearing tree
4f50: 20 3b 20 41 6e 64 20 68 65 72 65 20 77 65 72 65   ; And here were
4f60: 20 66 6f 72 65 73 74 73 20 61 6e 63 69 65 6e 74   forests ancient
4f70: 20 61 73 20 74 68 65 20 68 69 6c 6c 73 2c 20 45   as the hills, E
4f80: 6e 66 6f 6c 64 69 6e 67 20 73 75 6e 6e 79 20 73  nfolding sunny s
4f90: 70 6f 74 73 20 6f 66 20 67 72 65 65 6e 65 72 79  pots of greenery
4fa0: 2e 27 29 3b 0a 7d 0a 72 65 61 64 5f 74 65 73 74  .');.}.read_test
4fb0: 20 35 2e 33 20 7b 20 0a 20 20 53 45 4c 45 43 54   5.3 { .  SELECT
4fc0: 20 73 6e 69 70 70 65 74 28 74 35 29 20 46 52 4f   snippet(t5) FRO
4fd0: 4d 20 74 35 20 57 48 45 52 45 20 74 35 20 4d 41  M t5 WHERE t5 MA
4fe0: 54 43 48 20 27 6d 69 6c 65 73 27 0a 7d 20 7b 7b  TCH 'miles'.} {{
4ff0: 3c 62 3e 2e 2e 2e 3c 2f 62 3e 74 6f 20 61 20 73  <b>...</b>to a s
5000: 75 6e 6c 65 73 73 20 73 65 61 2e 20 20 53 6f 20  unless sea.  So 
5010: 74 77 69 63 65 20 66 69 76 65 20 3c 62 3e 6d 69  twice five <b>mi
5020: 6c 65 73 3c 2f 62 3e 20 6f 66 20 66 65 72 74 69  les</b> of ferti
5030: 6c 65 20 67 72 6f 75 6e 64 20 57 69 74 68 20 77  le ground With w
5040: 61 6c 6c 73 20 61 6e 64 20 74 6f 77 65 72 73 3c  alls and towers<
5050: 62 3e 2e 2e 2e 3c 2f 62 3e 7d 7d 0a 72 65 61 64  b>...</b>}}.read
5060: 5f 74 65 73 74 20 35 2e 34 20 7b 20 0a 20 20 53  _test 5.4 { .  S
5070: 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74 35  ELECT snippet(t5
5080: 2c 20 27 3c 69 3e 27 29 20 46 52 4f 4d 20 74 35  , '<i>') FROM t5
5090: 20 57 48 45 52 45 20 74 35 20 4d 41 54 43 48 20   WHERE t5 MATCH 
50a0: 27 6d 69 6c 65 73 27 0a 7d 20 7b 7b 3c 62 3e 2e  'miles'.} {{<b>.
50b0: 2e 2e 3c 2f 62 3e 74 6f 20 61 20 73 75 6e 6c 65  ..</b>to a sunle
50c0: 73 73 20 73 65 61 2e 20 20 53 6f 20 74 77 69 63  ss sea.  So twic
50d0: 65 20 66 69 76 65 20 3c 69 3e 6d 69 6c 65 73 3c  e five <i>miles<
50e0: 2f 62 3e 20 6f 66 20 66 65 72 74 69 6c 65 20 67  /b> of fertile g
50f0: 72 6f 75 6e 64 20 57 69 74 68 20 77 61 6c 6c 73  round With walls
5100: 20 61 6e 64 20 74 6f 77 65 72 73 3c 62 3e 2e 2e   and towers<b>..
5110: 2e 3c 2f 62 3e 7d 7d 0a 72 65 61 64 5f 74 65 73  .</b>}}.read_tes
5120: 74 20 35 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43  t 5.5 { .  SELEC
5130: 54 20 73 6e 69 70 70 65 74 28 74 35 2c 20 27 3c  T snippet(t5, '<
5140: 69 3e 27 2c 20 27 3c 2f 69 3e 27 29 20 46 52 4f  i>', '</i>') FRO
5150: 4d 20 74 35 20 57 48 45 52 45 20 74 35 20 4d 41  M t5 WHERE t5 MA
5160: 54 43 48 20 27 6d 69 6c 65 73 27 0a 7d 20 7b 7b  TCH 'miles'.} {{
5170: 3c 62 3e 2e 2e 2e 3c 2f 62 3e 74 6f 20 61 20 73  <b>...</b>to a s
5180: 75 6e 6c 65 73 73 20 73 65 61 2e 20 20 53 6f 20  unless sea.  So 
5190: 74 77 69 63 65 20 66 69 76 65 20 3c 69 3e 6d 69  twice five <i>mi
51a0: 6c 65 73 3c 2f 69 3e 20 6f 66 20 66 65 72 74 69  les</i> of ferti
51b0: 6c 65 20 67 72 6f 75 6e 64 20 57 69 74 68 20 77  le ground With w
51c0: 61 6c 6c 73 20 61 6e 64 20 74 6f 77 65 72 73 3c  alls and towers<
51d0: 62 3e 2e 2e 2e 3c 2f 62 3e 7d 7d 0a 72 65 61 64  b>...</b>}}.read
51e0: 5f 74 65 73 74 20 35 2e 36 20 7b 20 0a 20 20 53  _test 5.6 { .  S
51f0: 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74 35  ELECT snippet(t5
5200: 2c 20 27 3c 69 3e 27 2c 20 27 3c 2f 69 3e 27 2c  , '<i>', '</i>',
5210: 20 27 58 58 58 27 29 20 46 52 4f 4d 20 74 35 20   'XXX') FROM t5 
5220: 57 48 45 52 45 20 74 35 20 4d 41 54 43 48 20 27  WHERE t5 MATCH '
5230: 6d 69 6c 65 73 27 0a 7d 20 7b 7b 58 58 58 74 6f  miles'.} {{XXXto
5240: 20 61 20 73 75 6e 6c 65 73 73 20 73 65 61 2e 20   a sunless sea. 
5250: 20 53 6f 20 74 77 69 63 65 20 66 69 76 65 20 3c   So twice five <
5260: 69 3e 6d 69 6c 65 73 3c 2f 69 3e 20 6f 66 20 66  i>miles</i> of f
5270: 65 72 74 69 6c 65 20 67 72 6f 75 6e 64 20 57 69  ertile ground Wi
5280: 74 68 20 77 61 6c 6c 73 20 61 6e 64 20 74 6f 77  th walls and tow
5290: 65 72 73 58 58 58 7d 7d 0a 23 2d 2d 2d 2d 2d 2d  ersXXX}}.#------
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 2d 2d 2d 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 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5330: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65  # Test that an e
5340: 6d 70 74 79 20 4d 41 54 43 48 20 65 78 70 72 65  mpty MATCH expre
5350: 73 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ssion returns an
5360: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 73 65   empty result se
5370: 74 2e 20 41 73 0a 23 20 64 6f 65 73 20 70 61 73  t. As.# does pas
5380: 73 69 6e 67 20 61 20 4e 55 4c 4c 20 76 61 6c 75  sing a NULL valu
5390: 65 20 61 73 20 61 20 4d 41 54 43 48 20 65 78 70  e as a MATCH exp
53a0: 72 65 73 73 69 6f 6e 2e 0a 23 0a 73 65 74 20 44  ression..#.set D
53b0: 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20 30 0a  O_MALLOC_TEST 0.
53c0: 64 64 6c 5f 74 65 73 74 20 20 20 36 2e 31 20 7b  ddl_test   6.1 {
53d0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
53e0: 54 41 42 4c 45 20 74 36 20 55 53 49 4e 47 20 66  TABLE t6 USING f
53f0: 74 73 33 28 78 29 20 7d 0a 77 72 69 74 65 5f 74  ts3(x) }.write_t
5400: 65 73 74 20 36 2e 32 20 74 35 5f 63 6f 6e 74 65  est 6.2 t5_conte
5410: 6e 74 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  nt { INSERT INTO
5420: 20 74 36 20 56 41 4c 55 45 53 28 27 61 27 29 3b   t6 VALUES('a');
5430: 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 36 2e   }.write_test 6.
5440: 33 20 74 35 5f 63 6f 6e 74 65 6e 74 20 7b 20 49  3 t5_content { I
5450: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41  NSERT INTO t6 VA
5460: 4c 55 45 53 28 27 62 27 29 3b 20 7d 0a 77 72 69  LUES('b'); }.wri
5470: 74 65 5f 74 65 73 74 20 36 2e 34 20 74 35 5f 63  te_test 6.4 t5_c
5480: 6f 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52 54 20  ontent { INSERT 
5490: 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 27  INTO t6 VALUES('
54a0: 63 27 29 3b 20 7d 0a 72 65 61 64 5f 74 65 73 74  c'); }.read_test
54b0: 20 20 36 2e 35 20 7b 20 53 45 4c 45 43 54 20 2a    6.5 { SELECT *
54c0: 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 74   FROM t6 WHERE t
54d0: 36 20 4d 41 54 43 48 20 27 27 20 7d 20 7b 7d 0a  6 MATCH '' } {}.
54e0: 72 65 61 64 5f 74 65 73 74 20 20 36 2e 36 20 7b  read_test  6.6 {
54f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5500: 36 20 57 48 45 52 45 20 78 20 4d 41 54 43 48 20  6 WHERE x MATCH 
5510: 27 27 20 7d 20 7b 7d 0a 72 65 61 64 5f 74 65 73  '' } {}.read_tes
5520: 74 20 20 36 2e 37 20 7b 20 53 45 4c 45 43 54 20  t  6.7 { SELECT 
5530: 2a 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  * FROM t6 WHERE 
5540: 74 36 20 4d 41 54 43 48 20 4e 55 4c 4c 20 7d 20  t6 MATCH NULL } 
5550: 7b 7d 0a 72 65 61 64 5f 74 65 73 74 20 20 36 2e  {}.read_test  6.
5560: 38 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  8 { SELECT * FRO
5570: 4d 20 74 36 20 57 48 45 52 45 20 78 20 4d 41 54  M t6 WHERE x MAT
5580: 43 48 20 4e 55 4c 4c 20 7d 20 7b 7d 0a 23 2d 2d  CH NULL } {}.#--
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 2d 2d 2d 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 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5620: 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 66 65 77  ---.# Test a few
5630: 20 66 61 63 65 74 73 20 6f 66 20 74 68 65 20 46   facets of the F
5640: 54 53 33 20 78 46 69 6c 74 65 72 28 29 20 63 61  TS3 xFilter() ca
5650: 6c 6c 62 61 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  llback implement
5660: 61 74 69 6f 6e 3a 0a 23 0a 23 20 20 20 31 2e 20  ation:.#.#   1. 
5670: 54 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  That the sqlite3
5680: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
5690: 74 2e 75 73 61 62 6c 65 20 66 6c 61 67 20 69 73  t.usable flag is
56a0: 20 72 65 73 70 65 63 74 65 64 2e 0a 23 0a 23 20   respected..#.# 
56b0: 20 20 32 2e 20 54 68 61 74 20 69 74 20 69 73 20    2. That it is 
56c0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 75 73 65 20  an error to use 
56d0: 74 68 65 20 22 64 6f 63 69 64 22 20 6f 72 20 22  the "docid" or "
56e0: 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20 6f 66  rowid" column of
56f0: 0a 23 20 20 20 20 20 20 61 6e 20 46 54 53 33 20  .#      an FTS3 
5700: 74 61 62 6c 65 20 61 73 20 74 68 65 20 4c 48 53  table as the LHS
5710: 20 6f 66 20 61 20 4d 41 54 43 48 20 6f 70 65 72   of a MATCH oper
5720: 61 74 6f 72 2e 0a 23 0a 23 20 20 20 33 2e 20 54  ator..#.#   3. T
5730: 68 61 74 20 69 74 20 69 73 20 61 6e 20 65 72 72  hat it is an err
5740: 6f 72 20 74 6f 20 41 4e 44 20 74 6f 67 65 74 68  or to AND togeth
5750: 65 72 20 74 77 6f 20 4d 41 54 43 48 20 65 78 70  er two MATCH exp
5760: 72 65 73 73 69 6f 6e 73 20 69 6e 20 0a 23 20 20  ressions in .#  
5770: 20 20 20 20 74 68 61 74 20 72 65 66 65 72 20 74      that refer t
5780: 6f 20 61 20 73 69 6e 67 6c 65 20 46 54 53 33 20  o a single FTS3 
5790: 74 61 62 6c 65 20 69 6e 20 61 20 57 48 45 52 45  table in a WHERE
57a0: 20 63 6c 61 75 73 65 2e 0a 23 0a 23 0a 73 65 74   clause..#.#.set
57b0: 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 20   DO_MALLOC_TEST 
57c0: 30 0a 64 64 6c 5f 74 65 73 74 20 20 20 37 2e 31  0.ddl_test   7.1
57d0: 2e 31 20 7b 20 43 52 45 41 54 45 20 56 49 52 54  .1 { CREATE VIRT
57e0: 55 41 4c 20 54 41 42 4c 45 20 74 37 20 55 53 49  UAL TABLE t7 USI
57f0: 4e 47 20 66 74 73 33 28 61 29 20 7d 0a 64 64 6c  NG fts3(a) }.ddl
5800: 5f 74 65 73 74 20 20 20 37 2e 31 2e 32 20 7b 20  _test   7.1.2 { 
5810: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5820: 41 42 4c 45 20 74 38 20 55 53 49 4e 47 20 66 74  ABLE t8 USING ft
5830: 73 33 28 62 29 20 7d 0a 77 72 69 74 65 5f 74 65  s3(b) }.write_te
5840: 73 74 20 37 2e 31 2e 33 20 74 37 5f 63 6f 6e 74  st 7.1.3 t7_cont
5850: 65 6e 74 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ent { INSERT INT
5860: 4f 20 74 37 28 64 6f 63 69 64 2c 20 61 29 20 56  O t7(docid, a) V
5870: 41 4c 55 45 53 28 34 2c 27 6e 75 6d 62 65 72 20  ALUES(4,'number 
5880: 66 6f 75 72 27 29 20 7d 0a 77 72 69 74 65 5f 74  four') }.write_t
5890: 65 73 74 20 37 2e 31 2e 34 20 74 37 5f 63 6f 6e  est 7.1.4 t7_con
58a0: 74 65 6e 74 20 7b 20 49 4e 53 45 52 54 20 49 4e  tent { INSERT IN
58b0: 54 4f 20 74 37 28 64 6f 63 69 64 2c 20 61 29 20  TO t7(docid, a) 
58c0: 56 41 4c 55 45 53 28 35 2c 27 6e 75 6d 62 65 72  VALUES(5,'number
58d0: 20 66 69 76 65 27 29 20 7d 0a 77 72 69 74 65 5f   five') }.write_
58e0: 74 65 73 74 20 37 2e 31 2e 35 20 74 38 5f 63 6f  test 7.1.5 t8_co
58f0: 6e 74 65 6e 74 20 7b 20 49 4e 53 45 52 54 20 49  ntent { INSERT I
5900: 4e 54 4f 20 74 38 28 64 6f 63 69 64 2c 20 62 29  NTO t8(docid, b)
5910: 20 56 41 4c 55 45 53 28 34 2c 27 6c 65 74 74 65   VALUES(4,'lette
5920: 72 20 44 27 29 20 7d 0a 77 72 69 74 65 5f 74 65  r D') }.write_te
5930: 73 74 20 37 2e 31 2e 36 20 74 38 5f 63 6f 6e 74  st 7.1.6 t8_cont
5940: 65 6e 74 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ent { INSERT INT
5950: 4f 20 74 38 28 64 6f 63 69 64 2c 20 62 29 20 56  O t8(docid, b) V
5960: 41 4c 55 45 53 28 35 2c 27 6c 65 74 74 65 72 20  ALUES(5,'letter 
5970: 45 27 29 20 7d 0a 72 65 61 64 5f 74 65 73 74 20  E') }.read_test 
5980: 20 37 2e 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43   7.1.7 {.  SELEC
5990: 54 20 61 20 7c 7c 20 27 3a 27 20 7c 7c 20 62 20  T a || ':' || b 
59a0: 46 52 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20  FROM t7 JOIN t8 
59b0: 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 7d 20 7b  USING(docid).} {
59c0: 7b 6e 75 6d 62 65 72 20 66 6f 75 72 3a 6c 65 74  {number four:let
59d0: 74 65 72 20 44 7d 20 7b 6e 75 6d 62 65 72 20 66  ter D} {number f
59e0: 69 76 65 3a 6c 65 74 74 65 72 20 45 7d 7d 0a 0a  ive:letter E}}..
59f0: 65 72 72 6f 72 5f 74 65 73 74 20 37 2e 32 2e 31  error_test 7.2.1
5a00: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5a10: 4f 4d 20 74 37 20 57 48 45 52 45 20 64 6f 63 69  OM t7 WHERE doci
5a20: 64 20 4d 41 54 43 48 20 27 6e 75 6d 62 65 72 27  d MATCH 'number'
5a30: 0a 7d 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73  .} {unable to us
5a40: 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48  e function MATCH
5a50: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
5a60: 64 20 63 6f 6e 74 65 78 74 7d 0a 65 72 72 6f 72  d context}.error
5a70: 5f 74 65 73 74 20 37 2e 32 2e 32 20 7b 0a 20 20  _test 7.2.2 {.  
5a80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37  SELECT * FROM t7
5a90: 20 57 48 45 52 45 20 72 6f 77 69 64 20 4d 41 54   WHERE rowid MAT
5aa0: 43 48 20 27 6e 75 6d 62 65 72 27 0a 7d 20 7b 75  CH 'number'.} {u
5ab0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e  nable to use fun
5ac0: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
5ad0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
5ae0: 74 65 78 74 7d 0a 0a 65 72 72 6f 72 5f 74 65 73  text}..error_tes
5af0: 74 20 37 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45  t 7.3.1 {.  SELE
5b00: 43 54 20 2a 20 46 52 4f 4d 20 74 37 20 57 48 45  CT * FROM t7 WHE
5b10: 52 45 20 61 20 4d 41 54 43 48 20 27 6e 75 6d 62  RE a MATCH 'numb
5b20: 65 72 27 20 41 4e 44 20 61 20 4d 41 54 43 48 20  er' AND a MATCH 
5b30: 27 66 6f 75 72 27 0a 7d 20 7b 75 6e 61 62 6c 65  'four'.} {unable
5b40: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
5b50: 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65   MATCH in the re
5b60: 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d  quested context}
5b70: 0a 65 72 72 6f 72 5f 74 65 73 74 20 37 2e 33 2e  .error_test 7.3.
5b80: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
5b90: 52 4f 4d 20 74 37 2c 20 74 38 20 57 48 45 52 45  ROM t7, t8 WHERE
5ba0: 20 61 20 4d 41 54 43 48 20 27 6e 75 6d 62 65 72   a MATCH 'number
5bb0: 27 20 41 4e 44 20 61 20 4d 41 54 43 48 20 27 66  ' AND a MATCH 'f
5bc0: 6f 75 72 27 0a 7d 20 7b 75 6e 61 62 6c 65 20 74  our'.} {unable t
5bd0: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d  o use function M
5be0: 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75  ATCH in the requ
5bf0: 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 0a 65  ested context}.e
5c00: 72 72 6f 72 5f 74 65 73 74 20 37 2e 33 2e 33 20  rror_test 7.3.3 
5c10: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5c20: 4d 20 74 37 2c 20 74 38 20 57 48 45 52 45 20 62  M t7, t8 WHERE b
5c30: 20 4d 41 54 43 48 20 27 6c 65 74 74 65 72 27 20   MATCH 'letter' 
5c40: 41 4e 44 20 62 20 4d 41 54 43 48 20 27 64 27 0a  AND b MATCH 'd'.
5c50: 7d 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  } {unable to use
5c60: 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20   function MATCH 
5c70: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
5c80: 20 63 6f 6e 74 65 78 74 7d 0a 72 65 61 64 5f 74   context}.read_t
5c90: 65 73 74 20 37 2e 33 2e 34 20 7b 0a 20 20 53 45  est 7.3.4 {.  SE
5ca0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 2c 20  LECT * FROM t7, 
5cb0: 74 38 20 57 48 45 52 45 20 61 20 4d 41 54 43 48  t8 WHERE a MATCH
5cc0: 20 27 6e 75 6d 62 65 72 27 20 41 4e 44 20 62 20   'number' AND b 
5cd0: 4d 41 54 43 48 20 27 6c 65 74 74 65 72 27 0a 7d  MATCH 'letter'.}
5ce0: 20 7b 7b 6e 75 6d 62 65 72 20 66 6f 75 72 7d 20   {{number four} 
5cf0: 7b 6c 65 74 74 65 72 20 44 7d 20 7b 6e 75 6d 62  {letter D} {numb
5d00: 65 72 20 66 6f 75 72 7d 20 7b 6c 65 74 74 65 72  er four} {letter
5d10: 20 45 7d 20 7b 6e 75 6d 62 65 72 20 66 69 76 65   E} {number five
5d20: 7d 20 7b 6c 65 74 74 65 72 20 44 7d 20 7b 6e 75  } {letter D} {nu
5d30: 6d 62 65 72 20 66 69 76 65 7d 20 7b 6c 65 74 74  mber five} {lett
5d40: 65 72 20 45 7d 7d 0a 72 65 61 64 5f 74 65 73 74  er E}}.read_test
5d50: 20 37 2e 33 2e 35 20 7b 0a 20 20 53 45 4c 45 43   7.3.5 {.  SELEC
5d60: 54 20 2a 20 46 52 4f 4d 20 74 37 20 57 48 45 52  T * FROM t7 WHER
5d70: 45 20 61 20 4d 41 54 43 48 20 27 6e 75 6d 62 65  E a MATCH 'numbe
5d80: 72 27 20 41 4e 44 20 64 6f 63 69 64 20 3d 20 34  r' AND docid = 4
5d90: 0a 7d 20 7b 7b 6e 75 6d 62 65 72 20 66 6f 75 72  .} {{number four
5da0: 7d 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5df0: 20 54 65 73 74 20 74 68 65 20 71 75 6f 74 69 6e   Test the quotin
5e00: 67 20 6f 66 20 46 54 53 33 20 74 61 62 6c 65 20  g of FTS3 table 
5e10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 4e 61  column names. Na
5e20: 6d 65 73 20 6d 61 79 20 62 65 20 71 75 6f 74 65  mes may be quote
5e30: 64 20 75 73 69 6e 67 0a 23 20 61 6e 79 20 6f 66  d using.# any of
5e40: 20 22 22 2c 20 27 27 2c 20 60 60 60 20 6f 72 20   "", '', ``` or 
5e50: 5b 5d 2e 0a 23 0a 73 65 74 20 44 4f 5f 4d 41 4c  []..#.set DO_MAL
5e60: 4c 4f 43 5f 54 45 53 54 20 30 0a 64 64 6c 5f 74  LOC_TEST 0.ddl_t
5e70: 65 73 74 20 20 38 2e 31 2e 31 20 7b 20 43 52 45  est  8.1.1 { CRE
5e80: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
5e90: 45 20 74 39 61 20 55 53 49 4e 47 20 66 74 73 33  E t9a USING fts3
5ea0: 28 22 63 31 22 2c 20 5b 63 32 5d 29 20 7d 0a 64  ("c1", [c2]) }.d
5eb0: 64 6c 5f 74 65 73 74 20 20 38 2e 31 2e 32 20 7b  dl_test  8.1.2 {
5ec0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
5ed0: 54 41 42 4c 45 20 74 39 62 20 55 53 49 4e 47 20  TABLE t9b USING 
5ee0: 66 74 73 33 28 27 63 31 27 2c 20 60 63 32 60 29  fts3('c1', `c2`)
5ef0: 20 7d 0a 72 65 61 64 5f 74 65 73 74 20 38 2e 31   }.read_test 8.1
5f00: 2e 33 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c  .3 { PRAGMA tabl
5f10: 65 5f 69 6e 66 6f 28 74 39 61 29 20 7d 20 7b 30  e_info(t9a) } {0
5f20: 20 63 31 20 7b 7d 20 30 20 7b 7d 20 30 20 31 20   c1 {} 0 {} 0 1 
5f30: 63 32 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a 72 65  c2 {} 0 {} 0}.re
5f40: 61 64 5f 74 65 73 74 20 38 2e 31 2e 34 20 7b 20  ad_test 8.1.4 { 
5f50: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
5f60: 6f 28 74 39 62 29 20 7d 20 7b 30 20 63 31 20 7b  o(t9b) } {0 c1 {
5f70: 7d 20 30 20 7b 7d 20 30 20 31 20 63 32 20 7b 7d  } 0 {} 0 1 c2 {}
5f80: 20 30 20 7b 7d 20 30 7d 0a 64 64 6c 5f 74 65 73   0 {} 0}.ddl_tes
5f90: 74 20 20 38 2e 32 2e 31 20 7b 20 43 52 45 41 54  t  8.2.1 { CREAT
5fa0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
5fb0: 74 39 63 20 55 53 49 4e 47 20 66 74 73 33 28 22  t9c USING fts3("
5fc0: 63 22 22 31 22 2c 20 27 63 27 27 32 27 29 20 7d  c""1", 'c''2') }
5fd0: 0a 72 65 61 64 5f 74 65 73 74 20 38 2e 32 2e 32  .read_test 8.2.2
5fe0: 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f   { PRAGMA table_
5ff0: 69 6e 66 6f 28 74 39 63 29 20 7d 20 7b 30 20 63  info(t9c) } {0 c
6000: 5c 22 31 20 7b 7d 20 30 20 7b 7d 20 30 20 31 20  \"1 {} 0 {} 0 1 
6010: 63 27 32 20 7b 7d 20 30 20 7b 7d 20 30 7d 0a 23  c'2 {} 0 {} 0}.#
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 2d 2d  ----------------
6050: 2d 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 0a 0a 23 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 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
60c0: 74 20 46 54 53 33 20 74 61 62 6c 65 73 20 63 61  t FTS3 tables ca
60d0: 6e 20 62 65 20 72 65 6e 61 6d 65 64 20 75 73 69  n be renamed usi
60e0: 6e 67 20 74 68 65 20 41 4c 54 45 52 20 52 45 4e  ng the ALTER REN
60f0: 41 4d 45 20 63 6f 6d 6d 61 6e 64 2e 0a 23 20 4f  AME command..# O
6100: 4f 4d 20 65 72 72 6f 72 73 20 61 72 65 20 74 65  OM errors are te
6110: 73 74 65 64 20 64 75 72 69 6e 67 20 41 4c 54 45  sted during ALTE
6120: 52 20 52 45 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  R RENAME command
6130: 73 20 61 6c 73 6f 2e 0a 23 0a 66 6f 72 65 61 63  s also..#.foreac
6140: 68 20 44 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54  h DO_MALLOC_TEST
6150: 20 7b 30 20 31 20 32 7d 20 7b 0a 20 20 64 62 20   {0 1 2} {.  db 
6160: 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 64 65 6c  close.  file del
6170: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
6180: 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  db test.db-journ
6190: 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  al.  sqlite3 db 
61a0: 74 65 73 74 2e 64 62 0a 20 20 69 66 20 7b 24 44  test.db.  if {$D
61b0: 4f 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 7d 20 7b  O_MALLOC_TEST} {
61c0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
61d0: 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64 62 20  ig_lookaside db 
61e0: 30 20 30 20 30 20 7d 0a 0a 20 20 64 64 6c 5f 74  0 0 0 }..  ddl_t
61f0: 65 73 74 20 20 20 39 2e 31 2e 31 20 20 20 20 20  est   9.1.1     
6200: 20 20 20 20 20 20 20 20 7b 20 43 52 45 41 54 45          { CREATE
6210: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
6220: 31 30 20 55 53 49 4e 47 20 66 74 73 33 28 78 29  10 USING fts3(x)
6230: 20 7d 0a 20 20 77 72 69 74 65 5f 74 65 73 74 20   }.  write_test 
6240: 39 2e 31 2e 32 20 74 31 30 5f 63 6f 6e 74 65 6e  9.1.2 t10_conten
6250: 74 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  t { INSERT INTO 
6260: 74 31 30 20 56 41 4c 55 45 53 28 27 66 74 73 33  t10 VALUES('fts3
6270: 20 74 61 62 6c 65 73 27 29 20 7d 0a 20 20 77 72   tables') }.  wr
6280: 69 74 65 5f 74 65 73 74 20 39 2e 31 2e 33 20 74  ite_test 9.1.3 t
6290: 31 30 5f 63 6f 6e 74 65 6e 74 20 7b 20 49 4e 53  10_content { INS
62a0: 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c  ERT INTO t10 VAL
62b0: 55 45 53 28 27 61 72 65 20 72 65 6e 61 6d 65 61  UES('are renamea
62c0: 62 6c 65 27 29 20 7d 0a 0a 20 20 72 65 61 64 5f  ble') }..  read_
62d0: 74 65 73 74 20 20 39 2e 31 2e 34 20 7b 0a 20 20  test  9.1.4 {.  
62e0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
62f0: 74 31 30 20 57 48 45 52 45 20 74 31 30 20 4d 41  t10 WHERE t10 MA
6300: 54 43 48 20 27 74 61 62 6c 65 2a 27 0a 20 20 7d  TCH 'table*'.  }
6310: 20 7b 7b 66 74 73 33 20 74 61 62 6c 65 73 7d 7d   {{fts3 tables}}
6320: 0a 20 20 72 65 61 64 5f 74 65 73 74 20 20 39 2e  .  read_test  9.
6330: 31 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  1.5 {.    SELECT
6340: 20 2a 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52   * FROM t10 WHER
6350: 45 20 78 20 4d 41 54 43 48 20 27 72 65 6e 61 6d  E x MATCH 'renam
6360: 65 2a 27 0a 20 20 7d 20 7b 7b 61 72 65 20 72 65  e*'.  } {{are re
6370: 6e 61 6d 65 61 62 6c 65 7d 7d 0a 0a 20 20 64 64  nameable}}..  dd
6380: 6c 5f 74 65 73 74 20 20 20 39 2e 31 2e 36 20 20  l_test   9.1.6  
6390: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 4c 54             { ALT
63a0: 45 52 20 54 41 42 4c 45 20 74 31 30 20 52 45 4e  ER TABLE t10 REN
63b0: 41 4d 45 20 54 4f 20 74 31 31 20 7d 0a 0a 20 20  AME TO t11 }..  
63c0: 72 65 61 64 5f 74 65 73 74 20 20 39 2e 31 2e 37  read_test  9.1.7
63d0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
63e0: 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 74  FROM t11 WHERE t
63f0: 31 31 20 4d 41 54 43 48 20 27 74 61 62 6c 65 2a  11 MATCH 'table*
6400: 27 0a 20 20 7d 20 7b 7b 66 74 73 33 20 74 61 62  '.  } {{fts3 tab
6410: 6c 65 73 7d 7d 0a 20 20 72 65 61 64 5f 74 65 73  les}}.  read_tes
6420: 74 20 20 39 2e 31 2e 38 20 7b 0a 20 20 20 20 53  t  9.1.8 {.    S
6430: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31  ELECT * FROM t11
6440: 20 57 48 45 52 45 20 78 20 4d 41 54 43 48 20 27   WHERE x MATCH '
6450: 72 65 6e 61 6d 65 2a 27 0a 20 20 7d 20 7b 7b 61  rename*'.  } {{a
6460: 72 65 20 72 65 6e 61 6d 65 61 62 6c 65 7d 7d 0a  re renameable}}.
6470: 7d 0a 23 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 2d 2d 2d 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 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
6510: 61 20 63 6f 75 70 6c 65 20 6f 66 20 63 61 73 65  a couple of case
6520: 73 20 69 6e 76 6f 6c 76 69 6e 67 20 63 6f 72 72  s involving corr
6530: 75 70 74 20 64 61 74 61 20 73 74 72 75 63 74 75  upt data structu
6540: 72 65 73 3a 0a 23 0a 23 20 20 20 31 29 20 41 20  res:.#.#   1) A 
6550: 63 61 73 65 20 77 68 65 72 65 20 61 20 64 6f 63  case where a doc
6560: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 64  ument referenced
6570: 20 62 79 20 74 68 65 20 66 75 6c 6c 2d 74 65 78   by the full-tex
6580: 74 20 69 6e 64 65 78 20 69 73 0a 23 20 20 20 20  t index is.#    
6590: 20 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e    not present in
65a0: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
65b0: 61 62 6c 65 2e 0a 23 0a 23 20 20 20 32 29 20 41  able..#.#   2) A
65c0: 20 62 61 64 6c 79 20 66 6f 72 6d 61 74 74 65 64   badly formatted
65d0: 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 20   b-tree segment 
65e0: 6e 6f 64 65 2e 0a 23 0a 73 65 74 20 44 4f 5f 4d  node..#.set DO_M
65f0: 41 4c 4c 4f 43 5f 54 45 53 54 20 30 0a 64 64 6c  ALLOC_TEST 0.ddl
6600: 5f 74 65 73 74 20 20 20 31 30 2e 31 2e 31 20 7b  _test   10.1.1 {
6610: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
6620: 54 41 42 4c 45 20 74 61 20 55 53 49 4e 47 20 66  TABLE ta USING f
6630: 74 73 33 20 7d 0a 77 72 69 74 65 5f 74 65 73 74  ts3 }.write_test
6640: 20 31 30 2e 31 2e 32 20 74 61 5f 63 6f 6e 74 65   10.1.2 ta_conte
6650: 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49  nt { .  INSERT I
6660: 4e 54 4f 20 74 61 20 56 41 4c 55 45 53 28 27 44  NTO ta VALUES('D
6670: 75 72 69 6e 67 20 61 20 73 75 6d 6d 65 72 20 76  uring a summer v
6680: 61 63 61 74 69 6f 6e 20 69 6e 20 31 37 39 30 27  acation in 1790'
6690: 29 20 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31  ) }.write_test 1
66a0: 30 2e 31 2e 33 20 74 61 5f 63 6f 6e 74 65 6e 74  0.1.3 ta_content
66b0: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
66c0: 20 74 61 20 56 41 4c 55 45 53 28 27 57 6f 72 64   ta VALUES('Word
66d0: 73 77 6f 72 74 68 20 77 65 6e 74 20 6f 6e 20 61  sworth went on a
66e0: 20 77 61 6c 6b 69 6e 67 20 74 6f 75 72 27 29 20   walking tour') 
66f0: 7d 0a 77 72 69 74 65 5f 74 65 73 74 20 31 30 2e  }.write_test 10.
6700: 31 2e 34 20 74 61 5f 63 6f 6e 74 65 6e 74 20 7b  1.4 ta_content {
6710: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 5f   DELETE FROM ta_
6720: 63 6f 6e 74 65 6e 74 20 57 48 45 52 45 20 72 6f  content WHERE ro
6730: 77 69 64 20 3d 20 32 20 7d 0a 72 65 61 64 5f 74  wid = 2 }.read_t
6740: 65 73 74 20 20 31 30 2e 31 2e 35 20 7b 0a 20 20  est  10.1.5 {.  
6750: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
6760: 20 57 48 45 52 45 20 74 61 20 4d 41 54 43 48 20   WHERE ta MATCH 
6770: 27 73 75 6d 6d 65 72 27 0a 7d 20 7b 7b 44 75 72  'summer'.} {{Dur
6780: 69 6e 67 20 61 20 73 75 6d 6d 65 72 20 76 61 63  ing a summer vac
6790: 61 74 69 6f 6e 20 69 6e 20 31 37 39 30 7d 7d 0a  ation in 1790}}.
67a0: 65 72 72 6f 72 5f 74 65 73 74 20 31 30 2e 31 2e  error_test 10.1.
67b0: 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  6 {.  SELECT * F
67c0: 52 4f 4d 20 74 61 20 57 48 45 52 45 20 74 61 20  ROM ta WHERE ta 
67d0: 4d 41 54 43 48 20 27 77 61 6c 6b 69 6e 67 27 0a  MATCH 'walking'.
67e0: 7d 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  } {database disk
67f0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
6800: 6d 65 64 7d 0a 0a 77 72 69 74 65 5f 74 65 73 74  med}..write_test
6810: 20 31 30 2e 32 2e 31 20 74 61 5f 63 6f 6e 74 65   10.2.1 ta_conte
6820: 6e 74 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  nt { DELETE FROM
6830: 20 74 61 20 7d 0a 77 72 69 74 65 5f 74 65 73 74   ta }.write_test
6840: 20 31 30 2e 32 2e 32 20 74 61 5f 63 6f 6e 74 65   10.2.2 ta_conte
6850: 6e 74 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49  nt { .  INSERT I
6860: 4e 54 4f 20 74 61 20 56 41 4c 55 45 53 28 27 64  NTO ta VALUES('d
6870: 65 62 61 74 65 20 64 65 6d 6f 6e 73 74 72 61 74  ebate demonstrat
6880: 65 64 20 74 68 65 20 72 69 73 69 6e 67 20 64 69  ed the rising di
6890: 66 66 69 63 75 6c 74 79 27 29 20 7d 0a 77 72 69  fficulty') }.wri
68a0: 74 65 5f 74 65 73 74 20 31 30 2e 32 2e 33 20 74  te_test 10.2.3 t
68b0: 61 5f 63 6f 6e 74 65 6e 74 20 7b 20 0a 20 20 49  a_content { .  I
68c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 20 56 41  NSERT INTO ta VA
68d0: 4c 55 45 53 28 27 47 6f 6f 67 6c 65 20 72 65 6c  LUES('Google rel
68e0: 65 61 73 65 64 20 69 74 73 20 62 72 6f 77 73 65  eased its browse
68f0: 72 20 62 65 74 61 27 29 20 7d 0a 0a 73 65 74 20  r beta') }..set 
6900: 62 6c 6f 62 20 5b 64 62 20 6f 6e 65 20 7b 53 45  blob [db one {SE
6910: 4c 45 43 54 20 72 6f 6f 74 20 46 52 4f 4d 20 74  LECT root FROM t
6920: 61 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 72  a_segdir WHERE r
6930: 6f 77 69 64 20 3d 20 32 7d 5d 0a 62 69 6e 61 72  owid = 2}].binar
6940: 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 22 61 36  y scan $blob "a6
6950: 20 61 33 20 61 2a 22 20 73 74 61 72 74 20 6d 69   a3 a*" start mi
6960: 64 64 6c 65 20 65 6e 64 0a 73 65 74 20 6d 69 64  ddle end.set mid
6970: 64 6c 65 20 22 5c 78 30 45 5c 78 46 46 5c 78 46  dle "\x0E\xFF\xF
6980: 46 5c 78 46 46 5c 78 46 46 5c 78 46 46 5c 78 46  F\xFF\xFF\xFF\xF
6990: 46 5c 78 46 46 5c 78 46 46 5c 78 46 46 5c 78 46  F\xFF\xFF\xFF\xF
69a0: 46 5c 78 46 46 5c 78 30 36 5c 78 30 36 22 0a 73  F\xFF\x06\x06".s
69b0: 65 74 20 62 6c 6f 62 20 5b 62 69 6e 61 72 79 20  et blob [binary 
69c0: 66 6f 72 6d 61 74 20 22 61 36 20 61 2a 20 61 2a  format "a6 a* a*
69d0: 22 20 24 73 74 61 72 74 20 24 6d 69 64 64 6c 65  " $start $middle
69e0: 20 24 65 6e 64 5d 0a 77 72 69 74 65 5f 74 65 73   $end].write_tes
69f0: 74 20 31 30 2e 32 2e 34 20 74 61 5f 73 65 67 64  t 10.2.4 ta_segd
6a00: 69 72 20 7b 20 0a 20 20 55 50 44 41 54 45 20 74  ir { .  UPDATE t
6a10: 61 5f 73 65 67 64 69 72 20 53 45 54 20 72 6f 6f  a_segdir SET roo
6a20: 74 20 3d 20 24 62 6c 6f 62 20 57 48 45 52 45 20  t = $blob WHERE 
6a30: 72 6f 77 69 64 20 3d 20 32 0a 7d 0a 65 72 72 6f  rowid = 2.}.erro
6a40: 72 5f 74 65 73 74 20 31 30 2e 32 2e 35 20 7b 0a  r_test 10.2.5 {.
6a50: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6a60: 74 61 20 57 48 45 52 45 20 74 61 20 4d 41 54 43  ta WHERE ta MATC
6a70: 48 20 27 62 65 74 61 27 0a 7d 20 7b 64 61 74 61  H 'beta'.} {data
6a80: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
6a90: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 0a 0a 0a  is malformed}...
6aa0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.