/ Hex Artifact Content
Login

Artifact 97d59567b282f0807a25eba8df34743476bf9ca8:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70  us of this scrip
01c0: 74 20 69 73 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t is in-memory d
01d0: 61 74 61 62 61 73 65 20 62 61 63 6b 65 6e 64 2e  atabase backend.
01e0: 0a 23 0a 23 20 24 49 64 3a 20 6d 65 6d 64 62 2e  .#.# $Id: memdb.
01f0: 74 65 73 74 2c 76 20 31 2e 31 37 20 32 30 30 39  test,v 1.17 2009
0200: 2f 30 31 2f 30 39 20 31 34 3a 32 39 3a 33 35 20  /01/09 14:29:35 
0210: 64 72 68 20 45 78 70 20 24 0a 0a 0a 73 65 74 20  drh Exp $...set 
0220: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0230: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0240: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0250: 73 74 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61  ster.tcl..ifcapa
0260: 62 6c 65 20 6d 65 6d 6f 72 79 64 62 20 7b 0a 0a  ble memorydb {..
0270: 23 20 49 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  # In the followi
0280: 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  ng sequence of t
0290: 65 73 74 73 2c 20 63 6f 6d 70 75 74 65 20 74 68  ests, compute th
02a0: 65 20 4d 44 35 20 73 75 6d 20 6f 66 20 74 68 65  e MD5 sum of the
02b0: 20 63 6f 6e 74 65 6e 74 0a 23 20 6f 66 20 61 20   content.# of a 
02c0: 74 61 62 6c 65 2c 20 6d 61 6b 65 20 6c 6f 74 73  table, make lots
02d0: 20 6f 66 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   of modification
02e0: 73 20 74 6f 20 74 68 61 74 20 74 61 62 6c 65 2c  s to that table,
02f0: 20 74 68 65 6e 20 64 6f 20 61 20 72 6f 6c 6c 62   then do a rollb
0300: 61 63 6b 2e 0a 23 20 56 65 72 69 66 79 20 74 68  ack..# Verify th
0310: 61 74 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c  at after the rol
0320: 6c 62 61 63 6b 2c 20 74 68 65 20 4d 44 35 20 63  lback, the MD5 c
0330: 68 65 63 6b 73 75 6d 20 69 73 20 75 6e 63 68 61  hecksum is uncha
0340: 6e 67 65 64 2e 0a 23 0a 23 20 54 68 65 73 65 20  nged..#.# These 
0350: 74 65 73 74 73 20 77 65 72 65 20 62 72 6f 77 65  tests were browe
0360: 64 20 66 72 6f 6d 20 74 72 61 6e 73 2e 74 63 6c  d from trans.tcl
0370: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6d 65 6d 64  ..#.do_test memd
0380: 62 2d 31 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  b-1.1 {.  db clo
0390: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
03a0: 3a 6d 65 6d 6f 72 79 3a 0a 20 20 23 20 73 71 6c  :memory:.  # sql
03b0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
03c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
03d0: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
03e0: 45 20 54 41 42 4c 45 20 74 33 28 78 20 54 45 58  E TABLE t3(x TEX
03f0: 54 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  T);.    INSERT I
0400: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 72 61  NTO t3 VALUES(ra
0410: 6e 64 73 74 72 28 31 30 2c 34 30 30 29 29 3b 0a  ndstr(10,400));.
0420: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0430: 74 33 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74  t3 VALUES(randst
0440: 72 28 31 30 2c 34 30 30 29 29 3b 0a 20 20 20 20  r(10,400));.    
0450: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
0460: 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31 30  ELECT randstr(10
0470: 2c 34 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20  ,400) FROM t3;. 
0480: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0490: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72  3 SELECT randstr
04a0: 28 31 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 33  (10,400) FROM t3
04b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
04c0: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
04d0: 73 74 72 28 31 30 2c 34 30 30 29 20 46 52 4f 4d  str(10,400) FROM
04e0: 20 74 33 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t3;.    INSERT 
04f0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
0500: 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20 46  andstr(10,400) F
0510: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49 4e 53 45  ROM t3;.    INSE
0520: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
0530: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30  T randstr(10,400
0540: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49  ) FROM t3;.    I
0550: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
0560: 4c 45 43 54 20 72 61 6e 64 73 74 72 28 31 30 2c  LECT randstr(10,
0570: 34 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20  400) FROM t3;.  
0580: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0590: 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28   SELECT randstr(
05a0: 31 30 2c 34 30 30 29 20 46 52 4f 4d 20 74 33 3b  10,400) FROM t3;
05b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
05c0: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 73   t3 SELECT rands
05d0: 74 72 28 31 30 2c 34 30 30 29 20 46 52 4f 4d 20  tr(10,400) FROM 
05e0: 74 33 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t3;.    INSERT I
05f0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
0600: 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20 46 52  ndstr(10,400) FR
0610: 4f 4d 20 74 33 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t3;.    COMMI
0620: 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  T;.    SELECT co
0630: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 33 3b 0a  unt(*) FROM t3;.
0640: 20 20 7d 0a 7d 20 7b 31 30 32 34 7d 0a 0a 23 20    }.} {1024}..# 
0650: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
0660: 6f 63 65 64 75 72 65 20 63 6f 6d 70 75 74 65 73  ocedure computes
0670: 20 61 20 22 73 69 67 6e 61 74 75 72 65 22 20 66   a "signature" f
0680: 6f 72 20 74 61 62 6c 65 20 22 74 33 22 2e 20 20  or table "t3".  
0690: 49 66 0a 23 20 54 33 20 63 68 61 6e 67 65 73 20  If.# T3 changes 
06a0: 69 6e 20 61 6e 79 20 77 61 79 2c 20 74 68 65 20  in any way, the 
06b0: 73 69 67 6e 61 74 75 72 65 20 73 68 6f 75 6c 64  signature should
06c0: 20 63 68 61 6e 67 65 2e 20 20 0a 23 0a 23 20 54   change.  .#.# T
06d0: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
06e0: 65 73 74 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 57  est ROLLBACK.  W
06f0: 65 20 67 61 74 68 65 72 20 61 20 73 69 67 6e 61  e gather a signa
0700: 74 75 72 65 20 66 6f 72 20 74 33 2c 20 74 68 65  ture for t3, the
0710: 6e 0a 23 20 6d 61 6b 65 20 6c 6f 74 73 20 6f 66  n.# make lots of
0720: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 33 2c 20   changes to t3, 
0730: 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  then rollback an
0740: 64 20 74 61 6b 65 20 61 6e 6f 74 68 65 72 20 73  d take another s
0750: 69 67 6e 61 74 75 72 65 2e 0a 23 20 54 68 65 20  ignature..# The 
0760: 74 77 6f 20 73 69 67 6e 61 74 75 72 65 73 20 73  two signatures s
0770: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  hould be the sam
0780: 65 2e 0a 23 0a 70 72 6f 63 20 73 69 67 6e 61 74  e..#.proc signat
0790: 75 72 65 20 7b 7b 66 6e 20 7b 7d 7d 7d 20 7b 0a  ure {{fn {}}} {.
07a0: 20 20 73 65 74 20 72 78 20 5b 64 62 20 65 76 61    set rx [db eva
07b0: 6c 20 7b 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  l {SELECT x FROM
07c0: 20 74 33 7d 5d 0a 20 20 23 20 73 65 74 20 72 31   t3}].  # set r1
07d0: 20 5b 6d 64 35 20 24 72 78 5c 6e 5d 0a 20 20 69   [md5 $rx\n].  i
07e0: 66 20 7b 24 66 6e 21 3d 22 22 7d 20 7b 0a 20 20  f {$fn!=""} {.  
07f0: 20 20 23 20 73 65 74 20 66 64 20 5b 6f 70 65 6e    # set fd [open
0800: 20 24 66 6e 20 77 5d 0a 20 20 20 20 23 20 70 75   $fn w].    # pu
0810: 74 73 20 24 66 64 20 24 72 78 0a 20 20 20 20 23  ts $fd $rx.    #
0820: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 7d 0a 20   close $fd.  }. 
0830: 20 23 20 73 65 74 20 72 20 5b 64 62 20 65 76 61   # set r [db eva
0840: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
0850: 2a 29 2c 20 6d 64 35 73 75 6d 28 78 29 20 46 52  *), md5sum(x) FR
0860: 4f 4d 20 74 33 7d 5d 0a 20 20 23 20 70 75 74 73  OM t3}].  # puts
0870: 20 22 53 49 47 28 24 66 6e 29 3d 24 72 31 22 0a   "SIG($fn)=$r1".
0880: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5b    return [list [
0890: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72  string length $r
08a0: 78 5d 20 24 72 78 5d 0a 7d 0a 0a 23 20 44 6f 20  x] $rx].}..# Do 
08b0: 72 6f 6c 6c 62 61 63 6b 73 2e 20 20 4d 61 6b 65  rollbacks.  Make
08c0: 20 73 75 72 65 20 74 68 65 20 73 69 67 6e 61 74   sure the signat
08d0: 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  ure does not cha
08e0: 6e 67 65 2e 0a 23 0a 73 65 74 20 6c 69 6d 69 74  nge..#.set limit
08f0: 20 31 30 0a 66 6f 72 20 7b 73 65 74 20 69 20 32   10.for {set i 2
0900: 7d 20 7b 24 69 3c 3d 24 6c 69 6d 69 74 7d 20 7b  } {$i<=$limit} {
0910: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20  incr i} {.  set 
0920: 3a 3a 73 69 67 20 5b 73 69 67 6e 61 74 75 72 65  ::sig [signature
0930: 20 6f 6e 65 5d 0a 20 20 23 20 70 75 74 73 20 22   one].  # puts "
0940: 73 69 67 3d 24 73 69 67 22 0a 20 20 73 65 74 20  sig=$sig".  set 
0950: 63 6e 74 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 73  cnt [lindex $::s
0960: 69 67 20 30 5d 0a 20 20 69 66 20 7b 24 69 25 32  ig 0].  if {$i%2
0970: 3d 3d 30 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  ==0} {.    execs
0980: 71 6c 20 7b 50 52 41 47 4d 41 20 73 79 6e 63 68  ql {PRAGMA synch
0990: 72 6f 6e 6f 75 73 3d 46 55 4c 4c 7d 0a 20 20 7d  ronous=FULL}.  }
09a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 65 78 65 63   else {.    exec
09b0: 73 71 6c 20 7b 50 52 41 47 4d 41 20 73 79 6e 63  sql {PRAGMA sync
09c0: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 7d 0a  hronous=NORMAL}.
09d0: 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6d 65    }.  do_test me
09e0: 6d 64 62 2d 31 2e 24 69 2e 31 2d 24 63 6e 74 20  mdb-1.$i.1-$cnt 
09f0: 7b 0a 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  {.     execsql {
0a00: 0a 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  .       BEGIN;. 
0a10: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
0a20: 4d 20 74 33 20 57 48 45 52 45 20 72 61 6e 64 6f  M t3 WHERE rando
0a30: 6d 28 29 25 31 30 21 3d 30 3b 0a 20 20 20 20 20  m()%10!=0;.     
0a40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0a50: 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28   SELECT randstr(
0a60: 31 30 2c 31 30 29 7c 7c 78 20 46 52 4f 4d 20 74  10,10)||x FROM t
0a70: 33 3b 0a 20 20 20 20 20 20 20 49 4e 53 45 52 54  3;.       INSERT
0a80: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
0a90: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 29 7c 7c  randstr(10,10)||
0aa0: 78 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20  x FROM t3;.     
0ab0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
0ac0: 20 7d 0a 20 20 20 20 20 73 65 74 20 73 69 67 32   }.     set sig2
0ad0: 20 5b 73 69 67 6e 61 74 75 72 65 20 74 77 6f 5d   [signature two]
0ae0: 0a 20 20 7d 20 24 73 69 67 0a 20 20 23 20 70 75  .  } $sig.  # pu
0af0: 74 73 20 22 73 69 67 32 3d 24 73 69 67 32 22 0a  ts "sig2=$sig2".
0b00: 20 20 23 20 69 66 20 7b 24 73 69 67 32 21 3d 24    # if {$sig2!=$
0b10: 73 69 67 7d 20 65 78 69 74 0a 20 20 64 6f 5f 74  sig} exit.  do_t
0b20: 65 73 74 20 6d 65 6d 64 62 2d 31 2e 24 69 2e 32  est memdb-1.$i.2
0b30: 2d 24 63 6e 74 20 7b 0a 20 20 20 20 20 65 78 65  -$cnt {.     exe
0b40: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 42 45  csql {.       BE
0b50: 47 49 4e 3b 0a 20 20 20 20 20 20 20 44 45 4c 45  GIN;.       DELE
0b60: 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45  TE FROM t3 WHERE
0b70: 20 72 61 6e 64 6f 6d 28 29 25 31 30 21 3d 30 3b   random()%10!=0;
0b80: 0a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  .       INSERT I
0b90: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
0ba0: 6e 64 73 74 72 28 31 30 2c 31 30 29 7c 7c 78 20  ndstr(10,10)||x 
0bb0: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 20  FROM t3;.       
0bc0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 20 57  DELETE FROM t3 W
0bd0: 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 25 31 30  HERE random()%10
0be0: 21 3d 30 3b 0a 20 20 20 20 20 20 20 49 4e 53 45  !=0;.       INSE
0bf0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
0c00: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 31 30 29  T randstr(10,10)
0c10: 7c 7c 78 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  ||x FROM t3;.   
0c20: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
0c30: 20 20 20 7d 0a 20 20 20 20 20 73 69 67 6e 61 74     }.     signat
0c40: 75 72 65 0a 20 20 7d 20 24 73 69 67 0a 20 20 69  ure.  } $sig.  i
0c50: 66 20 7b 24 69 3c 24 6c 69 6d 69 74 7d 20 7b 0a  f {$i<$limit} {.
0c60: 20 20 20 20 64 6f 5f 74 65 73 74 20 6d 65 6d 64      do_test memd
0c70: 62 2d 31 2e 24 69 2e 39 2d 24 63 6e 74 20 7b 0a  b-1.$i.9-$cnt {.
0c80: 20 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b         execsql {
0c90: 0a 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  .         INSERT
0ca0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
0cb0: 72 61 6e 64 73 74 72 28 31 30 2c 34 30 30 29 20  randstr(10,400) 
0cc0: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72 61  FROM t3 WHERE ra
0cd0: 6e 64 6f 6d 28 29 25 31 30 3d 3d 30 3b 0a 20 20  ndom()%10==0;.  
0ce0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a       }.    } {}.
0cf0: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 70 61 67 65    }.  set ::page
0d00: 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 30 0a 7d  r_old_format 0.}
0d10: 0a 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  ..integrity_chec
0d20: 6b 20 6d 65 6d 64 62 2d 32 2e 31 0a 0a 64 6f 5f  k memdb-2.1..do_
0d30: 74 65 73 74 20 6d 65 6d 64 62 2d 33 2e 31 20 7b  test memdb-3.1 {
0d40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0d50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
0d60: 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 42  (a,b,c,d);.    B
0d70: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
0d80: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
0d90: 31 2c 32 2c 33 2c 34 29 3b 0a 20 20 20 20 53 45  1,2,3,4);.    SE
0da0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a  LECT * FROM t4;.
0db0: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a    }.} {1 2 3 4}.
0dc0: 64 6f 5f 74 65 73 74 20 6d 65 6d 64 62 2d 33 2e  do_test memdb-3.
0dd0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
0de0: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
0df0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0e00: 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  er WHERE type='t
0e10: 61 62 6c 65 27 3b 0a 20 20 7d 0a 7d 20 7b 74 33  able';.  }.} {t3
0e20: 20 74 34 7d 0a 64 6f 5f 74 65 73 74 20 6d 65 6d   t4}.do_test mem
0e30: 64 62 2d 33 2e 33 20 7b 0a 20 20 65 78 65 63 73  db-3.3 {.  execs
0e40: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
0e50: 42 4c 45 20 74 34 3b 0a 20 20 20 20 53 45 4c 45  BLE t4;.    SELE
0e60: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
0e70: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
0e80: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 3b 0a 20   type='table';. 
0e90: 20 7d 0a 7d 20 7b 74 33 7d 0a 64 6f 5f 74 65 73   }.} {t3}.do_tes
0ea0: 74 20 6d 65 6d 64 62 2d 33 2e 34 20 7b 0a 20 20  t memdb-3.4 {.  
0eb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f  execsql {.    RO
0ec0: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45  LLBACK;.    SELE
0ed0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
0ee0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
0ef0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 3b 0a 20   type='table';. 
0f00: 20 7d 0a 7d 20 7b 74 33 20 74 34 7d 0a 0a 23 20   }.} {t3 t4}..# 
0f10: 43 72 65 61 74 65 20 74 61 62 6c 65 73 20 66 6f  Create tables fo
0f20: 72 20 74 68 65 20 66 69 72 73 74 20 67 72 6f 75  r the first grou
0f30: 70 20 6f 66 20 74 65 73 74 73 2e 0a 23 0a 64 6f  p of tests..#.do
0f40: 5f 74 65 73 74 20 6d 65 6d 64 62 2d 34 2e 30 20  _test memdb-4.0 
0f50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0f60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0f70: 31 28 61 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55  1(a, b, c, UNIQU
0f80: 45 28 61 2c 62 29 29 3b 0a 20 20 20 20 43 52 45  E(a,b));.    CRE
0f90: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
0fa0: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52  .    SELECT c FR
0fb0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 63  OM t1 ORDER BY c
0fc0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 53 69  ;.  }.} {}..# Si
0fd0: 78 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 63 6f 6e  x columns of con
0fe0: 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 20  figuration data 
0ff0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20  as follows:.#.# 
1000: 20 20 69 20 20 20 20 20 20 54 68 65 20 72 65 66    i      The ref
1010: 65 72 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 66  erence number of
1020: 20 74 68 65 20 74 65 73 74 0a 23 20 20 20 63 6f   the test.#   co
1030: 6e 66 20 20 20 54 68 65 20 63 6f 6e 66 6c 69 63  nf   The conflic
1040: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
1050: 6f 72 69 74 68 6d 20 6f 6e 20 74 68 65 20 42 45  orithm on the BE
1060: 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 0a 23 20  GIN statement.# 
1070: 20 20 63 6d 64 20 20 20 20 41 6e 20 49 4e 53 45    cmd    An INSE
1080: 52 54 20 6f 72 20 52 45 50 4c 41 43 45 20 63 6f  RT or REPLACE co
1090: 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75 74 65  mmand to execute
10a0: 20 61 67 61 69 6e 73 74 20 74 61 62 6c 65 20 74   against table t
10b0: 31 0a 23 20 20 20 74 30 20 20 20 20 20 54 72 75  1.#   t0     Tru
10c0: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
10d0: 20 65 72 72 6f 72 20 66 72 6f 6d 20 24 63 6d 64   error from $cmd
10e0: 0a 23 20 20 20 74 31 20 20 20 20 20 43 6f 6e 74  .#   t1     Cont
10f0: 65 6e 74 20 6f 66 20 22 63 22 20 63 6f 6c 75 6d  ent of "c" colum
1100: 6e 20 6f 66 20 74 31 20 61 73 73 75 6d 69 6e 67  n of t1 assuming
1110: 20 6e 6f 20 65 72 72 6f 72 20 69 6e 20 24 63 6d   no error in $cm
1120: 64 0a 23 20 20 20 74 32 20 20 20 20 20 43 6f 6e  d.#   t2     Con
1130: 74 65 6e 74 20 6f 66 20 22 78 22 20 63 6f 6c 75  tent of "x" colu
1140: 6d 6e 20 6f 66 20 74 32 0a 23 0a 66 6f 72 65 61  mn of t2.#.forea
1150: 63 68 20 7b 69 20 63 6f 6e 66 20 63 6d 64 20 74  ch {i conf cmd t
1160: 30 20 74 31 20 74 32 7d 20 7b 0a 20 20 31 20 7b  0 t1 t2} {.  1 {
1170: 7d 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 20  }       INSERT  
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 31 20 7b 7d 20 20 31 0a 20 20 32 20 7b 7d 20 20  1 {}  1.  2 {}  
11a0: 20 20 20 20 20 7b 49 4e 53 45 52 54 20 4f 52 20       {INSERT OR 
11b0: 49 47 4e 4f 52 45 7d 20 20 20 20 20 20 30 20 33  IGNORE}      0 3
11c0: 20 20 20 31 0a 20 20 33 20 7b 7d 20 20 20 20 20     1.  3 {}     
11d0: 20 20 7b 49 4e 53 45 52 54 20 4f 52 20 52 45 50    {INSERT OR REP
11e0: 4c 41 43 45 7d 20 20 20 20 20 30 20 34 20 20 20  LACE}     0 4   
11f0: 31 0a 20 20 34 20 7b 7d 20 20 20 20 20 20 20 52  1.  4 {}       R
1200: 45 50 4c 41 43 45 20 20 20 20 20 20 20 20 20 20  EPLACE          
1210: 20 20 20 20 20 20 20 30 20 34 20 20 20 31 0a 20         0 4   1. 
1220: 20 35 20 7b 7d 20 20 20 20 20 20 20 7b 49 4e 53   5 {}       {INS
1230: 45 52 54 20 4f 52 20 46 41 49 4c 7d 20 20 20 20  ERT OR FAIL}    
1240: 20 20 20 20 31 20 7b 7d 20 20 31 0a 20 20 36 20      1 {}  1.  6 
1250: 7b 7d 20 20 20 20 20 20 20 7b 49 4e 53 45 52 54  {}       {INSERT
1260: 20 4f 52 20 41 42 4f 52 54 7d 20 20 20 20 20 20   OR ABORT}      
1270: 20 31 20 7b 7d 20 20 31 0a 20 20 37 20 7b 7d 20   1 {}  1.  7 {} 
1280: 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20 4f 52        {INSERT OR
1290: 20 52 4f 4c 4c 42 41 43 4b 7d 20 20 20 20 31 20   ROLLBACK}    1 
12a0: 7b 7d 20 20 7b 7d 0a 7d 20 7b 0a 0a 20 20 23 20  {}  {}.} {..  # 
12b0: 41 6c 6c 20 74 65 73 74 73 20 61 66 74 65 72 20  All tests after 
12c0: 74 65 73 74 20 31 20 64 65 70 65 6e 64 20 6f 6e  test 1 depend on
12d0: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
12e0: 74 69 6f 6e 2e 20 53 6f 20 65 6e 64 20 74 68 65  tion. So end the
12f0: 0a 20 20 23 20 6c 6f 6f 70 20 69 66 20 74 68 61  .  # loop if tha
1300: 74 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  t is not availab
1310: 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
1320: 2e 0a 20 20 69 66 63 61 70 61 62 6c 65 20 21 63  ..  ifcapable !c
1330: 6f 6e 66 6c 69 63 74 20 7b 69 66 20 7b 24 69 3e  onflict {if {$i>
1340: 31 7d 20 62 72 65 61 6b 7d 0a 0a 20 20 64 6f 5f  1} break}..  do_
1350: 74 65 73 74 20 6d 65 6d 64 62 2d 34 2e 24 69 20  test memdb-4.$i 
1360: 7b 0a 20 20 20 20 69 66 20 7b 24 63 6f 6e 66 21  {.    if {$conf!
1370: 3d 22 22 7d 20 7b 73 65 74 20 63 6f 6e 66 20 22  =""} {set conf "
1380: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 24 63 6f 6e  ON CONFLICT $con
1390: 66 22 7d 0a 20 20 20 20 73 65 74 20 72 30 20 5b  f"}.    set r0 [
13a0: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 5b  catch {execsql [
13b0: 73 75 62 73 74 20 7b 0a 20 20 20 20 20 20 44 45  subst {.      DE
13c0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
13d0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
13e0: 74 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t2;.      INSERT
13f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1400: 31 2c 32 2c 33 29 3b 0a 20 20 20 20 20 20 42 45  1,2,3);.      BE
1410: 47 49 4e 20 24 63 6f 6e 66 3b 0a 20 20 20 20 20  GIN $conf;.     
1420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1430: 56 41 4c 55 45 53 28 31 29 3b 20 0a 20 20 20 20  VALUES(1); .    
1440: 20 20 24 63 6d 64 20 49 4e 54 4f 20 74 31 20 56    $cmd INTO t1 V
1450: 41 4c 55 45 53 28 31 2c 32 2c 34 29 3b 0a 20 20  ALUES(1,2,4);.  
1460: 20 20 7d 5d 7d 20 72 31 5d 0a 20 20 20 20 63 61    }]} r1].    ca
1470: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 43 4f  tch {execsql {CO
1480: 4d 4d 49 54 7d 7d 0a 20 20 20 20 69 66 20 7b 24  MMIT}}.    if {$
1490: 72 30 7d 20 7b 73 65 74 20 72 31 20 7b 7d 7d 20  r0} {set r1 {}} 
14a0: 7b 73 65 74 20 72 31 20 5b 65 78 65 63 73 71 6c  {set r1 [execsql
14b0: 20 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20   {SELECT c FROM 
14c0: 74 31 7d 5d 7d 0a 20 20 20 20 73 65 74 20 72 32  t1}]}.    set r2
14d0: 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43   [execsql {SELEC
14e0: 54 20 78 20 46 52 4f 4d 20 74 32 7d 5d 0a 20 20  T x FROM t2}].  
14f0: 20 20 6c 69 73 74 20 24 72 30 20 24 72 31 20 24    list $r0 $r1 $
1500: 72 32 0a 20 20 7d 20 5b 6c 69 73 74 20 24 74 30  r2.  } [list $t0
1510: 20 24 74 31 20 24 74 32 5d 0a 7d 0a 0a 64 6f 5f   $t1 $t2].}..do_
1520: 74 65 73 74 20 6d 65 6d 64 62 2d 35 2e 30 20 7b  test memdb-5.0 {
1530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1540: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
1550: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
1560: 33 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  3;.    CREATE TA
1570: 42 4c 45 20 74 32 28 61 2c 62 2c 63 29 3b 0a 20  BLE t2(a,b,c);. 
1580: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1590: 32 20 56 41 4c 55 45 53 28 31 2c 32 2c 31 29 3b  2 VALUES(1,2,1);
15a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
15b0: 20 74 32 20 56 41 4c 55 45 53 28 32 2c 33 2c 32   t2 VALUES(2,3,2
15c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
15d0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 34  TO t2 VALUES(3,4
15e0: 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,1);.    INSERT 
15f0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34  INTO t2 VALUES(4
1600: 2c 35 2c 34 29 3b 0a 20 20 20 20 53 45 4c 45 43  ,5,4);.    SELEC
1610: 54 20 63 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  T c FROM t2 ORDE
1620: 52 20 42 59 20 62 3b 0a 20 20 20 20 43 52 45 41  R BY b;.    CREA
1630: 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a  TE TABLE t3(x);.
1640: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1650: 74 33 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  t3 VALUES(1);.  
1660: 7d 0a 7d 20 7b 31 20 32 20 31 20 34 7d 0a 0a 23  }.} {1 2 1 4}..#
1670: 20 53 69 78 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   Six columns of 
1680: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61  configuration da
1690: 74 61 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23  ta as follows:.#
16a0: 0a 23 20 20 20 69 20 20 20 20 20 20 54 68 65 20  .#   i      The 
16b0: 72 65 66 65 72 65 6e 63 65 20 6e 75 6d 62 65 72  reference number
16c0: 20 6f 66 20 74 68 65 20 74 65 73 74 0a 23 20 20   of the test.#  
16d0: 20 63 6f 6e 66 31 20 20 54 68 65 20 63 6f 6e 66   conf1  The conf
16e0: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
16f0: 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 20 74 68 65  algorithm on the
1700: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1710: 6e 74 0a 23 20 20 20 63 6f 6e 66 32 20 20 54 68  nt.#   conf2  Th
1720: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
1730: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
1740: 6f 6e 20 74 68 65 20 42 45 47 49 4e 20 73 74 61  on the BEGIN sta
1750: 74 65 6d 65 6e 74 0a 23 20 20 20 63 6d 64 20 20  tement.#   cmd  
1760: 20 20 41 6e 20 55 50 44 41 54 45 20 63 6f 6d 6d    An UPDATE comm
1770: 61 6e 64 20 74 6f 20 65 78 65 63 75 74 65 20 61  and to execute a
1780: 67 61 69 6e 73 74 20 74 61 62 6c 65 20 74 31 0a  gainst table t1.
1790: 23 20 20 20 74 30 20 20 20 20 20 54 72 75 65 20  #   t0     True 
17a0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
17b0: 72 72 6f 72 20 66 72 6f 6d 20 24 63 6d 64 0a 23  rror from $cmd.#
17c0: 20 20 20 74 31 20 20 20 20 20 43 6f 6e 74 65 6e     t1     Conten
17d0: 74 20 6f 66 20 22 62 22 20 63 6f 6c 75 6d 6e 20  t of "b" column 
17e0: 6f 66 20 74 31 20 61 73 73 75 6d 69 6e 67 20 6e  of t1 assuming n
17f0: 6f 20 65 72 72 6f 72 20 69 6e 20 24 63 6d 64 0a  o error in $cmd.
1800: 23 20 20 20 74 32 20 20 20 20 20 43 6f 6e 74 65  #   t2     Conte
1810: 6e 74 20 6f 66 20 22 78 22 20 63 6f 6c 75 6d 6e  nt of "x" column
1820: 20 6f 66 20 74 33 0a 23 0a 66 6f 72 65 61 63 68   of t3.#.foreach
1830: 20 7b 69 20 63 6f 6e 66 31 20 63 6f 6e 66 32 20   {i conf1 conf2 
1840: 63 6d 64 20 74 30 20 74 31 20 74 32 7d 20 7b 0a  cmd t0 t1 t2} {.
1850: 20 20 31 20 7b 7d 20 20 20 20 20 20 20 7b 7d 20    1 {}       {} 
1860: 20 20 20 20 20 20 55 50 44 41 54 45 20 20 20 20        UPDATE    
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
1880: 7b 36 20 37 20 38 20 39 7d 20 20 31 0a 20 20 32  {6 7 8 9}  1.  2
1890: 20 52 45 50 4c 41 43 45 20 20 7b 7d 20 20 20 20   REPLACE  {}    
18a0: 20 20 20 55 50 44 41 54 45 20 20 20 20 20 20 20     UPDATE       
18b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7b 37 20             0 {7 
18c0: 36 20 39 7d 20 20 20 20 31 0a 20 20 33 20 49 47  6 9}    1.  3 IG
18d0: 4e 4f 52 45 20 20 20 7b 7d 20 20 20 20 20 20 20  NORE   {}       
18e0: 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20  UPDATE          
18f0: 20 20 20 20 20 20 20 20 30 20 7b 36 20 37 20 33          0 {6 7 3
1900: 20 39 7d 20 20 31 0a 20 20 34 20 46 41 49 4c 20   9}  1.  4 FAIL 
1910: 20 20 20 20 7b 7d 20 20 20 20 20 20 20 55 50 44      {}       UPD
1920: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ATE             
1930: 20 20 20 20 20 31 20 7b 36 20 37 20 33 20 34 7d       1 {6 7 3 4}
1940: 20 20 31 0a 20 20 35 20 41 42 4f 52 54 20 20 20    1.  5 ABORT   
1950: 20 7b 7d 20 20 20 20 20 20 20 55 50 44 41 54 45   {}       UPDATE
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 31 20 7b 31 20 32 20 33 20 34 7d 20 20 31    1 {1 2 3 4}  1
1980: 0a 20 20 36 20 52 4f 4c 4c 42 41 43 4b 20 7b 7d  .  6 ROLLBACK {}
1990: 20 20 20 20 20 20 20 55 50 44 41 54 45 20 20 20         UPDATE   
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
19b0: 20 7b 31 20 32 20 33 20 34 7d 20 20 30 0a 20 20   {1 2 3 4}  0.  
19c0: 37 20 52 45 50 4c 41 43 45 20 20 7b 7d 20 20 20  7 REPLACE  {}   
19d0: 20 20 20 20 7b 55 50 44 41 54 45 20 4f 52 20 49      {UPDATE OR I
19e0: 47 4e 4f 52 45 7d 20 20 20 20 20 20 30 20 7b 36  GNORE}      0 {6
19f0: 20 37 20 33 20 39 7d 20 20 31 0a 20 20 38 20 49   7 3 9}  1.  8 I
1a00: 47 4e 4f 52 45 20 20 20 7b 7d 20 20 20 20 20 20  GNORE   {}      
1a10: 20 7b 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c   {UPDATE OR REPL
1a20: 41 43 45 7d 20 20 20 20 20 30 20 7b 37 20 36 20  ACE}     0 {7 6 
1a30: 39 7d 20 20 20 20 31 0a 20 20 39 20 46 41 49 4c  9}    1.  9 FAIL
1a40: 20 20 20 20 20 7b 7d 20 20 20 20 20 20 20 7b 55       {}       {U
1a50: 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45 7d  PDATE OR IGNORE}
1a60: 20 20 20 20 20 20 30 20 7b 36 20 37 20 33 20 39        0 {6 7 3 9
1a70: 7d 20 20 31 0a 20 31 30 20 41 42 4f 52 54 20 20  }  1. 10 ABORT  
1a80: 20 20 7b 7d 20 20 20 20 20 20 20 7b 55 50 44 41    {}       {UPDA
1a90: 54 45 20 4f 52 20 52 45 50 4c 41 43 45 7d 20 20  TE OR REPLACE}  
1aa0: 20 20 20 30 20 7b 37 20 36 20 39 7d 20 20 20 20     0 {7 6 9}    
1ab0: 31 0a 20 31 31 20 52 4f 4c 4c 42 41 43 4b 20 7b  1. 11 ROLLBACK {
1ac0: 7d 20 20 20 20 20 20 20 7b 55 50 44 41 54 45 20  }       {UPDATE 
1ad0: 4f 52 20 49 47 4e 4f 52 45 7d 20 20 20 20 20 20  OR IGNORE}      
1ae0: 30 20 7b 36 20 37 20 33 20 39 7d 20 20 20 31 0a  0 {6 7 3 9}   1.
1af0: 20 31 32 20 7b 7d 20 20 20 20 20 20 20 7b 7d 20   12 {}       {} 
1b00: 20 20 20 20 20 20 7b 55 50 44 41 54 45 20 4f 52        {UPDATE OR
1b10: 20 49 47 4e 4f 52 45 7d 20 20 20 20 20 20 30 20   IGNORE}      0 
1b20: 7b 36 20 37 20 33 20 39 7d 20 20 31 0a 20 31 33  {6 7 3 9}  1. 13
1b30: 20 7b 7d 20 20 20 20 20 20 20 7b 7d 20 20 20 20   {}       {}    
1b40: 20 20 20 7b 55 50 44 41 54 45 20 4f 52 20 52 45     {UPDATE OR RE
1b50: 50 4c 41 43 45 7d 20 20 20 20 20 30 20 7b 37 20  PLACE}     0 {7 
1b60: 36 20 39 7d 20 20 20 20 31 0a 20 31 34 20 7b 7d  6 9}    1. 14 {}
1b70: 20 20 20 20 20 20 20 7b 7d 20 20 20 20 20 20 20         {}       
1b80: 7b 55 50 44 41 54 45 20 4f 52 20 46 41 49 4c 7d  {UPDATE OR FAIL}
1b90: 20 20 20 20 20 20 20 20 31 20 7b 36 20 37 20 33          1 {6 7 3
1ba0: 20 34 7d 20 20 31 0a 20 31 35 20 7b 7d 20 20 20   4}  1. 15 {}   
1bb0: 20 20 20 20 7b 7d 20 20 20 20 20 20 20 7b 55 50      {}       {UP
1bc0: 44 41 54 45 20 4f 52 20 41 42 4f 52 54 7d 20 20  DATE OR ABORT}  
1bd0: 20 20 20 20 20 31 20 7b 31 20 32 20 33 20 34 7d       1 {1 2 3 4}
1be0: 20 20 31 0a 20 31 36 20 7b 7d 20 20 20 20 20 20    1. 16 {}      
1bf0: 20 7b 7d 20 20 20 20 20 20 20 7b 55 50 44 41 54   {}       {UPDAT
1c00: 45 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 7d 20 20  E OR ROLLBACK}  
1c10: 20 20 31 20 7b 31 20 32 20 33 20 34 7d 20 20 30    1 {1 2 3 4}  0
1c20: 0a 7d 20 7b 0a 20 20 23 20 41 6c 6c 20 74 65 73  .} {.  # All tes
1c30: 74 73 20 61 66 74 65 72 20 74 65 73 74 20 31 20  ts after test 1 
1c40: 64 65 70 65 6e 64 20 6f 6e 20 63 6f 6e 66 6c 69  depend on confli
1c50: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 20 53  ct resolution. S
1c60: 6f 20 65 6e 64 20 74 68 65 0a 20 20 23 20 6c 6f  o end the.  # lo
1c70: 6f 70 20 69 66 20 74 68 61 74 20 69 73 20 6e 6f  op if that is no
1c80: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
1c90: 68 69 73 20 62 75 69 6c 64 2e 0a 20 20 69 66 63  his build..  ifc
1ca0: 61 70 61 62 6c 65 20 21 63 6f 6e 66 6c 69 63 74  apable !conflict
1cb0: 20 7b 0a 20 20 20 20 69 66 20 7b 24 69 3e 31 7d   {.    if {$i>1}
1cc0: 20 62 72 65 61 6b 0a 20 20 7d 0a 0a 20 20 69 66   break.  }..  if
1cd0: 20 7b 24 74 30 7d 20 7b 73 65 74 20 74 31 20 7b   {$t0} {set t1 {
1ce0: 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20  column a is not 
1cf0: 75 6e 69 71 75 65 7d 7d 0a 20 20 64 6f 5f 74 65  unique}}.  do_te
1d00: 73 74 20 6d 65 6d 64 62 2d 35 2e 24 69 20 7b 0a  st memdb-5.$i {.
1d10: 20 20 20 20 69 66 20 7b 24 63 6f 6e 66 31 21 3d      if {$conf1!=
1d20: 22 22 7d 20 7b 73 65 74 20 63 6f 6e 66 31 20 22  ""} {set conf1 "
1d30: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 24 63 6f 6e  ON CONFLICT $con
1d40: 66 31 22 7d 0a 20 20 20 20 69 66 20 7b 24 63 6f  f1"}.    if {$co
1d50: 6e 66 32 21 3d 22 22 7d 20 7b 73 65 74 20 63 6f  nf2!=""} {set co
1d60: 6e 66 32 20 22 4f 4e 20 43 4f 4e 46 4c 49 43 54  nf2 "ON CONFLICT
1d70: 20 24 63 6f 6e 66 32 22 7d 0a 20 20 20 20 73 65   $conf2"}.    se
1d80: 74 20 72 30 20 5b 63 61 74 63 68 20 7b 65 78 65  t r0 [catch {exe
1d90: 63 73 71 6c 20 5b 73 75 62 73 74 20 7b 0a 20 20  csql [subst {.  
1da0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
1db0: 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  1;.      CREATE 
1dc0: 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 20  TABLE t1(a,b,c, 
1dd0: 55 4e 49 51 55 45 28 61 29 20 24 63 6f 6e 66 31  UNIQUE(a) $conf1
1de0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1df0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
1e00: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20   FROM t2;.      
1e10: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 78 3d  UPDATE t3 SET x=
1e20: 30 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 20 24  0;.      BEGIN $
1e30: 63 6f 6e 66 32 3b 0a 20 20 20 20 20 20 24 63 6d  conf2;.      $cm
1e40: 64 20 74 33 20 53 45 54 20 78 3d 31 3b 0a 20 20  d t3 SET x=1;.  
1e50: 20 20 20 20 24 63 6d 64 20 74 31 20 53 45 54 20      $cmd t1 SET 
1e60: 62 3d 62 2a 32 3b 0a 20 20 20 20 20 20 24 63 6d  b=b*2;.      $cm
1e70: 64 20 74 31 20 53 45 54 20 61 3d 63 2b 35 3b 0a  d t1 SET a=c+5;.
1e80: 20 20 20 20 7d 5d 7d 20 72 31 5d 0a 20 20 20 20      }]} r1].    
1e90: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
1ea0: 43 4f 4d 4d 49 54 7d 7d 0a 20 20 20 20 69 66 20  COMMIT}}.    if 
1eb0: 7b 21 24 72 30 7d 20 7b 73 65 74 20 72 31 20 5b  {!$r0} {set r1 [
1ec0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1ed0: 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  a FROM t1 ORDER 
1ee0: 42 59 20 62 7d 5d 7d 0a 20 20 20 20 73 65 74 20  BY b}]}.    set 
1ef0: 72 32 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c  r2 [execsql {SEL
1f00: 45 43 54 20 78 20 46 52 4f 4d 20 74 33 7d 5d 0a  ECT x FROM t3}].
1f10: 20 20 20 20 6c 69 73 74 20 24 72 30 20 24 72 31      list $r0 $r1
1f20: 20 24 72 32 0a 20 20 7d 20 5b 6c 69 73 74 20 24   $r2.  } [list $
1f30: 74 30 20 24 74 31 20 24 74 32 5d 0a 7d 0a 0a 64  t0 $t1 $t2].}..d
1f40: 6f 5f 74 65 73 74 20 6d 65 6d 64 62 2d 36 2e 31  o_test memdb-6.1
1f50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1f60: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1f70: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20   t2;.  }.} {1 2 
1f80: 31 20 32 20 33 20 32 20 33 20 34 20 31 20 34 20  1 2 3 2 3 4 1 4 
1f90: 35 20 34 7d 0a 64 6f 5f 74 65 73 74 20 6d 65 6d  5 4}.do_test mem
1fa0: 64 62 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  db-6.2 {.  execs
1fb0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1fc0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
1fd0: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61  2;.    SELECT na
1fe0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
1ff0: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
2000: 3d 27 74 61 62 6c 65 27 20 4f 52 44 45 52 20 42  ='table' ORDER B
2010: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 74 31 20 74  Y 1;.  }.} {t1 t
2020: 33 20 74 34 7d 0a 64 6f 5f 74 65 73 74 20 6d 65  3 t4}.do_test me
2030: 6d 64 62 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63  mdb-6.3 {.  exec
2040: 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41  sql {.    ROLLBA
2050: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  CK;.    SELECT n
2060: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
2070: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
2080: 65 3d 27 74 61 62 6c 65 27 20 4f 52 44 45 52 20  e='table' ORDER 
2090: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 74 31 20  BY 1;.  }.} {t1 
20a0: 74 32 20 74 33 20 74 34 7d 0a 64 6f 5f 74 65 73  t2 t3 t4}.do_tes
20b0: 74 20 6d 65 6d 64 62 2d 36 2e 34 20 7b 0a 20 20  t memdb-6.4 {.  
20c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
20d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
20e0: 20 20 7d 0a 7d 20 7b 31 20 32 20 31 20 32 20 33    }.} {1 2 1 2 3
20f0: 20 32 20 33 20 34 20 31 20 34 20 35 20 34 7d 0a   2 3 4 1 4 5 4}.
2100: 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75  ifcapable compou
2110: 6e 64 20 7b 0a 64 6f 5f 74 65 73 74 20 6d 65 6d  nd {.do_test mem
2120: 64 62 2d 36 2e 35 20 7b 0a 20 20 65 78 65 63 73  db-6.5 {.  execs
2130: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2140: 61 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  a FROM t2 UNION 
2150: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
2160: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
2170: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 7d 0a 7d  .} {1 2 3 4 5}.}
2180: 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 63 6f   ;# ifcapable co
2190: 6d 70 6f 75 6e 64 20 0a 64 6f 5f 74 65 73 74 20  mpound .do_test 
21a0: 6d 65 6d 64 62 2d 36 2e 36 20 7b 0a 20 20 65 78  memdb-6.6 {.  ex
21b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
21c0: 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
21d0: 32 28 63 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  2(c);.    SELECT
21e0: 20 61 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52   a FROM t2 ORDER
21f0: 20 42 59 20 63 3b 0a 20 20 7d 0a 7d 20 7b 31 20   BY c;.  }.} {1 
2200: 33 20 32 20 34 7d 0a 64 6f 5f 74 65 73 74 20 6d  3 2 4}.do_test m
2210: 65 6d 64 62 2d 36 2e 36 20 7b 0a 20 20 65 78 65  emdb-6.6 {.  exe
2220: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2230: 54 20 61 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  T a FROM t2 ORDE
2240: 52 20 42 59 20 63 20 44 45 53 43 3b 0a 20 20 7d  R BY c DESC;.  }
2250: 0a 7d 20 7b 34 20 32 20 33 20 31 7d 0a 64 6f 5f  .} {4 2 3 1}.do_
2260: 74 65 73 74 20 6d 65 6d 64 62 2d 36 2e 37 20 7b  test memdb-6.7 {
2270: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2280: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
2290: 54 45 20 54 41 42 4c 45 20 74 35 28 78 2c 79 29  TE TABLE t5(x,y)
22a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
22b0: 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 32 29  O t5 VALUES(1,2)
22c0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
22d0: 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t5;.  }.} {1
22e0: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 6d 65 6d 64   2}.do_test memd
22f0: 62 2d 36 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  b-6.8 {.  execsq
2300: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  l {.    SELECT n
2310: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
2320: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
2330: 65 3d 27 74 61 62 6c 65 27 20 4f 52 44 45 52 20  e='table' ORDER 
2340: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 74 31 20  BY 1;.  }.} {t1 
2350: 74 32 20 74 33 20 74 34 20 74 35 7d 0a 64 6f 5f  t2 t3 t4 t5}.do_
2360: 74 65 73 74 20 6d 65 6d 64 62 2d 36 2e 39 20 7b  test memdb-6.9 {
2370: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2380: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53   ROLLBACK;.    S
2390: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
23a0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
23b0: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
23c0: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
23d0: 0a 7d 20 7b 74 31 20 74 32 20 74 33 20 74 34 7d  .} {t1 t2 t3 t4}
23e0: 0a 64 6f 5f 74 65 73 74 20 6d 65 6d 64 62 2d 36  .do_test memdb-6
23f0: 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .10 {.  execsql 
2400: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2410: 4c 45 20 74 35 28 78 20 50 52 49 4d 41 52 59 20  LE t5(x PRIMARY 
2420: 4b 45 59 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a  KEY, y UNIQUE);.
2430: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2440: 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  M t5;.  }.} {}.d
2450: 6f 5f 74 65 73 74 20 6d 65 6d 64 62 2d 36 2e 31  o_test memdb-6.1
2460: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
2470: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2480: 4d 20 74 35 20 4f 52 44 45 52 20 42 59 20 79 20  M t5 ORDER BY y 
2490: 44 45 53 43 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  DESC;.  }.} {}..
24a0: 69 66 63 61 70 61 62 6c 65 20 63 6f 6e 66 6c 69  ifcapable confli
24b0: 63 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6d  ct {.  do_test m
24c0: 65 6d 64 62 2d 36 2e 31 32 20 7b 0a 20 20 20 20  emdb-6.12 {.    
24d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
24e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
24f0: 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20  ALUES(1,2);.    
2500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
2510: 20 56 41 4c 55 45 53 28 33 2c 34 29 3b 0a 20 20   VALUES(3,4);.  
2520: 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f      REPLACE INTO
2530: 20 74 35 20 56 41 4c 55 45 53 28 31 2c 34 29 3b   t5 VALUES(1,4);
2540: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f  .      SELECT ro
2550: 77 69 64 2c 2a 20 46 52 4f 4d 20 74 35 3b 0a 20  wid,* FROM t5;. 
2560: 20 20 20 7d 0a 20 20 7d 20 7b 33 20 31 20 34 7d     }.  } {3 1 4}
2570: 0a 20 20 64 6f 5f 74 65 73 74 20 6d 65 6d 64 62  .  do_test memdb
2580: 2d 36 2e 31 33 20 7b 0a 20 20 20 20 65 78 65 63  -6.13 {.    exec
2590: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45  sql {.      DELE
25a0: 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45  TE FROM t5 WHERE
25b0: 20 78 3e 35 3b 0a 20 20 20 20 20 20 53 45 4c 45   x>5;.      SELE
25c0: 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20  CT * FROM t5;.  
25d0: 20 20 7d 0a 20 20 7d 20 7b 31 20 34 7d 0a 20 20    }.  } {1 4}.  
25e0: 64 6f 5f 74 65 73 74 20 6d 65 6d 64 62 2d 36 2e  do_test memdb-6.
25f0: 31 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  14 {.    execsql
2600: 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20   {.      DELETE 
2610: 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20 79 3c  FROM t5 WHERE y<
2620: 33 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  3;.      SELECT 
2630: 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d  * FROM t5;.    }
2640: 0a 20 20 7d 20 7b 31 20 34 7d 0a 7d 0a 0a 64 6f  .  } {1 4}.}..do
2650: 5f 74 65 73 74 20 6d 65 6d 64 62 2d 36 2e 31 35  _test memdb-6.15
2660: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2670: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
2680: 35 20 57 48 45 52 45 20 78 3e 30 3b 0a 20 20 20  5 WHERE x>0;.   
2690: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
26a0: 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63  5;.  }.} {}..ifc
26b0: 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 20  apable subquery 
26c0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6d 65 6d 64  {.  do_test memd
26d0: 62 2d 37 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  b-7.1 {.    exec
26e0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
26f0: 54 45 20 54 41 42 4c 45 20 74 36 28 78 29 3b 0a  TE TABLE t6(x);.
2700: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2710: 4f 20 74 36 20 56 41 4c 55 45 53 28 31 29 3b 0a  O t6 VALUES(1);.
2720: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2730: 4f 20 74 36 20 53 45 4c 45 43 54 20 78 2b 31 20  O t6 SELECT x+1 
2740: 46 52 4f 4d 20 74 36 3b 0a 20 20 20 20 20 20 49  FROM t6;.      I
2750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 53 45  NSERT INTO t6 SE
2760: 4c 45 43 54 20 78 2b 32 20 46 52 4f 4d 20 74 36  LECT x+2 FROM t6
2770: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2780: 4e 54 4f 20 74 36 20 53 45 4c 45 43 54 20 78 2b  NTO t6 SELECT x+
2790: 34 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20 20 20  4 FROM t6;.     
27a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
27b0: 53 45 4c 45 43 54 20 78 2b 38 20 46 52 4f 4d 20  SELECT x+8 FROM 
27c0: 74 36 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t6;.      INSERT
27d0: 20 49 4e 54 4f 20 74 36 20 53 45 4c 45 43 54 20   INTO t6 SELECT 
27e0: 78 2b 31 36 20 46 52 4f 4d 20 74 36 3b 0a 20 20  x+16 FROM t6;.  
27f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2800: 74 36 20 53 45 4c 45 43 54 20 78 2b 33 32 20 46  t6 SELECT x+32 F
2810: 52 4f 4d 20 74 36 3b 0a 20 20 20 20 20 20 49 4e  ROM t6;.      IN
2820: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 53 45 4c  SERT INTO t6 SEL
2830: 45 43 54 20 78 2b 36 34 20 46 52 4f 4d 20 74 36  ECT x+64 FROM t6
2840: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2850: 4e 54 4f 20 74 36 20 53 45 4c 45 43 54 20 78 2b  NTO t6 SELECT x+
2860: 31 32 38 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20  128 FROM t6;.   
2870: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2880: 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
2890: 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20  DISTINCT x FROM 
28a0: 74 36 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  t6);.    }.  } {
28b0: 32 35 36 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  256}.  for {set 
28c0: 69 20 31 7d 20 7b 24 69 3c 3d 32 35 36 7d 20 7b  i 1} {$i<=256} {
28d0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 64 6f  incr i} {.    do
28e0: 5f 74 65 73 74 20 6d 65 6d 64 62 2d 37 2e 32 2e  _test memdb-7.2.
28f0: 24 69 20 7b 0a 20 20 20 20 20 20 20 65 78 65 63  $i {.       exec
2900: 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  sql "DELETE FROM
2910: 20 74 36 20 57 48 45 52 45 20 78 3d 5c 0a 20 20   t6 WHERE x=\.  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2930: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 36 20  ELECT x FROM t6 
2940: 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f 6d 28  ORDER BY random(
2950: 29 20 4c 49 4d 49 54 20 31 29 22 0a 20 20 20 20  ) LIMIT 1)".    
2960: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
2970: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2980: 20 74 36 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72   t6}.    } [expr
2990: 20 7b 32 35 36 2d 24 69 7d 5d 0a 20 20 7d 0a 7d   {256-$i}].  }.}
29a0: 0a 0a 23 20 54 69 63 6b 65 74 20 23 31 35 32 34  ..# Ticket #1524
29b0: 0a 23 0a 64 6f 5f 74 65 73 74 20 6d 65 6d 64 62  .#.do_test memdb
29c0: 2d 38 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  -8.1 {.  db clos
29d0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 7b  e.  sqlite3 db {
29e0: 3a 6d 65 6d 6f 72 79 3a 7d 0a 20 20 65 78 65 63  :memory:}.  exec
29f0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
2a00: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 54 52 55   auto_vacuum=TRU
2a10: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  E;.    CREATE TA
2a20: 42 4c 45 20 74 31 28 61 29 3b 0a 20 20 20 20 49  BLE t1(a);.    I
2a30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2a40: 4c 55 45 53 28 72 61 6e 64 73 74 72 28 35 30 30  LUES(randstr(500
2a50: 30 2c 36 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  0,6000));.    IN
2a60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2a70: 55 45 53 28 72 61 6e 64 73 74 72 28 35 30 30 30  UES(randstr(5000
2a80: 2c 36 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  ,6000));.    INS
2a90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2aa0: 45 53 28 72 61 6e 64 73 74 72 28 35 30 30 30 2c  ES(randstr(5000,
2ab0: 36 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  6000));.    INSE
2ac0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2ad0: 53 28 72 61 6e 64 73 74 72 28 35 30 30 30 2c 36  S(randstr(5000,6
2ae0: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
2af0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2b00: 28 72 61 6e 64 73 74 72 28 35 30 30 30 2c 36 30  (randstr(5000,60
2b10: 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  00));.    SELECT
2b20: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
2b30: 31 3b 0a 20 20 7d 0a 7d 20 35 0a 64 6f 5f 74 65  1;.  }.} 5.do_te
2b40: 73 74 20 6d 65 6d 64 62 2d 38 2e 32 20 7b 0a 20  st memdb-8.2 {. 
2b50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2b60: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20  ELETE FROM t1;. 
2b70: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2b80: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  *) FROM t1;.  }.
2b90: 7d 20 30 0a 0a 23 20 54 65 73 74 20 74 68 61 74  } 0..# Test that
2ba0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 77 6f 72   auto-vacuum wor
2bb0: 6b 73 20 77 69 74 68 20 69 6e 2d 6d 65 6d 6f 72  ks with in-memor
2bc0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23 20 0a  y databases..# .
2bd0: 64 6f 5f 74 65 73 74 20 6d 65 6d 64 62 2d 39 2e  do_test memdb-9.
2be0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
2bf0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
2c00: 2e 64 62 0a 20 20 64 62 20 63 61 63 68 65 20 73  .db.  db cache s
2c10: 69 7a 65 20 30 0a 20 20 65 78 65 63 73 71 6c 20  ize 0.  execsql 
2c20: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
2c30: 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b  o_vacuum = full;
2c40: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2c50: 45 20 74 31 28 61 29 3b 0a 20 20 20 20 49 4e 53  E t1(a);.    INS
2c60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2c70: 45 53 28 72 61 6e 64 73 74 72 28 31 30 30 30 2c  ES(randstr(1000,
2c80: 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  1000));.    INSE
2c90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2ca0: 53 28 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  S(randstr(1000,1
2cb0: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
2cc0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2cd0: 28 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30  (randstr(1000,10
2ce0: 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20  00));.  }.  set 
2cf0: 6d 65 6d 75 73 65 64 20 5b 6c 69 6e 64 65 78 20  memused [lindex 
2d00: 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20  [sqlite3_status 
2d10: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45  SQLITE_STATUS_ME
2d20: 4d 4f 52 59 5f 55 53 45 44 20 30 5d 20 31 5d 0a  MORY_USED 0] 1].
2d30: 20 20 73 65 74 20 70 67 6f 76 66 6c 20 5b 6c 69    set pgovfl [li
2d40: 6e 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 73 74  ndex [sqlite3_st
2d50: 61 74 75 73 20 53 51 4c 49 54 45 5f 53 54 41 54  atus SQLITE_STAT
2d60: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45  US_PAGECACHE_OVE
2d70: 52 46 4c 4f 57 20 30 5d 20 31 5d 0a 20 20 65 78  RFLOW 0] 1].  ex
2d80: 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
2d90: 52 4f 4d 20 74 31 20 7d 0a 20 20 73 65 74 20 6d  ROM t1 }.  set m
2da0: 65 6d 75 73 65 64 32 20 5b 6c 69 6e 64 65 78 20  emused2 [lindex 
2db0: 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20  [sqlite3_status 
2dc0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45  SQLITE_STATUS_ME
2dd0: 4d 4f 52 59 5f 55 53 45 44 20 30 5d 20 31 5d 0a  MORY_USED 0] 1].
2de0: 20 20 65 78 70 72 20 7b 28 24 6d 65 6d 75 73 65    expr {($memuse
2df0: 64 32 20 2b 20 32 30 34 38 20 3c 20 24 6d 65 6d  d2 + 2048 < $mem
2e00: 75 73 65 64 29 20 7c 7c 20 24 70 67 6f 76 66 6c  used) || $pgovfl
2e10: 3d 3d 30 7d 0a 7d 20 7b 31 7d 0a 0a 0a 7d 20 3b  ==0}.} {1}...} ;
2e20: 23 20 69 66 63 61 70 61 62 6c 65 20 6d 65 6d 6f  # ifcapable memo
2e30: 72 79 64 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73  rydb..finish_tes
2e40: 74 0a                                            t.