/ Hex Artifact Content
Login

Artifact 284de45abae4cc1082bc52012ee81521d5ac58e0:


0000: 23 20 32 30 31 31 20 4d 61 72 20 31 36 0a 23 0a  # 2011 Mar 16.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 23 20 54 68 65 20 66 6f 63 75  ***.#.# The focu
0170: 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69  s of this file i
0180: 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 65  s testing the se
0190: 73 73 69 6f 6e 20 6d 6f 64 75 6c 65 2e 0a 23 0a  ssion module..#.
01a0: 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73  .if {![info exis
01b0: 74 73 20 74 65 73 74 64 69 72 5d 7d 20 7b 0a 20  ts testdir]} {. 
01c0: 20 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69   set testdir [fi
01d0: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
01e0: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
01f0: 70 74 5d 5d 20 2e 2e 20 2e 2e 20 74 65 73 74 5d  pt]] .. .. test]
0200: 0a 7d 20 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65  .} .source [file
0210: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e   join [file dirn
0220: 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ame [info script
0230: 5d 5d 20 73 65 73 73 69 6f 6e 5f 63 6f 6d 6d 6f  ]] session_commo
0240: 6e 2e 74 63 6c 5d 0a 73 6f 75 72 63 65 20 24 74  n.tcl].source $t
0250: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0260: 6c 0a 69 66 63 61 70 61 62 6c 65 20 21 73 65 73  l.ifcapable !ses
0270: 73 69 6f 6e 20 7b 66 69 6e 69 73 68 5f 74 65 73  sion {finish_tes
0280: 74 3b 20 72 65 74 75 72 6e 7d 0a 0a 73 65 74 20  t; return}..set 
0290: 74 65 73 74 70 72 65 66 69 78 20 73 65 73 73 69  testprefix sessi
02a0: 6f 6e 32 0a 0a 70 72 6f 63 20 74 65 73 74 5f 72  on2..proc test_r
02b0: 65 73 65 74 20 7b 7d 20 7b 0a 20 20 63 61 74 63  eset {} {.  catc
02c0: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  h { db close }. 
02d0: 20 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f   catch { db2 clo
02e0: 73 65 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65  se }.  forcedele
02f0: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
0300: 64 62 32 0a 20 20 73 71 6c 69 74 65 33 20 64 62  db2.  sqlite3 db
0310: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
0320: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
0330: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
0340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0370: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20  #############.# 
0380: 45 6e 64 20 6f 66 20 70 72 6f 63 20 64 65 66 69  End of proc defi
0390: 6e 69 74 69 6f 6e 73 2e 20 53 74 61 72 74 20 6f  nitions. Start o
03a0: 66 20 74 65 73 74 73 2e 0a 23 23 23 23 23 23 23  f tests..#######
03b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03f0: 23 23 23 0a 0a 74 65 73 74 5f 72 65 73 65 74 0a  ###..test_reset.
0400: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0410: 31 2e 30 20 7b 20 0a 20 20 43 52 45 41 54 45 20  1.0 { .  CREATE 
0420: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
0430: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 49 4e  RY KEY, b);.  IN
0440: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0450: 55 45 53 28 27 69 27 2c 20 27 6f 6e 65 27 29 3b  UES('i', 'one');
0460: 0a 7d 0a 64 6f 5f 69 74 65 72 61 74 6f 72 5f 74  .}.do_iterator_t
0470: 65 73 74 20 31 2e 31 20 74 31 20 7b 0a 20 20 44  est 1.1 t1 {.  D
0480: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
0490: 45 52 45 20 61 20 3d 20 27 69 27 3b 0a 20 20 49  ERE a = 'i';.  I
04a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
04b0: 4c 55 45 53 28 27 69 69 27 2c 20 27 74 77 6f 27  LUES('ii', 'two'
04c0: 29 3b 0a 7d 20 7b 0a 20 20 7b 44 45 4c 45 54 45  );.} {.  {DELETE
04d0: 20 74 31 20 30 20 58 2e 20 7b 74 20 69 20 74 20   t1 0 X. {t i t 
04e0: 6f 6e 65 7d 20 7b 7d 7d 20 0a 20 20 7b 49 4e 53  one} {}} .  {INS
04f0: 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b  ERT t1 0 X. {} {
0500: 74 20 69 69 20 74 20 74 77 6f 7d 7d 0a 7d 0a 0a  t ii t two}}.}..
0510: 64 6f 5f 69 74 65 72 61 74 6f 72 5f 74 65 73 74  do_iterator_test
0520: 20 31 2e 32 20 74 31 20 7b 0a 20 20 49 4e 53 45   1.2 t1 {.  INSE
0530: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0540: 53 28 31 2e 35 2c 20 39 39 2e 39 29 0a 7d 20 7b  S(1.5, 99.9).} {
0550: 0a 20 20 7b 49 4e 53 45 52 54 20 74 31 20 30 20  .  {INSERT t1 0 
0560: 58 2e 20 7b 7d 20 7b 66 20 31 2e 35 20 66 20 39  X. {} {f 1.5 f 9
0570: 39 2e 39 7d 7d 0a 7d 0a 0a 64 6f 5f 69 74 65 72  9.9}}.}..do_iter
0580: 61 74 6f 72 5f 74 65 73 74 20 31 2e 33 20 74 31  ator_test 1.3 t1
0590: 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53   {.  UPDATE t1 S
05a0: 45 54 20 62 20 3d 20 31 30 30 2e 31 20 57 48 45  ET b = 100.1 WHE
05b0: 52 45 20 61 20 3d 20 31 2e 35 3b 0a 20 20 55 50  RE a = 1.5;.  UP
05c0: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
05d0: 39 39 2e 39 20 57 48 45 52 45 20 61 20 3d 20 31  99.9 WHERE a = 1
05e0: 2e 35 3b 0a 7d 20 7b 20 7d 0a 0a 64 6f 5f 69 74  .5;.} { }..do_it
05f0: 65 72 61 74 6f 72 5f 74 65 73 74 20 31 2e 34 20  erator_test 1.4 
0600: 74 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31  t1 {.  UPDATE t1
0610: 20 53 45 54 20 62 20 3d 20 31 30 30 2e 31 20 57   SET b = 100.1 W
0620: 48 45 52 45 20 61 20 3d 20 31 2e 35 3b 0a 7d 20  HERE a = 1.5;.} 
0630: 7b 0a 20 20 7b 55 50 44 41 54 45 20 74 31 20 30  {.  {UPDATE t1 0
0640: 20 58 2e 20 7b 66 20 31 2e 35 20 66 20 39 39 2e   X. {f 1.5 f 99.
0650: 39 7d 20 7b 7b 7d 20 7b 7d 20 66 20 31 30 30 2e  9} {{} {} f 100.
0660: 31 7d 7d 0a 7d 0a 0a 0a 23 20 45 78 65 63 75 74  1}}.}...# Execut
0670: 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 66 6f  e each of the fo
0680: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 6f  llowing blocks o
0690: 66 20 53 51 4c 20 6f 6e 20 64 61 74 61 62 61 73  f SQL on databas
06a0: 65 20 5b 64 62 31 5d 2e 20 43 6f 6c 6c 65 63 74  e [db1]. Collect
06b0: 0a 23 20 63 68 61 6e 67 65 73 20 75 73 69 6e 67  .# changes using
06c0: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
06d0: 74 2e 20 41 70 70 6c 79 20 74 68 65 20 72 65 73  t. Apply the res
06e0: 75 6c 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  ulting changeset
06f0: 20 74 6f 0a 23 20 64 61 74 61 62 61 73 65 20 5b   to.# database [
0700: 64 62 32 5d 2e 20 54 68 65 6e 20 63 68 65 63 6b  db2]. Then check
0710: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
0720: 74 73 20 6f 66 20 74 68 65 20 74 77 6f 20 64 61  ts of the two da
0730: 74 61 62 61 73 65 73 20 61 72 65 0a 23 20 69 64  tabases are.# id
0740: 65 6e 74 69 63 61 6c 2e 0a 23 0a 0a 73 65 74 20  entical..#..set 
0750: 73 65 74 5f 6f 66 5f 74 65 73 74 73 20 7b 0a 20  set_of_tests {. 
0760: 20 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f   1 { INSERT INTO
0770: 20 25 54 31 25 20 56 41 4c 55 45 53 28 31 2c 20   %T1% VALUES(1, 
0780: 32 29 20 7d 20 0a 0a 20 20 32 20 7b 0a 20 20 20  2) } ..  2 {.   
0790: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 32   INSERT INTO %T2
07a0: 25 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c  % VALUES(1, NULL
07b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
07c0: 54 4f 20 25 54 32 25 20 56 41 4c 55 45 53 28 32  TO %T2% VALUES(2
07d0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  , NULL);.    INS
07e0: 45 52 54 20 49 4e 54 4f 20 25 54 32 25 20 56 41  ERT INTO %T2% VA
07f0: 4c 55 45 53 28 33 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(3, NULL);. 
0800: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25     DELETE FROM %
0810: 54 32 25 20 57 48 45 52 45 20 61 20 3d 20 32 3b  T2% WHERE a = 2;
0820: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0830: 20 25 54 32 25 20 56 41 4c 55 45 53 28 34 2c 20   %T2% VALUES(4, 
0840: 4e 55 4c 4c 29 3b 0a 20 20 20 20 55 50 44 41 54  NULL);.    UPDAT
0850: 45 20 25 54 32 25 20 53 45 54 20 62 3d 30 20 57  E %T2% SET b=0 W
0860: 48 45 52 45 20 62 3d 31 3b 0a 20 20 7d 20 0a 0a  HERE b=1;.  } ..
0870: 20 20 33 20 7b 20 49 4e 53 45 52 54 20 49 4e 54    3 { INSERT INT
0880: 4f 20 25 54 33 25 20 53 45 4c 45 43 54 20 2a 2c  O %T3% SELECT *,
0890: 20 4e 55 4c 4c 20 46 52 4f 4d 20 25 54 32 25 20   NULL FROM %T2% 
08a0: 7d 0a 0a 20 20 34 20 7b 0a 20 20 20 20 49 4e 53  }..  4 {.    INS
08b0: 45 52 54 20 49 4e 54 4f 20 25 54 33 25 20 53 45  ERT INTO %T3% SE
08c0: 4c 45 43 54 20 61 7c 7c 61 2c 20 62 7c 7c 62 2c  LECT a||a, b||b,
08d0: 20 4e 55 4c 4c 20 46 52 4f 4d 20 25 54 33 25 3b   NULL FROM %T3%;
08e0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
08f0: 20 25 54 33 25 20 57 48 45 52 45 20 72 6f 77 69   %T3% WHERE rowi
0900: 64 25 32 3b 0a 20 20 7d 0a 0a 20 20 35 20 7b 20  d%2;.  }..  5 { 
0910: 55 50 44 41 54 45 20 25 54 33 25 20 53 45 54 20  UPDATE %T3% SET 
0920: 63 20 3d 20 61 7c 7c 62 20 7d 0a 0a 20 20 36 20  c = a||b }..  6 
0930: 7b 20 55 50 44 41 54 45 20 25 54 31 25 20 53 45  { UPDATE %T1% SE
0940: 54 20 61 20 3d 20 33 32 20 7d 0a 0a 20 20 37 20  T a = 32 }..  7 
0950: 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  { .    INSERT IN
0960: 54 4f 20 25 54 31 25 20 53 45 4c 45 43 54 20 72  TO %T1% SELECT r
0970: 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 2c 20 72  andomblob(32), r
0980: 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 20 46 52  andomblob(32) FR
0990: 4f 4d 20 25 54 31 25 3b 20 0a 20 20 20 20 49 4e  OM %T1%; .    IN
09a0: 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20 53  SERT INTO %T1% S
09b0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
09c0: 28 33 32 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (32), randomblob
09d0: 28 33 32 29 20 46 52 4f 4d 20 25 54 31 25 3b 20  (32) FROM %T1%; 
09e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
09f0: 20 25 54 31 25 20 53 45 4c 45 43 54 20 72 61 6e   %T1% SELECT ran
0a00: 64 6f 6d 62 6c 6f 62 28 33 32 29 2c 20 72 61 6e  domblob(32), ran
0a10: 64 6f 6d 62 6c 6f 62 28 33 32 29 20 46 52 4f 4d  domblob(32) FROM
0a20: 20 25 54 31 25 3b 20 0a 20 20 20 20 49 4e 53 45   %T1%; .    INSE
0a30: 52 54 20 49 4e 54 4f 20 25 54 31 25 20 53 45 4c  RT INTO %T1% SEL
0a40: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33  ECT randomblob(3
0a50: 32 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33  2), randomblob(3
0a60: 32 29 20 46 52 4f 4d 20 25 54 31 25 3b 20 0a 20  2) FROM %T1%; . 
0a70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25     INSERT INTO %
0a80: 54 31 25 20 53 45 4c 45 43 54 20 72 61 6e 64 6f  T1% SELECT rando
0a90: 6d 62 6c 6f 62 28 33 32 29 2c 20 72 61 6e 64 6f  mblob(32), rando
0aa0: 6d 62 6c 6f 62 28 33 32 29 20 46 52 4f 4d 20 25  mblob(32) FROM %
0ab0: 54 31 25 3b 20 0a 20 20 20 20 49 4e 53 45 52 54  T1%; .    INSERT
0ac0: 20 49 4e 54 4f 20 25 54 31 25 20 53 45 4c 45 43   INTO %T1% SELEC
0ad0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29  T randomblob(32)
0ae0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29  , randomblob(32)
0af0: 20 46 52 4f 4d 20 25 54 31 25 3b 20 0a 20 20 20   FROM %T1%; .   
0b00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31   INSERT INTO %T1
0b10: 25 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  % SELECT randomb
0b20: 6c 6f 62 28 33 32 29 2c 20 72 61 6e 64 6f 6d 62  lob(32), randomb
0b30: 6c 6f 62 28 33 32 29 20 46 52 4f 4d 20 25 54 31  lob(32) FROM %T1
0b40: 25 3b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49  %; .    INSERT I
0b50: 4e 54 4f 20 25 54 31 25 20 53 45 4c 45 43 54 20  NTO %T1% SELECT 
0b60: 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 2c 20  randomblob(32), 
0b70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 20 46  randomblob(32) F
0b80: 52 4f 4d 20 25 54 31 25 3b 20 0a 20 20 20 20 49  ROM %T1%; .    I
0b90: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20  NSERT INTO %T1% 
0ba0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
0bb0: 62 28 33 32 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(32), randomblo
0bc0: 62 28 33 32 29 20 46 52 4f 4d 20 25 54 31 25 3b  b(32) FROM %T1%;
0bd0: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
0be0: 4f 20 25 54 31 25 20 53 45 4c 45 43 54 20 72 61  O %T1% SELECT ra
0bf0: 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 2c 20 72 61  ndomblob(32), ra
0c00: 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 20 46 52 4f  ndomblob(32) FRO
0c10: 4d 20 25 54 31 25 3b 20 0a 20 20 20 20 49 4e 53  M %T1%; .    INS
0c20: 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20 53 45  ERT INTO %T1% SE
0c30: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
0c40: 33 32 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  32), randomblob(
0c50: 33 32 29 20 46 52 4f 4d 20 25 54 31 25 3b 20 0a  32) FROM %T1%; .
0c60: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0c70: 25 54 31 25 20 57 48 45 52 45 20 28 72 6f 77 69  %T1% WHERE (rowi
0c80: 64 25 33 29 3d 3d 30 3b 0a 20 20 7d 0a 0a 20 20  d%3)==0;.  }..  
0c90: 38 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  8 {.    BEGIN;. 
0ca0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0cb0: 20 25 54 31 25 20 53 45 4c 45 43 54 20 72 61 6e   %T1% SELECT ran
0cc0: 64 6f 6d 62 6c 6f 62 28 33 32 29 2c 20 72 61 6e  domblob(32), ran
0cd0: 64 6f 6d 62 6c 6f 62 28 33 32 29 20 46 52 4f 4d  domblob(32) FROM
0ce0: 20 25 54 31 25 3b 0a 20 20 20 20 52 4f 4c 4c 42   %T1%;.    ROLLB
0cf0: 41 43 4b 3b 0a 20 20 7d 0a 20 20 39 20 7b 0a 20  ACK;.  }.  9 {. 
0d00: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
0d10: 55 50 44 41 54 45 20 25 54 31 25 20 53 45 54 20  UPDATE %T1% SET 
0d20: 62 20 3d 20 27 78 78 78 27 3b 0a 20 20 20 20 52  b = 'xxx';.    R
0d30: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 31  OLLBACK;.  }.  1
0d40: 30 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  0 {.    BEGIN;. 
0d50: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
0d60: 20 25 54 31 25 20 57 48 45 52 45 20 31 3b 0a 20   %T1% WHERE 1;. 
0d70: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
0d80: 0a 20 20 31 31 20 7b 0a 20 20 20 20 49 4e 53 45  .  11 {.    INSE
0d90: 52 54 20 49 4e 54 4f 20 25 54 31 25 20 56 41 4c  RT INTO %T1% VAL
0da0: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  UES(randomblob(2
0db0: 31 30 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1000), randomblo
0dc0: 62 28 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  b(0));.    INSER
0dd0: 54 20 49 4e 54 4f 20 25 54 31 25 20 56 41 4c 55  T INTO %T1% VALU
0de0: 45 53 28 31 2e 35 2c 20 31 2e 35 29 3b 0a 20 20  ES(1.5, 1.5);.  
0df0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54    INSERT INTO %T
0e00: 31 25 20 56 41 4c 55 45 53 28 34 2e 35 36 2c 20  1% VALUES(4.56, 
0e10: 2d 39 39 2e 39 39 39 39 39 39 39 39 39 39 39 39  -99.999999999999
0e20: 39 39 39 39 39 39 39 39 39 29 3b 0a 20 20 7d 0a  999999999);.  }.
0e30: 20 20 31 32 20 7b 0a 20 20 20 20 49 4e 53 45 52    12 {.    INSER
0e40: 54 20 49 4e 54 4f 20 25 54 32 25 20 56 41 4c 55  T INTO %T2% VALU
0e50: 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  ES(NULL, NULL);.
0e60: 20 20 7d 0a 0a 20 20 31 33 20 7b 0a 20 20 20 20    }..  13 {.    
0e70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 54 31 25  DELETE FROM %T1%
0e80: 20 57 48 45 52 45 20 31 3b 0a 0a 20 20 20 20 2d   WHERE 1;..    -
0e90: 2d 20 49 6e 73 65 72 74 20 6d 61 6e 79 20 72 6f  - Insert many ro
0ea0: 77 73 20 77 69 74 68 20 72 65 61 6c 20 70 72 69  ws with real pri
0eb0: 6d 61 72 79 20 6b 65 79 73 2e 20 45 6e 6f 75 67  mary keys. Enoug
0ec0: 68 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 73  h to force the s
0ed0: 65 73 73 69 6f 6e 0a 20 20 20 20 2d 2d 20 6f 62  ession.    -- ob
0ee0: 6a 65 63 74 73 20 68 61 73 68 20 74 61 62 6c 65  jects hash table
0ef0: 20 74 6f 20 72 65 73 69 7a 65 2e 20 0a 20 20 20   to resize. .   
0f00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31   INSERT INTO %T1
0f10: 25 20 56 41 4c 55 45 53 28 30 2e 31 2c 20 30 2e  % VALUES(0.1, 0.
0f20: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
0f30: 4e 54 4f 20 25 54 31 25 20 53 45 4c 45 43 54 20  NTO %T1% SELECT 
0f40: 61 2b 30 2e 31 2c 20 62 2b 30 2e 31 20 46 52 4f  a+0.1, b+0.1 FRO
0f50: 4d 20 25 54 31 25 3b 0a 20 20 20 20 49 4e 53 45  M %T1%;.    INSE
0f60: 52 54 20 49 4e 54 4f 20 25 54 31 25 20 53 45 4c  RT INTO %T1% SEL
0f70: 45 43 54 20 61 2b 30 2e 32 2c 20 62 2b 30 2e 32  ECT a+0.2, b+0.2
0f80: 20 46 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20   FROM %T1%;.    
0f90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25  INSERT INTO %T1%
0fa0: 20 53 45 4c 45 43 54 20 61 2b 30 2e 34 2c 20 62   SELECT a+0.4, b
0fb0: 2b 30 2e 34 20 46 52 4f 4d 20 25 54 31 25 3b 0a  +0.4 FROM %T1%;.
0fc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0fd0: 25 54 31 25 20 53 45 4c 45 43 54 20 61 2b 30 2e  %T1% SELECT a+0.
0fe0: 38 2c 20 62 2b 30 2e 38 20 46 52 4f 4d 20 25 54  8, b+0.8 FROM %T
0ff0: 31 25 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1%;.    INSERT I
1000: 4e 54 4f 20 25 54 31 25 20 53 45 4c 45 43 54 20  NTO %T1% SELECT 
1010: 61 2b 31 2e 36 2c 20 62 2b 31 2e 36 20 46 52 4f  a+1.6, b+1.6 FRO
1020: 4d 20 25 54 31 25 3b 0a 20 20 20 20 49 4e 53 45  M %T1%;.    INSE
1030: 52 54 20 49 4e 54 4f 20 25 54 31 25 20 53 45 4c  RT INTO %T1% SEL
1040: 45 43 54 20 61 2b 33 2e 32 2c 20 62 2b 33 2e 32  ECT a+3.2, b+3.2
1050: 20 46 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20   FROM %T1%;.    
1060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25  INSERT INTO %T1%
1070: 20 53 45 4c 45 43 54 20 61 2b 36 2e 34 2c 20 62   SELECT a+6.4, b
1080: 2b 36 2e 34 20 46 52 4f 4d 20 25 54 31 25 3b 0a  +6.4 FROM %T1%;.
1090: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10a0: 25 54 31 25 20 53 45 4c 45 43 54 20 61 2b 31 32  %T1% SELECT a+12
10b0: 2e 38 2c 20 62 2b 31 32 2e 38 20 46 52 4f 4d 20  .8, b+12.8 FROM 
10c0: 25 54 31 25 3b 0a 20 20 20 20 49 4e 53 45 52 54  %T1%;.    INSERT
10d0: 20 49 4e 54 4f 20 25 54 31 25 20 53 45 4c 45 43   INTO %T1% SELEC
10e0: 54 20 61 2b 32 35 2e 36 2c 20 62 2b 32 35 2e 36  T a+25.6, b+25.6
10f0: 20 46 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20   FROM %T1%;.    
1100: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25  INSERT INTO %T1%
1110: 20 53 45 4c 45 43 54 20 61 2b 35 31 2e 32 2c 20   SELECT a+51.2, 
1120: 62 2b 35 31 2e 32 20 46 52 4f 4d 20 25 54 31 25  b+51.2 FROM %T1%
1130: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1140: 4f 20 25 54 31 25 20 53 45 4c 45 43 54 20 61 2b  O %T1% SELECT a+
1150: 31 30 32 2e 34 2c 20 62 2b 31 30 32 2e 34 20 46  102.4, b+102.4 F
1160: 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20 49 4e  ROM %T1%;.    IN
1170: 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20 53  SERT INTO %T1% S
1180: 45 4c 45 43 54 20 61 2b 32 30 34 2e 38 2c 20 62  ELECT a+204.8, b
1190: 2b 32 30 34 2e 38 20 46 52 4f 4d 20 25 54 31 25  +204.8 FROM %T1%
11a0: 3b 0a 20 20 7d 0a 0a 20 20 31 34 20 7b 0a 20 20  ;.  }..  14 {.  
11b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 54    DELETE FROM %T
11c0: 31 25 20 57 48 45 52 45 20 31 3b 0a 20 20 7d 0a  1% WHERE 1;.  }.
11d0: 0a 20 20 31 35 20 7b 0a 20 20 20 20 49 4e 53 45  .  15 {.    INSE
11e0: 52 54 20 49 4e 54 4f 20 25 54 31 25 20 56 41 4c  RT INTO %T1% VAL
11f0: 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49  UES(1, 1);.    I
1200: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20  NSERT INTO %T1% 
1210: 53 45 4c 45 43 54 20 61 2b 32 2c 20 62 2b 32 20  SELECT a+2, b+2 
1220: 46 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20 49  FROM %T1%;.    I
1230: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20  NSERT INTO %T1% 
1240: 53 45 4c 45 43 54 20 61 2b 34 2c 20 62 2b 34 20  SELECT a+4, b+4 
1250: 46 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20 49  FROM %T1%;.    I
1260: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20  NSERT INTO %T1% 
1270: 53 45 4c 45 43 54 20 61 2b 38 2c 20 62 2b 38 20  SELECT a+8, b+8 
1280: 46 52 4f 4d 20 25 54 31 25 3b 0a 20 20 20 20 49  FROM %T1%;.    I
1290: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 31 25 20  NSERT INTO %T1% 
12a0: 53 45 4c 45 43 54 20 61 2b 32 35 36 2c 20 62 2b  SELECT a+256, b+
12b0: 32 35 36 20 46 52 4f 4d 20 25 54 31 25 3b 0a 20  256 FROM %T1%;. 
12c0: 20 7d 0a 0a 20 20 31 36 20 7b 0a 20 20 20 20 49   }..  16 {.    I
12d0: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 34 25 20  NSERT INTO %T4% 
12e0: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 64  VALUES('abc', 'd
12f0: 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ef');.    INSERT
1300: 20 49 4e 54 4f 20 25 54 34 25 20 56 41 4c 55 45   INTO %T4% VALUE
1310: 53 28 27 64 65 66 27 2c 20 27 61 62 63 27 29 3b  S('def', 'abc');
1320: 0a 20 20 7d 0a 20 20 31 37 20 7b 20 55 50 44 41  .  }.  17 { UPDA
1330: 54 45 20 25 54 34 25 20 53 45 54 20 62 20 3d 20  TE %T4% SET b = 
1340: 31 20 7d 0a 0a 20 20 31 38 20 7b 20 44 45 4c 45  1 }..  18 { DELE
1350: 54 45 20 46 52 4f 4d 20 25 54 34 25 20 57 48 45  TE FROM %T4% WHE
1360: 52 45 20 31 20 7d 0a 0a 20 20 31 39 20 7b 20 0a  RE 1 }..  19 { .
1370: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1380: 74 31 20 56 41 4c 55 45 53 28 27 27 2c 20 27 27  t1 VALUES('', ''
1390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
13a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 58 27 27  TO t1 VALUES(X''
13b0: 2c 20 58 27 27 29 3b 0a 20 20 7d 0a 20 20 32 30  , X'');.  }.  20
13c0: 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
13d0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
13e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
13f0: 53 28 27 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d  S('', NULL);.  }
1400: 0a 7d 0a 0a 74 65 73 74 5f 72 65 73 65 74 0a 64  .}..test_reset.d
1410: 6f 5f 63 6f 6d 6d 6f 6e 5f 73 71 6c 20 7b 0a 20  o_common_sql {. 
1420: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1430: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
1440: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  b);.  CREATE TAB
1450: 4c 45 20 74 32 28 61 2c 20 62 20 49 4e 54 45 47  LE t2(a, b INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  ER PRIMARY KEY);
1470: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1480: 74 33 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  t3(a, b, c, PRIM
1490: 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a  ARY KEY(a, b));.
14a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
14b0: 34 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  4(a, b, PRIMARY 
14c0: 4b 45 59 28 62 2c 20 61 29 29 3b 0a 7d 0a 0a 66  KEY(b, a));.}..f
14d0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
14e0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 25 54 31  [string map {%T1
14f0: 25 20 74 31 20 25 54 32 25 20 74 32 20 25 54 33  % t1 %T2% t2 %T3
1500: 25 20 74 33 20 25 54 34 25 20 74 34 7d 20 24 73  % t3 %T4% t4} $s
1510: 65 74 5f 6f 66 5f 74 65 73 74 73 5d 20 7b 0a 20  et_of_tests] {. 
1520: 20 64 6f 5f 74 68 65 6e 5f 61 70 70 6c 79 5f 73   do_then_apply_s
1530: 71 6c 20 24 73 71 6c 0a 20 20 64 6f 5f 74 65 73  ql $sql.  do_tes
1540: 74 20 32 2e 24 74 6e 20 7b 20 63 6f 6d 70 61 72  t 2.$tn { compar
1550: 65 5f 64 62 20 64 62 20 64 62 32 20 7d 20 7b 7d  e_db db db2 } {}
1560: 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  .}..# The follow
1570: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  ing block of tes
1580: 74 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ts is similar to
1590: 20 74 68 65 20 6c 61 73 74 2c 20 65 78 63 65 70   the last, excep
15a0: 74 20 74 68 61 74 20 74 68 65 0a 23 20 73 65 73  t that the.# ses
15b0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 73 20 72  sion object is r
15c0: 65 63 6f 72 64 69 6e 67 20 63 68 61 6e 67 65 73  ecording changes
15d0: 20 6d 61 64 65 20 74 6f 20 61 6e 20 61 74 74 61   made to an atta
15e0: 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ched database. T
15f0: 68 65 0a 23 20 6d 61 69 6e 20 64 61 74 61 62 61  he.# main databa
1600: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 61  se contains a ta
1610: 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
1620: 6e 61 6d 65 20 61 73 20 74 68 65 20 74 61 62 6c  name as the tabl
1630: 65 20 62 65 69 6e 67 0a 23 20 6d 6f 64 69 66 69  e being.# modifi
1640: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 61 74  ed within the at
1650: 74 61 63 68 65 64 20 64 62 2e 0a 23 0a 74 65 73  tached db..#.tes
1660: 74 5f 72 65 73 65 74 0a 66 6f 72 63 65 64 65 6c  t_reset.forcedel
1670: 65 74 65 20 74 65 73 74 2e 64 62 33 0a 73 71 6c  ete test.db3.sql
1680: 69 74 65 33 20 64 62 33 20 74 65 73 74 2e 64 62  ite3 db3 test.db
1690: 33 0a 64 6f 5f 74 65 73 74 20 33 2e 30 20 7b 0a  3.do_test 3.0 {.
16a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
16b0: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33  ATTACH 'test.db3
16c0: 27 20 41 53 20 27 61 75 78 27 3b 0a 20 20 20 20  ' AS 'aux';.    
16d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
16e0: 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59  a, b PRIMARY KEY
16f0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
1700: 42 4c 45 20 74 32 28 78 2c 20 79 2c 20 7a 29 3b  BLE t2(x, y, z);
1710: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1720: 45 20 74 33 28 61 29 3b 0a 0a 20 20 20 20 43 52  E t3(a);..    CR
1730: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
1740: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
1750: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
1760: 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20  TABLE aux.t2(a, 
1770: 62 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  b INTEGER PRIMAR
1780: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
1790: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 33 28  TE TABLE aux.t3(
17a0: 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  a, b, c, PRIMARY
17b0: 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
17c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
17d0: 78 2e 74 34 28 61 2c 20 62 2c 20 50 52 49 4d 41  x.t4(a, b, PRIMA
17e0: 52 59 20 4b 45 59 28 62 2c 20 61 29 29 3b 0a 20  RY KEY(b, a));. 
17f0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
1800: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1810: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
1820: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
1830: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 20 49   TABLE t2(a, b I
1840: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1850: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
1860: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20 63  TABLE t3(a, b, c
1870: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c  , PRIMARY KEY(a,
1880: 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   b));.    CREATE
1890: 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 2c 20   TABLE t4(a, b, 
18a0: 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 61  PRIMARY KEY(b, a
18b0: 29 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d  ));.  } db2.} {}
18c0: 0a 0a 70 72 6f 63 20 78 54 72 61 63 65 20 7b 61  ..proc xTrace {a
18d0: 72 67 73 7d 20 7b 20 70 75 74 73 20 24 61 72 67  rgs} { puts $arg
18e0: 73 20 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s }..foreach {tn
18f0: 20 73 71 6c 7d 20 5b 0a 20 20 73 74 72 69 6e 67   sql} [.  string
1900: 20 6d 61 70 20 7b 25 54 31 25 20 61 75 78 2e 74   map {%T1% aux.t
1910: 31 20 25 54 32 25 20 61 75 78 2e 74 32 20 25 54  1 %T2% aux.t2 %T
1920: 33 25 20 61 75 78 2e 74 33 20 25 54 34 25 20 61  3% aux.t3 %T4% a
1930: 75 78 2e 74 34 7d 20 24 73 65 74 5f 6f 66 5f 74  ux.t4} $set_of_t
1940: 65 73 74 73 0a 5d 20 7b 0a 20 20 64 6f 5f 74 68  ests.] {.  do_th
1950: 65 6e 5f 61 70 70 6c 79 5f 73 71 6c 20 24 73 71  en_apply_sql $sq
1960: 6c 20 61 75 78 0a 20 20 64 6f 5f 74 65 73 74 20  l aux.  do_test 
1970: 33 2e 24 74 6e 20 7b 20 63 6f 6d 70 61 72 65 5f  3.$tn { compare_
1980: 64 62 20 64 62 32 20 64 62 33 20 7d 20 7b 7d 0a  db db2 db3 } {}.
1990: 7d 0a 63 61 74 63 68 20 7b 64 62 33 20 63 6c 6f  }.catch {db3 clo
19a0: 73 65 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  se}...#---------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1a00: 20 74 65 73 74 73 20 76 65 72 69 66 79 20 74 68   tests verify th
1a10: 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69  at NULL values i
1a20: 6e 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  n primary key co
1a30: 6c 75 6d 6e 73 20 61 72 65 0a 23 20 68 61 6e 64  lumns are.# hand
1a40: 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 20 62 79  led correctly by
1a50: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64   the session mod
1a60: 75 6c 65 2e 0a 23 0a 74 65 73 74 5f 72 65 73 65  ule..#.test_rese
1a70: 74 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  t.do_execsql_tes
1a80: 74 20 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 4.0 {.  CREATE
1a90: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
1aa0: 41 52 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41  ARY KEY);.  CREA
1ab0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
1ac0: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
1ad0: 28 63 2c 20 62 29 29 3b 0a 20 20 43 52 45 41 54  (c, b));.  CREAT
1ae0: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 20  E TABLE t3(a, b 
1af0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1b00: 4b 45 59 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68  KEY);.}..foreach
1b10: 20 7b 74 6e 20 73 71 6c 20 63 68 61 6e 67 65 73   {tn sql changes
1b20: 65 74 7d 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20  et} {.  1 {.    
1b30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1b40: 41 4c 55 45 53 28 31 32 33 29 3b 0a 20 20 20 20  ALUES(123);.    
1b50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1b60: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20  ALUES(NULL);.   
1b70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1b80: 56 41 4c 55 45 53 28 34 35 36 29 3b 0a 20 20 7d  VALUES(456);.  }
1b90: 20 7b 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74   {.    {INSERT t
1ba0: 31 20 30 20 58 20 7b 7d 20 7b 69 20 34 35 36 7d  1 0 X {} {i 456}
1bb0: 7d 20 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74  } .    {INSERT t
1bc0: 31 20 30 20 58 20 7b 7d 20 7b 69 20 31 32 33 7d  1 0 X {} {i 123}
1bd0: 7d 0a 20 20 7d 0a 0a 20 20 32 20 7b 0a 20 20 20  }.  }..  2 {.   
1be0: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
1bf0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 20 7b 0a 20   = NULL;.  } {. 
1c00: 20 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30 20     {DELETE t1 0 
1c10: 58 20 7b 69 20 34 35 36 7d 20 7b 7d 7d 0a 20 20  X {i 456} {}}.  
1c20: 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58    {DELETE t1 0 X
1c30: 20 7b 69 20 31 32 33 7d 20 7b 7d 7d 0a 20 20 7d   {i 123} {}}.  }
1c40: 0a 0a 20 20 33 20 7b 20 44 45 4c 45 54 45 20 46  ..  3 { DELETE F
1c50: 52 4f 4d 20 74 31 20 7d 20 7b 20 7d 0a 0a 20 20  ROM t1 } { }..  
1c60: 34 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  4 { .    INSERT 
1c70: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 4e  INTO t3 VALUES(N
1c80: 55 4c 4c 2c 20 4e 55 4c 4c 29 0a 20 20 7d 20 7b  ULL, NULL).  } {
1c90: 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74 33 20  .    {INSERT t3 
1ca0: 30 20 2e 58 20 7b 7d 20 7b 6e 20 7b 7d 20 69 20  0 .X {} {n {} i 
1cb0: 31 7d 7d 20 0a 20 20 7d 0a 0a 20 20 35 20 7b 20  1}} .  }..  5 { 
1cc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1cd0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 4e 55 4c 4c  ALUES(1, 2, NULL
1ce0: 29 20 7d 20 20 20 20 7b 20 7d 0a 20 20 36 20 7b  ) }    { }.  6 {
1cf0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1d00: 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20  VALUES(1, NULL, 
1d10: 33 29 20 7d 20 20 20 20 7b 20 7d 0a 20 20 37 20  3) }    { }.  7 
1d20: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
1d30: 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c   VALUES(1, NULL,
1d40: 20 4e 55 4c 4c 29 20 7d 20 7b 20 7d 0a 20 20 38   NULL) } { }.  8
1d50: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
1d60: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  2 VALUES(1, 2, 3
1d70: 29 20 7d 20 20 20 20 7b 20 7b 49 4e 53 45 52 54  ) }    { {INSERT
1d80: 20 74 32 20 30 20 2e 58 58 20 7b 7d 20 7b 69 20   t2 0 .XX {} {i 
1d90: 31 20 69 20 32 20 69 20 33 7d 7d 20 7d 0a 20 20  1 i 2 i 3}} }.  
1da0: 39 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  9 { DELETE FROM 
1db0: 74 32 20 57 48 45 52 45 20 31 20 7d 20 20 20 20  t2 WHERE 1 }    
1dc0: 20 20 20 20 20 20 20 20 7b 20 7b 44 45 4c 45 54          { {DELET
1dd0: 45 20 74 32 20 30 20 2e 58 58 20 7b 69 20 31 20  E t2 0 .XX {i 1 
1de0: 69 20 32 20 69 20 33 7d 20 7b 7d 7d 20 7d 0a 0a  i 2 i 3} {}} }..
1df0: 7d 20 7b 0a 20 20 64 6f 5f 69 74 65 72 61 74 6f  } {.  do_iterato
1e00: 72 5f 74 65 73 74 20 34 2e 24 74 6e 20 7b 74 31  r_test 4.$tn {t1
1e10: 20 74 32 20 74 33 7d 20 24 73 71 6c 20 24 63 68   t2 t3} $sql $ch
1e20: 61 6e 67 65 73 65 74 0a 7d 0a 0a 0a 23 2d 2d 2d  angeset.}...#---
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e70: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
1e80: 61 74 20 69 66 20 4e 55 4c 4c 20 69 73 20 70 61  at if NULL is pa
1e90: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 73  ssed to sqlite3s
1ea0: 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 2c  ession_attach(),
1eb0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 23 20   all database.# 
1ec0: 74 61 62 6c 65 73 20 61 72 65 20 61 74 74 61 63  tables are attac
1ed0: 68 65 64 20 74 6f 20 74 68 65 20 73 65 73 73 69  hed to the sessi
1ee0: 6f 6e 20 6f 62 6a 65 63 74 2e 0a 23 0a 74 65 73  on object..#.tes
1ef0: 74 5f 72 65 73 65 74 0a 64 6f 5f 65 78 65 63 73  t_reset.do_execs
1f00: 71 6c 5f 74 65 73 74 20 35 2e 30 20 7b 0a 20 20  ql_test 5.0 {.  
1f10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1f20: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  a PRIMARY KEY);.
1f30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1f40: 32 28 78 2c 20 79 20 50 52 49 4d 41 52 59 20 4b  2(x, y PRIMARY K
1f50: 45 59 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  EY);.}..foreach 
1f60: 7b 74 6e 20 73 71 6c 20 63 68 61 6e 67 65 73 65  {tn sql changese
1f70: 74 7d 20 7b 0a 20 20 31 20 7b 20 49 4e 53 45 52  t} {.  1 { INSER
1f80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1f90: 28 33 35 29 20 7d 20 20 20 20 20 7b 20 7b 49 4e  (35) }     { {IN
1fa0: 53 45 52 54 20 74 31 20 30 20 58 20 7b 7d 20 7b  SERT t1 0 X {} {
1fb0: 69 20 33 35 7d 7d 20 7d 0a 20 20 32 20 7b 20 49  i 35}} }.  2 { I
1fc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1fd0: 4c 55 45 53 28 33 36 2c 20 33 37 29 20 7d 20 7b  LUES(36, 37) } {
1fe0: 20 7b 49 4e 53 45 52 54 20 74 32 20 30 20 2e 58   {INSERT t2 0 .X
1ff0: 20 7b 7d 20 7b 69 20 33 36 20 69 20 33 37 7d 7d   {} {i 36 i 37}}
2000: 20 7d 0a 20 20 33 20 7b 20 0a 20 20 20 20 44 45   }.  3 { .    DE
2010: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
2020: 52 45 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45  RE 1;.    UPDATE
2030: 20 74 32 20 53 45 54 20 78 20 3d 20 33 34 3b 0a   t2 SET x = 34;.
2040: 20 20 7d 20 7b 20 0a 20 20 20 20 7b 44 45 4c 45    } { .    {DELE
2050: 54 45 20 74 31 20 30 20 58 20 7b 69 20 33 35 7d  TE t1 0 X {i 35}
2060: 20 7b 7d 7d 0a 20 20 20 20 7b 55 50 44 41 54 45   {}}.    {UPDATE
2070: 20 74 32 20 30 20 2e 58 20 7b 69 20 33 36 20 69   t2 0 .X {i 36 i
2080: 20 33 37 7d 20 7b 69 20 33 34 20 7b 7d 20 7b 7d   37} {i 34 {} {}
2090: 7d 7d 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f  }}.  }.} {.  do_
20a0: 69 74 65 72 61 74 6f 72 5f 74 65 73 74 20 35 2e  iterator_test 5.
20b0: 24 74 6e 20 2a 20 24 73 71 6c 20 24 63 68 61 6e  $tn * $sql $chan
20c0: 67 65 73 65 74 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  geset.}..#------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62  ---.# The next b
2120: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 76 65  lock of tests ve
2130: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 22 69  rify that the "i
2140: 6e 64 69 72 65 63 74 22 20 66 6c 61 67 20 69 73  ndirect" flag is
2150: 20 73 65 74 20 0a 23 20 63 6f 72 72 65 63 74 6c   set .# correctl
2160: 79 20 77 69 74 68 69 6e 20 63 68 61 6e 67 65 73  y within changes
2170: 65 74 73 2e 20 54 68 65 20 69 6e 64 69 72 65 63  ets. The indirec
2180: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  t flag is set fo
2190: 72 20 61 20 63 68 61 6e 67 65 0a 23 20 69 66 20  r a change.# if 
21a0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
21b0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
21c0: 3a 0a 23 0a 23 20 20 20 2a 20 54 68 65 20 73 71  :.#.#   * The sq
21d0: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64  lite3session_ind
21e0: 69 72 65 63 74 28 29 20 41 50 49 20 68 61 73 20  irect() API has 
21f0: 62 65 65 6e 20 75 73 65 64 20 74 6f 20 73 65 74  been used to set
2200: 20 74 68 65 20 73 65 73 73 69 6f 6e 0a 23 20 20   the session.#  
2210: 20 20 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67     indirect flag
2220: 20 74 6f 20 74 72 75 65 2c 20 6f 72 0a 23 20 20   to true, or.#  
2230: 20 2a 20 54 68 65 20 63 68 61 6e 67 65 20 77 61   * The change wa
2240: 73 20 6d 61 64 65 20 62 79 20 61 20 74 72 69 67  s made by a trig
2250: 67 65 72 2e 0a 23 0a 23 20 49 66 20 74 68 65 20  ger..#.# If the 
2260: 73 61 6d 65 20 72 6f 77 20 69 73 20 75 70 64 61  same row is upda
2270: 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ted more than on
2280: 63 65 20 64 75 72 69 6e 67 20 61 20 73 65 73 73  ce during a sess
2290: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 0a 23  ion, then the .#
22a0: 20 63 68 61 6e 67 65 20 69 73 20 63 6f 6e 73 69   change is consi
22b0: 64 65 72 65 64 20 69 6e 64 69 72 65 63 74 20 6f  dered indirect o
22c0: 6e 6c 79 20 69 66 20 61 6c 6c 20 63 68 61 6e 67  nly if all chang
22d0: 65 73 20 6d 65 65 74 20 74 68 65 20 63 72 69 74  es meet the crit
22e0: 65 72 69 61 20 0a 23 20 61 62 6f 76 65 2e 0a 23  eria .# above..#
22f0: 0a 74 65 73 74 5f 72 65 73 65 74 0a 64 62 20 66  .test_reset.db f
2300: 75 6e 63 74 69 6f 6e 20 69 6e 64 69 72 65 63 74  unction indirect
2310: 20 5b 6c 69 73 74 20 53 20 69 6e 64 69 72 65 63   [list S indirec
2320: 74 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  t]..do_execsql_t
2330: 65 73 74 20 36 2e 30 20 7b 0a 20 20 43 52 45 41  est 6.0 {.  CREA
2340: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
2350: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
2360: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
2370: 45 20 74 32 28 78 20 50 52 49 4d 41 52 59 20 4b  E t2(x PRIMARY K
2380: 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45  EY, y);.  CREATE
2390: 20 54 52 49 47 47 45 52 20 41 46 54 45 52 20 49   TRIGGER AFTER I
23a0: 4e 53 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e  NSERT ON t2 WHEN
23b0: 20 6e 65 77 2e 78 25 32 20 42 45 47 49 4e 0a 20   new.x%2 BEGIN. 
23c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
23d0: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2b 31  2 VALUES(new.x+1
23e0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 45 4e 44 3b 0a  , NULL);.  END;.
23f0: 7d 0a 0a 64 6f 5f 69 74 65 72 61 74 6f 72 5f 74  }..do_iterator_t
2400: 65 73 74 20 36 2e 31 2e 31 20 2a 20 7b 0a 20 20  est 6.1.1 * {.  
2410: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2420: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 2c 20  ALUES(1, 'one', 
2430: 27 69 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 69  'i');.  SELECT i
2440: 6e 64 69 72 65 63 74 28 31 29 3b 0a 20 20 49 4e  ndirect(1);.  IN
2450: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2460: 55 45 53 28 32 2c 20 27 74 77 6f 27 2c 20 27 69  UES(2, 'two', 'i
2470: 69 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 69 6e  i');.  SELECT in
2480: 64 69 72 65 63 74 28 30 29 3b 0a 20 20 49 4e 53  direct(0);.  INS
2490: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
24a0: 45 53 28 33 2c 20 27 74 68 72 65 65 27 2c 20 27  ES(3, 'three', '
24b0: 69 69 69 27 29 3b 0a 7d 20 7b 0a 20 20 7b 49 4e  iii');.} {.  {IN
24c0: 53 45 52 54 20 74 31 20 30 20 58 2e 2e 20 7b 7d  SERT t1 0 X.. {}
24d0: 20 7b 69 20 31 20 74 20 6f 6e 65 20 74 20 69 7d   {i 1 t one t i}
24e0: 7d 0a 20 20 7b 49 4e 53 45 52 54 20 74 31 20 31  }.  {INSERT t1 1
24f0: 20 58 2e 2e 20 7b 7d 20 7b 69 20 32 20 74 20 74   X.. {} {i 2 t t
2500: 77 6f 20 74 20 69 69 7d 7d 0a 20 20 7b 49 4e 53  wo t ii}}.  {INS
2510: 45 52 54 20 74 31 20 30 20 58 2e 2e 20 7b 7d 20  ERT t1 0 X.. {} 
2520: 7b 69 20 33 20 74 20 74 68 72 65 65 20 74 20 69  {i 3 t three t i
2530: 69 69 7d 7d 0a 7d 0a 0a 64 6f 5f 69 74 65 72 61  ii}}.}..do_itera
2540: 74 6f 72 5f 74 65 73 74 20 36 2e 31 2e 32 20 2a  tor_test 6.1.2 *
2550: 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 6e 64 69   {.  SELECT indi
2560: 72 65 63 74 28 31 29 3b 0a 20 20 55 50 44 41 54  rect(1);.  UPDAT
2570: 45 20 74 31 20 53 45 54 20 63 20 3d 20 27 49 27  E t1 SET c = 'I'
2580: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
2590: 53 45 4c 45 43 54 20 69 6e 64 69 72 65 63 74 28  SELECT indirect(
25a0: 30 29 3b 0a 7d 20 7b 0a 20 20 7b 55 50 44 41 54  0);.} {.  {UPDAT
25b0: 45 20 74 31 20 31 20 58 2e 2e 20 7b 69 20 31 20  E t1 1 X.. {i 1 
25c0: 7b 7d 20 7b 7d 20 74 20 69 7d 20 7b 7b 7d 20 7b  {} {} t i} {{} {
25d0: 7d 20 7b 7d 20 7b 7d 20 74 20 49 7d 7d 0a 7d 0a  } {} {} t I}}.}.
25e0: 64 6f 5f 69 74 65 72 61 74 6f 72 5f 74 65 73 74  do_iterator_test
25f0: 20 36 2e 31 2e 33 20 2a 20 7b 0a 20 20 53 45 4c   6.1.3 * {.  SEL
2600: 45 43 54 20 69 6e 64 69 72 65 63 74 28 31 29 3b  ECT indirect(1);
2610: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
2620: 20 63 20 3d 20 27 2e 27 20 57 48 45 52 45 20 61   c = '.' WHERE a
2630: 20 3d 20 31 3b 0a 20 20 53 45 4c 45 43 54 20 69   = 1;.  SELECT i
2640: 6e 64 69 72 65 63 74 28 30 29 3b 0a 20 20 55 50  ndirect(0);.  UP
2650: 44 41 54 45 20 74 31 20 53 45 54 20 63 20 3d 20  DATE t1 SET c = 
2660: 27 6f 27 20 57 48 45 52 45 20 61 20 3d 20 31 3b  'o' WHERE a = 1;
2670: 0a 7d 20 7b 0a 20 20 7b 55 50 44 41 54 45 20 74  .} {.  {UPDATE t
2680: 31 20 30 20 58 2e 2e 20 7b 69 20 31 20 7b 7d 20  1 0 X.. {i 1 {} 
2690: 7b 7d 20 74 20 49 7d 20 7b 7b 7d 20 7b 7d 20 7b  {} t I} {{} {} {
26a0: 7d 20 7b 7d 20 74 20 6f 7d 7d 0a 7d 0a 64 6f 5f  } {} t o}}.}.do_
26b0: 69 74 65 72 61 74 6f 72 5f 74 65 73 74 20 36 2e  iterator_test 6.
26c0: 31 2e 34 20 2a 20 7b 0a 20 20 53 45 4c 45 43 54  1.4 * {.  SELECT
26d0: 20 69 6e 64 69 72 65 63 74 28 30 29 3b 0a 20 20   indirect(0);.  
26e0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 63 20  UPDATE t1 SET c 
26f0: 3d 20 27 78 27 20 57 48 45 52 45 20 61 20 3d 20  = 'x' WHERE a = 
2700: 31 3b 0a 20 20 53 45 4c 45 43 54 20 69 6e 64 69  1;.  SELECT indi
2710: 72 65 63 74 28 31 29 3b 0a 20 20 55 50 44 41 54  rect(1);.  UPDAT
2720: 45 20 74 31 20 53 45 54 20 63 20 3d 20 27 69 27  E t1 SET c = 'i'
2730: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 7d 20   WHERE a = 1;.} 
2740: 7b 0a 20 20 7b 55 50 44 41 54 45 20 74 31 20 30  {.  {UPDATE t1 0
2750: 20 58 2e 2e 20 7b 69 20 31 20 7b 7d 20 7b 7d 20   X.. {i 1 {} {} 
2760: 74 20 6f 7d 20 7b 7b 7d 20 7b 7d 20 7b 7d 20 7b  t o} {{} {} {} {
2770: 7d 20 74 20 69 7d 7d 0a 7d 0a 64 6f 5f 69 74 65  } t i}}.}.do_ite
2780: 72 61 74 6f 72 5f 74 65 73 74 20 36 2e 31 2e 34  rator_test 6.1.4
2790: 20 2a 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 6e   * {.  SELECT in
27a0: 64 69 72 65 63 74 28 31 29 3b 0a 20 20 55 50 44  direct(1);.  UPD
27b0: 41 54 45 20 74 31 20 53 45 54 20 63 20 3d 20 27  ATE t1 SET c = '
27c0: 79 27 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  y' WHERE a = 1;.
27d0: 20 20 53 45 4c 45 43 54 20 69 6e 64 69 72 65 63    SELECT indirec
27e0: 74 28 31 29 3b 0a 20 20 55 50 44 41 54 45 20 74  t(1);.  UPDATE t
27f0: 31 20 53 45 54 20 63 20 3d 20 27 49 27 20 57 48  1 SET c = 'I' WH
2800: 45 52 45 20 61 20 3d 20 31 3b 0a 7d 20 7b 0a 20  ERE a = 1;.} {. 
2810: 20 7b 55 50 44 41 54 45 20 74 31 20 31 20 58 2e   {UPDATE t1 1 X.
2820: 2e 20 7b 69 20 31 20 7b 7d 20 7b 7d 20 74 20 69  . {i 1 {} {} t i
2830: 7d 20 7b 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 74  } {{} {} {} {} t
2840: 20 49 7d 7d 0a 7d 0a 0a 64 6f 5f 69 74 65 72 61   I}}.}..do_itera
2850: 74 6f 72 5f 74 65 73 74 20 36 2e 31 2e 35 20 2a  tor_test 6.1.5 *
2860: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
2870: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 78   t2 VALUES(1, 'x
2880: 27 29 3b 0a 7d 20 7b 0a 20 20 7b 49 4e 53 45 52  ');.} {.  {INSER
2890: 54 20 74 32 20 30 20 58 2e 20 7b 7d 20 7b 69 20  T t2 0 X. {} {i 
28a0: 31 20 74 20 78 7d 7d 0a 20 20 7b 49 4e 53 45 52  1 t x}}.  {INSER
28b0: 54 20 74 32 20 31 20 58 2e 20 7b 7d 20 7b 69 20  T t2 1 X. {} {i 
28c0: 32 20 6e 20 7b 7d 7d 7d 0a 7d 0a 0a 64 6f 5f 69  2 n {}}}.}..do_i
28d0: 74 65 72 61 74 6f 72 5f 74 65 73 74 20 36 2e 31  terator_test 6.1
28e0: 2e 36 20 2a 20 7b 0a 20 20 53 45 4c 45 43 54 20  .6 * {.  SELECT 
28f0: 69 6e 64 69 72 65 63 74 28 31 29 3b 0a 20 20 49  indirect(1);.  I
2900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
2910: 4c 55 45 53 28 33 2c 20 27 78 27 29 3b 0a 20 20  LUES(3, 'x');.  
2920: 53 45 4c 45 43 54 20 69 6e 64 69 72 65 63 74 28  SELECT indirect(
2930: 30 29 3b 0a 20 20 55 50 44 41 54 45 20 74 32 20  0);.  UPDATE t2 
2940: 53 45 54 20 79 20 3d 20 27 79 27 20 57 48 45 52  SET y = 'y' WHER
2950: 45 20 78 3e 32 3b 0a 7d 20 7b 0a 20 20 7b 49 4e  E x>2;.} {.  {IN
2960: 53 45 52 54 20 74 32 20 30 20 58 2e 20 7b 7d 20  SERT t2 0 X. {} 
2970: 7b 69 20 33 20 74 20 79 7d 7d 0a 20 20 7b 49 4e  {i 3 t y}}.  {IN
2980: 53 45 52 54 20 74 32 20 30 20 58 2e 20 7b 7d 20  SERT t2 0 X. {} 
2990: 7b 69 20 34 20 74 20 79 7d 7d 0a 7d 0a 0a 64 6f  {i 4 t y}}.}..do
29a0: 5f 69 74 65 72 61 74 6f 72 5f 74 65 73 74 20 36  _iterator_test 6
29b0: 2e 31 2e 37 20 2a 20 7b 0a 20 20 53 45 4c 45 43  .1.7 * {.  SELEC
29c0: 54 20 69 6e 64 69 72 65 63 74 28 31 29 3b 0a 20  T indirect(1);. 
29d0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20   DELETE FROM t2 
29e0: 57 48 45 52 45 20 78 20 3d 20 34 3b 0a 20 20 53  WHERE x = 4;.  S
29f0: 45 4c 45 43 54 20 69 6e 64 69 72 65 63 74 28 30  ELECT indirect(0
2a00: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2a10: 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 27 6e   t2 VALUES(4, 'n
2a20: 65 77 27 29 3b 0a 7d 20 7b 0a 20 20 7b 55 50 44  ew');.} {.  {UPD
2a30: 41 54 45 20 74 32 20 30 20 58 2e 20 7b 69 20 34  ATE t2 0 X. {i 4
2a40: 20 74 20 79 7d 20 7b 7b 7d 20 7b 7d 20 74 20 6e   t y} {{} {} t n
2a50: 65 77 7d 7d 0a 7d 0a 0a 64 6f 5f 69 74 65 72 61  ew}}.}..do_itera
2a60: 74 6f 72 5f 74 65 73 74 20 36 2e 31 2e 38 20 2a  tor_test 6.1.8 *
2a70: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2a80: 45 20 74 33 28 61 2c 20 62 20 50 52 49 4d 41 52  E t3(a, b PRIMAR
2a90: 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45  Y KEY);.  CREATE
2aa0: 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 20 50   TABLE t4(a, b P
2ab0: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 43  RIMARY KEY);.  C
2ac0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 34  REATE TRIGGER t4
2ad0: 74 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  t AFTER UPDATE O
2ae0: 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20 55  N t4 BEGIN.    U
2af0: 50 44 41 54 45 20 74 33 20 53 45 54 20 61 20 3d  PDATE t3 SET a =
2b00: 20 6e 65 77 2e 61 20 57 48 45 52 45 20 62 20 3d   new.a WHERE b =
2b10: 20 6e 65 77 2e 62 3b 0a 20 20 45 4e 44 3b 0a 0a   new.b;.  END;..
2b20: 20 20 53 45 4c 45 43 54 20 69 6e 64 69 72 65 63    SELECT indirec
2b30: 74 28 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  t(1);.  INSERT I
2b40: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 6f  NTO t3 VALUES('o
2b50: 6e 65 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  ne', 1);.  INSER
2b60: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
2b70: 28 27 6f 6e 65 27 2c 20 31 29 3b 0a 20 20 53 45  ('one', 1);.  SE
2b80: 4c 45 43 54 20 69 6e 64 69 72 65 63 74 28 30 29  LECT indirect(0)
2b90: 3b 0a 20 20 55 50 44 41 54 45 20 74 34 20 53 45  ;.  UPDATE t4 SE
2ba0: 54 20 61 20 3d 20 27 74 77 6f 27 20 57 48 45 52  T a = 'two' WHER
2bb0: 45 20 62 20 3d 20 31 3b 0a 7d 20 7b 0a 20 20 7b  E b = 1;.} {.  {
2bc0: 49 4e 53 45 52 54 20 74 33 20 31 20 2e 58 20 7b  INSERT t3 1 .X {
2bd0: 7d 20 7b 74 20 74 77 6f 20 69 20 31 7d 7d 0a 20  } {t two i 1}}. 
2be0: 20 7b 49 4e 53 45 52 54 20 74 34 20 30 20 2e 58   {INSERT t4 0 .X
2bf0: 20 7b 7d 20 7b 74 20 74 77 6f 20 69 20 31 7d 7d   {} {t two i 1}}
2c00: 20 0a 7d 0a 0a 73 71 6c 69 74 65 33 73 65 73 73   .}..sqlite3sess
2c10: 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a 64 6f  ion S db main.do
2c20: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e  _execsql_test 6.
2c30: 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 69  2.1 {.  SELECT i
2c40: 6e 64 69 72 65 63 74 28 30 29 3b 0a 20 20 53 45  ndirect(0);.  SE
2c50: 4c 45 43 54 20 69 6e 64 69 72 65 63 74 28 2d 31  LECT indirect(-1
2c60: 29 3b 0a 20 20 53 45 4c 45 43 54 20 69 6e 64 69  );.  SELECT indi
2c70: 72 65 63 74 28 34 35 29 3b 0a 20 20 53 45 4c 45  rect(45);.  SELE
2c80: 43 54 20 69 6e 64 69 72 65 63 74 28 2d 31 30 30  CT indirect(-100
2c90: 29 3b 0a 7d 20 7b 30 20 30 20 31 20 31 7d 0a 53  );.} {0 0 1 1}.S
2ca0: 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
2d00: 69 66 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61  if a conflict-ha
2d10: 6e 64 6c 65 72 20 74 68 61 74 20 68 61 73 20 62  ndler that has b
2d20: 65 65 6e 20 70 61 73 73 65 64 20 65 69 74 68 65  een passed eithe
2d30: 72 20 4e 4f 54 46 4f 55 4e 44 20 6f 72 0a 23 20  r NOTFOUND or.# 
2d40: 43 4f 4e 53 54 52 41 49 4e 54 20 72 65 74 75 72  CONSTRAINT retur
2d50: 6e 73 20 52 45 50 4c 41 43 45 20 2d 20 74 68 65  ns REPLACE - the
2d60: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
2d70: 74 5f 61 70 70 6c 79 28 29 20 63 61 6c 6c 20 72  t_apply() call r
2d80: 65 74 75 72 6e 73 0a 23 20 4d 49 53 55 53 45 20  eturns.# MISUSE 
2d90: 61 6e 64 20 72 6f 6c 6c 73 20 62 61 63 6b 20 61  and rolls back a
2da0: 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
2db0: 73 6f 20 66 61 72 2e 0a 23 0a 23 20 20 20 37 2e  so far..#.#   7.
2dc0: 31 2e 2a 3a 20 4e 4f 54 46 4f 55 4e 44 20 63 6f  1.*: NOTFOUND co
2dd0: 6e 66 6c 69 63 74 2d 63 61 6c 6c 62 61 63 6b 2e  nflict-callback.
2de0: 0a 23 20 20 20 37 2e 32 2e 2a 3a 20 43 4f 4e 53  .#   7.2.*: CONS
2df0: 54 52 41 49 4e 54 20 63 6f 6e 66 6c 69 63 74 2d  TRAINT conflict-
2e00: 63 61 6c 6c 62 61 63 6b 2e 0a 23 0a 70 72 6f 63  callback..#.proc
2e10: 20 78 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73   xConflict {args
2e20: 7d 20 7b 72 65 74 75 72 6e 20 52 45 50 4c 41 43  } {return REPLAC
2e30: 45 7d 0a 74 65 73 74 5f 72 65 73 65 74 0a 0a 64  E}.test_reset..d
2e40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37  o_execsql_test 7
2e50: 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .1.1 {.  CREATE 
2e60: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
2e70: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 49 4e  RY KEY, b);.  IN
2e80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2e90: 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20  UES(1, 'one');. 
2ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2eb0: 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29  VALUES(2, 'two')
2ec0: 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 37 2e 31 2e  ;.}.do_test 7.1.
2ed0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
2ee0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2ef0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
2f00: 59 2c 20 62 20 4e 4f 54 20 4e 55 4c 4c 29 3b 0a  Y, b NOT NULL);.
2f10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2f20: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e  t1 VALUES(1, 'on
2f30: 65 27 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b  e');.  } db2.} {
2f40: 7d 0a 64 6f 5f 74 65 73 74 20 37 2e 31 2e 33 20  }.do_test 7.1.3 
2f50: 7b 0a 20 20 73 65 74 20 63 68 61 6e 67 65 73 65  {.  set changese
2f60: 74 20 5b 63 68 61 6e 67 65 73 65 74 5f 66 72 6f  t [changeset_fro
2f70: 6d 5f 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  m_sql {.    UPDA
2f80: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27 66  TE t1 SET b = 'f
2f90: 69 76 65 27 20 57 48 45 52 45 20 61 20 3d 20 31  ive' WHERE a = 1
2fa0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
2fb0: 53 45 54 20 62 20 3d 20 27 73 69 78 27 20 57 48  SET b = 'six' WH
2fc0: 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 7d 5d 0a  ERE a = 2;.  }].
2fd0: 20 20 73 65 74 20 78 20 5b 6c 69 73 74 5d 0a 20    set x [list]. 
2fe0: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
2ff0: 66 6f 72 65 61 63 68 20 63 20 24 63 68 61 6e 67  foreach c $chang
3000: 65 73 65 74 20 7b 20 6c 61 70 70 65 6e 64 20 78  eset { lappend x
3010: 20 24 63 20 7d 0a 20 20 73 65 74 20 78 0a 7d 20   $c }.  set x.} 
3020: 5b 6c 69 73 74 20 5c 0a 20 20 7b 55 50 44 41 54  [list \.  {UPDAT
3030: 45 20 74 31 20 30 20 58 2e 20 7b 69 20 31 20 74  E t1 0 X. {i 1 t
3040: 20 6f 6e 65 7d 20 7b 7b 7d 20 7b 7d 20 74 20 66   one} {{} {} t f
3050: 69 76 65 7d 7d 20 5c 0a 20 20 7b 55 50 44 41 54  ive}} \.  {UPDAT
3060: 45 20 74 31 20 30 20 58 2e 20 7b 69 20 32 20 74  E t1 0 X. {i 2 t
3070: 20 74 77 6f 7d 20 7b 7b 7d 20 7b 7d 20 74 20 73   two} {{} {} t s
3080: 69 78 7d 7d 20 20 5c 0a 5d 0a 64 6f 5f 74 65 73  ix}}  \.].do_tes
3090: 74 20 37 2e 31 2e 34 20 7b 0a 20 20 6c 69 73 74  t 7.1.4 {.  list
30a0: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
30b0: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 20  changeset_apply 
30c0: 64 62 32 20 24 63 68 61 6e 67 65 73 65 74 20 78  db2 $changeset x
30d0: 43 6f 6e 66 6c 69 63 74 7d 20 6d 73 67 5d 20 24  Conflict} msg] $
30e0: 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f  msg.} {1 SQLITE_
30f0: 4d 49 53 55 53 45 7d 0a 64 6f 5f 74 65 73 74 20  MISUSE}.do_test 
3100: 37 2e 31 2e 35 20 7b 20 65 78 65 63 73 71 6c 20  7.1.5 { execsql 
3110: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
3120: 74 31 20 7d 20 64 62 32 20 7d 20 7b 31 20 6f 6e  t1 } db2 } {1 on
3130: 65 7d 0a 0a 64 6f 5f 74 65 73 74 20 37 2e 32 2e  e}..do_test 7.2.
3140: 31 20 7b 0a 20 20 73 65 74 20 63 68 61 6e 67 65  1 {.  set change
3150: 73 65 74 20 5b 63 68 61 6e 67 65 73 65 74 5f 66  set [changeset_f
3160: 72 6f 6d 5f 73 71 6c 20 7b 20 55 50 44 41 54 45  rom_sql { UPDATE
3170: 20 74 31 20 53 45 54 20 62 20 3d 20 4e 55 4c 4c   t1 SET b = NULL
3180: 20 57 48 45 52 45 20 61 20 3d 20 31 20 7d 5d 0a   WHERE a = 1 }].
3190: 0a 20 20 73 65 74 20 78 20 5b 6c 69 73 74 5d 0a  .  set x [list].
31a0: 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
31b0: 5f 66 6f 72 65 61 63 68 20 63 20 24 63 68 61 6e  _foreach c $chan
31c0: 67 65 73 65 74 20 7b 20 6c 61 70 70 65 6e 64 20  geset { lappend 
31d0: 78 20 24 63 20 7d 0a 20 20 73 65 74 20 78 0a 7d  x $c }.  set x.}
31e0: 20 5b 6c 69 73 74 20 5c 0a 20 20 7b 55 50 44 41   [list \.  {UPDA
31f0: 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20 31 20  TE t1 0 X. {i 1 
3200: 74 20 66 69 76 65 7d 20 7b 7b 7d 20 7b 7d 20 6e  t five} {{} {} n
3210: 20 7b 7d 7d 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73   {}}} \.].do_tes
3220: 74 20 37 2e 32 2e 32 20 7b 0a 20 20 6c 69 73 74  t 7.2.2 {.  list
3230: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
3240: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 20  changeset_apply 
3250: 64 62 32 20 24 63 68 61 6e 67 65 73 65 74 20 78  db2 $changeset x
3260: 43 6f 6e 66 6c 69 63 74 7d 20 6d 73 67 5d 20 24  Conflict} msg] $
3270: 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f  msg.} {1 SQLITE_
3280: 4d 49 53 55 53 45 7d 0a 64 6f 5f 74 65 73 74 20  MISUSE}.do_test 
3290: 37 2e 32 2e 33 20 7b 20 65 78 65 63 73 71 6c 20  7.2.3 { execsql 
32a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
32b0: 74 31 20 7d 20 64 62 32 20 7d 20 7b 31 20 6f 6e  t1 } db2 } {1 on
32c0: 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3310: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20   Test that if a 
3320: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
3330: 20 72 65 74 75 72 6e 73 20 41 42 4f 52 54 2c 20   returns ABORT, 
3340: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 66 20 74  application of t
3350: 68 65 20 0a 23 20 63 68 61 6e 67 65 73 65 74 20  he .# changeset 
3360: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  is rolled back a
3370: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 63 68  nd the sqlite3ch
3380: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
3390: 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 0a 23  method returns.#
33a0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 23   SQLITE_ABORT..#
33b0: 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  .# Also test tha
33c0: 74 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  t the same thing
33d0: 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 63 6f   happens if a co
33e0: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 72  nflict handler r
33f0: 65 74 75 72 6e 73 20 61 6e 0a 23 20 75 6e 72 65  eturns an.# unre
3400: 63 6f 67 6e 69 7a 65 64 20 69 6e 74 65 67 65 72  cognized integer
3410: 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
3420: 69 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  in this case SQL
3430: 49 54 45 5f 4d 49 53 55 53 45 20 69 73 20 72 65  ITE_MISUSE is re
3440: 74 75 72 6e 65 64 0a 23 20 69 6e 73 74 65 61 64  turned.# instead
3450: 20 6f 66 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   of SQLITE_ABORT
3460: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ..#.foreach {tn 
3470: 63 6f 6e 66 6c 69 63 74 5f 72 65 74 75 72 6e 20  conflict_return 
3480: 61 70 70 6c 79 5f 72 65 74 75 72 6e 7d 20 7b 0a  apply_return} {.
3490: 20 20 31 20 20 20 20 41 42 4f 52 54 20 20 20 53    1    ABORT   S
34a0: 51 4c 49 54 45 5f 41 42 4f 52 54 0a 20 20 32 20  QLITE_ABORT.  2 
34b0: 20 20 20 35 36 37 20 20 20 20 20 53 51 4c 49 54     567     SQLIT
34c0: 45 5f 4d 49 53 55 53 45 0a 7d 20 7b 0a 20 20 74  E_MISUSE.} {.  t
34d0: 65 73 74 5f 72 65 73 65 74 0a 20 20 70 72 6f 63  est_reset.  proc
34e0: 20 78 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73   xConflict {args
34f0: 7d 20 5b 6c 69 73 74 20 72 65 74 75 72 6e 20 24  } [list return $
3500: 63 6f 6e 66 6c 69 63 74 5f 72 65 74 75 72 6e 5d  conflict_return]
3510: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 38 2e 24 74  ..  do_test 8.$t
3520: 6e 2e 30 20 7b 0a 20 20 20 20 64 6f 5f 63 6f 6d  n.0 {.    do_com
3530: 6d 6f 6e 5f 73 71 6c 20 7b 20 0a 20 20 20 20 20  mon_sql { .     
3540: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3550: 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b  (x, y, PRIMARY K
3560: 45 59 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 20  EY(x, y));.     
3570: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3580: 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29  VALUES('x', 'y')
3590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  ;.    }.    exec
35a0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
35b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 77 27 2c  O t1 VALUES('w',
35c0: 20 27 77 27 29 20 7d 0a 0a 20 20 20 20 73 65 74   'w') }..    set
35d0: 20 63 68 61 6e 67 65 73 65 74 20 5b 63 68 61 6e   changeset [chan
35e0: 67 65 73 65 74 5f 66 72 6f 6d 5f 73 71 6c 20 7b  geset_from_sql {
35f0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
3600: 57 48 45 52 45 20 31 20 7d 5d 0a 0a 20 20 20 20  WHERE 1 }]..    
3610: 73 65 74 20 78 20 5b 6c 69 73 74 5d 0a 20 20 20  set x [list].   
3620: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
3630: 66 6f 72 65 61 63 68 20 63 20 24 63 68 61 6e 67  foreach c $chang
3640: 65 73 65 74 20 7b 20 6c 61 70 70 65 6e 64 20 78  eset { lappend x
3650: 20 24 63 20 7d 0a 20 20 20 20 73 65 74 20 78 0a   $c }.    set x.
3660: 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20    } [list \.    
3670: 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58 58 20  {DELETE t1 0 XX 
3680: 7b 74 20 77 20 74 20 77 7d 20 7b 7d 7d 20 5c 0a  {t w t w} {}} \.
3690: 20 20 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30      {DELETE t1 0
36a0: 20 58 58 20 7b 74 20 78 20 74 20 79 7d 20 7b 7d   XX {t x t y} {}
36b0: 7d 20 5c 0a 20 20 5d 0a 0a 20 20 64 6f 5f 74 65  } \.  ]..  do_te
36c0: 73 74 20 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  st 8.$tn.1 {.   
36d0: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71   list [catch {sq
36e0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
36f0: 70 70 6c 79 20 64 62 32 20 24 63 68 61 6e 67 65  pply db2 $change
3700: 73 65 74 20 78 43 6f 6e 66 6c 69 63 74 7d 20 6d  set xConflict} m
3710: 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 5b 6c 69  sg] $msg.  } [li
3720: 73 74 20 31 20 24 61 70 70 6c 79 5f 72 65 74 75  st 1 $apply_retu
3730: 72 6e 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 38  rn]..  do_test 8
3740: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65  .$tn.2 {.    exe
3750: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
3760: 52 4f 4d 20 74 31 7d 20 64 62 32 0a 20 20 7d 20  ROM t1} db2.  } 
3770: 7b 78 20 79 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  {x y}.}...#-----
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 0a 23 20 54 72 79 20 74 6f 20 63 61  ----.# Try to ca
37d0: 75 73 65 20 61 6e 20 69 6e 66 69 6e 69 74 65 20  use an infinite 
37e0: 6c 6f 6f 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  loop as follows:
37f0: 0a 23 0a 23 20 20 20 31 2e 20 48 61 76 65 20 61  .#.#   1. Have a
3800: 20 63 68 61 6e 67 65 73 65 74 20 69 6e 73 65 72   changeset inser
3810: 74 20 61 20 72 6f 77 20 74 68 61 74 20 63 61 75  t a row that cau
3820: 73 65 73 20 61 20 43 4f 4e 46 4c 49 43 54 20 63  ses a CONFLICT c
3830: 61 6c 6c 62 61 63 6b 2c 0a 23 20 20 20 32 2e 20  allback,.#   2. 
3840: 48 61 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63  Have the conflic
3850: 74 20 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e  t handler return
3860: 20 52 45 50 4c 41 43 45 2c 0a 23 20 20 20 33 2e   REPLACE,.#   3.
3870: 20 41 66 74 65 72 20 74 68 65 20 73 65 73 73 69   After the sessi
3880: 6f 6e 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65  on module delete
3890: 73 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  s the conflictin
38a0: 67 20 72 6f 77 2c 20 68 61 76 65 20 61 20 74 72  g row, have a tr
38b0: 69 67 67 65 72 0a 23 20 20 20 20 20 20 72 65 2d  igger.#      re-
38c0: 69 6e 73 65 72 74 20 69 74 2e 0a 23 20 20 20 34  insert it..#   4
38d0: 2e 20 47 6f 74 6f 20 73 74 65 70 20 31 2e 2e 2e  . Goto step 1...
38e0: 0a 23 0a 23 20 54 68 69 73 20 64 6f 65 73 6e 27  .#.# This doesn'
38f0: 74 20 77 6f 72 6b 2c 20 61 73 20 74 68 65 20 73  t work, as the s
3900: 65 63 6f 6e 64 20 69 6e 76 6f 63 61 74 69 6f 6e  econd invocation
3910: 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   of the conflict
3920: 20 68 61 6e 64 6c 65 72 20 69 73 20 61 0a 23 20   handler is a.# 
3930: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6e 6f 74 20  CONSTRAINT, not 
3940: 61 20 43 4f 4e 46 4c 49 43 54 2e 20 54 68 65 72  a CONFLICT. Ther
3950: 65 20 69 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e is at most one
3960: 20 43 4f 4e 46 4c 49 43 54 20 63 61 6c 6c 62 61   CONFLICT callba
3970: 63 6b 20 66 6f 72 0a 23 20 65 61 63 68 20 63 68  ck for.# each ch
3980: 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e  ange in the chan
3990: 67 65 73 65 74 2e 0a 23 0a 74 65 73 74 5f 72 65  geset..#.test_re
39a0: 73 65 74 0a 70 72 6f 63 20 78 43 6f 6e 66 6c 69  set.proc xConfli
39b0: 63 74 20 7b 74 79 70 65 20 61 72 67 73 7d 20 7b  ct {type args} {
39c0: 20 0a 20 20 69 66 20 7b 24 74 79 70 65 20 3d 3d   .  if {$type ==
39d0: 20 22 43 4f 4e 46 4c 49 43 54 22 7d 20 7b 20 72   "CONFLICT"} { r
39e0: 65 74 75 72 6e 20 52 45 50 4c 41 43 45 20 7d 0a  eturn REPLACE }.
39f0: 20 20 72 65 74 75 72 6e 20 4f 4d 49 54 0a 7d 0a    return OMIT.}.
3a00: 64 6f 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20  do_test 9.1 {.  
3a10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
3a20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
3a30: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
3a40: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
3a50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3a60: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
3a70: 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  EY, b);.    INSE
3a80: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3a90: 53 28 27 78 27 2c 20 32 29 3b 0a 20 20 20 20 43  S('x', 2);.    C
3aa0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
3ab0: 31 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f  1 AFTER DELETE O
3ac0: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
3ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3ae0: 56 41 4c 55 45 53 28 6f 6c 64 2e 61 2c 20 6f 6c  VALUES(old.a, ol
3af0: 64 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  d.b);.    END;. 
3b00: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74   } db2.} {}.do_t
3b10: 65 73 74 20 39 2e 32 20 7b 0a 20 20 73 65 74 20  est 9.2 {.  set 
3b20: 63 68 61 6e 67 65 73 65 74 20 5b 63 68 61 6e 67  changeset [chang
3b30: 65 73 65 74 5f 66 72 6f 6d 5f 73 71 6c 20 7b 20  eset_from_sql { 
3b40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3b50: 41 4c 55 45 53 28 27 78 27 2c 20 31 29 20 7d 5d  ALUES('x', 1) }]
3b60: 0a 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  .  sqlite3change
3b70: 73 65 74 5f 61 70 70 6c 79 20 64 62 32 20 24 63  set_apply db2 $c
3b80: 68 61 6e 67 65 73 65 74 20 78 43 6f 6e 66 6c 69  hangeset xConfli
3b90: 63 74 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  ct.} {}.do_test 
3ba0: 39 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.3 {.  execsql 
3bb0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
3bc0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 78 20 32 7d  t1 } db2.} {x 2}
3bd0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 74  ------------.#.t
3c20: 65 73 74 5f 72 65 73 65 74 0a 64 62 20 66 75 6e  est_reset.db fun
3c30: 63 74 69 6f 6e 20 65 6e 61 62 6c 65 20 5b 6c 69  ction enable [li
3c40: 73 74 20 53 20 65 6e 61 62 6c 65 5d 0a 0a 64 6f  st S enable]..do
3c50: 5f 63 6f 6d 6d 6f 6e 5f 73 71 6c 20 7b 0a 20 20  _common_sql {.  
3c60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
3c70: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
3c80: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3c90: 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20   t1 VALUES('x', 
3ca0: 27 58 27 29 3b 0a 7d 0a 0a 64 6f 5f 69 74 65 72  'X');.}..do_iter
3cb0: 61 74 6f 72 5f 74 65 73 74 20 31 30 2e 31 20 74  ator_test 10.1 t
3cc0: 31 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1 {.  INSERT INT
3cd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 79 27 2c  O t1 VALUES('y',
3ce0: 20 27 59 27 29 3b 0a 20 20 53 45 4c 45 43 54 20   'Y');.  SELECT 
3cf0: 65 6e 61 62 6c 65 28 30 29 3b 0a 20 20 49 4e 53  enable(0);.  INS
3d00: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3d10: 45 53 28 27 7a 27 2c 20 27 5a 27 29 3b 0a 20 20  ES('z', 'Z');.  
3d20: 53 45 4c 45 43 54 20 65 6e 61 62 6c 65 28 31 29  SELECT enable(1)
3d30: 3b 0a 7d 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20  ;.} {.  {INSERT 
3d40: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 74 20 79 20  t1 0 X. {} {t y 
3d50: 74 20 59 7d 7d 0a 7d 0a 0a 73 71 6c 69 74 65 33  t Y}}.}..sqlite3
3d60: 73 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69  session S db mai
3d70: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
3d80: 74 20 31 30 2e 32 20 7b 0a 20 20 53 45 4c 45 43  t 10.2 {.  SELEC
3d90: 54 20 65 6e 61 62 6c 65 28 30 29 3b 0a 20 20 53  T enable(0);.  S
3da0: 45 4c 45 43 54 20 65 6e 61 62 6c 65 28 2d 31 29  ELECT enable(-1)
3db0: 3b 0a 20 20 53 45 4c 45 43 54 20 65 6e 61 62 6c  ;.  SELECT enabl
3dc0: 65 28 31 29 3b 0a 20 20 53 45 4c 45 43 54 20 65  e(1);.  SELECT e
3dd0: 6e 61 62 6c 65 28 2d 31 29 3b 0a 7d 20 7b 30 20  nable(-1);.} {0 
3de0: 30 20 31 20 31 7d 0a 53 20 64 65 6c 65 74 65 0a  0 1 1}.S delete.
3df0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.