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

Artifact c7ee5fbb3b316d1496f1d2fa861c53840b84cef9:


0000: 23 20 32 30 31 32 20 4d 61 72 63 68 20 30 36 0a  # 2012 March 06.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 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 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 73 63 72 69 70 74 20   of this script 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 69  is testing the i
01d0: 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
01e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 0a 73 65   function..#..se
01f0: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0200: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
0210: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0220: 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63  tester.tcl.sourc
0230: 65 20 24 74 65 73 74 64 69 72 2f 66 74 73 33 5f  e $testdir/fts3_
0240: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 65 74 20 3a  common.tcl.set :
0250: 3a 74 65 73 74 70 72 65 66 69 78 20 66 74 73 34  :testprefix fts4
0260: 6d 65 72 67 65 0a 0a 23 20 49 66 20 53 51 4c 49  merge..# If SQLI
0270: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 69  TE_ENABLE_FTS3 i
0280: 73 20 64 65 66 69 6e 65 64 2c 20 6f 6d 69 74 20  s defined, omit 
0290: 74 68 69 73 20 66 69 6c 65 2e 0a 69 66 63 61 70  this file..ifcap
02a0: 61 62 6c 65 20 21 66 74 73 33 20 7b 0a 20 20 66  able !fts3 {.  f
02b0: 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74  inish_test.  ret
02c0: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 66 74 73 33  urn.}..proc fts3
02d0: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
02e0: 20 7b 74 62 6c 7d 20 7b 0a 20 20 64 62 20 65 76   {tbl} {.  db ev
02f0: 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
0300: 24 74 62 6c 20 28 24 74 62 6c 29 20 56 41 4c 55  $tbl ($tbl) VALU
0310: 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68  ES('integrity-ch
0320: 65 63 6b 27 29 22 0a 20 20 72 65 74 75 72 6e 20  eck')".  return 
0330: 22 6f 6b 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  "ok".}..#-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
0390: 31 2e 2a 0a 23 0a 64 6f 5f 74 65 73 74 20 31 2e  1.*.#.do_test 1.
03a0: 30 20 7b 20 66 74 73 33 5f 62 75 69 6c 64 5f 64  0 { fts3_build_d
03b0: 62 5f 31 20 31 30 30 34 20 7d 20 7b 7d 0a 64 6f  b_1 1004 } {}.do
03c0: 5f 74 65 73 74 20 31 2e 31 20 7b 20 66 74 73 33  _test 1.1 { fts3
03d0: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
03e0: 20 74 31 20 7d 20 7b 6f 6b 7d 0a 64 6f 5f 65 78   t1 } {ok}.do_ex
03f0: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 20 7b  ecsql_test 1.1 {
0400: 20 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65 6c   .  SELECT level
0410: 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 69  , group_concat(i
0420: 64 78 2c 20 27 20 27 29 20 46 52 4f 4d 20 74 31  dx, ' ') FROM t1
0430: 5f 73 65 67 64 69 72 20 47 52 4f 55 50 20 42 59  _segdir GROUP BY
0440: 20 6c 65 76 65 6c 20 0a 7d 20 7b 0a 20 20 30 20   level .} {.  0 
0450: 7b 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37  {0 1 2 3 4 5 6 7
0460: 20 38 20 39 20 31 30 20 31 31 7d 20 0a 20 20 31   8 9 10 11} .  1
0470: 20 7b 30 20 31 20 32 20 33 20 34 20 35 20 36 20   {0 1 2 3 4 5 6 
0480: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
0490: 33 7d 0a 20 20 32 20 7b 30 20 31 20 32 7d 0a 7d  3}.  2 {0 1 2}.}
04a0: 0a 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20  ..for {set i 0} 
04b0: 7b 24 69 3c 32 30 7d 20 7b 69 6e 63 72 20 69 7d  {$i<20} {incr i}
04c0: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
04d0: 74 65 73 74 20 31 2e 32 2e 24 69 2e 31 20 7b 20  test 1.2.$i.1 { 
04e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 74  INSERT INTO t1(t
04f0: 31 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65  1) VALUES('merge
0500: 3d 31 27 29 20 7d 0a 20 20 64 6f 5f 74 65 73 74  =1') }.  do_test
0510: 20 31 2e 32 2e 24 69 2e 32 20 7b 20 66 74 73 33   1.2.$i.2 { fts3
0520: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
0530: 20 74 31 20 7d 20 6f 6b 0a 20 20 64 6f 5f 65 78   t1 } ok.  do_ex
0540: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 32 2e 24  ecsql_test 1.2.$
0550: 69 2e 33 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  i.3 { .    SELEC
0560: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20  T docid FROM t1 
0570: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
0580: 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 20 74 68 72  zero one two thr
0590: 65 65 27 0a 20 20 7d 20 7b 31 32 33 20 31 33 32  ee'.  } {123 132
05a0: 20 32 31 33 20 32 33 31 20 33 31 32 20 33 32 31   213 231 312 321
05b0: 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }.}..do_execsql_
05c0: 74 65 73 74 20 31 2e 33 20 7b 20 0a 20 20 53 45  test 1.3 { .  SE
05d0: 4c 45 43 54 20 6c 65 76 65 6c 2c 20 67 72 6f 75  LECT level, grou
05e0: 70 5f 63 6f 6e 63 61 74 28 69 64 78 2c 20 27 20  p_concat(idx, ' 
05f0: 27 29 20 46 52 4f 4d 20 74 31 5f 73 65 67 64 69  ') FROM t1_segdi
0600: 72 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c  r GROUP BY level
0610: 20 0a 7d 20 7b 0a 20 20 30 20 7b 30 20 31 20 32   .} {.  0 {0 1 2
0620: 20 33 7d 20 0a 20 20 31 20 7b 30 20 31 20 32 20   3} .  1 {0 1 2 
0630: 33 20 34 20 35 20 36 7d 20 0a 20 20 32 20 7b 30  3 4 5 6} .  2 {0
0640: 20 31 20 32 20 33 7d 0a 7d 0a 0a 66 6f 72 20 7b   1 2 3}.}..for {
0650: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 30 30  set i 0} {$i<100
0660: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 64  } {incr i} {.  d
0670: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0680: 2e 34 2e 24 69 20 7b 20 49 4e 53 45 52 54 20 49  .4.$i { INSERT I
0690: 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c 55 45  NTO t1(t1) VALUE
06a0: 53 28 27 6d 65 72 67 65 3d 31 2c 34 27 29 20 7d  S('merge=1,4') }
06b0: 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 34 2e 24  .  do_test 1.4.$
06c0: 69 2e 32 20 7b 20 66 74 73 33 5f 69 6e 74 65 67  i.2 { fts3_integ
06d0: 72 69 74 79 5f 63 68 65 63 6b 20 74 31 20 7d 20  rity_check t1 } 
06e0: 6f 6b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  ok.  do_execsql_
06f0: 74 65 73 74 20 31 2e 34 2e 24 69 2e 33 20 7b 20  test 1.4.$i.3 { 
0700: 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69  .    SELECT doci
0710: 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  d FROM t1 WHERE 
0720: 74 31 20 4d 41 54 43 48 20 27 7a 65 72 6f 20 6f  t1 MATCH 'zero o
0730: 6e 65 20 74 77 6f 20 74 68 72 65 65 27 0a 20 20  ne two three'.  
0740: 7d 20 7b 31 32 33 20 31 33 32 20 32 31 33 20 32  } {123 132 213 2
0750: 33 31 20 33 31 32 20 33 32 31 7d 0a 7d 0a 0a 64  31 312 321}.}..d
0760: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0770: 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 6c  .5 { .  SELECT l
0780: 65 76 65 6c 2c 20 67 72 6f 75 70 5f 63 6f 6e 63  evel, group_conc
0790: 61 74 28 69 64 78 2c 20 27 20 27 29 20 46 52 4f  at(idx, ' ') FRO
07a0: 4d 20 74 31 5f 73 65 67 64 69 72 20 47 52 4f 55  M t1_segdir GROU
07b0: 50 20 42 59 20 6c 65 76 65 6c 20 0a 7d 20 7b 0a  P BY level .} {.
07c0: 20 20 32 20 7b 30 20 31 7d 0a 20 20 33 20 30 0a    2 {0 1}.  3 0.
07d0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0820: 54 65 73 74 20 63 61 73 65 73 20 32 2e 2a 20 74  Test cases 2.* t
0830: 65 73 74 20 74 68 61 74 20 65 72 72 6f 72 73 20  est that errors 
0840: 69 6e 20 74 68 65 20 78 78 78 20 70 61 72 74 20  in the xxx part 
0850: 6f 66 20 74 68 65 20 27 6d 65 72 67 65 3d 78 78  of the 'merge=xx
0860: 78 27 20 61 72 65 0a 23 20 68 61 6e 64 6c 65 64  x' are.# handled
0870: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 64 6f   correctly..#.do
0880: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  _execsql_test 2.
0890: 30 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  0 { CREATE VIRTU
08a0: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e  AL TABLE t2 USIN
08b0: 47 20 66 74 73 34 20 7d 0a 0a 66 6f 72 65 61 63  G fts4 }..foreac
08c0: 68 20 7b 74 6e 20 61 72 67 7d 20 7b 0a 20 20 31  h {tn arg} {.  1
08d0: 20 20 20 7b 6d 65 72 67 65 3d 61 62 63 7d 0a 20     {merge=abc}. 
08e0: 20 32 20 20 20 7b 6d 65 72 67 65 3d 25 25 25 7d   2   {merge=%%%}
08f0: 0a 20 20 33 20 20 20 7b 6d 65 72 67 65 3d 2c 7d  .  3   {merge=,}
0900: 0a 20 20 34 20 20 20 7b 6d 65 72 67 65 3d 35 2c  .  4   {merge=5,
0910: 7d 0a 20 20 35 20 20 20 7b 6d 65 72 67 65 3d 36  }.  5   {merge=6
0920: 2c 25 7d 0a 20 20 36 20 20 20 7b 6d 65 72 67 65  ,%}.  6   {merge
0930: 3d 36 2c 73 69 78 7d 0a 20 20 37 20 20 20 7b 6d  =6,six}.  7   {m
0940: 65 72 67 65 3d 36 2c 31 7d 0a 20 20 38 20 20 20  erge=6,1}.  8   
0950: 7b 6d 65 72 67 65 3d 36 2c 30 7d 0a 7d 20 7b 0a  {merge=6,0}.} {.
0960: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
0970: 73 74 20 32 2e 24 74 6e 20 7b 20 0a 20 20 20 20  st 2.$tn { .    
0980: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74  INSERT INTO t2(t
0990: 32 29 20 56 41 4c 55 45 53 28 24 61 72 67 29 3b  2) VALUES($arg);
09a0: 0a 20 20 7d 20 7b 31 20 7b 53 51 4c 20 6c 6f 67  .  } {1 {SQL log
09b0: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
09c0: 69 6e 67 20 64 61 74 61 62 61 73 65 7d 7d 0a 7d  ing database}}.}
09d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
0a20: 65 73 74 20 63 61 73 65 73 20 33 2e 2a 0a 23 0a  est cases 3.*.#.
0a30: 64 6f 5f 74 65 73 74 20 33 2e 30 20 7b 20 0a 20  do_test 3.0 { . 
0a40: 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63   reset_db.  exec
0a50: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67  sql { PRAGMA pag
0a60: 65 5f 73 69 7a 65 20 3d 20 35 31 32 20 7d 0a 20  e_size = 512 }. 
0a70: 20 66 74 73 33 5f 62 75 69 6c 64 5f 64 62 5f 32   fts3_build_db_2
0a80: 20 33 30 30 34 30 20 0a 7d 20 7b 7d 0a 64 6f 5f   30040 .} {}.do_
0a90: 74 65 73 74 20 33 2e 31 20 7b 20 66 74 73 33 5f  test 3.1 { fts3_
0aa0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
0ab0: 74 32 20 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 65 78  t2 } {ok}..do_ex
0ac0: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b  ecsql_test 3.2 {
0ad0: 20 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65 6c   .  SELECT level
0ae0: 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 69  , group_concat(i
0af0: 64 78 2c 20 27 20 27 29 20 46 52 4f 4d 20 74 32  dx, ' ') FROM t2
0b00: 5f 73 65 67 64 69 72 20 47 52 4f 55 50 20 42 59  _segdir GROUP BY
0b10: 20 6c 65 76 65 6c 20 0a 7d 20 7b 0a 20 20 30 20   level .} {.  0 
0b20: 7b 30 20 31 20 32 20 33 20 34 20 35 20 36 7d 20  {0 1 2 3 4 5 6} 
0b30: 0a 20 20 31 20 7b 30 20 31 20 32 20 33 20 34 7d  .  1 {0 1 2 3 4}
0b40: 20 0a 20 20 32 20 7b 30 20 31 20 32 20 33 20 34   .  2 {0 1 2 3 4
0b50: 7d 20 0a 20 20 33 20 7b 30 20 31 20 32 20 33 20  } .  3 {0 1 2 3 
0b60: 34 20 35 20 36 7d 0a 7d 0a 0a 64 6f 5f 65 78 65  4 5 6}.}..do_exe
0b70: 63 73 71 6c 5f 74 65 73 74 20 33 2e 33 20 7b 20  csql_test 3.3 { 
0b80: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0b90: 32 28 74 32 29 20 56 41 4c 55 45 53 28 27 6d 65  2(t2) VALUES('me
0ba0: 72 67 65 3d 31 30 30 30 30 30 30 2c 32 27 29 3b  rge=1000000,2');
0bb0: 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c  .  SELECT level,
0bc0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 69 64   group_concat(id
0bd0: 78 2c 20 27 20 27 29 20 46 52 4f 4d 20 74 32 5f  x, ' ') FROM t2_
0be0: 73 65 67 64 69 72 20 47 52 4f 55 50 20 42 59 20  segdir GROUP BY 
0bf0: 6c 65 76 65 6c 20 0a 7d 20 7b 0a 20 20 30 20 30  level .} {.  0 0
0c00: 20 0a 20 20 32 20 30 0a 20 20 33 20 30 20 0a 20   .  2 0.  3 0 . 
0c10: 20 34 20 30 0a 20 20 36 20 30 0a 7d 0a 0a 23 2d   4 0.  6 0.}..#-
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 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 0a 23 20 54 65 73 74 20  --------.# Test 
0c70: 63 61 73 65 73 20 34 2e 2a 0a 23 0a 72 65 73 65  cases 4.*.#.rese
0c80: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
0c90: 74 65 73 74 20 34 2e 31 20 7b 0a 20 20 50 52 41  test 4.1 {.  PRA
0ca0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
0cb0: 35 31 32 3b 0a 20 20 43 52 45 41 54 45 20 56 49  512;.  CREATE VI
0cc0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 34 20 55  RTUAL TABLE t4 U
0cd0: 53 49 4e 47 20 66 74 73 34 3b 0a 20 20 50 52 41  SING fts4;.  PRA
0ce0: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
0cf0: 7a 65 3b 0a 7d 20 7b 35 31 32 7d 0a 0a 64 6f 5f  ze;.} {512}..do_
0d00: 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 66 6f 72  test 4.2 {.  for
0d10: 65 61 63 68 20 78 20 7b 61 20 63 20 62 20 64 20  each x {a c b d 
0d20: 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 20  e f g h i j k l 
0d30: 6d 20 6e 20 6f 20 70 7d 20 7b 0a 20 20 20 20 65  m n o p} {.    e
0d40: 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49  xecsql "INSERT I
0d50: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 5b  NTO t4 VALUES('[
0d60: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 78  string repeat $x
0d70: 20 36 30 30 5d 27 29 22 0a 20 20 7d 0a 20 20 65   600]')".  }.  e
0d80: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c  xecsql {SELECT l
0d90: 65 76 65 6c 2c 20 67 72 6f 75 70 5f 63 6f 6e 63  evel, group_conc
0da0: 61 74 28 69 64 78 2c 20 27 20 27 29 20 46 52 4f  at(idx, ' ') FRO
0db0: 4d 20 74 34 5f 73 65 67 64 69 72 20 47 52 4f 55  M t4_segdir GROU
0dc0: 50 20 42 59 20 6c 65 76 65 6c 7d 0a 7d 20 7b 30  P BY level}.} {0
0dd0: 20 7b 30 20 31 20 32 20 33 20 34 20 35 20 36 20   {0 1 2 3 4 5 6 
0de0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
0df0: 33 20 31 34 20 31 35 7d 7d 0a 0a 66 6f 72 65 61  3 14 15}}..forea
0e00: 63 68 20 7b 74 6e 20 65 78 70 65 63 74 7d 20 7b  ch {tn expect} {
0e10: 0a 20 20 31 20 20 22 30 20 7b 30 20 31 20 32 20  .  1  "0 {0 1 2 
0e20: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0e30: 20 31 31 20 31 32 20 31 33 7d 20 31 20 30 22 0a   11 12 13} 1 0".
0e40: 20 20 32 20 20 22 30 20 7b 30 20 31 20 32 20 33    2  "0 {0 1 2 3
0e50: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
0e60: 31 31 20 31 32 7d 20 20 20 20 31 20 30 22 0a 20  11 12}    1 0". 
0e70: 20 33 20 20 22 30 20 7b 30 20 31 20 32 20 33 20   3  "0 {0 1 2 3 
0e80: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
0e90: 31 7d 20 20 20 20 20 20 20 31 20 30 22 0a 20 20  1}       1 0".  
0ea0: 34 20 20 22 30 20 7b 30 20 31 20 32 20 33 20 34  4  "0 {0 1 2 3 4
0eb0: 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 20 20   5 6 7 8 9 10}  
0ec0: 20 20 20 20 20 20 20 20 31 20 30 22 0a 20 20 35          1 0".  5
0ed0: 20 20 22 30 20 7b 30 20 31 20 32 20 33 20 34 20    "0 {0 1 2 3 4 
0ee0: 35 20 36 20 37 20 38 20 39 7d 20 20 20 20 20 20  5 6 7 8 9}      
0ef0: 20 20 20 20 20 20 20 31 20 30 22 0a 20 20 36 20         1 0".  6 
0f00: 20 22 30 20 7b 30 20 31 20 32 20 33 20 34 20 35   "0 {0 1 2 3 4 5
0f10: 20 36 20 37 20 38 7d 20 20 20 20 20 20 20 20 20   6 7 8}         
0f20: 20 20 20 20 20 20 31 20 30 22 0a 20 20 37 20 20        1 0".  7  
0f30: 22 30 20 7b 30 20 31 20 32 20 33 20 34 20 35 20  "0 {0 1 2 3 4 5 
0f40: 36 20 37 7d 20 20 20 20 20 20 20 20 20 20 20 20  6 7}            
0f50: 20 20 20 20 20 31 20 30 22 0a 20 20 38 20 20 22       1 0".  8  "
0f60: 30 20 7b 30 20 31 20 32 20 33 20 34 20 35 20 36  0 {0 1 2 3 4 5 6
0f70: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
0f80: 20 20 20 20 31 20 30 22 0a 20 20 39 20 20 22 30      1 0".  9  "0
0f90: 20 7b 30 20 31 20 32 20 33 20 34 20 35 7d 20 20   {0 1 2 3 4 5}  
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 31 20 30 22 0a 7d 20 7b 0a 20 20 64 6f     1 0".} {.  do
0fc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
0fd0: 33 2e 24 74 6e 20 7b 0a 20 20 20 20 49 4e 53 45  3.$tn {.    INSE
0fe0: 52 54 20 49 4e 54 4f 20 74 34 28 74 34 29 20 56  RT INTO t4(t4) V
0ff0: 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 31 2c 31  ALUES('merge=1,1
1000: 36 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  6');.    SELECT 
1010: 6c 65 76 65 6c 2c 20 67 72 6f 75 70 5f 63 6f 6e  level, group_con
1020: 63 61 74 28 69 64 78 2c 20 27 20 27 29 20 46 52  cat(idx, ' ') FR
1030: 4f 4d 20 74 34 5f 73 65 67 64 69 72 20 47 52 4f  OM t4_segdir GRO
1040: 55 50 20 42 59 20 6c 65 76 65 6c 3b 0a 20 20 7d  UP BY level;.  }
1050: 20 24 65 78 70 65 63 74 0a 7d 0a 0a 64 6f 5f 65   $expect.}..do_e
1060: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 34 2e  xecsql_test 4.4.
1070: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 71 75 6f  1 {.  SELECT quo
1080: 74 65 28 76 61 6c 75 65 29 20 46 52 4f 4d 20 74  te(value) FROM t
1090: 34 5f 73 74 61 74 20 57 48 45 52 45 20 72 6f 77  4_stat WHERE row
10a0: 69 64 3d 31 0a 7d 20 7b 58 27 30 30 30 36 27 7d  id=1.} {X'0006'}
10b0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
10c0: 74 20 34 2e 34 2e 32 20 7b 0a 20 20 44 45 4c 45  t 4.4.2 {.  DELE
10d0: 54 45 20 46 52 4f 4d 20 74 34 5f 73 74 61 74 20  TE FROM t4_stat 
10e0: 57 48 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a 20  WHERE rowid=1;. 
10f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28   INSERT INTO t4(
1100: 74 34 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67  t4) VALUES('merg
1110: 65 3d 31 2c 31 32 27 29 3b 0a 20 20 53 45 4c 45  e=1,12');.  SELE
1120: 43 54 20 6c 65 76 65 6c 2c 20 67 72 6f 75 70 5f  CT level, group_
1130: 63 6f 6e 63 61 74 28 69 64 78 2c 20 27 20 27 29  concat(idx, ' ')
1140: 20 46 52 4f 4d 20 74 34 5f 73 65 67 64 69 72 20   FROM t4_segdir 
1150: 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 3b 0a  GROUP BY level;.
1160: 7d 20 22 30 20 7b 30 20 31 20 32 20 33 20 34 20  } "0 {0 1 2 3 4 
1170: 35 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5}              
1180: 20 20 20 20 20 20 20 31 20 30 22 0a 0a 0a 23 2d         1 0"...#-
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
11e0: 63 61 73 65 73 20 35 2e 2a 0a 23 0a 23 20 54 65  cases 5.*.#.# Te
11f0: 73 74 20 74 68 61 74 20 69 66 20 61 20 63 72 69  st that if a cri
1200: 73 69 73 2d 6d 65 72 67 65 20 6f 63 63 75 72 73  sis-merge occurs
1210: 20 74 68 61 74 20 64 69 73 72 75 70 74 73 20 61   that disrupts a
1220: 6e 20 6f 6e 67 6f 69 6e 67 20 69 6e 63 72 65 6d  n ongoing increm
1230: 65 6e 74 61 6c 0a 23 20 6d 65 72 67 65 2c 20 74  ental.# merge, t
1240: 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
1250: 22 6d 65 72 67 65 3d 41 2c 42 22 20 69 64 65 6e  "merge=A,B" iden
1260: 74 69 66 69 65 73 20 74 68 69 73 20 61 6e 64 20  tifies this and 
1270: 73 74 61 72 74 73 20 61 20 6e 65 77 0a 23 20 69  starts a new.# i
1280: 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
1290: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
12a0: 73 63 65 6e 61 72 69 6f 73 3a 0a 23 0a 23 20 20  scenarios:.#.#  
12b0: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6c 65 73   * There are les
12c0: 73 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 74 68  s segments on th
12d0: 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 74 68  e input level th
12e0: 61 74 20 74 68 65 20 64 69 73 72 75 70 74 65 64  at the disrupted
12f0: 0a 23 20 20 20 20 20 69 6e 63 72 65 6d 65 6e 74  .#     increment
1300: 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 65  al merge operate
1310: 64 20 6f 6e 2c 20 6f 72 0a 23 20 20 20 0a 23 20  d on, or.#   .# 
1320: 20 20 2a 20 53 75 66 66 69 63 69 65 6e 74 20 73    * Sufficient s
1330: 65 67 6d 65 6e 74 73 20 65 78 69 73 74 20 6f 6e  egments exist on
1340: 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
1350: 20 62 75 74 20 74 68 65 20 73 65 67 6d 65 6e 74   but the segment
1360: 73 20 0a 23 20 20 20 20 20 63 6f 6e 74 61 69 6e  s .#     contain
1370: 20 6b 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68   keys smaller th
1380: 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  an the largest k
1390: 65 79 20 69 6e 20 74 68 65 20 70 6f 74 65 6e 74  ey in the potent
13a0: 69 61 6c 20 6f 75 74 70 75 74 20 0a 23 20 20 20  ial output .#   
13b0: 20 20 73 65 67 6d 65 6e 74 2e 0a 23 20 0a 64 6f    segment..# .do
13c0: 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 72 65  _test 5.1 {.  re
13d0: 73 65 74 5f 64 62 0a 20 20 66 74 73 33 5f 62 75  set_db.  fts3_bu
13e0: 69 6c 64 5f 64 62 5f 31 20 31 30 30 30 0a 7d 20  ild_db_1 1000.} 
13f0: 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}..do_execsql_t
1400: 65 73 74 20 35 2e 32 20 7b 0a 20 20 53 45 4c 45  est 5.2 {.  SELE
1410: 43 54 20 6c 65 76 65 6c 2c 20 67 72 6f 75 70 5f  CT level, group_
1420: 63 6f 6e 63 61 74 28 69 64 78 2c 20 27 20 27 29  concat(idx, ' ')
1430: 20 46 52 4f 4d 20 74 31 5f 73 65 67 64 69 72 20   FROM t1_segdir 
1440: 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 3b 0a  GROUP BY level;.
1450: 7d 20 7b 0a 20 20 30 20 7b 30 20 31 20 32 20 33  } {.  0 {0 1 2 3
1460: 20 34 20 35 20 36 20 37 7d 20 0a 20 20 31 20 7b   4 5 6 7} .  1 {
1470: 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20  0 1 2 3 4 5 6 7 
1480: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 7d  8 9 10 11 12 13}
1490: 20 0a 20 20 32 20 7b 30 20 31 20 32 7d 0a 7d 0a   .  2 {0 1 2}.}.
14a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
14b0: 20 35 2e 33 20 7b 0a 20 20 49 4e 53 45 52 54 20   5.3 {.  INSERT 
14c0: 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c 55  INTO t1(t1) VALU
14d0: 45 53 28 27 6d 65 72 67 65 3d 31 2c 35 27 29 3b  ES('merge=1,5');
14e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
14f0: 31 28 74 31 29 20 56 41 4c 55 45 53 28 27 6d 65  1(t1) VALUES('me
1500: 72 67 65 3d 31 2c 35 27 29 3b 0a 20 20 53 45 4c  rge=1,5');.  SEL
1510: 45 43 54 20 6c 65 76 65 6c 2c 20 67 72 6f 75 70  ECT level, group
1520: 5f 63 6f 6e 63 61 74 28 69 64 78 2c 20 27 20 27  _concat(idx, ' '
1530: 29 20 46 52 4f 4d 20 74 31 5f 73 65 67 64 69 72  ) FROM t1_segdir
1540: 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 3b   GROUP BY level;
1550: 0a 7d 20 7b 0a 20 20 30 20 7b 30 20 31 20 32 7d  .} {.  0 {0 1 2}
1560: 0a 20 20 31 20 7b 30 20 31 20 32 20 33 20 34 20  .  1 {0 1 2 3 4 
1570: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
1580: 31 32 20 31 33 20 31 34 7d 20 0a 20 20 32 20 7b  12 13 14} .  2 {
1590: 30 20 31 20 32 20 33 7d 0a 7d 0a 0a 64 6f 5f 65  0 1 2 3}.}..do_e
15a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 34 20  xecsql_test 5.4 
15b0: 7b 53 45 4c 45 43 54 20 71 75 6f 74 65 28 76 61  {SELECT quote(va
15c0: 6c 75 65 29 20 66 72 6f 6d 20 74 31 5f 73 74 61  lue) from t1_sta
15d0: 74 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31 7d  t WHERE rowid=1}
15e0: 20 7b 58 27 30 31 30 35 27 7d 0a 64 6f 5f 74 65   {X'0105'}.do_te
15f0: 73 74 20 35 2e 35 20 7b 0a 20 20 66 6f 72 65 61  st 5.5 {.  forea
1600: 63 68 20 64 6f 63 69 64 20 5b 65 78 65 63 73 71  ch docid [execsq
1610: 6c 20 7b 53 45 4c 45 43 54 20 64 6f 63 69 64 20  l {SELECT docid 
1620: 46 52 4f 4d 20 74 31 7d 5d 20 7b 0a 20 20 20 20  FROM t1}] {.    
1630: 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20  execsql {INSERT 
1640: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 64   FROM t1 WHERE d
1660: 6f 63 69 64 3d 24 64 6f 63 69 64 7d 0a 20 20 7d  ocid=$docid}.  }
1670: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  .} {}..do_execsq
1680: 6c 5f 74 65 73 74 20 35 2e 36 20 7b 53 45 4c 45  l_test 5.6 {SELE
1690: 43 54 20 71 75 6f 74 65 28 76 61 6c 75 65 29 20  CT quote(value) 
16a0: 66 72 6f 6d 20 74 31 5f 73 74 61 74 20 57 48 45  from t1_stat WHE
16b0: 52 45 20 72 6f 77 69 64 3d 31 7d 20 7b 58 27 30  RE rowid=1} {X'0
16c0: 31 30 35 27 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  105'}..do_execsq
16d0: 6c 5f 74 65 73 74 20 35 2e 37 20 7b 0a 20 20 53  l_test 5.7 {.  S
16e0: 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 67 72 6f  ELECT level, gro
16f0: 75 70 5f 63 6f 6e 63 61 74 28 69 64 78 2c 20 27  up_concat(idx, '
1700: 20 27 29 20 46 52 4f 4d 20 74 31 5f 73 65 67 64   ') FROM t1_segd
1710: 69 72 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65  ir GROUP BY leve
1720: 6c 3b 0a 20 20 53 45 4c 45 43 54 20 71 75 6f 74  l;.  SELECT quot
1730: 65 28 76 61 6c 75 65 29 20 66 72 6f 6d 20 74 31  e(value) from t1
1740: 5f 73 74 61 74 20 57 48 45 52 45 20 72 6f 77 69  _stat WHERE rowi
1750: 64 3d 31 3b 0a 7d 20 7b 0a 20 20 30 20 7b 30 20  d=1;.} {.  0 {0 
1760: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
1770: 39 20 31 30 7d 20 0a 20 20 31 20 7b 30 20 31 20  9 10} .  1 {0 1 
1780: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
1790: 31 30 20 31 31 20 31 32 7d 20 0a 20 20 32 20 7b  10 11 12} .  2 {
17a0: 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37 7d  0 1 2 3 4 5 6 7}
17b0: 0a 20 20 58 27 30 31 30 35 27 0a 7d 0a 0a 64 6f  .  X'0105'.}..do
17c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
17d0: 38 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  8 {.  INSERT INT
17e0: 4f 20 74 31 28 74 31 29 20 56 41 4c 55 45 53 28  O t1(t1) VALUES(
17f0: 27 6d 65 72 67 65 3d 31 2c 36 27 29 3b 0a 20 20  'merge=1,6');.  
1800: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 74  INSERT INTO t1(t
1810: 31 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65  1) VALUES('merge
1820: 3d 31 2c 36 27 29 3b 0a 20 20 53 45 4c 45 43 54  =1,6');.  SELECT
1830: 20 6c 65 76 65 6c 2c 20 67 72 6f 75 70 5f 63 6f   level, group_co
1840: 6e 63 61 74 28 69 64 78 2c 20 27 20 27 29 20 46  ncat(idx, ' ') F
1850: 52 4f 4d 20 74 31 5f 73 65 67 64 69 72 20 47 52  ROM t1_segdir GR
1860: 4f 55 50 20 42 59 20 6c 65 76 65 6c 3b 0a 20 20  OUP BY level;.  
1870: 53 45 4c 45 43 54 20 71 75 6f 74 65 28 76 61 6c  SELECT quote(val
1880: 75 65 29 20 66 72 6f 6d 20 74 31 5f 73 74 61 74  ue) from t1_stat
1890: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a   WHERE rowid=1;.
18a0: 7d 20 7b 0a 20 20 30 20 7b 30 20 31 20 32 20 33  } {.  0 {0 1 2 3
18b0: 20 34 7d 20 0a 20 20 31 20 7b 30 20 31 20 32 20   4} .  1 {0 1 2 
18c0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
18d0: 20 31 31 20 31 32 20 31 33 7d 20 0a 20 20 32 20   11 12 13} .  2 
18e0: 7b 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37  {0 1 2 3 4 5 6 7
18f0: 20 38 7d 20 58 27 30 31 30 36 27 0a 7d 0a 0a 64   8} X'0106'.}..d
1900: 6f 5f 74 65 73 74 20 35 2e 38 2e 31 20 7b 20 66  o_test 5.8.1 { f
1910: 74 73 33 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  ts3_integrity_ch
1920: 65 63 6b 20 74 31 20 7d 20 6f 6b 0a 0a 64 6f 5f  eck t1 } ok..do_
1930: 74 65 73 74 20 35 2e 39 20 7b 0a 20 20 73 65 74  test 5.9 {.  set
1940: 20 4c 20 5b 65 78 70 72 20 31 36 2a 31 36 2a 37   L [expr 16*16*7
1950: 20 2b 20 31 36 2a 33 20 2b 20 31 32 5d 0a 20 20   + 16*3 + 12].  
1960: 66 6f 72 65 61 63 68 20 64 6f 63 69 64 20 5b 65  foreach docid [e
1970: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
1980: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
1990: 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
19a0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
19b0: 74 31 20 4c 49 4d 49 54 20 24 4c 0a 20 20 7d 5d  t1 LIMIT $L.  }]
19c0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
19d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
19e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
19f0: 57 48 45 52 45 20 64 6f 63 69 64 3d 24 64 6f 63  WHERE docid=$doc
1a00: 69 64 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  id}.  }.} {}..do
1a10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
1a20: 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c 65  10 {.  SELECT le
1a30: 76 65 6c 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  vel, group_conca
1a40: 74 28 69 64 78 2c 20 27 20 27 29 20 46 52 4f 4d  t(idx, ' ') FROM
1a50: 20 74 31 5f 73 65 67 64 69 72 20 47 52 4f 55 50   t1_segdir GROUP
1a60: 20 42 59 20 6c 65 76 65 6c 3b 0a 20 20 53 45 4c   BY level;.  SEL
1a70: 45 43 54 20 71 75 6f 74 65 28 76 61 6c 75 65 29  ECT quote(value)
1a80: 20 66 72 6f 6d 20 74 31 5f 73 74 61 74 20 57 48   from t1_stat WH
1a90: 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a 7d 20 7b  ERE rowid=1;.} {
1aa0: 0a 20 20 30 20 30 20 31 20 7b 30 20 31 7d 20 32  .  0 0 1 {0 1} 2
1ab0: 20 30 20 33 20 30 20 58 27 30 31 30 36 27 0a 7d   0 3 0 X'0106'.}
1ac0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1ad0: 74 20 35 2e 31 31 20 7b 0a 20 20 49 4e 53 45 52  t 5.11 {.  INSER
1ae0: 54 20 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41  T INTO t1(t1) VA
1af0: 4c 55 45 53 28 27 6d 65 72 67 65 3d 31 2c 36 27  LUES('merge=1,6'
1b00: 29 3b 0a 20 20 53 45 4c 45 43 54 20 6c 65 76 65  );.  SELECT leve
1b10: 6c 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  l, group_concat(
1b20: 69 64 78 2c 20 27 20 27 29 20 46 52 4f 4d 20 74  idx, ' ') FROM t
1b30: 31 5f 73 65 67 64 69 72 20 47 52 4f 55 50 20 42  1_segdir GROUP B
1b40: 59 20 6c 65 76 65 6c 3b 0a 20 20 53 45 4c 45 43  Y level;.  SELEC
1b50: 54 20 71 75 6f 74 65 28 76 61 6c 75 65 29 20 66  T quote(value) f
1b60: 72 6f 6d 20 74 31 5f 73 74 61 74 20 57 48 45 52  rom t1_stat WHER
1b70: 45 20 72 6f 77 69 64 3d 31 3b 0a 7d 20 7b 0a 20  E rowid=1;.} {. 
1b80: 20 30 20 30 20 31 20 7b 30 20 31 7d 20 32 20 30   0 0 1 {0 1} 2 0
1b90: 20 33 20 30 20 58 27 27 0a 7d 0a 0a 23 2d 2d 2d   3 0 X''.}..#---
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
1bf0: 73 65 73 20 36 2e 2a 0a 23 0a 23 20 41 74 20 6f  ses 6.*.#.# At o
1c00: 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f 6c  ne point the fol
1c10: 6c 6f 77 69 6e 67 20 74 65 73 74 20 63 61 75 73  lowing test caus
1c20: 65 64 20 61 6e 20 61 73 73 65 72 74 28 29 20 74  ed an assert() t
1c30: 6f 20 66 61 69 6c 20 28 62 65 63 61 75 73 65 20  o fail (because 
1c40: 74 68 65 0a 23 20 73 65 63 6f 6e 64 20 27 6d 65  the.# second 'me
1c50: 72 67 65 3d 31 2c 32 27 20 6f 70 65 72 61 74 69  rge=1,2' operati
1c60: 6f 6e 20 62 65 6c 6f 77 20 61 63 74 75 61 6c 6c  on below actuall
1c70: 79 20 22 6d 65 72 67 65 73 22 20 61 20 73 69 6e  y "merges" a sin
1c80: 67 6c 65 20 69 6e 70 75 74 0a 23 20 73 65 67 6d  gle input.# segm
1c90: 65 6e 74 2c 20 77 68 69 63 68 20 77 61 73 20 75  ent, which was u
1ca0: 6e 65 78 70 65 63 74 65 64 29 2e 0a 23 0a 64 6f  nexpected)..#.do
1cb0: 5f 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 72 65  _test 6.1 {.  re
1cc0: 73 65 74 5f 64 62 0a 20 20 73 65 74 20 61 20 5b  set_db.  set a [
1cd0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 61 20  string repeat a 
1ce0: 39 30 30 5d 0a 20 20 73 65 74 20 62 20 5b 73 74  900].  set b [st
1cf0: 72 69 6e 67 20 72 65 70 65 61 74 20 62 20 39 30  ring repeat b 90
1d00: 30 5d 0a 20 20 73 65 74 20 63 20 5b 73 74 72 69  0].  set c [stri
1d10: 6e 67 20 72 65 70 65 61 74 20 63 20 39 30 30 5d  ng repeat c 900]
1d20: 0a 20 20 73 65 74 20 64 20 5b 73 74 72 69 6e 67  .  set d [string
1d30: 20 72 65 70 65 61 74 20 64 20 39 30 30 5d 0a 20   repeat d 900]. 
1d40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1d50: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1d60: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
1d70: 34 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  4;.    BEGIN;.  
1d80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1d90: 74 31 20 56 41 4c 55 45 53 28 24 61 29 3b 0a 20  t1 VALUES($a);. 
1da0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1db0: 20 74 31 20 56 41 4c 55 45 53 28 24 62 29 3b 0a   t1 VALUES($b);.
1dc0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
1dd0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
1de0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1df0: 45 53 28 24 63 29 3b 0a 20 20 20 20 20 20 49 4e  ES($c);.      IN
1e00: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1e10: 55 45 53 28 24 64 29 3b 0a 20 20 20 20 43 4f 4d  UES($d);.    COM
1e20: 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 65 78 65 63  MIT;.  }..  exec
1e30: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
1e40: 20 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c   INTO t1(t1) VAL
1e50: 55 45 53 28 27 6d 65 72 67 65 3d 31 2c 32 27 29  UES('merge=1,2')
1e60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1e70: 4f 20 74 31 28 74 31 29 20 56 41 4c 55 45 53 28  O t1(t1) VALUES(
1e80: 27 6d 65 72 67 65 3d 31 2c 32 27 29 3b 0a 20 20  'merge=1,2');.  
1e90: 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
1ef0: 37 2e 2a 0a 23 0a 23 20 54 65 73 74 20 74 68 61  7.*.#.# Test tha
1f00: 74 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  t the value retu
1f10: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
1f20: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20  total_changes() 
1f30: 69 6e 63 72 65 61 73 65 73 20 62 79 0a 23 20 31  increases by.# 1
1f40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6e 6f 2d   following a no-
1f50: 6f 70 20 22 6d 65 72 67 65 3d 41 2c 42 22 2c 20  op "merge=A,B", 
1f60: 6f 72 20 62 79 20 6d 6f 72 65 20 74 68 61 6e 20  or by more than 
1f70: 31 20 69 66 20 61 63 74 75 61 6c 20 77 6f 72 6b  1 if actual work
1f80: 20 69 73 0a 23 20 70 65 72 66 6f 72 6d 65 64 2e   is.# performed.
1f90: 0a 23 0a 64 6f 5f 74 65 73 74 20 37 2e 30 20 7b  .#.do_test 7.0 {
1fa0: 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 66 74  .  reset_db.  ft
1fb0: 73 33 5f 62 75 69 6c 64 5f 64 62 5f 31 20 31 30  s3_build_db_1 10
1fc0: 30 30 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63  00.} {}..do_exec
1fd0: 73 71 6c 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20  sql_test 7.1 {. 
1fe0: 20 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 67   SELECT level, g
1ff0: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 69 64 78 2c  roup_concat(idx,
2000: 20 27 20 27 29 20 46 52 4f 4d 20 74 31 5f 73 65   ' ') FROM t1_se
2010: 67 64 69 72 20 47 52 4f 55 50 20 42 59 20 6c 65  gdir GROUP BY le
2020: 76 65 6c 0a 7d 20 7b 0a 20 20 30 20 7b 30 20 31  vel.} {.  0 {0 1
2030: 20 32 20 33 20 34 20 35 20 36 20 37 7d 20 0a 20   2 3 4 5 6 7} . 
2040: 20 31 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   1 {0 1 2 3 4 5 
2050: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
2060: 20 31 33 7d 20 0a 20 20 32 20 7b 30 20 31 20 32   13} .  2 {0 1 2
2070: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 37 2e 32 20  }.}.do_test 7.2 
2080: 7b 0a 20 20 73 65 74 20 78 20 5b 64 62 20 74 6f  {.  set x [db to
2090: 74 61 6c 5f 63 68 61 6e 67 65 73 5d 0a 20 20 65  tal_changes].  e
20a0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
20b0: 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c 55  INTO t1(t1) VALU
20c0: 45 53 28 27 6d 65 72 67 65 3d 32 2c 31 30 27 29  ES('merge=2,10')
20d0: 20 7d 0a 20 20 65 78 70 72 20 7b 20 28 5b 64 62   }.  expr { ([db
20e0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 20   total_changes] 
20f0: 2d 20 24 78 29 3e 31 20 7d 0a 7d 20 7b 31 7d 0a  - $x)>1 }.} {1}.
2100: 64 6f 5f 74 65 73 74 20 37 2e 33 20 7b 0a 20 20  do_test 7.3 {.  
2110: 73 65 74 20 78 20 5b 64 62 20 74 6f 74 61 6c 5f  set x [db total_
2120: 63 68 61 6e 67 65 73 5d 0a 20 20 65 78 65 63 73  changes].  execs
2130: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
2140: 20 74 31 28 74 31 29 20 56 41 4c 55 45 53 28 27   t1(t1) VALUES('
2150: 6d 65 72 67 65 3d 32 30 30 2c 31 30 27 29 20 7d  merge=200,10') }
2160: 0a 20 20 65 78 70 72 20 7b 20 28 5b 64 62 20 74  .  expr { ([db t
2170: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 20 2d 20  otal_changes] - 
2180: 24 78 29 3e 31 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  $x)>1 }.} {1}.do
2190: 5f 74 65 73 74 20 37 2e 34 20 7b 0a 20 20 73 65  _test 7.4 {.  se
21a0: 74 20 78 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68  t x [db total_ch
21b0: 61 6e 67 65 73 5d 0a 20 20 65 78 65 63 73 71 6c  anges].  execsql
21c0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
21d0: 31 28 74 31 29 20 56 41 4c 55 45 53 28 27 6d 65  1(t1) VALUES('me
21e0: 72 67 65 3d 32 30 30 2c 31 30 27 29 20 7d 0a 20  rge=200,10') }. 
21f0: 20 65 78 70 72 20 7b 20 28 5b 64 62 20 74 6f 74   expr { ([db tot
2200: 61 6c 5f 63 68 61 6e 67 65 73 5d 20 2d 20 24 78  al_changes] - $x
2210: 29 3e 31 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  )>1 }.} {0}.do_t
2220: 65 73 74 20 37 2e 35 20 7b 0a 20 20 73 65 74 20  est 7.5 {.  set 
2230: 78 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e  x [db total_chan
2240: 67 65 73 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b  ges].  execsql {
2250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
2260: 74 31 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67  t1) VALUES('merg
2270: 65 3d 32 30 30 2c 31 30 27 29 20 7d 0a 20 20 65  e=200,10') }.  e
2280: 78 70 72 20 7b 20 28 5b 64 62 20 74 6f 74 61 6c  xpr { ([db total
2290: 5f 63 68 61 6e 67 65 73 5d 20 2d 20 24 78 29 3e  _changes] - $x)>
22a0: 31 20 7d 0a 7d 20 7b 30 7d 0a 0a 66 69 6e 69 73  1 }.} {0}..finis
22b0: 68 5f 74 65 73 74 0a                             h_test.