/ Hex Artifact Content
Login

Artifact 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a:


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 73 71   {db tbl} {.  sq
04d0: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20  lite3_db_config 
04e0: 24 64 62 20 44 45 46 45 4e 53 49 56 45 20 30 0a  $db DEFENSIVE 0.
04f0: 20 20 24 64 62 20 65 76 61 6c 20 5b 73 74 72 69    $db eval [stri
0500: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 25 20 24  ng map [list % $
0510: 74 62 6c 5d 20 7b 0a 20 20 20 20 42 45 47 49 4e  tbl] {.    BEGIN
0520: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
0530: 45 4d 50 20 54 41 42 4c 45 20 74 6d 70 5f 73 65  EMP TABLE tmp_se
0540: 67 64 69 72 28 0a 20 20 20 20 20 20 20 20 6c 65  gdir(.        le
0550: 76 65 6c 2c 20 69 64 78 2c 20 73 74 61 72 74 5f  vel, idx, start_
0560: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
0570: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
0580: 63 6b 2c 20 72 6f 6f 74 0a 20 20 20 20 20 20 29  ck, root.      )
0590: 3b 0a 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  ;..      INSERT 
05a0: 49 4e 54 4f 20 74 65 6d 70 2e 74 6d 70 5f 73 65  INTO temp.tmp_se
05b0: 67 64 69 72 20 0a 20 20 20 20 20 20 20 20 53 45  gdir .        SE
05c0: 4c 45 43 54 20 0a 20 20 20 20 20 20 20 20 31 30  LECT .        10
05d0: 32 34 2a 28 6f 2e 6c 65 76 65 6c 20 2f 20 31 30  24*(o.level / 10
05e0: 32 34 29 20 2b 20 33 32 2c 20 20 20 20 20 20 20  24) + 32,       
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 65 76 65           -- leve
0610: 6c 0a 20 20 20 20 20 20 20 20 73 75 6d 28 6f 2e  l.        sum(o.
0620: 6c 65 76 65 6c 3c 69 2e 6c 65 76 65 6c 20 4f 52  level<i.level OR
0630: 20 28 6f 2e 6c 65 76 65 6c 3d 69 2e 6c 65 76 65   (o.level=i.leve
0640: 6c 20 41 4e 44 20 6f 2e 69 64 78 3e 69 2e 69 64  l AND o.idx>i.id
0650: 78 29 29 2c 20 2d 2d 20 69 64 78 0a 20 20 20 20  x)), -- idx.    
0660: 20 20 20 20 6f 2e 73 74 61 72 74 5f 62 6c 6f 63      o.start_bloc
0670: 6b 2c 20 6f 2e 6c 65 61 76 65 73 5f 65 6e 64 5f  k, o.leaves_end_
0680: 62 6c 6f 63 6b 2c 20 6f 2e 65 6e 64 5f 62 6c 6f  block, o.end_blo
0690: 63 6b 2c 20 6f 2e 72 6f 6f 74 20 20 20 20 20 2d  ck, o.root     -
06a0: 2d 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  - other.        
06b0: 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 6f 2c  FROM %_segdir o,
06c0: 20 25 5f 73 65 67 64 69 72 20 69 20 0a 20 20 20   %_segdir i .   
06d0: 20 20 20 20 20 57 48 45 52 45 20 28 6f 2e 6c 65       WHERE (o.le
06e0: 76 65 6c 20 2f 20 31 30 32 34 29 20 3d 20 28 69  vel / 1024) = (i
06f0: 2e 6c 65 76 65 6c 20 2f 20 31 30 32 34 29 0a 20  .level / 1024). 
0700: 20 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20         GROUP BY 
0710: 6f 2e 6c 65 76 65 6c 2c 20 6f 2e 69 64 78 3b 0a  o.level, o.idx;.
0720: 20 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20    .      DELETE 
0730: 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 3b 0a 20  FROM %_segdir;. 
0740: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0750: 20 25 5f 73 65 67 64 69 72 20 53 45 4c 45 43 54   %_segdir SELECT
0760: 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 74 6d 70   * FROM temp.tmp
0770: 5f 73 65 67 64 69 72 3b 0a 20 20 20 20 20 20 44  _segdir;.      D
0780: 52 4f 50 20 54 41 42 4c 45 20 74 65 6d 70 2e 74  ROP TABLE temp.t
0790: 6d 70 5f 73 65 67 64 69 72 3b 0a 20 20 0a 20 20  mp_segdir;.  .  
07a0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 5d 0a 7d    COMMIT;.  }].}
07b0: 0a 0a 64 6f 5f 74 65 73 74 20 31 2e 31 20 7b 0a  ..do_test 1.1 {.
07c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
07d0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
07e0: 20 74 32 20 55 53 49 4e 47 20 66 74 73 34 28 77   t2 USING fts4(w
07f0: 6f 72 64 73 2c 20 70 72 65 66 69 78 3d 22 31 2c  ords, prefix="1,
0800: 32 2c 33 22 29 20 7d 0a 20 20 66 6f 72 65 61 63  2,3") }.  foreac
0810: 68 20 7b 64 6f 63 69 64 20 77 6f 72 64 73 7d 20  h {docid words} 
0820: 5b 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43  [db eval { SELEC
0830: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 7b  T * FROM t1 }] {
0840: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
0850: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 64 6f  NSERT INTO t2(do
0860: 63 69 64 2c 20 77 6f 72 64 73 29 20 56 41 4c 55  cid, words) VALU
0870: 45 53 28 24 64 6f 63 69 64 2c 20 24 77 6f 72 64  ES($docid, $word
0880: 73 29 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  s) }.  }.} {}..d
0890: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
08a0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c 65  .2 {.  SELECT le
08b0: 76 65 6c 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  vel, count(*) FR
08c0: 4f 4d 20 74 32 5f 73 65 67 64 69 72 20 47 52 4f  OM t2_segdir GRO
08d0: 55 50 20 42 59 20 6c 65 76 65 6c 0a 7d 20 7b 0a  UP BY level.} {.
08e0: 20 20 30 20 20 20 20 31 33 20 20 20 20 31 20 31    0    13    1 1
08f0: 35 20 20 20 20 32 20 35 20 0a 20 20 31 30 32 34  5    2 5 .  1024
0900: 20 31 33 20 31 30 32 35 20 31 35 20 31 30 32 36   13 1025 15 1026
0910: 20 35 20 0a 20 20 32 30 34 38 20 31 33 20 32 30   5 .  2048 13 20
0920: 34 39 20 31 35 20 32 30 35 30 20 35 20 0a 20 20  49 15 2050 5 .  
0930: 33 30 37 32 20 31 33 20 33 30 37 33 20 31 35 20  3072 13 3073 15 
0940: 33 30 37 34 20 35 0a 7d 0a 0a 64 6f 5f 65 78 65  3074 5.}..do_exe
0950: 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 20 7b 20  csql_test 1.3 { 
0960: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74  INSERT INTO t2(t
0970: 32 29 20 56 41 4c 55 45 53 28 27 69 6e 74 65 67  2) VALUES('integ
0980: 72 69 74 79 2d 63 68 65 63 6b 27 29 20 7d 0a 70  rity-check') }.p
0990: 72 65 70 61 72 65 5f 66 6f 72 5f 6f 70 74 69 6d  repare_for_optim
09a0: 69 7a 65 20 64 62 20 74 32 0a 64 6f 5f 65 78 65  ize db t2.do_exe
09b0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 34 20 7b 20  csql_test 1.4 { 
09c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74  INSERT INTO t2(t
09d0: 32 29 20 56 41 4c 55 45 53 28 27 69 6e 74 65 67  2) VALUES('integ
09e0: 72 69 74 79 2d 63 68 65 63 6b 27 29 20 7d 0a 0a  rity-check') }..
09f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0a00: 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c  1.5 {.  SELECT l
0a10: 65 76 65 6c 2c 20 63 6f 75 6e 74 28 2a 29 20 46  evel, count(*) F
0a20: 52 4f 4d 20 74 32 5f 73 65 67 64 69 72 20 47 52  ROM t2_segdir GR
0a30: 4f 55 50 20 42 59 20 6c 65 76 65 6c 0a 7d 20 7b  OUP BY level.} {
0a40: 0a 20 20 33 32 20 20 20 33 33 20 0a 20 20 31 30  .  32   33 .  10
0a50: 35 36 20 33 33 20 0a 20 20 32 30 38 30 20 33 33  56 33 .  2080 33
0a60: 20 0a 20 20 33 31 30 34 20 33 33 0a 7d 0a 0a 64   .  3104 33.}..d
0a70: 6f 5f 74 65 73 74 20 31 2e 36 20 7b 0a 20 20 77  o_test 1.6 {.  w
0a80: 68 69 6c 65 20 31 20 7b 0a 20 20 20 20 73 65 74  hile 1 {.    set
0a90: 20 74 63 31 20 5b 64 62 20 74 6f 74 61 6c 5f 63   tc1 [db total_c
0aa0: 68 61 6e 67 65 73 5d 0a 20 20 20 20 65 78 65 63  hanges].    exec
0ab0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0ac0: 4f 20 74 32 28 74 32 29 20 56 41 4c 55 45 53 28  O t2(t2) VALUES(
0ad0: 27 6d 65 72 67 65 3d 35 2c 32 27 29 20 7d 0a 20  'merge=5,2') }. 
0ae0: 20 20 20 73 65 74 20 74 63 32 20 5b 64 62 20 74     set tc2 [db t
0af0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 0a 20 20  otal_changes].  
0b00: 20 20 69 66 20 7b 28 24 74 63 32 20 2d 20 24 74    if {($tc2 - $t
0b10: 63 31 29 20 3c 20 32 7d 20 62 72 65 61 6b 0a 20  c1) < 2} break. 
0b20: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0b30: 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 63 6f 75  ELECT level, cou
0b40: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 5f 73 65  nt(*) FROM t2_se
0b50: 67 64 69 72 20 47 52 4f 55 50 20 42 59 20 6c 65  gdir GROUP BY le
0b60: 76 65 6c 20 7d 0a 7d 20 7b 33 33 20 31 20 31 30  vel }.} {33 1 10
0b70: 35 37 20 31 20 32 30 38 31 20 31 20 33 31 30 35  57 1 2081 1 3105
0b80: 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   1}.do_execsql_t
0b90: 65 73 74 20 31 2e 37 20 7b 20 49 4e 53 45 52 54  est 1.7 { INSERT
0ba0: 20 49 4e 54 4f 20 74 32 28 74 32 29 20 56 41 4c   INTO t2(t2) VAL
0bb0: 55 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63  UES('integrity-c
0bc0: 68 65 63 6b 27 29 20 7d 0a 0a 64 6f 5f 65 78 65  heck') }..do_exe
0bd0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 38 20 7b 0a  csql_test 1.8 {.
0be0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0bf0: 28 77 6f 72 64 73 29 20 53 45 4c 45 43 54 20 77  (words) SELECT w
0c00: 6f 72 64 73 20 46 52 4f 4d 20 74 31 3b 0a 20 20  ords FROM t1;.  
0c10: 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 63 6f  SELECT level, co
0c20: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 5f 73  unt(*) FROM t2_s
0c30: 65 67 64 69 72 20 47 52 4f 55 50 20 42 59 20 6c  egdir GROUP BY l
0c40: 65 76 65 6c 3b 0a 7d 20 7b 30 20 32 20 31 30 32  evel;.} {0 2 102
0c50: 34 20 32 20 32 30 34 38 20 32 20 33 30 37 32 20  4 2 2048 2 3072 
0c60: 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2}..#-----------
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 2d 2d 2d 2d 2d 2d  ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a  --------------..
0cb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0cc0: 32 2e 30 20 7b 0a 20 20 44 45 4c 45 54 45 20 46  2.0 {.  DELETE F
0cd0: 52 4f 4d 20 74 32 3b 0a 7d 0a 64 6f 5f 74 65 73  ROM t2;.}.do_tes
0ce0: 74 20 32 2e 31 20 7b 0a 20 20 66 6f 72 65 61 63  t 2.1 {.  foreac
0cf0: 68 20 7b 64 6f 63 69 64 20 77 6f 72 64 73 7d 20  h {docid words} 
0d00: 5b 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43  [db eval { SELEC
0d10: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 7b  T * FROM t1 }] {
0d20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
0d30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 64 6f  NSERT INTO t2(do
0d40: 63 69 64 2c 20 77 6f 72 64 73 29 20 56 41 4c 55  cid, words) VALU
0d50: 45 53 28 24 64 6f 63 69 64 2c 20 24 77 6f 72 64  ES($docid, $word
0d60: 73 29 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  s) }.  }..  set 
0d70: 69 20 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 64  i 0.  foreach {d
0d80: 6f 63 69 64 20 77 6f 72 64 73 7d 20 5b 64 62 20  ocid words} [db 
0d90: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
0da0: 46 52 4f 4d 20 74 31 20 7d 5d 20 7b 0a 20 20 20  FROM t1 }] {.   
0db0: 20 69 66 20 7b 5b 69 6e 63 72 20 69 5d 20 25 20   if {[incr i] % 
0dc0: 32 7d 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 44  2} { execsql { D
0dd0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48  ELETE FROM t2 WH
0de0: 45 52 45 20 64 6f 63 69 64 20 3d 20 24 64 6f 63  ERE docid = $doc
0df0: 69 64 20 7d 20 7d 0a 20 20 7d 0a 0a 20 20 73 65  id } }.  }..  se
0e00: 74 20 69 20 30 0a 20 20 66 6f 72 65 61 63 68 20  t i 0.  foreach 
0e10: 7b 64 6f 63 69 64 20 77 6f 72 64 73 7d 20 5b 64  {docid words} [d
0e20: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
0e30: 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 7b 0a 20  * FROM t1 }] {. 
0e40: 20 20 20 69 66 20 7b 5b 69 6e 63 72 20 69 5d 20     if {[incr i] 
0e50: 25 20 33 7d 20 7b 0a 20 20 20 20 20 20 65 78 65  % 3} {.      exe
0e60: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 4f 52  csql { INSERT OR
0e70: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 32   REPLACE INTO t2
0e80: 28 64 6f 63 69 64 2c 20 77 6f 72 64 73 29 20 56  (docid, words) V
0e90: 41 4c 55 45 53 28 24 64 6f 63 69 64 2c 20 24 77  ALUES($docid, $w
0ea0: 6f 72 64 73 29 20 7d 0a 20 20 20 20 7d 0a 20 20  ords) }.    }.  
0eb0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73  }.} {}..do_execs
0ec0: 71 6c 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20  ql_test 2.2 {.  
0ed0: 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 63 6f  SELECT level, co
0ee0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 5f 73  unt(*) FROM t2_s
0ef0: 65 67 64 69 72 20 47 52 4f 55 50 20 42 59 20 6c  egdir GROUP BY l
0f00: 65 76 65 6c 0a 7d 20 7b 0a 20 20 30 20 20 20 20  evel.} {.  0    
0f10: 31 30 20 20 20 20 31 20 31 35 20 20 20 20 32 20  10    1 15    2 
0f20: 31 32 20 0a 20 20 31 30 32 34 20 31 30 20 31 30  12 .  1024 10 10
0f30: 32 35 20 31 35 20 31 30 32 36 20 31 32 20 0a 20  25 15 1026 12 . 
0f40: 20 32 30 34 38 20 31 30 20 32 30 34 39 20 31 35   2048 10 2049 15
0f50: 20 32 30 35 30 20 31 32 20 0a 20 20 33 30 37 32   2050 12 .  3072
0f60: 20 31 30 20 33 30 37 33 20 31 35 20 33 30 37 34   10 3073 15 3074
0f70: 20 31 32 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   12.}..do_execsq
0f80: 6c 5f 74 65 73 74 20 32 2e 33 20 7b 20 49 4e 53  l_test 2.3 { INS
0f90: 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20  ERT INTO t2(t2) 
0fa0: 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74  VALUES('integrit
0fb0: 79 2d 63 68 65 63 6b 27 29 20 7d 0a 70 72 65 70  y-check') }.prep
0fc0: 61 72 65 5f 66 6f 72 5f 6f 70 74 69 6d 69 7a 65  are_for_optimize
0fd0: 20 64 62 20 74 32 0a 64 6f 5f 65 78 65 63 73 71   db t2.do_execsq
0fe0: 6c 5f 74 65 73 74 20 32 2e 34 20 7b 20 49 4e 53  l_test 2.4 { INS
0ff0: 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20  ERT INTO t2(t2) 
1000: 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74  VALUES('integrit
1010: 79 2d 63 68 65 63 6b 27 29 20 7d 0a 0a 64 6f 5f  y-check') }..do_
1020: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 35  execsql_test 2.5
1030: 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65   {.  SELECT leve
1040: 6c 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  l, count(*) FROM
1050: 20 74 32 5f 73 65 67 64 69 72 20 47 52 4f 55 50   t2_segdir GROUP
1060: 20 42 59 20 6c 65 76 65 6c 0a 7d 20 7b 0a 20 20   BY level.} {.  
1070: 20 20 33 32 20 33 37 20 0a 20 20 31 30 35 36 20    32 37 .  1056 
1080: 33 37 20 0a 20 20 32 30 38 30 20 33 37 20 0a 20  37 .  2080 37 . 
1090: 20 33 31 30 34 20 33 37 0a 7d 0a 0a 64 6f 5f 74   3104 37.}..do_t
10a0: 65 73 74 20 32 2e 36 20 7b 0a 20 20 77 68 69 6c  est 2.6 {.  whil
10b0: 65 20 31 20 7b 0a 20 20 20 20 73 65 74 20 74 63  e 1 {.    set tc
10c0: 31 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e  1 [db total_chan
10d0: 67 65 73 5d 0a 20 20 20 20 65 78 65 63 73 71 6c  ges].    execsql
10e0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
10f0: 32 28 74 32 29 20 56 41 4c 55 45 53 28 27 6d 65  2(t2) VALUES('me
1100: 72 67 65 3d 35 2c 32 27 29 20 7d 0a 20 20 20 20  rge=5,2') }.    
1110: 73 65 74 20 74 63 32 20 5b 64 62 20 74 6f 74 61  set tc2 [db tota
1120: 6c 5f 63 68 61 6e 67 65 73 5d 0a 20 20 20 20 69  l_changes].    i
1130: 66 20 7b 28 24 74 63 32 20 2d 20 24 74 63 31 29  f {($tc2 - $tc1)
1140: 20 3c 20 32 7d 20 62 72 65 61 6b 0a 20 20 7d 0a   < 2} break.  }.
1150: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1160: 43 54 20 6c 65 76 65 6c 2c 20 63 6f 75 6e 74 28  CT level, count(
1170: 2a 29 20 46 52 4f 4d 20 74 32 5f 73 65 67 64 69  *) FROM t2_segdi
1180: 72 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c  r GROUP BY level
1190: 20 7d 0a 7d 20 7b 33 33 20 31 20 31 30 35 37 20   }.} {33 1 1057 
11a0: 31 20 32 30 38 31 20 31 20 33 31 30 35 20 31 7d  1 2081 1 3105 1}
11b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
11c0: 20 32 2e 37 20 7b 20 49 4e 53 45 52 54 20 49 4e   2.7 { INSERT IN
11d0: 54 4f 20 74 32 28 74 32 29 20 56 41 4c 55 45 53  TO t2(t2) VALUES
11e0: 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  ('integrity-chec
11f0: 6b 27 29 20 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  k') }..do_execsq
1200: 6c 5f 74 65 73 74 20 32 2e 38 20 7b 0a 20 20 49  l_test 2.8 {.  I
1210: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 77 6f  NSERT INTO t2(wo
1220: 72 64 73 29 20 53 45 4c 45 43 54 20 77 6f 72 64  rds) SELECT word
1230: 73 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  s FROM t1;.  SEL
1240: 45 43 54 20 6c 65 76 65 6c 2c 20 63 6f 75 6e 74  ECT level, count
1250: 28 2a 29 20 46 52 4f 4d 20 74 32 5f 73 65 67 64  (*) FROM t2_segd
1260: 69 72 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65  ir GROUP BY leve
1270: 6c 3b 0a 7d 20 7b 30 20 32 20 31 30 32 34 20 32  l;.} {0 2 1024 2
1280: 20 32 30 34 38 20 32 20 33 30 37 32 20 32 7d 0a   2048 2 3072 2}.
1290: 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
12e0: 65 63 6b 20 74 68 61 74 20 27 6f 70 74 69 6d 69  eck that 'optimi
12f0: 7a 65 27 20 77 6f 72 6b 73 20 77 68 65 6e 20 74  ze' works when t
1300: 68 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20  here is data in 
1310: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
1320: 73 68 0a 23 20 74 61 62 6c 65 2c 20 62 75 74 20  sh.# table, but 
1330: 6e 6f 20 73 65 67 6d 65 6e 74 73 20 61 74 20 61  no segments at a
1340: 6c 6c 20 6f 6e 20 64 69 73 6b 2e 0a 23 0a 64 6f  ll on disk..#.do
1350: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
1360: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  1 {.  CREATE VIR
1370: 54 55 41 4c 20 54 41 42 4c 45 20 66 74 73 20 55  TUAL TABLE fts U
1380: 53 49 4e 47 20 66 74 73 34 20 28 74 29 3b 0a 20  SING fts4 (t);. 
1390: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73   INSERT INTO fts
13a0: 20 28 66 74 73 29 20 56 41 4c 55 45 53 20 28 27   (fts) VALUES ('
13b0: 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 7d 0a 64 6f  optimize');.}.do
13c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
13d0: 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2 {.  INSERT INT
13e0: 4f 20 66 74 73 28 66 74 73 29 20 56 41 4c 55 45  O fts(fts) VALUE
13f0: 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65  S('integrity-che
1400: 63 6b 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 63  ck');.  SELECT c
1410: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 66 74 73  ount(*) FROM fts
1420: 5f 73 65 67 64 69 72 3b 0a 7d 20 7b 30 7d 0a 64  _segdir;.} {0}.d
1430: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  o_execsql_test 3
1440: 2e 33 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .3 {.  BEGIN;.  
1450: 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 20  INSERT INTO fts 
1460: 28 72 6f 77 69 64 2c 20 74 29 20 56 41 4c 55 45  (rowid, t) VALUE
1470: 53 20 28 32 2c 20 27 74 65 73 74 27 29 3b 0a 20  S (2, 'test');. 
1480: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73   INSERT INTO fts
1490: 20 28 66 74 73 29 20 56 41 4c 55 45 53 20 28 27   (fts) VALUES ('
14a0: 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 20 20 43 4f  optimize');.  CO
14b0: 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 6c  MMIT;.  SELECT l
14c0: 65 76 65 6c 2c 20 69 64 78 20 46 52 4f 4d 20 66  evel, idx FROM f
14d0: 74 73 5f 73 65 67 64 69 72 3b 0a 7d 20 7b 30 20  ts_segdir;.} {0 
14e0: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
14f0: 73 74 20 33 2e 34 20 7b 0a 20 20 49 4e 53 45 52  st 3.4 {.  INSER
1500: 54 20 49 4e 54 4f 20 66 74 73 28 66 74 73 29 20  T INTO fts(fts) 
1510: 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74  VALUES('integrit
1520: 79 2d 63 68 65 63 6b 27 29 3b 0a 20 20 53 45 4c  y-check');.  SEL
1530: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 66  ECT rowid FROM f
1540: 74 73 20 57 48 45 52 45 20 66 74 73 20 4d 41 54  ts WHERE fts MAT
1550: 43 48 20 27 74 65 73 74 27 3b 0a 7d 20 7b 32 7d  CH 'test';.} {2}
1560: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1570: 20 33 2e 35 20 7b 0a 20 20 49 4e 53 45 52 54 20   3.5 {.  INSERT 
1580: 49 4e 54 4f 20 66 74 73 20 28 66 74 73 29 20 56  INTO fts (fts) V
1590: 41 4c 55 45 53 20 28 27 6f 70 74 69 6d 69 7a 65  ALUES ('optimize
15a0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
15b0: 4f 20 66 74 73 28 66 74 73 29 20 56 41 4c 55 45  O fts(fts) VALUE
15c0: 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65  S('integrity-che
15d0: 63 6b 27 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20  ck');.}.do_test 
15e0: 33 2e 36 20 7b 0a 20 20 73 65 74 20 63 31 20 5b  3.6 {.  set c1 [
15f0: 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
1600: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  ].  execsql { IN
1610: 53 45 52 54 20 49 4e 54 4f 20 66 74 73 20 28 66  SERT INTO fts (f
1620: 74 73 29 20 56 41 4c 55 45 53 20 28 27 6f 70 74  ts) VALUES ('opt
1630: 69 6d 69 7a 65 27 29 20 7d 0a 20 20 65 78 70 72  imize') }.  expr
1640: 20 7b 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e   {[db total_chan
1650: 67 65 73 5d 20 2d 20 24 63 31 7d 0a 7d 20 7b 31  ges] - $c1}.} {1
1660: 7d 0a 64 6f 5f 74 65 73 74 20 33 2e 37 20 7b 0a  }.do_test 3.7 {.
1670: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
1680: 52 54 20 49 4e 54 4f 20 66 74 73 20 28 72 6f 77  RT INTO fts (row
1690: 69 64 2c 20 74 29 20 56 41 4c 55 45 53 20 28 33  id, t) VALUES (3
16a0: 2c 20 27 78 79 7a 27 29 20 7d 0a 20 20 73 65 74  , 'xyz') }.  set
16b0: 20 63 31 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68   c1 [db total_ch
16c0: 61 6e 67 65 73 5d 0a 20 20 65 78 65 63 73 71 6c  anges].  execsql
16d0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66   { INSERT INTO f
16e0: 74 73 20 28 66 74 73 29 20 56 41 4c 55 45 53 20  ts (fts) VALUES 
16f0: 28 27 6f 70 74 69 6d 69 7a 65 27 29 20 7d 0a 20  ('optimize') }. 
1700: 20 65 78 70 72 20 7b 28 5b 64 62 20 74 6f 74 61   expr {([db tota
1710: 6c 5f 63 68 61 6e 67 65 73 5d 20 2d 20 24 63 31  l_changes] - $c1
1720: 29 20 3e 20 31 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f  ) > 1}.} {1}.do_
1730: 74 65 73 74 20 33 2e 38 20 7b 0a 20 20 73 65 74  test 3.8 {.  set
1740: 20 63 31 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68   c1 [db total_ch
1750: 61 6e 67 65 73 5d 0a 20 20 65 78 65 63 73 71 6c  anges].  execsql
1760: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66   { INSERT INTO f
1770: 74 73 20 28 66 74 73 29 20 56 41 4c 55 45 53 20  ts (fts) VALUES 
1780: 28 27 6f 70 74 69 6d 69 7a 65 27 29 20 7d 0a 20  ('optimize') }. 
1790: 20 65 78 70 72 20 7b 5b 64 62 20 74 6f 74 61 6c   expr {[db total
17a0: 5f 63 68 61 6e 67 65 73 5d 20 2d 20 24 63 31 7d  _changes] - $c1}
17b0: 0a 7d 20 7b 31 7d 0a 0a 66 69 6e 69 73 68 5f 74  .} {1}..finish_t
17c0: 65 73 74 0a                                      est.