/ Hex Artifact Content
Login

Artifact fd6a11684b965e1999564ae763797b7fb9e34c96:


0000: 23 20 32 30 31 36 20 4d 61 72 63 68 20 38 0a 23  # 2016 March 8.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65  ******.#..set te
0170: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0180: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0190: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
01a0: 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  er.tcl.source $t
01b0: 65 73 74 64 69 72 2f 66 74 73 33 5f 63 6f 6d 6d  estdir/fts3_comm
01c0: 6f 6e 2e 74 63 6c 0a 73 65 74 20 3a 3a 74 65 73  on.tcl.set ::tes
01d0: 74 70 72 65 66 69 78 20 66 74 73 34 6f 70 74 0a  tprefix fts4opt.
01e0: 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  .# If SQLITE_ENA
01f0: 42 4c 45 5f 46 54 53 33 20 69 73 20 64 65 66 69  BLE_FTS3 is defi
0200: 6e 65 64 2c 20 6f 6d 69 74 20 74 68 69 73 20 66  ned, omit this f
0210: 69 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65 20 21  ile..ifcapable !
0220: 66 74 73 33 20 7b 0a 20 20 66 69 6e 69 73 68 5f  fts3 {.  finish_
0230: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
0240: 0a 23 20 43 72 65 61 74 65 20 74 68 65 20 66 74  .# Create the ft
0250: 73 5f 6b 6a 76 5f 67 65 6e 65 73 69 73 20 70 72  s_kjv_genesis pr
0260: 6f 63 65 64 75 72 65 20 77 68 69 63 68 20 66 69  ocedure which fi
0270: 6c 6c 73 20 61 6e 64 20 46 54 53 33 2f 34 20 74  lls and FTS3/4 t
0280: 61 62 6c 65 20 0a 23 20 77 69 74 68 20 74 68 65  able .# with the
0290: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
02a0: 66 20 74 68 65 20 42 6f 6f 6b 20 6f 66 20 47 65  f the Book of Ge
02b0: 6e 65 73 69 73 2e 0a 23 0a 73 6f 75 72 63 65 20  nesis..#.source 
02c0: 24 74 65 73 74 64 69 72 2f 67 65 6e 65 73 69 73  $testdir/genesis
02d0: 2e 74 63 6c 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  .tcl..do_execsql
02e0: 5f 74 65 73 74 20 31 2e 30 20 7b 20 43 52 45 41  _test 1.0 { CREA
02f0: 54 45 20 54 41 42 4c 45 20 74 31 28 64 6f 63 69  TE TABLE t1(doci
0300: 64 2c 20 77 6f 72 64 73 29 20 7d 0a 66 74 73 5f  d, words) }.fts_
0310: 6b 6a 76 5f 67 65 6e 65 73 69 73 0a 0a 23 2d 2d  kjv_genesis..#--
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 72 67 75 6d 65  -------.# Argume
0370: 6e 74 20 24 64 62 20 69 73 20 61 6e 20 6f 70 65  nt $db is an ope
0380: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
0390: 65 2e 20 24 74 62 6c 20 69 73 20 74 68 65 20 6e  e. $tbl is the n
03a0: 61 6d 65 20 6f 66 20 61 6e 20 46 54 53 33 2f 34  ame of an FTS3/4
03b0: 0a 23 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  .# table with th
03c0: 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  e database. This
03d0: 20 63 6f 6d 6d 61 6e 64 20 72 65 61 72 72 61 6e   command rearran
03e0: 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ges the contents
03f0: 20 6f 66 20 74 68 65 0a 23 20 25 5f 73 65 67 64   of the.# %_segd
0400: 69 72 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74  ir table so that
0410: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 77 69   all segments wi
0420: 74 68 69 6e 20 65 61 63 68 20 69 6e 64 65 78 20  thin each index 
0430: 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  are on the same.
0440: 23 20 6c 65 76 65 6c 2e 20 54 68 69 73 20 6d 65  # level. This me
0450: 61 6e 73 20 74 68 61 74 20 74 68 65 20 27 6d 65  ans that the 'me
0460: 72 67 65 27 20 63 6f 6d 6d 61 6e 64 20 63 61 6e  rge' command can
0470: 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 66 6f   then be used fo
0480: 72 20 61 6e 0a 23 20 69 6e 63 72 65 6d 65 6e 74  r an.# increment
0490: 61 6c 20 6f 70 74 69 6d 69 7a 65 20 72 6f 75 74  al optimize rout
04a0: 69 6e 65 2e 0a 23 0a 70 72 6f 63 20 70 72 65 70  ine..#.proc prep
04b0: 61 72 65 5f 66 6f 72 5f 6f 70 74 69 6d 69 7a 65  are_for_optimize
04c0: 20 7b 64 62 20 74 62 6c 7d 20 7b 0a 20 20 24 64   {db tbl} {.  $d
04d0: 62 20 65 76 61 6c 20 5b 73 74 72 69 6e 67 20 6d  b eval [string m
04e0: 61 70 20 5b 6c 69 73 74 20 25 20 24 74 62 6c 5d  ap [list % $tbl]
04f0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
0500: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
0510: 54 41 42 4c 45 20 74 6d 70 5f 73 65 67 64 69 72  TABLE tmp_segdir
0520: 28 0a 20 20 20 20 20 20 20 20 6c 65 76 65 6c 2c  (.        level,
0530: 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63   idx, start_bloc
0540: 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  k, leaves_end_bl
0550: 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20  ock, end_block, 
0560: 72 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 0a 20  root.      );.. 
0570: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0580: 20 74 65 6d 70 2e 74 6d 70 5f 73 65 67 64 69 72   temp.tmp_segdir
0590: 20 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54   .        SELECT
05a0: 20 0a 20 20 20 20 20 20 20 20 31 30 32 34 2a 28   .        1024*(
05b0: 6f 2e 6c 65 76 65 6c 20 2f 20 31 30 32 34 29 20  o.level / 1024) 
05c0: 2b 20 33 32 2c 20 20 20 20 20 20 20 20 20 20 20  + 32,           
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 2d 2d 20 6c 65 76 65 6c 0a 20 20       -- level.  
05f0: 20 20 20 20 20 20 73 75 6d 28 6f 2e 6c 65 76 65        sum(o.leve
0600: 6c 3c 69 2e 6c 65 76 65 6c 20 4f 52 20 28 6f 2e  l<i.level OR (o.
0610: 6c 65 76 65 6c 3d 69 2e 6c 65 76 65 6c 20 41 4e  level=i.level AN
0620: 44 20 6f 2e 69 64 78 3e 69 2e 69 64 78 29 29 2c  D o.idx>i.idx)),
0630: 20 2d 2d 20 69 64 78 0a 20 20 20 20 20 20 20 20   -- idx.        
0640: 6f 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6f  o.start_block, o
0650: 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  .leaves_end_bloc
0660: 6b 2c 20 6f 2e 65 6e 64 5f 62 6c 6f 63 6b 2c 20  k, o.end_block, 
0670: 6f 2e 72 6f 6f 74 20 20 20 20 20 2d 2d 20 6f 74  o.root     -- ot
0680: 68 65 72 0a 20 20 20 20 20 20 20 20 46 52 4f 4d  her.        FROM
0690: 20 25 5f 73 65 67 64 69 72 20 6f 2c 20 25 5f 73   %_segdir o, %_s
06a0: 65 67 64 69 72 20 69 20 0a 20 20 20 20 20 20 20  egdir i .       
06b0: 20 57 48 45 52 45 20 28 6f 2e 6c 65 76 65 6c 20   WHERE (o.level 
06c0: 2f 20 31 30 32 34 29 20 3d 20 28 69 2e 6c 65 76  / 1024) = (i.lev
06d0: 65 6c 20 2f 20 31 30 32 34 29 0a 20 20 20 20 20  el / 1024).     
06e0: 20 20 20 47 52 4f 55 50 20 42 59 20 6f 2e 6c 65     GROUP BY o.le
06f0: 76 65 6c 2c 20 6f 2e 69 64 78 3b 0a 20 20 0a 20  vel, o.idx;.  . 
0700: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
0710: 20 25 5f 73 65 67 64 69 72 3b 0a 20 20 20 20 20   %_segdir;.     
0720: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 73   INSERT INTO %_s
0730: 65 67 64 69 72 20 53 45 4c 45 43 54 20 2a 20 46  egdir SELECT * F
0740: 52 4f 4d 20 74 65 6d 70 2e 74 6d 70 5f 73 65 67  ROM temp.tmp_seg
0750: 64 69 72 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  dir;.      DROP 
0760: 54 41 42 4c 45 20 74 65 6d 70 2e 74 6d 70 5f 73  TABLE temp.tmp_s
0770: 65 67 64 69 72 3b 0a 20 20 0a 20 20 20 20 43 4f  egdir;.  .    CO
0780: 4d 4d 49 54 3b 0a 20 20 7d 5d 0a 7d 0a 0a 64 6f  MMIT;.  }].}..do
0790: 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 65 78  _test 1.1 {.  ex
07a0: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 56  ecsql { CREATE V
07b0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 32 20  IRTUAL TABLE t2 
07c0: 55 53 49 4e 47 20 66 74 73 34 28 77 6f 72 64 73  USING fts4(words
07d0: 2c 20 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 22  , prefix="1,2,3"
07e0: 29 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 7b 64  ) }.  foreach {d
07f0: 6f 63 69 64 20 77 6f 72 64 73 7d 20 5b 64 62 20  ocid words} [db 
0800: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
0810: 46 52 4f 4d 20 74 31 20 7d 5d 20 7b 0a 20 20 20  FROM t1 }] {.   
0820: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0830: 54 20 49 4e 54 4f 20 74 32 28 64 6f 63 69 64 2c  T INTO t2(docid,
0840: 20 77 6f 72 64 73 29 20 56 41 4c 55 45 53 28 24   words) VALUES($
0850: 64 6f 63 69 64 2c 20 24 77 6f 72 64 73 29 20 7d  docid, $words) }
0860: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78  .  }.} {}..do_ex
0870: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 32 20 7b  ecsql_test 1.2 {
0880: 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c  .  SELECT level,
0890: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
08a0: 32 5f 73 65 67 64 69 72 20 47 52 4f 55 50 20 42  2_segdir GROUP B
08b0: 59 20 6c 65 76 65 6c 0a 7d 20 7b 0a 20 20 30 20  Y level.} {.  0 
08c0: 20 20 20 31 33 20 20 20 20 31 20 31 35 20 20 20     13    1 15   
08d0: 20 32 20 35 20 0a 20 20 31 30 32 34 20 31 33 20   2 5 .  1024 13 
08e0: 31 30 32 35 20 31 35 20 31 30 32 36 20 35 20 0a  1025 15 1026 5 .
08f0: 20 20 32 30 34 38 20 31 33 20 32 30 34 39 20 31    2048 13 2049 1
0900: 35 20 32 30 35 30 20 35 20 0a 20 20 33 30 37 32  5 2050 5 .  3072
0910: 20 31 33 20 33 30 37 33 20 31 35 20 33 30 37 34   13 3073 15 3074
0920: 20 35 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   5.}..do_execsql
0930: 5f 74 65 73 74 20 31 2e 33 20 7b 20 49 4e 53 45  _test 1.3 { INSE
0940: 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20 56  RT INTO t2(t2) V
0950: 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74 79  ALUES('integrity
0960: 2d 63 68 65 63 6b 27 29 20 7d 0a 70 72 65 70 61  -check') }.prepa
0970: 72 65 5f 66 6f 72 5f 6f 70 74 69 6d 69 7a 65 20  re_for_optimize 
0980: 64 62 20 74 32 0a 64 6f 5f 65 78 65 63 73 71 6c  db t2.do_execsql
0990: 5f 74 65 73 74 20 31 2e 34 20 7b 20 49 4e 53 45  _test 1.4 { INSE
09a0: 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20 56  RT INTO t2(t2) V
09b0: 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74 79  ALUES('integrity
09c0: 2d 63 68 65 63 6b 27 29 20 7d 0a 0a 64 6f 5f 65  -check') }..do_e
09d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 35 20  xecsql_test 1.5 
09e0: 7b 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65 6c  {.  SELECT level
09f0: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
0a00: 74 32 5f 73 65 67 64 69 72 20 47 52 4f 55 50 20  t2_segdir GROUP 
0a10: 42 59 20 6c 65 76 65 6c 0a 7d 20 7b 0a 20 20 33  BY level.} {.  3
0a20: 32 20 20 20 33 33 20 0a 20 20 31 30 35 36 20 33  2   33 .  1056 3
0a30: 33 20 0a 20 20 32 30 38 30 20 33 33 20 0a 20 20  3 .  2080 33 .  
0a40: 33 31 30 34 20 33 33 0a 7d 0a 0a 64 6f 5f 74 65  3104 33.}..do_te
0a50: 73 74 20 31 2e 36 20 7b 0a 20 20 77 68 69 6c 65  st 1.6 {.  while
0a60: 20 31 20 7b 0a 20 20 20 20 73 65 74 20 74 63 31   1 {.    set tc1
0a70: 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   [db total_chang
0a80: 65 73 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  es].    execsql 
0a90: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
0aa0: 28 74 32 29 20 56 41 4c 55 45 53 28 27 6d 65 72  (t2) VALUES('mer
0ab0: 67 65 3d 35 2c 32 27 29 20 7d 0a 20 20 20 20 73  ge=5,2') }.    s
0ac0: 65 74 20 74 63 32 20 5b 64 62 20 74 6f 74 61 6c  et tc2 [db total
0ad0: 5f 63 68 61 6e 67 65 73 5d 0a 20 20 20 20 69 66  _changes].    if
0ae0: 20 7b 28 24 74 63 32 20 2d 20 24 74 63 31 29 20   {($tc2 - $tc1) 
0af0: 3c 20 32 7d 20 62 72 65 61 6b 0a 20 20 7d 0a 20  < 2} break.  }. 
0b00: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0b10: 54 20 6c 65 76 65 6c 2c 20 63 6f 75 6e 74 28 2a  T level, count(*
0b20: 29 20 46 52 4f 4d 20 74 32 5f 73 65 67 64 69 72  ) FROM t2_segdir
0b30: 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 20   GROUP BY level 
0b40: 7d 0a 7d 20 7b 33 33 20 31 20 31 30 35 37 20 31  }.} {33 1 1057 1
0b50: 20 32 30 38 31 20 31 20 33 31 30 35 20 31 7d 0a   2081 1 3105 1}.
0b60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0b70: 31 2e 37 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  1.7 { INSERT INT
0b80: 4f 20 74 32 28 74 32 29 20 56 41 4c 55 45 53 28  O t2(t2) VALUES(
0b90: 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b  'integrity-check
0ba0: 27 29 20 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  ') }..do_execsql
0bb0: 5f 74 65 73 74 20 31 2e 38 20 7b 0a 20 20 49 4e  _test 1.8 {.  IN
0bc0: 53 45 52 54 20 49 4e 54 4f 20 74 32 28 77 6f 72  SERT INTO t2(wor
0bd0: 64 73 29 20 53 45 4c 45 43 54 20 77 6f 72 64 73  ds) SELECT words
0be0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
0bf0: 43 54 20 6c 65 76 65 6c 2c 20 63 6f 75 6e 74 28  CT level, count(
0c00: 2a 29 20 46 52 4f 4d 20 74 32 5f 73 65 67 64 69  *) FROM t2_segdi
0c10: 72 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c  r GROUP BY level
0c20: 3b 0a 7d 20 7b 30 20 32 20 31 30 32 34 20 32 20  ;.} {0 2 1024 2 
0c30: 32 30 34 38 20 32 20 33 30 37 32 20 32 7d 0a 0a  2048 2 3072 2}..
0c40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 65  ----------..do_e
0c90: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 30 20  xecsql_test 2.0 
0ca0: 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  {.  DELETE FROM 
0cb0: 74 32 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 32 2e  t2;.}.do_test 2.
0cc0: 31 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 64  1 {.  foreach {d
0cd0: 6f 63 69 64 20 77 6f 72 64 73 7d 20 5b 64 62 20  ocid words} [db 
0ce0: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
0cf0: 46 52 4f 4d 20 74 31 20 7d 5d 20 7b 0a 20 20 20  FROM t1 }] {.   
0d00: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0d10: 54 20 49 4e 54 4f 20 74 32 28 64 6f 63 69 64 2c  T INTO t2(docid,
0d20: 20 77 6f 72 64 73 29 20 56 41 4c 55 45 53 28 24   words) VALUES($
0d30: 64 6f 63 69 64 2c 20 24 77 6f 72 64 73 29 20 7d  docid, $words) }
0d40: 0a 20 20 7d 0a 0a 20 20 73 65 74 20 69 20 30 0a  .  }..  set i 0.
0d50: 20 20 66 6f 72 65 61 63 68 20 7b 64 6f 63 69 64    foreach {docid
0d60: 20 77 6f 72 64 73 7d 20 5b 64 62 20 65 76 61 6c   words} [db eval
0d70: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0d80: 20 74 31 20 7d 5d 20 7b 0a 20 20 20 20 69 66 20   t1 }] {.    if 
0d90: 7b 5b 69 6e 63 72 20 69 5d 20 25 20 32 7d 20 7b  {[incr i] % 2} {
0da0: 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54   execsql { DELET
0db0: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
0dc0: 64 6f 63 69 64 20 3d 20 24 64 6f 63 69 64 20 7d  docid = $docid }
0dd0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 69 20   }.  }..  set i 
0de0: 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 64 6f 63  0.  foreach {doc
0df0: 69 64 20 77 6f 72 64 73 7d 20 5b 64 62 20 65 76  id words} [db ev
0e00: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
0e10: 4f 4d 20 74 31 20 7d 5d 20 7b 0a 20 20 20 20 69  OM t1 }] {.    i
0e20: 66 20 7b 5b 69 6e 63 72 20 69 5d 20 25 20 33 7d  f {[incr i] % 3}
0e30: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
0e40: 20 7b 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50   { INSERT OR REP
0e50: 4c 41 43 45 20 49 4e 54 4f 20 74 32 28 64 6f 63  LACE INTO t2(doc
0e60: 69 64 2c 20 77 6f 72 64 73 29 20 56 41 4c 55 45  id, words) VALUE
0e70: 53 28 24 64 6f 63 69 64 2c 20 24 77 6f 72 64 73  S($docid, $words
0e80: 29 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20  ) }.    }.  }.} 
0e90: 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}..do_execsql_t
0ea0: 65 73 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c 45  est 2.2 {.  SELE
0eb0: 43 54 20 6c 65 76 65 6c 2c 20 63 6f 75 6e 74 28  CT level, count(
0ec0: 2a 29 20 46 52 4f 4d 20 74 32 5f 73 65 67 64 69  *) FROM t2_segdi
0ed0: 72 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c  r GROUP BY level
0ee0: 0a 7d 20 7b 0a 20 20 30 20 20 20 20 31 30 20 20  .} {.  0    10  
0ef0: 20 20 31 20 31 35 20 20 20 20 32 20 31 32 20 0a    1 15    2 12 .
0f00: 20 20 31 30 32 34 20 31 30 20 31 30 32 35 20 31    1024 10 1025 1
0f10: 35 20 31 30 32 36 20 31 32 20 0a 20 20 32 30 34  5 1026 12 .  204
0f20: 38 20 31 30 20 32 30 34 39 20 31 35 20 32 30 35  8 10 2049 15 205
0f30: 30 20 31 32 20 0a 20 20 33 30 37 32 20 31 30 20  0 12 .  3072 10 
0f40: 33 30 37 33 20 31 35 20 33 30 37 34 20 31 32 0a  3073 15 3074 12.
0f50: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
0f60: 73 74 20 32 2e 33 20 7b 20 49 4e 53 45 52 54 20  st 2.3 { INSERT 
0f70: 49 4e 54 4f 20 74 32 28 74 32 29 20 56 41 4c 55  INTO t2(t2) VALU
0f80: 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68  ES('integrity-ch
0f90: 65 63 6b 27 29 20 7d 0a 70 72 65 70 61 72 65 5f  eck') }.prepare_
0fa0: 66 6f 72 5f 6f 70 74 69 6d 69 7a 65 20 64 62 20  for_optimize db 
0fb0: 74 32 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t2.do_execsql_te
0fc0: 73 74 20 32 2e 34 20 7b 20 49 4e 53 45 52 54 20  st 2.4 { INSERT 
0fd0: 49 4e 54 4f 20 74 32 28 74 32 29 20 56 41 4c 55  INTO t2(t2) VALU
0fe0: 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68  ES('integrity-ch
0ff0: 65 63 6b 27 29 20 7d 0a 0a 64 6f 5f 65 78 65 63  eck') }..do_exec
1000: 73 71 6c 5f 74 65 73 74 20 32 2e 35 20 7b 0a 20  sql_test 2.5 {. 
1010: 20 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 63   SELECT level, c
1020: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 5f  ount(*) FROM t2_
1030: 73 65 67 64 69 72 20 47 52 4f 55 50 20 42 59 20  segdir GROUP BY 
1040: 6c 65 76 65 6c 0a 7d 20 7b 0a 20 20 20 20 33 32  level.} {.    32
1050: 20 33 37 20 0a 20 20 31 30 35 36 20 33 37 20 0a   37 .  1056 37 .
1060: 20 20 32 30 38 30 20 33 37 20 0a 20 20 33 31 30    2080 37 .  310
1070: 34 20 33 37 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  4 37.}..do_test 
1080: 32 2e 36 20 7b 0a 20 20 77 68 69 6c 65 20 31 20  2.6 {.  while 1 
1090: 7b 0a 20 20 20 20 73 65 74 20 74 63 31 20 5b 64  {.    set tc1 [d
10a0: 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d  b total_changes]
10b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
10c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32  NSERT INTO t2(t2
10d0: 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65 3d  ) VALUES('merge=
10e0: 35 2c 32 27 29 20 7d 0a 20 20 20 20 73 65 74 20  5,2') }.    set 
10f0: 74 63 32 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68  tc2 [db total_ch
1100: 61 6e 67 65 73 5d 0a 20 20 20 20 69 66 20 7b 28  anges].    if {(
1110: 24 74 63 32 20 2d 20 24 74 63 31 29 20 3c 20 32  $tc2 - $tc1) < 2
1120: 7d 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 65 78  } break.  }.  ex
1130: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c  ecsql { SELECT l
1140: 65 76 65 6c 2c 20 63 6f 75 6e 74 28 2a 29 20 46  evel, count(*) F
1150: 52 4f 4d 20 74 32 5f 73 65 67 64 69 72 20 47 52  ROM t2_segdir GR
1160: 4f 55 50 20 42 59 20 6c 65 76 65 6c 20 7d 0a 7d  OUP BY level }.}
1170: 20 7b 33 33 20 31 20 31 30 35 37 20 31 20 32 30   {33 1 1057 1 20
1180: 38 31 20 31 20 33 31 30 35 20 31 7d 0a 64 6f 5f  81 1 3105 1}.do_
1190: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 37  execsql_test 2.7
11a0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
11b0: 32 28 74 32 29 20 56 41 4c 55 45 53 28 27 69 6e  2(t2) VALUES('in
11c0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 27 29 20  tegrity-check') 
11d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
11e0: 73 74 20 32 2e 38 20 7b 0a 20 20 49 4e 53 45 52  st 2.8 {.  INSER
11f0: 54 20 49 4e 54 4f 20 74 32 28 77 6f 72 64 73 29  T INTO t2(words)
1200: 20 53 45 4c 45 43 54 20 77 6f 72 64 73 20 46 52   SELECT words FR
1210: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
1220: 6c 65 76 65 6c 2c 20 63 6f 75 6e 74 28 2a 29 20  level, count(*) 
1230: 46 52 4f 4d 20 74 32 5f 73 65 67 64 69 72 20 47  FROM t2_segdir G
1240: 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 3b 0a 7d  ROUP BY level;.}
1250: 20 7b 30 20 32 20 31 30 32 34 20 32 20 32 30 34   {0 2 1024 2 204
1260: 38 20 32 20 33 30 37 32 20 32 7d 0a 0a 23 2d 2d  8 2 3072 2}..#--
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
12c0: 74 68 61 74 20 27 6f 70 74 69 6d 69 7a 65 27 20  that 'optimize' 
12d0: 77 6f 72 6b 73 20 77 68 65 6e 20 74 68 65 72 65  works when there
12e0: 20 69 73 20 64 61 74 61 20 69 6e 20 74 68 65 20   is data in the 
12f0: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 0a 23  in-memory hash.#
1300: 20 74 61 62 6c 65 2c 20 62 75 74 20 6e 6f 20 73   table, but no s
1310: 65 67 6d 65 6e 74 73 20 61 74 20 61 6c 6c 20 6f  egments at all o
1320: 6e 20 64 69 73 6b 2e 0a 23 0a 64 6f 5f 65 78 65  n disk..#.do_exe
1330: 63 73 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a  csql_test 3.1 {.
1340: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1350: 20 54 41 42 4c 45 20 66 74 73 20 55 53 49 4e 47   TABLE fts USING
1360: 20 66 74 73 34 20 28 74 29 3b 0a 20 20 49 4e 53   fts4 (t);.  INS
1370: 45 52 54 20 49 4e 54 4f 20 66 74 73 20 28 66 74  ERT INTO fts (ft
1380: 73 29 20 56 41 4c 55 45 53 20 28 27 6f 70 74 69  s) VALUES ('opti
1390: 6d 69 7a 65 27 29 3b 0a 7d 0a 64 6f 5f 65 78 65  mize');.}.do_exe
13a0: 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 0a  csql_test 3.2 {.
13b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
13c0: 73 28 66 74 73 29 20 56 41 4c 55 45 53 28 27 69  s(fts) VALUES('i
13d0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 27 29  ntegrity-check')
13e0: 3b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  ;.  SELECT count
13f0: 28 2a 29 20 46 52 4f 4d 20 66 74 73 5f 73 65 67  (*) FROM fts_seg
1400: 64 69 72 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78  dir;.} {0}.do_ex
1410: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 33 20 7b  ecsql_test 3.3 {
1420: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 49 4e 53 45  .  BEGIN;.  INSE
1430: 52 54 20 49 4e 54 4f 20 66 74 73 20 28 72 6f 77  RT INTO fts (row
1440: 69 64 2c 20 74 29 20 56 41 4c 55 45 53 20 28 32  id, t) VALUES (2
1450: 2c 20 27 74 65 73 74 27 29 3b 0a 20 20 49 4e 53  , 'test');.  INS
1460: 45 52 54 20 49 4e 54 4f 20 66 74 73 20 28 66 74  ERT INTO fts (ft
1470: 73 29 20 56 41 4c 55 45 53 20 28 27 6f 70 74 69  s) VALUES ('opti
1480: 6d 69 7a 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54  mize');.  COMMIT
1490: 3b 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65 6c  ;.  SELECT level
14a0: 2c 20 69 64 78 20 46 52 4f 4d 20 66 74 73 5f 73  , idx FROM fts_s
14b0: 65 67 64 69 72 3b 0a 7d 20 7b 30 20 30 7d 0a 64  egdir;.} {0 0}.d
14c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  o_execsql_test 3
14d0: 2e 34 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  .4 {.  INSERT IN
14e0: 54 4f 20 66 74 73 28 66 74 73 29 20 56 41 4c 55  TO fts(fts) VALU
14f0: 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68  ES('integrity-ch
1500: 65 63 6b 27 29 3b 0a 20 20 53 45 4c 45 43 54 20  eck');.  SELECT 
1510: 72 6f 77 69 64 20 46 52 4f 4d 20 66 74 73 20 57  rowid FROM fts W
1520: 48 45 52 45 20 66 74 73 20 4d 41 54 43 48 20 27  HERE fts MATCH '
1530: 74 65 73 74 27 3b 0a 7d 20 7b 32 7d 0a 64 6f 5f  test';.} {2}.do_
1540: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 35  execsql_test 3.5
1550: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
1560: 20 66 74 73 20 28 66 74 73 29 20 56 41 4c 55 45   fts (fts) VALUE
1570: 53 20 28 27 6f 70 74 69 6d 69 7a 65 27 29 3b 0a  S ('optimize');.
1580: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
1590: 73 28 66 74 73 29 20 56 41 4c 55 45 53 28 27 69  s(fts) VALUES('i
15a0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 27 29  ntegrity-check')
15b0: 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 33 2e 36 20  ;.}.do_test 3.6 
15c0: 7b 0a 20 20 73 65 74 20 63 31 20 5b 64 62 20 74  {.  set c1 [db t
15d0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 0a 20 20  otal_changes].  
15e0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
15f0: 20 49 4e 54 4f 20 66 74 73 20 28 66 74 73 29 20   INTO fts (fts) 
1600: 56 41 4c 55 45 53 20 28 27 6f 70 74 69 6d 69 7a  VALUES ('optimiz
1610: 65 27 29 20 7d 0a 20 20 65 78 70 72 20 7b 5b 64  e') }.  expr {[d
1620: 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d  b total_changes]
1630: 20 2d 20 24 63 31 7d 0a 7d 20 7b 31 7d 0a 64 6f   - $c1}.} {1}.do
1640: 5f 74 65 73 74 20 33 2e 37 20 7b 0a 20 20 65 78  _test 3.7 {.  ex
1650: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
1660: 4e 54 4f 20 66 74 73 20 28 72 6f 77 69 64 2c 20  NTO fts (rowid, 
1670: 74 29 20 56 41 4c 55 45 53 20 28 33 2c 20 27 78  t) VALUES (3, 'x
1680: 79 7a 27 29 20 7d 0a 20 20 73 65 74 20 63 31 20  yz') }.  set c1 
1690: 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  [db total_change
16a0: 73 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49  s].  execsql { I
16b0: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 20 28  NSERT INTO fts (
16c0: 66 74 73 29 20 56 41 4c 55 45 53 20 28 27 6f 70  fts) VALUES ('op
16d0: 74 69 6d 69 7a 65 27 29 20 7d 0a 20 20 65 78 70  timize') }.  exp
16e0: 72 20 7b 28 5b 64 62 20 74 6f 74 61 6c 5f 63 68  r {([db total_ch
16f0: 61 6e 67 65 73 5d 20 2d 20 24 63 31 29 20 3e 20  anges] - $c1) > 
1700: 31 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  1}.} {1}.do_test
1710: 20 33 2e 38 20 7b 0a 20 20 73 65 74 20 63 31 20   3.8 {.  set c1 
1720: 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  [db total_change
1730: 73 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49  s].  execsql { I
1740: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 20 28  NSERT INTO fts (
1750: 66 74 73 29 20 56 41 4c 55 45 53 20 28 27 6f 70  fts) VALUES ('op
1760: 74 69 6d 69 7a 65 27 29 20 7d 0a 20 20 65 78 70  timize') }.  exp
1770: 72 20 7b 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61  r {[db total_cha
1780: 6e 67 65 73 5d 20 2d 20 24 63 31 7d 0a 7d 20 7b  nges] - $c1}.} {
1790: 31 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  1}..finish_test.