/ Hex Artifact Content
Login

Artifact ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810:


0000: 23 20 32 30 31 38 20 4d 61 72 63 68 20 31 34 0a  # 2018 March 14.
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 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20  ..#..if {![info 
01b0: 65 78 69 73 74 73 20 74 65 73 74 64 69 72 5d 7d  exists testdir]}
01c0: 20 7b 0a 20 20 73 65 74 20 74 65 73 74 64 69 72   {.  set testdir
01d0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c   [file join [fil
01e0: 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
01f0: 73 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e 20 74  script]] .. .. t
0200: 65 73 74 5d 0a 7d 20 0a 73 6f 75 72 63 65 20 5b  est].} .source [
0210: 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20  file join [file 
0220: 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63  dirname [info sc
0230: 72 69 70 74 5d 5d 20 73 65 73 73 69 6f 6e 5f 63  ript]] session_c
0240: 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 6f 75 72 63  ommon.tcl].sourc
0250: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0260: 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c 65 20  r.tcl.ifcapable 
0270: 21 73 65 73 73 69 6f 6e 20 7b 66 69 6e 69 73 68  !session {finish
0280: 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 7d 0a 0a  _test; return}..
0290: 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20 73  set testprefix s
02a0: 65 73 73 69 6f 6e 72 65 62 61 73 65 0a 0a 73 65  essionrebase..se
02b0: 74 20 3a 3a 6c 43 6f 6e 66 6c 69 63 74 20 5b 6c  t ::lConflict [l
02c0: 69 73 74 5d 0a 70 72 6f 63 20 78 43 6f 6e 66 6c  ist].proc xConfl
02d0: 69 63 74 20 7b 61 72 67 73 7d 20 7b 0a 20 20 73  ict {args} {.  s
02e0: 65 74 20 72 65 73 20 5b 6c 69 6e 64 65 78 20 24  et res [lindex $
02f0: 3a 3a 6c 43 6f 6e 66 6c 69 63 74 20 30 5d 0a 20  ::lConflict 0]. 
0300: 20 73 65 74 20 3a 3a 6c 43 6f 6e 66 6c 69 63 74   set ::lConflict
0310: 20 5b 6c 72 61 6e 67 65 20 24 3a 3a 6c 43 6f 6e   [lrange $::lCon
0320: 66 6c 69 63 74 20 31 20 65 6e 64 5d 0a 20 20 72  flict 1 end].  r
0330: 65 74 75 72 6e 20 24 72 65 73 0a 7d 0a 0a 23 2d  eturn $res.}..#-
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 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
0390: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 63 61  ollowing test ca
03a0: 73 65 73 20 2d 20 31 2e 2a 20 2d 20 74 65 73 74  ses - 1.* - test
03b0: 20 74 68 61 74 20 74 68 65 20 72 65 62 61 73 65   that the rebase
03c0: 20 62 6c 6f 62 73 20 6f 75 74 70 75 74 20 62 79   blobs output by
03d0: 0a 23 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .# sqlite3_chang
03e0: 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 20 6c 6f  eset_apply_v2 lo
03f0: 6f 6b 20 63 6f 72 72 65 63 74 20 69 6e 20 73 6f  ok correct in so
0400: 6d 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 2e  me simple cases.
0410: 20 54 68 65 20 62 6c 6f 62 0a 23 20 69 73 20 69   The blob.# is i
0420: 74 73 65 6c 66 20 61 20 63 68 61 6e 67 65 73 65  tself a changese
0430: 74 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65  t, containing re
0440: 63 6f 72 64 73 20 64 65 74 65 72 6d 69 6e 65 64  cords determined
0450: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23   as follows:.#.#
0460: 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 63 6f     * For each co
0470: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 76 65 64 20  nflict resolved 
0480: 77 69 74 68 20 52 45 50 4c 41 43 45 2c 20 74 68  with REPLACE, th
0490: 65 20 72 65 62 61 73 65 20 62 6c 6f 62 20 63 6f  e rebase blob co
04a0: 6e 74 61 69 6e 73 0a 23 20 20 20 20 20 61 20 44  ntains.#     a D
04b0: 45 4c 45 54 45 20 72 65 63 6f 72 64 2e 20 41 6c  ELETE record. Al
04c0: 6c 20 66 69 65 6c 64 73 20 6f 74 68 65 72 20 74  l fields other t
04d0: 68 61 6e 20 74 68 65 20 50 4b 20 66 69 65 6c 64  han the PK field
04e0: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
04f0: 0a 23 0a 23 20 20 20 2a 20 46 6f 72 20 65 61 63  .#.#   * For eac
0500: 68 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  h conflict resol
0510: 76 65 64 20 77 69 74 68 20 4f 4d 49 54 2c 20 74  ved with OMIT, t
0520: 68 65 20 72 65 62 61 73 65 20 62 6c 6f 62 20 63  he rebase blob c
0530: 6f 6e 74 61 69 6e 73 20 61 6e 0a 23 20 20 20 20  ontains an.#    
0540: 20 49 4e 53 45 52 54 20 72 65 63 6f 72 64 2e 20   INSERT record. 
0550: 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  For an INSERT or
0560: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
0570: 6e 2c 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  n, the indirect 
0580: 66 6c 61 67 0a 23 20 20 20 20 20 69 73 20 63 6c  flag.#     is cl
0590: 65 61 72 20 61 6e 64 20 61 6c 6c 20 75 70 64 61  ear and all upda
05a0: 74 65 64 20 66 69 65 6c 64 73 20 61 72 65 20 64  ted fields are d
05b0: 65 66 69 6e 65 64 2e 20 46 6f 72 20 61 20 44 45  efined. For a DE
05c0: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 0a  LETE operation,.
05d0: 23 20 20 20 20 20 74 68 65 20 69 6e 64 69 72 65  #     the indire
05e0: 63 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  ct flag is set a
05f0: 6e 64 20 61 6c 6c 20 6e 6f 6e 2d 50 4b 20 66 69  nd all non-PK fi
0600: 65 6c 64 73 20 6c 65 66 74 20 75 6e 64 65 66 69  elds left undefi
0610: 6e 65 64 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 61  ned..#.proc do_a
0620: 70 70 6c 79 5f 76 32 5f 74 65 73 74 20 7b 74 6e  pply_v2_test {tn
0630: 20 73 71 6c 20 6d 6f 64 73 71 6c 20 63 6f 6e 66   sql modsql conf
0640: 6c 69 63 74 5f 68 61 6e 64 6c 65 72 20 72 65 73  lict_handler res
0650: 7d 20 7b 0a 20 20 0a 20 20 65 78 65 63 73 71 6c  } {.  .  execsql
0660: 20 42 45 47 49 4e 0a 20 20 73 71 6c 69 74 65 33   BEGIN.  sqlite3
0670: 73 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69  session S db mai
0680: 6e 0a 20 20 53 20 61 74 74 61 63 68 20 2a 0a 20  n.  S attach *. 
0690: 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20   execsql $sql.  
06a0: 73 65 74 20 63 68 61 6e 67 65 73 65 74 20 5b 53  set changeset [S
06b0: 20 63 68 61 6e 67 65 73 65 74 5d 0a 20 20 53 20   changeset].  S 
06c0: 64 65 6c 65 74 65 0a 20 20 65 78 65 63 73 71 6c  delete.  execsql
06d0: 20 52 4f 4c 4c 42 41 43 4b 0a 0a 20 20 65 78 65   ROLLBACK..  exe
06e0: 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 65 78 65  csql BEGIN.  exe
06f0: 63 73 71 6c 20 24 6d 6f 64 73 71 6c 0a 20 20 73  csql $modsql.  s
0700: 65 74 20 3a 3a 6c 43 6f 6e 66 6c 69 63 74 20 24  et ::lConflict $
0710: 63 6f 6e 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72  conflict_handler
0720: 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 73 71 6c  .  set blob [sql
0730: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
0740: 70 6c 79 5f 76 32 20 64 62 20 24 63 68 61 6e 67  ply_v2 db $chang
0750: 65 73 65 74 20 78 43 6f 6e 66 6c 69 63 74 5d 0a  eset xConflict].
0760: 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41    execsql ROLLBA
0770: 43 4b 0a 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c  CK..  uplevel [l
0780: 69 73 74 20 64 6f 5f 74 65 73 74 20 24 74 6e 20  ist do_test $tn 
0790: 5b 6c 69 73 74 20 63 68 61 6e 67 65 73 65 74 5f  [list changeset_
07a0: 74 6f 5f 6c 69 73 74 20 24 62 6c 6f 62 5d 20 5b  to_list $blob] [
07b0: 6c 69 73 74 20 7b 2a 7d 24 72 65 73 5d 5d 0a 7d  list {*}$res]].}
07c0: 0a 0a 0a 73 65 74 20 3a 3a 6c 43 6f 6e 66 6c 69  ...set ::lConfli
07d0: 63 74 20 5b 6c 69 73 74 5d 0a 70 72 6f 63 20 78  ct [list].proc x
07e0: 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73 7d 20  Conflict {args} 
07f0: 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69 6e  {.  set res [lin
0800: 64 65 78 20 24 3a 3a 6c 43 6f 6e 66 6c 69 63 74  dex $::lConflict
0810: 20 30 5d 0a 20 20 73 65 74 20 3a 3a 6c 43 6f 6e   0].  set ::lCon
0820: 66 6c 69 63 74 20 5b 6c 72 61 6e 67 65 20 24 3a  flict [lrange $:
0830: 3a 6c 43 6f 6e 66 6c 69 63 74 20 31 20 65 6e 64  :lConflict 1 end
0840: 5d 0a 20 20 72 65 74 75 72 6e 20 24 72 65 73 0a  ].  return $res.
0850: 7d 0a 0a 23 20 54 61 6b 65 20 61 20 63 6f 70 79  }..# Take a copy
0860: 20 6f 66 20 64 61 74 61 62 61 73 65 20 74 65 73   of database tes
0870: 74 2e 64 62 20 69 6e 20 66 69 6c 65 20 74 65 73  t.db in file tes
0880: 74 2e 64 62 32 2e 20 45 78 65 63 75 74 65 20 24  t.db2. Execute $
0890: 73 71 6c 31 0a 23 20 61 67 61 69 6e 73 74 20 74  sql1.# against t
08a0: 65 73 74 2e 64 62 20 61 6e 64 20 24 73 71 6c 32  est.db and $sql2
08b0: 20 61 67 61 69 6e 73 74 20 74 65 73 74 2e 64 62   against test.db
08c0: 32 2e 20 43 61 70 74 75 72 65 20 61 20 63 68 61  2. Capture a cha
08d0: 6e 67 65 73 65 74 0a 23 20 66 6f 72 20 65 61 63  ngeset.# for eac
08e0: 68 2e 20 54 68 65 6e 20 73 65 6e 64 20 74 68 65  h. Then send the
08f0: 20 74 65 73 74 2e 64 62 32 20 63 68 61 6e 67 65   test.db2 change
0900: 73 65 74 20 74 6f 20 74 65 73 74 2e 64 62 20 61  set to test.db a
0910: 6e 64 20 61 70 70 6c 79 0a 23 20 69 74 20 77 69  nd apply.# it wi
0920: 74 68 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  th the conflict 
0930: 68 61 6e 64 6c 65 72 73 20 69 6e 20 24 63 6f 6e  handlers in $con
0940: 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72 2e 20 50  flict_handler. P
0950: 61 74 63 68 20 74 68 65 0a 23 20 74 65 73 74 2e  atch the.# test.
0960: 64 62 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64  db changeset and
0970: 20 74 68 65 6e 20 65 78 65 63 75 74 65 20 69 74   then execute it
0980: 20 61 67 61 69 6e 73 74 20 74 65 73 74 2e 64 62   against test.db
0990: 32 2e 20 54 65 73 74 20 74 68 61 74 0a 23 20 74  2. Test that.# t
09a0: 68 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  he two databases
09b0: 20 63 6f 6d 65 20 6f 75 74 20 74 68 65 20 73 61   come out the sa
09c0: 6d 65 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f 72 65  me..#.proc do_re
09d0: 62 61 73 65 5f 74 65 73 74 20 7b 74 6e 20 73 71  base_test {tn sq
09e0: 6c 31 20 73 71 6c 32 20 63 6f 6e 66 6c 69 63 74  l1 sql2 conflict
09f0: 5f 68 61 6e 64 6c 65 72 20 7b 74 65 73 74 73 71  _handler {testsq
0a00: 6c 20 22 22 7d 20 7b 74 65 73 74 72 65 73 20 22  l ""} {testres "
0a10: 22 7d 7d 20 7b 0a 0a 20 20 66 6f 72 20 7b 73 65  "}} {..  for {se
0a20: 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20 32 7d  t i 1} {$i <= 2}
0a30: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
0a40: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
0a50: 2e 64 62 32 20 74 65 73 74 2e 64 62 32 2d 6a 6f  .db2 test.db2-jo
0a60: 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 77  urnal test.db2-w
0a70: 61 6c 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79  al.    forcecopy
0a80: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
0a90: 32 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  2.    sqlite3 db
0aa0: 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 20 20  2 test.db2..    
0ab0: 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a 0a 20  db eval BEGIN.. 
0ac0: 20 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f     sqlite3sessio
0ad0: 6e 20 53 31 20 64 62 20 6d 61 69 6e 0a 20 20 20  n S1 db main.   
0ae0: 20 53 31 20 61 74 74 61 63 68 20 2a 0a 20 20 20   S1 attach *.   
0af0: 20 65 78 65 63 73 71 6c 20 24 73 71 6c 31 20 64   execsql $sql1 d
0b00: 62 0a 20 20 20 20 73 65 74 20 63 31 20 5b 53 31  b.    set c1 [S1
0b10: 20 63 68 61 6e 67 65 73 65 74 5d 0a 20 20 20 20   changeset].    
0b20: 53 31 20 64 65 6c 65 74 65 0a 0a 20 20 20 20 69  S1 delete..    i
0b30: 66 20 7b 24 69 3d 3d 31 7d 20 7b 0a 20 20 20 20  f {$i==1} {.    
0b40: 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
0b50: 20 53 32 20 64 62 32 20 6d 61 69 6e 0a 20 20 20   S2 db2 main.   
0b60: 20 20 20 53 32 20 61 74 74 61 63 68 20 2a 0a 20     S2 attach *. 
0b70: 20 20 20 20 20 65 78 65 63 73 71 6c 20 24 73 71       execsql $sq
0b80: 6c 32 20 64 62 32 0a 20 20 20 20 20 20 73 65 74  l2 db2.      set
0b90: 20 63 32 20 5b 53 32 20 63 68 61 6e 67 65 73 65   c2 [S2 changese
0ba0: 74 5d 0a 20 20 20 20 20 20 53 32 20 64 65 6c 65  t].      S2 dele
0bb0: 74 65 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  te.    } else {.
0bc0: 20 20 20 20 20 20 73 65 74 20 63 32 20 5b 6c 69        set c2 [li
0bd0: 73 74 5d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  st].      foreac
0be0: 68 20 73 71 6c 20 5b 73 70 6c 69 74 20 24 73 71  h sql [split $sq
0bf0: 6c 32 20 22 3b 22 5d 20 7b 0a 20 20 20 20 20 20  l2 ";"] {.      
0c00: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
0c10: 20 73 70 61 63 65 20 24 73 71 6c 5d 7d 20 63 6f   space $sql]} co
0c20: 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20 73  ntinue.        s
0c30: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 32  qlite3session S2
0c40: 20 64 62 32 20 6d 61 69 6e 0a 20 20 20 20 20 20   db2 main.      
0c50: 20 20 53 32 20 61 74 74 61 63 68 20 2a 0a 20 20    S2 attach *.  
0c60: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 24 73        execsql $s
0c70: 71 6c 20 64 62 32 0a 20 20 20 20 20 20 20 20 6c  ql db2.        l
0c80: 61 70 70 65 6e 64 20 63 32 20 5b 53 32 20 63 68  append c2 [S2 ch
0c90: 61 6e 67 65 73 65 74 5d 0a 20 20 20 20 20 20 20  angeset].       
0ca0: 20 53 32 20 64 65 6c 65 74 65 0a 20 20 20 20 20   S2 delete.     
0cb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65   }.    }..    se
0cc0: 74 20 3a 3a 6c 43 6f 6e 66 6c 69 63 74 20 24 63  t ::lConflict $c
0cd0: 6f 6e 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72 0a  onflict_handler.
0ce0: 20 20 20 20 73 65 74 20 72 65 62 61 73 65 20 5b      set rebase [
0cf0: 6c 69 73 74 5d 0a 20 20 20 20 69 66 20 7b 24 69  list].    if {$i
0d00: 3d 3d 31 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70  ==1} {.      lap
0d10: 70 65 6e 64 20 72 65 62 61 73 65 20 5b 73 71 6c  pend rebase [sql
0d20: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
0d30: 70 6c 79 5f 76 32 20 64 62 20 24 63 32 20 78 43  ply_v2 db $c2 xC
0d40: 6f 6e 66 6c 69 63 74 5d 0a 20 20 20 20 7d 20 65  onflict].    } e
0d50: 6c 73 65 20 7b 0a 20 20 20 20 20 20 66 6f 72 65  lse {.      fore
0d60: 61 63 68 20 63 20 24 63 32 20 7b 0a 23 70 75 74  ach c $c2 {.#put
0d70: 73 20 22 61 70 70 6c 79 5f 76 32 3a 20 5b 63 68  s "apply_v2: [ch
0d80: 61 6e 67 65 73 65 74 5f 74 6f 5f 6c 69 73 74 20  angeset_to_list 
0d90: 24 63 5d 22 0a 20 20 20 20 20 20 20 20 6c 61 70  $c]".        lap
0da0: 70 65 6e 64 20 72 65 62 61 73 65 20 5b 73 71 6c  pend rebase [sql
0db0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
0dc0: 70 6c 79 5f 76 32 20 64 62 20 24 63 20 78 43 6f  ply_v2 db $c xCo
0dd0: 6e 66 6c 69 63 74 5d 0a 20 20 20 20 20 20 7d 0a  nflict].      }.
0de0: 20 20 20 20 20 20 23 70 75 74 73 20 22 6c 6c 65        #puts "lle
0df0: 6e 67 74 68 3a 20 5b 6c 6c 65 6e 67 74 68 20 24  ngth: [llength $
0e00: 72 65 62 61 73 65 5d 22 0a 20 20 20 20 7d 0a 20  rebase]".    }. 
0e10: 20 20 20 23 69 66 20 7b 24 74 6e 3d 3d 22 32 2e     #if {$tn=="2.
0e20: 31 2e 34 22 7d 20 7b 20 70 75 74 73 20 5b 63 68  1.4"} { puts [ch
0e30: 61 6e 67 65 73 65 74 5f 74 6f 5f 6c 69 73 74 20  angeset_to_list 
0e40: 24 72 65 62 61 73 65 5d 20 3b 20 62 72 65 61 6b  $rebase] ; break
0e50: 70 6f 69 6e 74 20 7d 0a 20 20 20 20 23 70 75 74  point }.    #put
0e60: 73 20 5b 63 68 61 6e 67 65 73 65 74 5f 74 6f 5f  s [changeset_to_
0e70: 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 72 65  list [lindex $re
0e80: 62 61 73 65 20 30 5d 5d 20 3b 20 62 72 65 61 6b  base 0]] ; break
0e90: 70 6f 69 6e 74 0a 20 20 20 20 23 70 75 74 73 20  point.    #puts 
0ea0: 5b 6c 6c 65 6e 67 74 68 20 24 72 65 62 61 73 65  [llength $rebase
0eb0: 5d 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ].  .    sqlite3
0ec0: 72 65 62 61 73 65 72 5f 63 72 65 61 74 65 20 52  rebaser_create R
0ed0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 72 20 24  .    foreach r $
0ee0: 72 65 62 61 73 65 20 7b 0a 23 70 75 74 73 20 5b  rebase {.#puts [
0ef0: 63 68 61 6e 67 65 73 65 74 5f 74 6f 5f 6c 69 73  changeset_to_lis
0f00: 74 20 24 72 5d 0a 20 20 20 20 20 20 52 20 63 6f  t $r].      R co
0f10: 6e 66 69 67 75 72 65 20 24 72 0a 20 20 20 20 7d  nfigure $r.    }
0f20: 0a 20 20 20 20 73 65 74 20 63 31 72 20 5b 52 20  .    set c1r [R 
0f30: 72 65 62 61 73 65 20 24 63 31 5d 0a 20 20 20 20  rebase $c1].    
0f40: 52 20 64 65 6c 65 74 65 0a 20 20 20 20 23 69 66  R delete.    #if
0f50: 20 7b 24 74 6e 3d 3d 22 32 2e 31 2e 34 22 7d 20   {$tn=="2.1.4"} 
0f60: 7b 20 70 75 74 73 20 5b 63 68 61 6e 67 65 73 65  { puts [changese
0f70: 74 5f 74 6f 5f 6c 69 73 74 20 24 63 31 72 5d 20  t_to_list $c1r] 
0f80: 7d 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  }.  .    sqlite3
0f90: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
0fa0: 76 32 20 64 62 32 20 24 63 31 72 20 78 43 6f 6e  v2 db2 $c1r xCon
0fb0: 66 6c 69 63 74 41 62 6f 72 74 0a 20 20 0a 20 20  flictAbort.  .  
0fc0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 72 61    if {[string ra
0fd0: 6e 67 65 20 24 74 6e 20 65 6e 64 20 65 6e 64 5d  nge $tn end end]
0fe0: 21 3d 22 2a 22 7d 20 7b 0a 20 20 20 20 20 20 75  !="*"} {.      u
0ff0: 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f  plevel [list do_
1000: 74 65 73 74 20 24 74 6e 2e 24 69 2e 31 20 5b 6c  test $tn.$i.1 [l
1010: 69 73 74 20 63 6f 6d 70 61 72 65 5f 64 62 20 64  ist compare_db d
1020: 62 20 64 62 32 5d 20 7b 7d 5d 0a 20 20 20 20 7d  b db2] {}].    }
1030: 0a 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  .    db2 close. 
1040: 20 0a 20 20 20 20 69 66 20 7b 24 74 65 73 74 73   .    if {$tests
1050: 71 6c 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20  ql!=""} {.      
1060: 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f  uplevel [list do
1070: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74  _execsql_test $t
1080: 6e 2e 24 69 2e 32 20 24 74 65 73 74 73 71 6c 20  n.$i.2 $testsql 
1090: 24 74 65 73 74 72 65 73 5d 0a 20 20 20 20 7d 0a  $testres].    }.
10a0: 20 20 0a 20 20 20 20 64 62 20 65 76 61 6c 20 52    .    db eval R
10b0: 4f 4c 4c 42 41 43 4b 0a 20 20 7d 0a 7d 0a 0a 64  OLLBACK.  }.}..d
10c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
10d0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
10e0: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
10f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
1100: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1110: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 76 61  t1 VALUES(1, 'va
1120: 6c 75 65 20 41 27 29 3b 0a 7d 0a 0a 64 6f 5f 61  lue A');.}..do_a
1130: 70 70 6c 79 5f 76 32 5f 74 65 73 74 20 31 2e 31  pply_v2_test 1.1
1140: 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31  .1 {.  UPDATE t1
1150: 20 53 45 54 20 62 20 3d 20 27 76 61 6c 75 65 20   SET b = 'value 
1160: 42 27 20 57 48 45 52 45 20 61 3d 31 3b 0a 7d 20  B' WHERE a=1;.} 
1170: 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  {.  UPDATE t1 SE
1180: 54 20 62 20 3d 20 27 76 61 6c 75 65 20 43 27 20  T b = 'value C' 
1190: 57 48 45 52 45 20 61 3d 31 3b 0a 7d 20 7b 0a 20  WHERE a=1;.} {. 
11a0: 20 4f 4d 49 54 0a 7d 20 7b 0a 20 20 7b 49 4e 53   OMIT.} {.  {INS
11b0: 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b  ERT t1 0 X. {} {
11c0: 69 20 31 20 74 20 7b 76 61 6c 75 65 20 42 7d 7d  i 1 t {value B}}
11d0: 7d 0a 7d 0a 0a 64 6f 5f 61 70 70 6c 79 5f 76 32  }.}..do_apply_v2
11e0: 5f 74 65 73 74 20 31 2e 31 2e 32 20 7b 0a 20 20  _test 1.1.2 {.  
11f0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
1200: 3d 20 27 76 61 6c 75 65 20 42 27 20 57 48 45 52  = 'value B' WHER
1210: 45 20 61 3d 31 3b 0a 7d 20 7b 0a 20 20 55 50 44  E a=1;.} {.  UPD
1220: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
1230: 76 61 6c 75 65 20 43 27 20 57 48 45 52 45 20 61  value C' WHERE a
1240: 3d 31 3b 0a 7d 20 7b 0a 20 20 52 45 50 4c 41 43  =1;.} {.  REPLAC
1250: 45 0a 7d 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20  E.} {.  {INSERT 
1260: 74 31 20 31 20 58 2e 20 7b 7d 20 7b 69 20 31 20  t1 1 X. {} {i 1 
1270: 74 20 7b 76 61 6c 75 65 20 42 7d 7d 7d 0a 7d 0a  t {value B}}}.}.
1280: 0a 64 6f 5f 61 70 70 6c 79 5f 76 32 5f 74 65 73  .do_apply_v2_tes
1290: 74 20 31 2e 32 2e 31 20 7b 0a 20 20 49 4e 53 45  t 1.2.1 {.  INSE
12a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12b0: 53 28 32 2c 20 27 66 69 72 73 74 27 29 3b 0a 7d  S(2, 'first');.}
12c0: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
12d0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 73   t1 VALUES(2, 's
12e0: 65 63 6f 6e 64 27 29 3b 0a 7d 20 7b 0a 20 20 4f  econd');.} {.  O
12f0: 4d 49 54 0a 7d 20 7b 0a 20 20 7b 49 4e 53 45 52  MIT.} {.  {INSER
1300: 54 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20  T t1 0 X. {} {i 
1310: 32 20 74 20 66 69 72 73 74 7d 7d 0a 7d 0a 64 6f  2 t first}}.}.do
1320: 5f 61 70 70 6c 79 5f 76 32 5f 74 65 73 74 20 31  _apply_v2_test 1
1330: 2e 32 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20  .2.2 {.  INSERT 
1340: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
1350: 2c 20 27 66 69 72 73 74 27 29 3b 0a 7d 20 7b 0a  , 'first');.} {.
1360: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1370: 20 56 41 4c 55 45 53 28 32 2c 20 27 73 65 63 6f   VALUES(2, 'seco
1380: 6e 64 27 29 3b 0a 7d 20 7b 0a 20 20 52 45 50 4c  nd');.} {.  REPL
1390: 41 43 45 0a 7d 20 7b 0a 20 20 7b 49 4e 53 45 52  ACE.} {.  {INSER
13a0: 54 20 74 31 20 31 20 58 2e 20 7b 7d 20 7b 69 20  T t1 1 X. {} {i 
13b0: 32 20 74 20 66 69 72 73 74 7d 7d 0a 7d 0a 0a 64  2 t first}}.}..d
13c0: 6f 5f 61 70 70 6c 79 5f 76 32 5f 74 65 73 74 20  o_apply_v2_test 
13d0: 31 2e 33 2e 31 20 7b 0a 20 20 44 45 4c 45 54 45  1.3.1 {.  DELETE
13e0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
13f0: 3d 31 3b 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45  =1;.} {.  UPDATE
1400: 20 74 31 20 53 45 54 20 62 3d 27 76 61 6c 75 65   t1 SET b='value
1410: 20 44 27 20 57 48 45 52 45 20 61 3d 31 3b 0a 7d   D' WHERE a=1;.}
1420: 20 7b 0a 20 20 4f 4d 49 54 0a 7d 20 7b 0a 20 20   {.  OMIT.} {.  
1430: 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58 2e 20  {DELETE t1 0 X. 
1440: 7b 69 20 31 20 74 20 7b 76 61 6c 75 65 20 41 7d  {i 1 t {value A}
1450: 7d 20 7b 7d 7d 0a 7d 0a 64 6f 5f 61 70 70 6c 79  } {}}.}.do_apply
1460: 5f 76 32 5f 74 65 73 74 20 31 2e 33 2e 32 20 7b  _v2_test 1.3.2 {
1470: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  .  DELETE FROM t
1480: 31 20 57 48 45 52 45 20 61 3d 31 3b 0a 7d 20 7b  1 WHERE a=1;.} {
1490: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
14a0: 20 62 3d 27 76 61 6c 75 65 20 44 27 20 57 48 45   b='value D' WHE
14b0: 52 45 20 61 3d 31 3b 0a 7d 20 7b 0a 20 20 52 45  RE a=1;.} {.  RE
14c0: 50 4c 41 43 45 0a 7d 20 7b 0a 20 20 7b 44 45 4c  PLACE.} {.  {DEL
14d0: 45 54 45 20 74 31 20 31 20 58 2e 20 7b 69 20 31  ETE t1 1 X. {i 1
14e0: 20 74 20 7b 76 61 6c 75 65 20 41 7d 7d 20 7b 7d   t {value A}} {}
14f0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1540: 23 20 54 65 73 74 20 63 61 73 65 73 20 32 2e 2a  # Test cases 2.*
1550: 20 2d 20 73 69 6d 70 6c 65 20 74 65 73 74 73 20   - simple tests 
1560: 6f 66 20 72 65 62 61 73 69 6e 67 20 61 63 74 75  of rebasing actu
1570: 61 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 23  al changesets..#
1580: 0a 23 20 20 20 20 32 2e 31 2e 31 20 2d 20 31 75  .#    2.1.1 - 1u
1590: 32 75 31 72 0a 23 20 20 20 20 32 2e 31 2e 32 20  2u1r.#    2.1.2 
15a0: 2d 20 31 75 32 75 32 72 0a 23 20 20 20 20 32 2e  - 1u2u2r.#    2.
15b0: 31 2e 33 20 2d 20 31 64 32 64 0a 23 20 20 20 20  1.3 - 1d2d.#    
15c0: 32 2e 31 2e 34 20 2d 20 31 64 32 75 31 72 0a 23  2.1.4 - 1d2u1r.#
15d0: 20 20 20 20 32 2e 31 2e 35 20 2d 20 31 64 32 75      2.1.5 - 1d2u
15e0: 32 72 20 21 21 0a 23 20 20 20 20 32 2e 31 2e 36  2r !!.#    2.1.6
15f0: 20 2d 20 31 75 32 64 31 72 0a 23 20 20 20 20 32   - 1u2d1r.#    2
1600: 2e 31 2e 37 20 2d 20 31 75 32 64 32 72 0a 23 0a  .1.7 - 1u2d2r.#.
1610: 23 20 20 20 20 32 2e 31 2e 38 20 2d 20 31 69 32  #    2.1.8 - 1i2
1620: 69 32 72 0a 23 20 20 20 20 32 2e 31 2e 39 20 2d  i2r.#    2.1.9 -
1630: 20 31 69 32 69 31 72 0a 23 0a 0a 70 72 6f 63 20   1i2i1r.#..proc 
1640: 78 43 6f 6e 66 6c 69 63 74 41 62 6f 72 74 20 7b  xConflictAbort {
1650: 61 72 67 73 7d 20 7b 0a 20 20 72 65 74 75 72 6e  args} {.  return
1660: 20 22 41 42 4f 52 54 22 0a 7d 0a 0a 72 65 73 65   "ABORT".}..rese
1670: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
1680: 74 65 73 74 20 32 2e 31 2e 30 20 7b 0a 20 20 43  test 2.1.0 {.  C
1690: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 20 28  REATE TABLE t1 (
16a0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
16b0: 59 20 4b 45 59 2c 20 62 20 54 45 58 54 29 3b 0a  Y KEY, b TEXT);.
16c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
16d0: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
16e0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
16f0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
1700: 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
1710: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
1720: 20 27 74 68 72 65 65 27 29 3b 0a 7d 0a 64 6f 5f   'three');.}.do_
1730: 72 65 62 61 73 65 5f 74 65 73 74 20 32 2e 31 2e  rebase_test 2.1.
1740: 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20  1 {.  UPDATE t1 
1750: 53 45 54 20 62 20 3d 20 27 74 77 6f 2e 31 27 20  SET b = 'two.1' 
1760: 57 48 45 52 45 20 61 3d 32 0a 7d 20 7b 0a 20 20  WHERE a=2.} {.  
1770: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
1780: 3d 20 27 74 77 6f 2e 32 27 20 57 48 45 52 45 20  = 'two.2' WHERE 
1790: 61 3d 32 3b 0a 7d 20 7b 0a 20 20 4f 4d 49 54 0a  a=2;.} {.  OMIT.
17a0: 7d 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  } { SELECT * FRO
17b0: 4d 20 74 31 20 7d 20 7b 31 20 6f 6e 65 20 32 20  M t1 } {1 one 2 
17c0: 74 77 6f 2e 31 20 33 20 74 68 72 65 65 7d 0a 0a  two.1 3 three}..
17d0: 64 6f 5f 72 65 62 61 73 65 5f 74 65 73 74 20 32  do_rebase_test 2
17e0: 2e 31 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20  .1.2 {.  UPDATE 
17f0: 74 31 20 53 45 54 20 62 20 3d 20 27 74 77 6f 2e  t1 SET b = 'two.
1800: 31 27 20 57 48 45 52 45 20 61 3d 32 0a 7d 20 7b  1' WHERE a=2.} {
1810: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
1820: 20 62 20 3d 20 27 74 77 6f 2e 32 27 20 57 48 45   b = 'two.2' WHE
1830: 52 45 20 61 3d 32 3b 0a 7d 20 7b 0a 20 20 52 45  RE a=2;.} {.  RE
1840: 50 4c 41 43 45 0a 7d 20 7b 20 53 45 4c 45 43 54  PLACE.} { SELECT
1850: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20   * FROM t1 } {1 
1860: 6f 6e 65 20 32 20 74 77 6f 2e 32 20 33 20 74 68  one 2 two.2 3 th
1870: 72 65 65 7d 0a 0a 64 6f 5f 72 65 62 61 73 65 5f  ree}..do_rebase_
1880: 74 65 73 74 20 32 2e 31 2e 33 20 7b 0a 20 20 44  test 2.1.3 {.  D
1890: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
18a0: 45 52 45 20 61 3d 33 0a 7d 20 7b 0a 20 20 44 45  ERE a=3.} {.  DE
18b0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
18c0: 52 45 20 61 3d 33 3b 0a 7d 20 7b 0a 20 20 4f 4d  RE a=3;.} {.  OM
18d0: 49 54 0a 7d 20 7b 20 53 45 4c 45 43 54 20 2a 20  IT.} { SELECT * 
18e0: 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 6f 6e 65  FROM t1 } {1 one
18f0: 20 32 20 74 77 6f 7d 0a 0a 64 6f 5f 72 65 62 61   2 two}..do_reba
1900: 73 65 5f 74 65 73 74 20 32 2e 31 2e 34 20 7b 0a  se_test 2.1.4 {.
1910: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1920: 20 57 48 45 52 45 20 61 3d 31 0a 7d 20 7b 0a 20   WHERE a=1.} {. 
1930: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
1940: 3d 27 6f 6e 65 2e 32 27 20 57 48 45 52 45 20 61  ='one.2' WHERE a
1950: 3d 31 0a 7d 20 7b 0a 20 20 4f 4d 49 54 0a 7d 20  =1.} {.  OMIT.} 
1960: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1970: 74 31 20 7d 20 7b 32 20 74 77 6f 20 33 20 74 68  t1 } {2 two 3 th
1980: 72 65 65 7d 0a 0a 23 64 6f 5f 72 65 62 61 73 65  ree}..#do_rebase
1990: 5f 74 65 73 74 20 32 2e 31 2e 35 20 7b 0a 23 20  _test 2.1.5 {.# 
19a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
19b0: 57 48 45 52 45 20 61 3d 31 3b 0a 23 7d 20 7b 0a  WHERE a=1;.#} {.
19c0: 23 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  #  UPDATE t1 SET
19d0: 20 62 3d 27 6f 6e 65 2e 32 27 20 57 48 45 52 45   b='one.2' WHERE
19e0: 20 61 3d 31 0a 23 7d 20 7b 0a 23 20 20 52 45 50   a=1.#} {.#  REP
19f0: 4c 41 43 45 0a 23 7d 20 7b 20 53 45 4c 45 43 54  LACE.#} { SELECT
1a00: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 32 20   * FROM t1 } {2 
1a10: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 64 6f  two 3 three}..do
1a20: 5f 72 65 62 61 73 65 5f 74 65 73 74 20 32 2e 31  _rebase_test 2.1
1a30: 2e 36 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31  .6 {.  UPDATE t1
1a40: 20 53 45 54 20 62 3d 27 74 68 72 65 65 2e 31 27   SET b='three.1'
1a50: 20 57 48 45 52 45 20 61 3d 33 0a 7d 20 7b 0a 20   WHERE a=3.} {. 
1a60: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
1a70: 57 48 45 52 45 20 61 3d 33 3b 0a 7d 20 7b 0a 20  WHERE a=3;.} {. 
1a80: 20 4f 4d 49 54 0a 7d 20 7b 20 53 45 4c 45 43 54   OMIT.} { SELECT
1a90: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20   * FROM t1 } {1 
1aa0: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
1ab0: 65 2e 31 7d 0a 0a 64 6f 5f 72 65 62 61 73 65 5f  e.1}..do_rebase_
1ac0: 74 65 73 74 20 32 2e 31 2e 37 20 7b 0a 20 20 55  test 2.1.7 {.  U
1ad0: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 3d 27  PDATE t1 SET b='
1ae0: 74 68 72 65 65 2e 31 27 20 57 48 45 52 45 20 61  three.1' WHERE a
1af0: 3d 33 0a 7d 20 7b 0a 20 20 44 45 4c 45 54 45 20  =3.} {.  DELETE 
1b00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1b10: 33 3b 0a 7d 20 7b 0a 20 20 52 45 50 4c 41 43 45  3;.} {.  REPLACE
1b20: 0a 7d 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .} { SELECT * FR
1b30: 4f 4d 20 74 31 20 7d 20 7b 31 20 6f 6e 65 20 32  OM t1 } {1 one 2
1b40: 20 74 77 6f 7d 0a 0a 64 6f 5f 72 65 62 61 73 65   two}..do_rebase
1b50: 5f 74 65 73 74 20 32 2e 31 2e 38 20 7b 0a 20 20  _test 2.1.8 {.  
1b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1b70: 41 4c 55 45 53 28 34 2c 20 27 66 6f 75 72 2e 31  ALUES(4, 'four.1
1b80: 27 29 0a 7d 20 7b 0a 20 20 49 4e 53 45 52 54 20  ').} {.  INSERT 
1b90: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
1ba0: 2c 20 27 66 6f 75 72 2e 32 27 29 3b 0a 7d 20 7b  , 'four.2');.} {
1bb0: 0a 20 20 52 45 50 4c 41 43 45 0a 7d 20 7b 20 53  .  REPLACE.} { S
1bc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1bd0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1be0: 20 74 68 72 65 65 20 34 20 66 6f 75 72 2e 32 7d   three 4 four.2}
1bf0: 0a 0a 64 6f 5f 72 65 62 61 73 65 5f 74 65 73 74  ..do_rebase_test
1c00: 20 32 2e 31 2e 39 20 7b 0a 20 20 49 4e 53 45 52   2.1.9 {.  INSER
1c10: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1c20: 28 34 2c 20 27 66 6f 75 72 2e 31 27 29 0a 7d 20  (4, 'four.1').} 
1c30: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
1c40: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 27 66 6f  t1 VALUES(4, 'fo
1c50: 75 72 2e 32 27 29 3b 0a 7d 20 7b 0a 20 20 4f 4d  ur.2');.} {.  OM
1c60: 49 54 0a 7d 20 7b 20 53 45 4c 45 43 54 20 2a 20  IT.} { SELECT * 
1c70: 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 6f 6e 65  FROM t1 } {1 one
1c80: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 20 34   2 two 3 three 4
1c90: 20 66 6f 75 72 2e 31 7d 0a 0a 64 6f 5f 65 78 65   four.1}..do_exe
1ca0: 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e 30 20  csql_test 2.2.0 
1cb0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1cc0: 20 74 32 28 78 2c 20 79 2c 20 7a 20 50 52 49 4d   t2(x, y, z PRIM
1cd0: 41 52 59 20 4b 45 59 29 3b 0a 20 20 49 4e 53 45  ARY KEY);.  INSE
1ce0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1cf0: 53 28 27 69 27 2c 20 27 61 27 2c 20 27 41 27 29  S('i', 'a', 'A')
1d00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1d10: 74 32 20 56 41 4c 55 45 53 28 27 69 69 27 2c 20  t2 VALUES('ii', 
1d20: 27 62 27 2c 20 27 42 27 29 3b 0a 20 20 49 4e 53  'b', 'B');.  INS
1d30: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1d40: 45 53 28 27 69 69 69 27 2c 20 27 63 27 2c 20 27  ES('iii', 'c', '
1d50: 43 27 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  C');..  CREATE T
1d60: 41 42 4c 45 20 74 33 28 61 20 49 4e 54 45 47 45  ABLE t3(a INTEGE
1d70: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
1d80: 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , c);.  INSERT I
1d90: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 2d 31  NTO t3 VALUES(-1
1da0: 2c 20 27 7a 27 2c 20 27 5a 27 29 3b 0a 20 20 49  , 'z', 'Z');.  I
1db0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
1dc0: 4c 55 45 53 28 2d 32 2c 20 27 79 27 2c 20 27 59  LUES(-2, 'y', 'Y
1dd0: 27 29 3b 0a 7d 0a 0a 64 6f 5f 72 65 62 61 73 65  ');.}..do_rebase
1de0: 5f 74 65 73 74 20 32 2e 32 2e 31 20 7b 0a 20 20  _test 2.2.1 {.  
1df0: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 78 3d  UPDATE t2 SET x=
1e00: 31 20 57 48 45 52 45 20 7a 3d 27 41 27 0a 7d 20  1 WHERE z='A'.} 
1e10: 7b 0a 20 20 55 50 44 41 54 45 20 74 32 20 53 45  {.  UPDATE t2 SE
1e20: 54 20 79 3d 27 6f 6e 65 27 20 57 48 45 52 45 20  T y='one' WHERE 
1e30: 7a 3d 27 41 27 3b 0a 7d 20 7b 0a 7d 20 7b 20 53  z='A';.} {.} { S
1e40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1e50: 57 48 45 52 45 20 7a 3d 27 41 27 20 7d 20 7b 20  WHERE z='A' } { 
1e60: 31 20 6f 6e 65 20 41 20 7d 0a 0a 64 6f 5f 72 65  1 one A }..do_re
1e70: 62 61 73 65 5f 74 65 73 74 20 32 2e 32 2e 32 20  base_test 2.2.2 
1e80: 7b 0a 20 20 55 50 44 41 54 45 20 74 32 20 53 45  {.  UPDATE t2 SE
1e90: 54 20 78 3d 31 2c 20 79 3d 27 6f 6e 65 27 20 57  T x=1, y='one' W
1ea0: 48 45 52 45 20 7a 3d 27 42 27 0a 7d 20 7b 0a 20  HERE z='B'.} {. 
1eb0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79   UPDATE t2 SET y
1ec0: 3d 27 74 77 6f 27 20 57 48 45 52 45 20 7a 3d 27  ='two' WHERE z='
1ed0: 42 27 3b 0a 7d 20 7b 0a 20 20 52 45 50 4c 41 43  B';.} {.  REPLAC
1ee0: 45 0a 7d 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  E.} { SELECT * F
1ef0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 7a 3d 27  ROM t2 WHERE z='
1f00: 42 27 20 7d 20 7b 20 31 20 74 77 6f 20 42 20 7d  B' } { 1 two B }
1f10: 0a 0a 64 6f 5f 72 65 62 61 73 65 5f 74 65 73 74  ..do_rebase_test
1f20: 20 32 2e 32 2e 33 20 7b 0a 20 20 55 50 44 41 54   2.2.3 {.  UPDAT
1f30: 45 20 74 32 20 53 45 54 20 78 3d 31 2c 20 79 3d  E t2 SET x=1, y=
1f40: 27 6f 6e 65 27 20 57 48 45 52 45 20 7a 3d 27 42  'one' WHERE z='B
1f50: 27 0a 7d 20 7b 0a 20 20 55 50 44 41 54 45 20 74  '.} {.  UPDATE t
1f60: 32 20 53 45 54 20 79 3d 27 74 77 6f 27 20 57 48  2 SET y='two' WH
1f70: 45 52 45 20 7a 3d 27 42 27 3b 0a 7d 20 7b 0a 20  ERE z='B';.} {. 
1f80: 20 4f 4d 49 54 0a 7d 20 7b 20 53 45 4c 45 43 54   OMIT.} { SELECT
1f90: 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1fa0: 20 7a 3d 27 42 27 20 7d 20 7b 20 31 20 6f 6e 65   z='B' } { 1 one
1fb0: 20 42 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   B }..#---------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65  .reset_db.do_exe
2010: 63 73 71 6c 5f 74 65 73 74 20 33 2e 30 20 7b 0a  csql_test 3.0 {.
2020: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2030: 33 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41  3(a, b, c, PRIMA
2040: 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20  RY KEY(b, c));. 
2050: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
2060: 63 64 65 66 67 68 69 6a 6b 6c 28 78 20 50 52 49  cdefghijkl(x PRI
2070: 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b  MARY KEY, y, z);
2080: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
2090: 74 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t3 VALUES(1, 2, 
20a0: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
20b0: 4f 20 74 33 20 56 41 4c 55 45 53 28 34 2c 20 32  O t3 VALUES(4, 2
20c0: 2c 20 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 5);.  INSERT I
20d0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 37 2c  NTO t3 VALUES(7,
20e0: 20 32 2c 20 39 29 3b 0a 0a 20 20 49 4e 53 45 52   2, 9);..  INSER
20f0: 54 20 49 4e 54 4f 20 61 62 63 64 65 66 67 68 69  T INTO abcdefghi
2100: 6a 6b 6c 20 56 41 4c 55 45 53 28 27 61 27 2c 20  jkl VALUES('a', 
2110: 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 49 4e 53  'b', 'c');.  INS
2120: 45 52 54 20 49 4e 54 4f 20 61 62 63 64 65 66 67  ERT INTO abcdefg
2130: 68 69 6a 6b 6c 20 56 41 4c 55 45 53 28 27 64 27  hijkl VALUES('d'
2140: 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20 49  , 'e', 'f');.  I
2150: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 64 65  NSERT INTO abcde
2160: 66 67 68 69 6a 6b 6c 20 56 41 4c 55 45 53 28 27  fghijkl VALUES('
2170: 67 27 2c 20 27 68 27 2c 20 27 69 27 29 3b 0a 7d  g', 'h', 'i');.}
2180: 0a 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 23 20 20  ..breakpoint.#  
2190: 64 6f 5f 72 65 62 61 73 65 5f 74 65 73 74 20 33  do_rebase_test 3
21a0: 2e 36 2e 74 6e 20 7b 0a 23 20 20 20 20 55 50 44  .6.tn {.#    UPD
21b0: 41 54 45 20 61 62 63 64 65 66 67 68 69 6a 6b 6c  ATE abcdefghijkl
21c0: 20 53 45 54 20 7a 3d 27 58 27 2c 20 79 3d 27 58   SET z='X', y='X
21d0: 27 20 57 48 45 52 45 20 78 3d 27 64 27 3b 0a 23  ' WHERE x='d';.#
21e0: 20 20 7d 20 7b 0a 23 20 20 20 20 55 50 44 41 54    } {.#    UPDAT
21f0: 45 20 61 62 63 64 65 66 67 68 69 6a 6b 6c 20 53  E abcdefghijkl S
2200: 45 54 20 79 3d 31 20 57 48 45 52 45 20 78 3d 27  ET y=1 WHERE x='
2210: 64 27 3b 0a 23 20 20 20 20 55 50 44 41 54 45 20  d';.#    UPDATE 
2220: 61 62 63 64 65 66 67 68 69 6a 6b 6c 20 53 45 54  abcdefghijkl SET
2230: 20 7a 3d 31 20 57 48 45 52 45 20 78 3d 27 64 27   z=1 WHERE x='d'
2240: 3b 0a 23 20 20 7d 20 5b 6c 69 73 74 20 52 45 50  ;.#  } [list REP
2250: 4c 41 43 45 20 52 45 50 4c 41 43 45 20 52 45 50  LACE REPLACE REP
2260: 4c 41 43 45 5d 0a 0a 66 6f 72 65 61 63 68 20 7b  LACE]..foreach {
2270: 74 6e 20 70 7d 20 7b 0a 20 20 20 20 31 20 4f 4d  tn p} {.    1 OM
2280: 49 54 20 32 20 52 45 50 4c 41 43 45 0a 7d 20 7b  IT 2 REPLACE.} {
2290: 0a 20 20 64 6f 5f 72 65 62 61 73 65 5f 74 65 73  .  do_rebase_tes
22a0: 74 20 33 2e 31 2e 24 74 6e 20 7b 0a 20 20 20 20  t 3.1.$tn {.    
22b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
22c0: 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a  ALUES(1, 1, 1);.
22d0: 20 20 20 20 55 50 44 41 54 45 20 61 62 63 64 65      UPDATE abcde
22e0: 66 67 68 69 6a 6b 6c 20 53 45 54 20 79 3d 32 3b  fghijkl SET y=2;
22f0: 0a 20 20 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52  .  } {.    INSER
2300: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
2310: 28 34 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 44  (4, 1, 1);.    D
2320: 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 64 65  ELETE FROM abcde
2330: 66 67 68 69 6a 6b 6c 3b 0a 20 20 7d 20 5b 6c 69  fghijkl;.  } [li
2340: 73 74 20 24 70 20 24 70 20 24 70 20 24 70 20 24  st $p $p $p $p $
2350: 70 20 24 70 20 24 70 20 24 70 5d 0a 0a 20 20 64  p $p $p $p]..  d
2360: 6f 5f 72 65 62 61 73 65 5f 74 65 73 74 20 33 2e  o_rebase_test 3.
2370: 32 2e 24 74 6e 20 7b 0a 20 20 20 20 49 4e 53 45  2.$tn {.    INSE
2380: 52 54 20 49 4e 54 4f 20 61 62 63 64 65 66 67 68  RT INTO abcdefgh
2390: 69 6a 6b 6c 20 53 45 4c 45 43 54 20 2a 20 46 52  ijkl SELECT * FR
23a0: 4f 4d 20 74 33 3b 0a 20 20 20 20 55 50 44 41 54  OM t3;.    UPDAT
23b0: 45 20 74 33 20 53 45 54 20 62 3d 62 2b 31 3b 0a  E t3 SET b=b+1;.
23c0: 20 20 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52 54    } {.    INSERT
23d0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
23e0: 33 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 49 4e  3, 3, 3);.    IN
23f0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 64 65 66  SERT INTO abcdef
2400: 67 68 69 6a 6b 6c 20 53 45 4c 45 43 54 20 2a 20  ghijkl SELECT * 
2410: 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 20 5b 6c 69  FROM t3;.  } [li
2420: 73 74 20 24 70 20 24 70 20 24 70 20 24 70 20 24  st $p $p $p $p $
2430: 70 20 24 70 20 24 70 20 24 70 5d 0a 0a 20 20 64  p $p $p $p]..  d
2440: 6f 5f 72 65 62 61 73 65 5f 74 65 73 74 20 33 2e  o_rebase_test 3.
2450: 33 2e 24 74 6e 20 7b 0a 20 20 20 20 49 4e 53 45  3.$tn {.    INSE
2460: 52 54 20 49 4e 54 4f 20 61 62 63 64 65 66 67 68  RT INTO abcdefgh
2470: 69 6a 6b 6c 20 56 41 4c 55 45 53 28 32 32 2c 20  ijkl VALUES(22, 
2480: 32 33 2c 20 32 34 29 3b 0a 20 20 7d 20 7b 0a 20  23, 24);.  } {. 
2490: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
24a0: 62 63 64 65 66 67 68 69 6a 6b 6c 20 56 41 4c 55  bcdefghijkl VALU
24b0: 45 53 28 32 32 2c 20 32 35 2c 20 32 36 29 3b 0a  ES(22, 25, 26);.
24c0: 20 20 20 20 55 50 44 41 54 45 20 61 62 63 64 65      UPDATE abcde
24d0: 66 67 68 69 6a 6b 6c 20 53 45 54 20 79 3d 34 30  fghijkl SET y=40
24e0: 30 20 57 48 45 52 45 20 78 3d 32 32 3b 0a 20 20  0 WHERE x=22;.  
24f0: 7d 20 5b 6c 69 73 74 20 24 70 20 24 70 20 24 70  } [list $p $p $p
2500: 20 24 70 20 24 70 20 24 70 20 24 70 20 24 70 5d   $p $p $p $p $p]
2510: 0a 0a 20 20 64 6f 5f 72 65 62 61 73 65 5f 74 65  ..  do_rebase_te
2520: 73 74 20 33 2e 34 2e 24 74 6e 20 7b 0a 20 20 20  st 3.4.$tn {.   
2530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
2540: 64 65 66 67 68 69 6a 6b 6c 20 56 41 4c 55 45 53  defghijkl VALUES
2550: 28 32 32 2c 20 32 33 2c 20 32 34 29 3b 0a 20 20  (22, 23, 24);.  
2560: 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  } {.    INSERT I
2570: 4e 54 4f 20 61 62 63 64 65 66 67 68 69 6a 6b 6c  NTO abcdefghijkl
2580: 20 56 41 4c 55 45 53 28 32 32 2c 20 32 35 2c 20   VALUES(22, 25, 
2590: 32 36 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  26);.    UPDATE 
25a0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 20 53 45 54  abcdefghijkl SET
25b0: 20 79 3d 34 30 30 20 57 48 45 52 45 20 78 3d 32   y=400 WHERE x=2
25c0: 32 3b 0a 20 20 7d 20 5b 6c 69 73 74 20 52 45 50  2;.  } [list REP
25d0: 4c 41 43 45 20 24 70 5d 0a 0a 20 20 64 6f 5f 72  LACE $p]..  do_r
25e0: 65 62 61 73 65 5f 74 65 73 74 20 33 2e 35 2e 24  ebase_test 3.5.$
25f0: 74 6e 2a 20 7b 0a 20 20 20 20 55 50 44 41 54 45  tn* {.    UPDATE
2600: 20 61 62 63 64 65 66 67 68 69 6a 6b 6c 20 53 45   abcdefghijkl SE
2610: 54 20 79 3d 27 58 27 20 57 48 45 52 45 20 78 3d  T y='X' WHERE x=
2620: 27 64 27 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 44  'd';.  } {.    D
2630: 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 64 65  ELETE FROM abcde
2640: 66 67 68 69 6a 6b 6c 20 57 48 45 52 45 20 78 3d  fghijkl WHERE x=
2650: 27 64 27 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  'd';.    INSERT 
2660: 49 4e 54 4f 20 61 62 63 64 65 66 67 68 69 6a 6b  INTO abcdefghijk
2670: 6c 20 56 41 4c 55 45 53 28 27 64 27 2c 20 4e 55  l VALUES('d', NU
2680: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 20 5b  LL, NULL);.  } [
2690: 6c 69 73 74 20 24 70 20 24 70 20 24 70 5d 0a 20  list $p $p $p]. 
26a0: 20 64 6f 5f 72 65 62 61 73 65 5f 74 65 73 74 20   do_rebase_test 
26b0: 33 2e 35 2e 24 74 6e 20 7b 0a 20 20 20 20 55 50  3.5.$tn {.    UP
26c0: 44 41 54 45 20 61 62 63 64 65 66 67 68 69 6a 6b  DATE abcdefghijk
26d0: 6c 20 53 45 54 20 79 3d 27 58 27 20 57 48 45 52  l SET y='X' WHER
26e0: 45 20 78 3d 27 64 27 3b 0a 20 20 7d 20 7b 0a 20  E x='d';.  } {. 
26f0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61     DELETE FROM a
2700: 62 63 64 65 66 67 68 69 6a 6b 6c 20 57 48 45 52  bcdefghijkl WHER
2710: 45 20 78 3d 27 64 27 3b 0a 20 20 20 20 49 4e 53  E x='d';.    INS
2720: 45 52 54 20 49 4e 54 4f 20 61 62 63 64 65 66 67  ERT INTO abcdefg
2730: 68 69 6a 6b 6c 20 56 41 4c 55 45 53 28 27 64 27  hijkl VALUES('d'
2740: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20  , NULL, NULL);. 
2750: 20 7d 20 5b 6c 69 73 74 20 52 45 50 4c 41 43 45   } [list REPLACE
2760: 20 24 70 20 24 70 5d 0a 0a 20 20 64 6f 5f 72 65   $p $p]..  do_re
2770: 62 61 73 65 5f 74 65 73 74 20 33 2e 36 2e 24 74  base_test 3.6.$t
2780: 6e 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61  n {.    UPDATE a
2790: 62 63 64 65 66 67 68 69 6a 6b 6c 20 53 45 54 20  bcdefghijkl SET 
27a0: 7a 3d 27 58 27 2c 20 79 3d 27 58 27 20 57 48 45  z='X', y='X' WHE
27b0: 52 45 20 78 3d 27 64 27 3b 0a 20 20 7d 20 7b 0a  RE x='d';.  } {.
27c0: 20 20 20 20 55 50 44 41 54 45 20 61 62 63 64 65      UPDATE abcde
27d0: 66 67 68 69 6a 6b 6c 20 53 45 54 20 79 3d 31 20  fghijkl SET y=1 
27e0: 57 48 45 52 45 20 78 3d 27 64 27 3b 0a 20 20 20  WHERE x='d';.   
27f0: 20 55 50 44 41 54 45 20 61 62 63 64 65 66 67 68   UPDATE abcdefgh
2800: 69 6a 6b 6c 20 53 45 54 20 7a 3d 31 20 57 48 45  ijkl SET z=1 WHE
2810: 52 45 20 78 3d 27 64 27 3b 0a 20 20 7d 20 5b 6c  RE x='d';.  } [l
2820: 69 73 74 20 52 45 50 4c 41 43 45 20 24 70 20 24  ist REPLACE $p $
2830: 70 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  p].}..#---------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 70  .# Check that ap
2890: 70 6c 79 5f 76 32 28 29 20 64 6f 65 73 20 6e 6f  ply_v2() does no
28a0: 74 20 63 72 65 61 74 65 20 61 20 72 65 62 61 73  t create a rebas
28b0: 65 20 62 75 66 66 65 72 20 66 6f 72 20 61 20 70  e buffer for a p
28c0: 61 74 63 68 73 65 74 2e 0a 23 20 41 6e 64 20 74  atchset..# And t
28d0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  hat it is not po
28e0: 73 73 69 62 6c 65 20 74 6f 20 72 65 62 61 73 65  ssible to rebase
28f0: 20 61 20 70 61 74 63 68 73 65 74 2e 0a 23 0a 64   a patchset..#.d
2900: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
2910: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
2920: 42 4c 45 20 74 35 28 6f 20 50 52 49 4d 41 52 59  BLE t5(o PRIMARY
2930: 20 4b 45 59 2c 20 70 2c 20 71 29 3b 0a 20 20 49   KEY, p, q);.  I
2940: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
2950: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
2960: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
2970: 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b  VALUES(4, 5, 6);
2980: 0a 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63  .}.foreach {tn c
2990: 6d 64 20 72 65 62 61 73 61 62 6c 65 7d 20 7b 0a  md rebasable} {.
29a0: 20 20 31 20 70 61 74 63 68 73 65 74 20 30 0a 20    1 patchset 0. 
29b0: 20 32 20 63 68 61 6e 67 65 73 65 74 20 31 0a 7d   2 changeset 1.}
29c0: 20 7b 0a 20 20 70 72 6f 63 20 78 43 6f 6e 66 6c   {.  proc xConfl
29d0: 69 63 74 20 7b 61 72 67 73 7d 20 7b 20 72 65 74  ict {args} { ret
29e0: 75 72 6e 20 22 4f 4d 49 54 22 20 7d 0a 20 20 64  urn "OMIT" }.  d
29f0: 6f 5f 74 65 73 74 20 34 2e 31 2e 24 74 6e 20 7b  o_test 4.1.$tn {
2a00: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2a10: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
2a20: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 35    DELETE FROM t5
2a30: 20 57 48 45 52 45 20 6f 3d 34 3b 0a 20 20 20 20   WHERE o=4;.    
2a40: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 73 65  }..    sqlite3se
2a50: 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a  ssion S db main.
2a60: 20 20 20 20 53 20 61 74 74 61 63 68 20 2a 0a 20      S attach *. 
2a70: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2a80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2a90: 35 20 56 41 4c 55 45 53 28 34 2c 20 27 66 69 76  5 VALUES(4, 'fiv
2aa0: 65 27 2c 20 27 73 69 78 27 29 3b 0a 20 20 20 20  e', 'six');.    
2ab0: 7d 0a 20 20 20 20 73 65 74 20 50 20 5b 53 20 24  }.    set P [S $
2ac0: 63 6d 64 5d 0a 20 20 20 20 53 20 64 65 6c 65 74  cmd].    S delet
2ad0: 65 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20 52  e..    execsql R
2ae0: 4f 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 73 65  OLLBACK;..    se
2af0: 74 20 3a 3a 72 65 62 61 73 65 20 5b 73 71 6c 69  t ::rebase [sqli
2b00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
2b10: 6c 79 5f 76 32 20 64 62 20 24 50 20 78 43 6f 6e  ly_v2 db $P xCon
2b20: 66 6c 69 63 74 5d 0a 20 20 20 20 65 78 70 72 20  flict].    expr 
2b30: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 72 65 62 61  [llength $::reba
2b40: 73 65 5d 3e 30 0a 20 20 7d 20 24 72 65 62 61 73  se]>0.  } $rebas
2b50: 61 62 6c 65 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  able.}..foreach 
2b60: 7b 74 6e 20 63 6d 64 20 72 65 62 61 73 61 62 6c  {tn cmd rebasabl
2b70: 65 7d 20 7b 0a 20 20 31 20 70 61 74 63 68 73 65  e} {.  1 patchse
2b80: 74 20 30 0a 20 20 32 20 63 68 61 6e 67 65 73 65  t 0.  2 changese
2b90: 74 20 31 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  t 1.} {.  do_tes
2ba0: 74 20 34 2e 32 2e 24 74 6e 20 7b 0a 20 20 20 20  t 4.2.$tn {.    
2bb0: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53  sqlite3session S
2bc0: 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 53 20 61   db main.    S a
2bd0: 74 74 61 63 68 20 2a 0a 20 20 20 20 65 78 65 63  ttach *.    exec
2be0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  sql {.      INSE
2bf0: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
2c00: 53 28 35 2b 24 74 6e 2c 20 27 66 69 76 65 27 2c  S(5+$tn, 'five',
2c10: 20 27 73 69 78 27 29 3b 0a 20 20 20 20 7d 0a 20   'six');.    }. 
2c20: 20 20 20 73 65 74 20 50 20 5b 53 20 24 63 6d 64     set P [S $cmd
2c30: 5d 0a 20 20 20 20 53 20 64 65 6c 65 74 65 0a 0a  ].    S delete..
2c40: 20 20 20 20 73 71 6c 69 74 65 33 72 65 62 61 73      sqlite3rebas
2c50: 65 72 5f 63 72 65 61 74 65 20 52 0a 20 20 20 20  er_create R.    
2c60: 52 20 63 6f 6e 66 69 67 75 72 65 20 24 3a 3a 72  R configure $::r
2c70: 65 62 61 73 65 0a 20 20 20 20 65 78 70 72 20 5b  ebase.    expr [
2c80: 63 61 74 63 68 20 7b 52 20 72 65 62 61 73 65 20  catch {R rebase 
2c90: 24 50 7d 5d 3d 3d 30 0a 20 20 7d 20 24 72 65 62  $P}]==0.  } $reb
2ca0: 61 73 61 62 6c 65 0a 0a 20 20 63 61 74 63 68 20  asable..  catch 
2cb0: 7b 20 52 20 64 65 6c 65 74 65 20 7d 0a 7d 0a 66  { R delete }.}.f
2cc0: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.