/ Hex Artifact Content
Login

Artifact 094f8195fe8e409bd4da0f1d769f7745faec62c8:


0000: 23 20 32 30 30 35 20 4e 6f 76 65 6d 62 65 72 20  # 2005 November 
0010: 33 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  30.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  #***************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69  ********.#.# Thi
0170: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0180: 74 65 73 74 73 20 74 6f 20 65 6e 73 75 72 65 20  tests to ensure 
0190: 74 68 61 74 20 74 68 65 20 6c 69 62 72 61 72 79  that the library
01a0: 20 68 61 6e 64 6c 65 73 20 6d 61 6c 6c 6f 63 28   handles malloc(
01b0: 29 20 66 61 69 6c 75 72 65 73 0a 23 20 63 6f 72  ) failures.# cor
01c0: 72 65 63 74 6c 79 2e 20 54 68 65 20 65 6d 70 68  rectly. The emph
01d0: 61 73 69 73 20 6f 66 20 74 68 65 73 65 20 74 65  asis of these te
01e0: 73 74 73 20 61 72 65 20 74 68 65 20 5f 70 72 65  sts are the _pre
01f0: 70 61 72 65 28 29 2c 20 5f 73 74 65 70 28 29 20  pare(), _step() 
0200: 61 6e 64 0a 23 20 5f 66 69 6e 61 6c 69 7a 65 28  and.# _finalize(
0210: 29 20 63 61 6c 6c 73 2e 0a 23 0a 23 20 24 49 64  ) calls..#.# $Id
0220: 3a 20 6d 61 6c 6c 6f 63 33 2e 74 65 73 74 2c 76  : malloc3.test,v
0230: 20 31 2e 32 33 20 32 30 30 38 2f 30 35 2f 31 33   1.23 2008/05/13
0240: 20 31 39 3a 34 31 3a 35 34 20 73 68 61 6e 65 20   19:41:54 shane 
0250: 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64  Exp $..set testd
0260: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0270: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0280: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
0290: 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73 74  tcl.source $test
02a0: 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d 6f  dir/malloc_commo
02b0: 6e 2e 74 63 6c 0a 0a 23 20 4f 6e 6c 79 20 72 75  n.tcl..# Only ru
02c0: 6e 20 74 68 65 73 65 20 74 65 73 74 73 20 69 66  n these tests if
02d0: 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e   memory debuggin
02e0: 67 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a  g is turned on..
02f0: 23 0a 69 66 20 7b 21 24 4d 45 4d 44 45 42 55 47  #.if {!$MEMDEBUG
0300: 7d 20 7b 0a 20 20 20 70 75 74 73 20 22 53 6b 69  } {.   puts "Ski
0310: 70 70 69 6e 67 20 6d 61 6c 6c 6f 63 33 20 74 65  pping malloc3 te
0320: 73 74 73 3a 20 6e 6f 74 20 63 6f 6d 70 69 6c 65  sts: not compile
0330: 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f  d with -DSQLITE_
0340: 4d 45 4d 44 45 42 55 47 2e 2e 2e 22 0a 20 20 20  MEMDEBUG...".   
0350: 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 20 72  finish_test.   r
0360: 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  eturn.}..#------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 0a 23 20 4e 4f 54 45 53 20 4f 4e 20  ----.# NOTES ON 
03c0: 52 45 43 4f 56 45 52 49 4e 47 20 46 52 4f 4d 20  RECOVERING FROM 
03d0: 41 20 4d 41 4c 4c 4f 43 20 46 41 49 4c 55 52 45  A MALLOC FAILURE
03e0: 0a 23 20 0a 23 20 54 68 65 20 74 65 73 74 73 20  .# .# The tests 
03f0: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 65 73  in this file tes
0400: 74 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 73  t the behaviours
0410: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
0420: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 23 20 70 61  e following.# pa
0430: 72 61 67 72 61 70 68 73 2e 20 54 68 65 73 65 20  ragraphs. These 
0440: 74 65 73 74 73 20 74 65 73 74 20 74 68 65 20 62  tests test the b
0450: 65 68 61 76 69 6f 75 72 20 6f 66 20 74 68 65 20  ehaviour of the 
0460: 73 79 73 74 65 6d 20 77 68 65 6e 20 6d 61 6c 6c  system when mall
0470: 6f 63 28 29 20 66 61 69 6c 73 0a 23 20 69 6e 73  oc() fails.# ins
0480: 69 64 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f  ide of a call to
0490: 20 5f 70 72 65 70 61 72 65 28 29 2c 20 5f 73 74   _prepare(), _st
04a0: 65 70 28 29 2c 20 5f 66 69 6e 61 6c 69 7a 65 28  ep(), _finalize(
04b0: 29 20 6f 72 20 5f 72 65 73 65 74 28 29 2e 20 54  ) or _reset(). T
04c0: 68 65 0a 23 20 68 61 6e 64 6c 69 6e 67 20 6f 66  he.# handling of
04d0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
04e0: 65 73 20 77 69 74 68 69 6e 20 61 6e 63 69 6c 6c  es within ancill
04f0: 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20 69  ary procedures i
0500: 73 20 74 65 73 74 65 64 0a 23 20 65 6c 73 65 77  s tested.# elsew
0510: 68 65 72 65 2e 0a 23 0a 23 20 4f 76 65 72 76 69  here..#.# Overvi
0520: 65 77 3a 0a 23 0a 23 20 45 78 65 63 75 74 69 6e  ew:.#.# Executin
0530: 67 20 61 20 73 74 61 74 65 6d 65 6e 74 20 69 73  g a statement is
0540: 20 64 6f 6e 65 20 69 6e 20 74 68 72 65 65 20 73   done in three s
0550: 74 61 67 65 73 20 28 70 72 65 70 61 72 65 2c 20  tages (prepare, 
0560: 73 74 65 70 20 61 6e 64 20 66 69 6e 61 6c 69 7a  step and finaliz
0570: 65 29 2e 20 41 0a 23 20 6d 61 6c 6c 6f 63 28 29  e). A.# malloc()
0580: 20 66 61 69 6c 75 72 65 20 6d 61 79 20 6f 63 63   failure may occ
0590: 75 72 20 77 69 74 68 69 6e 20 61 6e 79 20 73 74  ur within any st
05a0: 61 67 65 2e 20 49 66 20 61 20 6d 65 6d 6f 72 79  age. If a memory
05b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
05c0: 73 0a 23 20 64 75 72 69 6e 67 20 73 74 61 74 65  s.# during state
05d0: 6d 65 6e 74 20 70 72 65 70 61 72 61 74 69 6f 6e  ment preparation
05e0: 2c 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 68  , no statement h
05f0: 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
0600: 64 2e 20 46 72 6f 6d 20 74 68 65 20 75 73 65 72  d. From the user
0610: 73 0a 23 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  s.# point of vie
0620: 77 20 74 68 65 20 73 79 73 74 65 6d 20 73 74 61  w the system sta
0630: 74 65 20 69 73 20 61 73 20 69 66 20 5f 70 72 65  te is as if _pre
0640: 70 61 72 65 28 29 20 68 61 64 20 6e 65 76 65 72  pare() had never
0650: 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 0a 23 0a   been called..#.
0660: 23 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  # If the memory 
0670: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
0680: 20 64 75 72 69 6e 67 20 74 68 65 20 5f 73 74 65   during the _ste
0690: 70 28 29 20 6f 72 20 5f 66 69 6e 61 6c 69 7a 65  p() or _finalize
06a0: 28 29 20 63 61 6c 6c 73 2c 20 74 68 65 6e 0a 23  () calls, then.#
06b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
06c0: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 6f 6e 65  y be left in one
06d0: 20 6f 66 20 74 77 6f 20 73 74 61 74 65 73 20 28   of two states (
06e0: 61 66 74 65 72 20 66 69 6e 61 6c 69 7a 65 28 29  after finalize()
06f0: 20 68 61 73 20 62 65 65 6e 0a 23 20 63 61 6c 6c   has been.# call
0700: 65 64 29 3a 0a 23 0a 23 20 20 20 20 20 2a 20 41  ed):.#.#     * A
0710: 73 20 69 66 20 74 68 65 20 6e 65 69 74 68 65 72  s if the neither
0720: 20 5f 73 74 65 70 28 29 20 6e 6f 72 20 5f 66 69   _step() nor _fi
0730: 6e 61 6c 69 7a 65 28 29 20 68 61 64 20 65 76 65  nalize() had eve
0740: 72 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  r been called on
0750: 0a 23 20 20 20 20 20 20 20 74 68 65 20 73 74 61  .#       the sta
0760: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 28 69  tement handle (i
0770: 2e 65 2e 20 61 6e 79 20 63 68 61 6e 67 65 73 20  .e. any changes 
0780: 6d 61 64 65 20 62 79 20 74 68 65 20 73 74 61 74  made by the stat
0790: 65 6d 65 6e 74 20 61 72 65 0a 23 20 20 20 20 20  ement are.#     
07a0: 20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 0a    rolled back)..
07b0: 23 20 20 20 20 20 2a 20 54 68 65 20 63 75 72 72  #     * The curr
07c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
07d0: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
07e0: 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
07f0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 23   a hot-journal.#
0800: 20 20 20 20 20 20 20 6d 61 79 20 6f 72 20 6d 61         may or ma
0810: 79 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  y not actually b
0820: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
0830: 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 23 0a 23   filesystem..#.#
0840: 20 54 68 65 20 63 61 6c 6c 65 72 20 63 61 6e 20   The caller can 
0850: 74 65 6c 6c 20 74 68 65 20 64 69 66 66 65 72 65  tell the differe
0860: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 73  nce between thes
0870: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20  e two scenarios 
0880: 62 79 20 69 6e 76 6f 6b 69 6e 67 0a 23 20 5f 67  by invoking.# _g
0890: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 29 2e  et_autocommit().
08a0: 0a 23 0a 23 0a 23 20 48 61 6e 64 6c 69 6e 67 20  .#.#.# Handling 
08b0: 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  of sqlite3_reset
08c0: 28 29 3a 0a 23 0a 23 20 49 66 20 61 20 6d 61 6c  ():.#.# If a mal
08d0: 6c 6f 63 28 29 20 66 61 69 6c 73 20 77 68 69 6c  loc() fails whil
08e0: 65 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20 73  e executing an s
08f0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 63  qlite3_reset() c
0900: 61 6c 6c 2c 20 74 68 69 73 20 69 73 20 68 61 6e  all, this is han
0910: 64 6c 65 64 0a 23 20 69 6e 20 74 68 65 20 73 61  dled.# in the sa
0920: 6d 65 20 77 61 79 20 61 73 20 61 20 66 61 69 6c  me way as a fail
0930: 75 72 65 20 77 69 74 68 69 6e 20 5f 66 69 6e 61  ure within _fina
0940: 6c 69 7a 65 28 29 2e 20 54 68 65 20 73 74 61 74  lize(). The stat
0950: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 0a 23 20 69  ement handle.# i
0960: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 20 61 6e  s not deleted an
0970: 64 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  d must be passed
0980: 20 74 6f 20 5f 66 69 6e 61 6c 69 7a 65 28 29 20   to _finalize() 
0990: 66 6f 72 20 72 65 73 6f 75 72 63 65 20 64 65 61  for resource dea
09a0: 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 23 20 41 74 74  llocation..# Att
09b0: 65 6d 70 74 69 6e 67 20 74 6f 20 5f 73 74 65 70  empting to _step
09c0: 28 29 20 6f 72 20 5f 72 65 73 65 74 28 29 20 74  () or _reset() t
09d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  he statement aft
09e0: 65 72 20 61 20 66 61 69 6c 65 64 20 5f 72 65 73  er a failed _res
09f0: 65 74 28 29 20 77 69 6c 6c 0a 23 20 61 6c 77 61  et() will.# alwa
0a00: 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
0a10: 5f 4e 4f 4d 45 4d 2e 0a 23 0a 23 0a 23 20 4f 74  _NOMEM..#.#.# Ot
0a20: 68 65 72 20 61 63 74 69 76 65 20 53 51 4c 20 73  her active SQL s
0a30: 74 61 74 65 6d 65 6e 74 73 3a 0a 23 0a 23 20 54  tatements:.#.# T
0a40: 68 65 20 65 66 66 65 63 74 20 6f 66 20 61 20 6d  he effect of a m
0a50: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 6e  alloc failure on
0a60: 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 65 78   concurrently ex
0a70: 65 63 75 74 69 6e 67 20 53 51 4c 20 73 74 61 74  ecuting SQL stat
0a80: 65 6d 65 6e 74 73 2c 0a 23 20 70 61 72 74 69 63  ements,.# partic
0a90: 75 6c 61 72 6c 79 20 77 68 65 6e 20 74 68 65 20  ularly when the 
0aa0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65  statement is exe
0ab0: 63 75 74 69 6e 67 20 77 69 74 68 20 52 45 41 44  cuting with READ
0ac0: 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 65 74  _UNCOMMITTED set
0ad0: 20 61 6e 64 0a 23 20 74 68 65 20 6d 61 6c 6c 6f   and.# the mallo
0ae0: 63 28 29 20 66 61 69 6c 75 72 65 20 6d 61 6e 64  c() failure mand
0af0: 61 74 65 73 20 73 74 61 74 65 6d 65 6e 74 20 72  ates statement r
0b00: 6f 6c 6c 62 61 63 6b 20 6f 6e 6c 79 2e 20 43 75  ollback only. Cu
0b10: 72 72 65 6e 74 6c 79 2c 20 69 66 0a 23 20 74 72  rrently, if.# tr
0b20: 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
0b30: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  ck is required, 
0b40: 61 6c 6c 20 6f 74 68 65 72 20 76 64 62 65 27 73  all other vdbe's
0b50: 20 61 72 65 20 61 62 6f 72 74 65 64 2e 0a 23 0a   are aborted..#.
0b60: 23 20 20 20 20 20 4e 6f 6e 2d 74 72 61 6e 73 69  #     Non-transi
0b70: 65 6e 74 20 6d 61 6c 6c 6f 63 73 20 69 6e 20 62  ent mallocs in b
0b80: 74 72 65 65 2e 63 3a 0a 23 20 20 20 20 20 20 20  tree.c:.#       
0b90: 20 20 2a 20 54 68 65 20 42 74 72 65 65 20 73 74    * The Btree st
0ba0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a 23  ructure itself.#
0bb0: 20 20 20 20 20 20 20 20 20 2a 20 45 61 63 68 20           * Each 
0bc0: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
0bd0: 72 65 0a 23 0a 23 20 20 20 20 20 4d 61 6c 6c 6f  re.#.#     Mallo
0be0: 63 73 20 69 6e 20 70 61 67 65 72 2e 63 3a 0a 23  cs in pager.c:.#
0bf0: 20 20 20 20 20 20 20 20 20 72 65 61 64 4d 61 73           readMas
0c00: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 20 2d 20  terJournal()  - 
0c10: 53 70 61 63 65 20 74 6f 20 72 65 61 64 20 74 68  Space to read th
0c20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
0c30: 20 6e 61 6d 65 0a 23 20 20 20 20 20 20 20 20 20   name.#         
0c40: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
0c50: 29 20 20 20 20 2d 20 53 70 61 63 65 20 66 6f 72  )    - Space for
0c60: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
0c70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
0c80: 23 0a 23 20 20 20 20 20 20 20 20 20 73 71 6c 69  #.#         sqli
0c90: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 29 20  te3pager_open() 
0ca0: 20 2d 20 54 68 65 20 70 61 67 65 72 20 73 74 72   - The pager str
0cb0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a 23 20  ucture itself.# 
0cc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
0cd0: 70 61 67 65 72 67 65 74 28 29 20 20 20 2d 20 53  pagerget()   - S
0ce0: 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 70  pace for a new p
0cf0: 61 67 65 0a 23 20 20 20 20 20 20 20 20 20 70 61  age.#         pa
0d00: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
0d10: 28 29 20 2d 20 50 61 67 65 72 2e 61 49 6e 4a 6f  () - Pager.aInJo
0d20: 75 72 6e 61 6c 5b 5d 20 62 69 74 6d 61 70 0a 23  urnal[] bitmap.#
0d30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
0d40: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 2d 20  pager_write() - 
0d50: 46 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  For in-memory da
0d60: 74 61 62 61 73 65 73 20 6f 6e 6c 79 3a 20 68 69  tabases only: hi
0d70: 73 74 6f 72 79 20 70 61 67 65 20 61 6e 64 0a 23  story page and.#
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 73 74 61 74 65 6d 65 6e 74 20 68 69 73 74 6f 72  statement histor
0db0: 79 20 70 61 67 65 2e 0a 23 20 20 20 20 20 20 20  y page..#       
0dc0: 20 20 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67    pager_stmt_beg
0dd0: 69 6e 28 29 20 20 20 2d 20 50 61 67 65 72 2e 61  in()   - Pager.a
0de0: 49 6e 53 74 6d 74 5b 5d 20 62 69 74 6d 61 70 0a  InStmt[] bitmap.
0df0: 23 0a 23 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  #.# None of the 
0e00: 61 62 6f 76 65 20 61 72 65 20 61 20 68 75 67 65  above are a huge
0e10: 20 70 72 6f 62 6c 65 6d 2e 20 54 68 65 20 6d 6f   problem. The mo
0e20: 73 74 20 74 72 6f 75 62 6c 65 73 6f 6d 65 20 66  st troublesome f
0e30: 61 69 6c 75 72 65 73 20 61 72 65 20 74 68 65 0a  ailures are the.
0e40: 23 20 74 72 61 6e 73 69 65 6e 74 20 6d 61 6c 6c  # transient mall
0e50: 6f 63 28 29 20 63 61 6c 6c 73 20 69 6e 20 62 74  oc() calls in bt
0e60: 72 65 65 2e 63 2c 20 77 68 69 63 68 20 63 61 6e  ree.c, which can
0e70: 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
0e80: 65 20 74 72 65 65 2d 62 61 6c 61 6e 63 65 0a 23  e tree-balance.#
0e90: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
0ea0: 20 6d 65 61 6e 73 20 74 68 65 20 74 72 65 65 20   means the tree 
0eb0: 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 77  being balanced w
0ec0: 69 6c 6c 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  ill be internall
0ed0: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 23  y inconsistent.#
0ee0: 20 61 66 74 65 72 20 74 68 65 20 6d 61 6c 6c 6f   after the mallo
0ef0: 63 28 29 20 66 61 69 6c 73 2e 20 54 6f 20 61 76  c() fails. To av
0f00: 6f 69 64 20 74 68 65 20 63 6f 72 72 75 70 74 20  oid the corrupt 
0f10: 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64 20  tree being read 
0f20: 62 79 20 61 0a 23 20 52 45 41 44 5f 55 4e 43 4f  by a.# READ_UNCO
0f30: 4d 4d 49 54 54 45 44 20 71 75 65 72 79 2c 20 77  MMITTED query, w
0f40: 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
0f50: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
0f60: 69 6f 6e 20 6f 72 20 73 74 61 74 65 6d 65 6e 74  ion or statement
0f70: 0a 23 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  .# rollback occu
0f80: 72 73 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  rs before sqlite
0f90: 33 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e 73  3_step() returns
0fa0: 2c 20 6e 6f 74 20 64 75 72 69 6e 67 20 61 20 73  , not during a s
0fb0: 75 62 73 65 71 75 65 6e 74 0a 23 20 73 71 6c 69  ubsequent.# sqli
0fc0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 0a  te3_finalize()..
0fd0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d  -----------..#--
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 4f 54 45 53  --------.# NOTES
1070: 20 4f 4e 20 54 45 53 54 20 49 4d 50 4c 45 4d 45   ON TEST IMPLEME
1080: 4e 54 41 54 49 4f 4e 0a 23 0a 23 20 54 68 65 20  NTATION.#.# The 
1090: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
10a0: 6c 65 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  le are implement
10b0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
10c0: 72 6f 6d 20 74 68 6f 73 65 20 69 6e 20 6f 74 68  rom those in oth
10d0: 65 72 0a 23 20 66 69 6c 65 73 2e 20 49 6e 73 74  er.# files. Inst
10e0: 65 61 64 2c 20 74 65 73 74 73 20 61 72 65 20 73  ead, tests are s
10f0: 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
1100: 68 72 65 65 20 70 72 69 6d 69 74 69 76 65 73 3a  hree primitives:
1110: 20 53 51 4c 2c 20 50 52 45 50 20 61 6e 64 0a 23   SQL, PREP and.#
1120: 20 54 45 53 54 2e 20 45 61 63 68 20 70 72 69 6d   TEST. Each prim
1130: 69 74 69 76 65 20 68 61 73 20 61 20 73 69 6e 67  itive has a sing
1140: 6c 65 20 61 72 67 75 6d 65 6e 74 2e 20 50 72 69  le argument. Pri
1150: 6d 69 74 69 76 65 73 20 61 72 65 20 70 72 6f 63  mitives are proc
1160: 65 73 73 65 64 20 69 6e 0a 23 20 74 68 65 20 6f  essed in.# the o
1170: 72 64 65 72 20 74 68 65 79 20 61 72 65 20 73 70  rder they are sp
1180: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 66  ecified in the f
1190: 69 6c 65 2e 0a 23 0a 23 20 41 20 54 45 53 54 20  ile..#.# A TEST 
11a0: 70 72 69 6d 69 74 69 76 65 20 73 70 65 63 69 66  primitive specif
11b0: 69 65 73 20 61 20 54 43 4c 20 73 63 72 69 70 74  ies a TCL script
11c0: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
11d0: 2e 20 57 68 65 6e 20 61 20 54 45 53 54 0a 23 20  . When a TEST.# 
11e0: 64 69 72 65 63 74 69 76 65 20 69 73 20 65 6e 63  directive is enc
11f0: 6f 75 6e 74 65 72 65 64 20 74 68 65 20 54 63 6c  ountered the Tcl
1200: 20 73 63 72 69 70 74 20 69 73 20 65 76 61 6c 75   script is evalu
1210: 61 74 65 64 2e 20 55 73 75 61 6c 6c 79 2c 20 74  ated. Usually, t
1220: 68 69 73 20 54 63 6c 0a 23 20 73 63 72 69 70 74  his Tcl.# script
1230: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
1240: 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 5b   more calls to [
1250: 64 6f 5f 74 65 73 74 5d 2e 0a 23 0a 23 20 41 20  do_test]..#.# A 
1260: 50 52 45 50 20 70 72 69 6d 69 74 69 76 65 20 73  PREP primitive s
1270: 70 65 63 69 66 69 65 73 20 61 6e 20 53 51 4c 20  pecifies an SQL 
1280: 73 63 72 69 70 74 20 61 73 20 69 74 73 20 61 72  script as its ar
1290: 67 75 6d 65 6e 74 2e 20 57 68 65 6e 20 61 20 50  gument. When a P
12a0: 52 45 50 0a 23 20 64 69 72 65 63 74 69 76 65 20  REP.# directive 
12b0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 74  is encountered t
12c0: 68 65 20 53 51 4c 20 69 73 20 65 76 61 6c 75 61  he SQL is evalua
12d0: 74 65 64 20 75 73 69 6e 67 20 64 61 74 61 62 61  ted using databa
12e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20  se connection.# 
12f0: 5b 64 62 5d 2e 0a 23 0a 23 20 54 68 65 20 53 51  [db]..#.# The SQ
1300: 4c 20 70 72 69 6d 69 74 69 76 65 73 20 61 72 65  L primitives are
1310: 20 77 68 65 72 65 20 74 68 65 20 61 63 74 69 6f   where the actio
1320: 6e 20 68 61 70 70 65 6e 73 2e 20 41 6e 20 53 51  n happens. An SQ
1330: 4c 20 70 72 69 6d 69 74 69 76 65 20 6d 75 73 74  L primitive must
1340: 0a 23 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e  .# contain a sin
1350: 67 6c 65 2c 20 76 61 6c 69 64 20 53 51 4c 20 73  gle, valid SQL s
1360: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
1370: 61 72 67 75 6d 65 6e 74 2e 20 57 68 65 6e 20 61  argument. When a
1380: 6e 20 53 51 4c 0a 23 20 70 72 69 6d 69 74 69 76  n SQL.# primitiv
1390: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
13a0: 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  , it is evaluate
13b0: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 69  d one or more ti
13c0: 6d 65 73 20 74 6f 20 74 65 73 74 20 74 68 65 0a  mes to test the.
13d0: 23 20 62 65 68 61 76 69 6f 75 72 20 6f 66 20 74  # behaviour of t
13e0: 68 65 20 73 79 73 74 65 6d 20 77 68 65 6e 20 6d  he system when m
13f0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 64 75  alloc() fails du
1400: 72 69 6e 67 20 70 72 65 70 61 72 61 74 69 6f 6e  ring preparation
1410: 20 6f 72 0a 23 20 65 78 65 63 75 74 69 6f 6e 20   or.# execution 
1420: 6f 66 20 73 61 69 64 20 73 74 61 74 65 6d 65 6e  of said statemen
1430: 74 2e 20 54 68 65 20 4e 74 68 20 74 69 6d 65 20  t. The Nth time 
1440: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
1450: 20 65 78 65 63 75 74 65 64 2c 0a 23 20 74 68 65   executed,.# the
1460: 20 4e 74 68 20 6d 61 6c 6c 6f 63 20 69 73 20 73   Nth malloc is s
1470: 61 69 64 20 74 6f 20 66 61 69 6c 2e 20 54 68 65  aid to fail. The
1480: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78   statement is ex
1490: 65 63 75 74 65 64 20 75 6e 74 69 6c 20 69 74 0a  ecuted until it.
14a0: 23 20 73 75 63 63 65 65 64 73 2c 20 69 2e 65 2e  # succeeds, i.e.
14b0: 20 28 4d 2b 31 29 20 74 69 6d 65 73 2c 20 77 68   (M+1) times, wh
14c0: 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d  ere M is the num
14d0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 28 29  ber of mallocs()
14e0: 20 72 65 71 75 69 72 65 64 0a 23 20 74 6f 20 70   required.# to p
14f0: 72 65 70 61 72 65 20 61 6e 64 20 65 78 65 63 75  repare and execu
1500: 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  te the statement
1510: 2e 0a 23 0a 23 20 45 61 63 68 20 74 69 6d 65 20  ..#.# Each time 
1520: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
1530: 20 66 61 69 6c 73 2c 20 74 68 65 20 64 72 69 76   fails, the driv
1540: 65 72 20 70 72 6f 67 72 61 6d 20 28 73 65 65 20  er program (see 
1550: 70 72 6f 63 20 5b 72 75 6e 5f 74 65 73 74 5d 0a  proc [run_test].
1560: 23 20 62 65 6c 6f 77 29 20 66 69 67 75 72 65 73  # below) figures
1570: 20 6f 75 74 20 69 66 20 61 20 74 72 61 6e 73 61   out if a transa
1580: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61  ction has been a
1590: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 6f 6c  utomatically rol
15a0: 6c 65 64 20 62 61 63 6b 2e 0a 23 20 49 66 20 6e  led back..# If n
15b0: 6f 74 2c 20 69 74 20 65 78 65 63 75 74 65 73 20  ot, it executes 
15c0: 61 6e 79 20 54 45 53 54 20 62 6c 6f 63 6b 20 69  any TEST block i
15d0: 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 6f 63 65  mmediately proce
15e0: 65 64 69 6e 67 20 74 68 65 20 53 51 4c 0a 23 20  eding the SQL.# 
15f0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1600: 72 65 65 78 65 63 75 74 65 73 20 74 68 65 20 53  reexecutes the S
1610: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  QL statement wit
1620: 68 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65  h the next value
1630: 20 6f 66 20 4e 2e 0a 23 0a 23 20 49 66 20 61 20   of N..#.# If a 
1640: 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1650: 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  been automatical
1660: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ly rolled back, 
1670: 74 68 65 6e 20 74 68 65 20 64 72 69 76 65 72 0a  then the driver.
1680: 23 20 70 72 6f 67 72 61 6d 20 65 78 65 63 75 74  # program execut
1690: 65 73 20 61 6c 6c 20 74 68 65 20 53 51 4c 20 73  es all the SQL s
16a0: 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
16b0: 20 6f 66 20 53 51 4c 20 6f 72 20 50 52 45 50 20   of SQL or PREP 
16c0: 70 72 69 6d 69 74 69 76 65 73 0a 23 20 62 65 74  primitives.# bet
16d0: 77 65 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  ween the current
16e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
16f0: 6e 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  nd the most rece
1700: 6e 74 20 22 42 45 47 49 4e 22 2e 20 41 6e 79 20  nt "BEGIN". Any 
1710: 0a 23 20 54 45 53 54 20 62 6c 6f 63 6b 20 69 6d  .# TEST block im
1720: 6d 65 64 69 61 74 65 6c 79 20 70 72 6f 63 65 65  mediately procee
1730: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 61  ding the SQL sta
1740: 74 65 6d 65 6e 74 20 69 73 20 65 76 61 6c 75 61  tement is evalua
1750: 74 65 64 2c 20 61 6e 64 0a 23 20 74 68 65 6e 20  ted, and.# then 
1760: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1770: 74 20 72 65 65 78 65 63 75 74 65 64 20 77 69 74  t reexecuted wit
1780: 68 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 65  h the incremente
1790: 64 20 4e 20 76 61 6c 75 65 2e 0a 23 0a 23 20 54  d N value..#.# T
17a0: 68 61 74 20 6d 61 6b 65 20 61 6e 79 20 73 65 6e  hat make any sen
17b0: 73 65 3f 20 49 66 20 6e 6f 74 2c 20 72 65 61 64  se? If not, read
17c0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 5b 72 75   the code in [ru
17d0: 6e 5f 74 65 73 74 5d 20 61 6e 64 20 69 74 20 6d  n_test] and it m
17e0: 69 67 68 74 2e 0a 23 0a 23 20 45 78 74 72 61 20  ight..#.# Extra 
17f0: 72 65 73 74 72 69 63 74 69 6f 6e 20 69 6d 70 6f  restriction impo
1800: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
1810: 6d 65 6e 74 61 74 69 6f 6e 3a 0a 23 0a 23 20 2a  mentation:.#.# *
1820: 20 49 66 20 61 20 50 52 45 50 20 62 6c 6f 63 6b   If a PREP block
1830: 20 73 74 61 72 74 73 20 61 20 74 72 61 6e 73 61   starts a transa
1840: 63 74 69 6f 6e 2c 20 69 74 20 6d 75 73 74 20 66  ction, it must f
1850: 69 6e 69 73 68 20 69 74 2e 0a 23 20 2a 20 41 20  inish it..# * A 
1860: 50 52 45 50 20 62 6c 6f 63 6b 20 6d 61 79 20 6e  PREP block may n
1870: 6f 74 20 63 6c 6f 73 65 20 61 20 74 72 61 6e 73  ot close a trans
1880: 61 63 74 69 6f 6e 20 69 74 20 64 69 64 20 6e 6f  action it did no
1890: 74 20 73 74 61 72 74 2e 0a 23 0a 23 2d 2d 2d 2d  t start..#.#----
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18e0: 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 20 54 68 65 73 65  ------...# These
18f0: 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 64 20   procs are used 
1900: 74 6f 20 62 75 69 6c 64 20 75 70 20 61 20 22 70  to build up a "p
1910: 72 6f 67 72 61 6d 22 20 69 6e 20 67 6c 6f 62 61  rogram" in globa
1920: 6c 20 76 61 72 69 61 62 6c 65 0a 23 20 3a 3a 72  l variable.# ::r
1930: 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 2e 20  un_test_script. 
1940: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1950: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 72 6f  is file, the pro
1960: 63 20 5b 72 75 6e 5f 74 65 73 74 5d 20 69 73 20  c [run_test] is 
1970: 75 73 65 64 0a 23 20 74 6f 20 65 78 65 63 75 74  used.# to execut
1980: 65 20 74 68 65 20 70 72 6f 67 72 61 6d 20 28 61  e the program (a
1990: 6e 64 20 61 6c 6c 20 74 65 73 74 20 63 61 73 65  nd all test case
19a0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 74 68 65 72  s contained ther
19b0: 65 69 6e 29 2e 0a 23 0a 73 65 74 20 3a 3a 72 75  ein)..#.set ::ru
19c0: 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20 5b 6c  n_test_script [l
19d0: 69 73 74 5d 0a 70 72 6f 63 20 54 45 53 54 20 7b  ist].proc TEST {
19e0: 69 64 20 74 7d 20 7b 6c 61 70 70 65 6e 64 20 3a  id t} {lappend :
19f0: 3a 72 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74  :run_test_script
1a00: 20 2d 74 65 73 74 20 5b 6c 69 73 74 20 24 69 64   -test [list $id
1a10: 20 24 74 5d 7d 0a 70 72 6f 63 20 50 52 45 50 20   $t]}.proc PREP 
1a20: 7b 70 7d 20 7b 6c 61 70 70 65 6e 64 20 3a 3a 72  {p} {lappend ::r
1a30: 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20 2d  un_test_script -
1a40: 70 72 65 70 20 5b 73 74 72 69 6e 67 20 74 72 69  prep [string tri
1a50: 6d 20 24 70 5d 7d 0a 70 72 6f 63 20 44 45 42 55  m $p]}.proc DEBU
1a60: 47 20 7b 73 7d 20 7b 6c 61 70 70 65 6e 64 20 3a  G {s} {lappend :
1a70: 3a 72 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74  :run_test_script
1a80: 20 2d 64 65 62 75 67 20 24 73 7d 0a 0a 23 20 53   -debug $s}..# S
1a90: 51 4c 20 2d 2d 0a 23 0a 23 20 20 20 20 20 53 51  QL --.#.#     SQ
1aa0: 4c 20 3f 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 3f 20  L ?-norollback? 
1ab0: 3c 73 71 6c 2d 74 65 78 74 3e 0a 23 0a 23 20 41  <sql-text>.#.# A
1ac0: 64 64 20 61 6e 20 27 53 51 4c 27 20 70 72 69 6d  dd an 'SQL' prim
1ad0: 69 74 69 76 65 20 74 6f 20 74 68 65 20 70 72 6f  itive to the pro
1ae0: 67 72 61 6d 20 28 73 65 65 20 6e 6f 74 65 73 20  gram (see notes 
1af0: 61 62 6f 76 65 29 2e 20 49 66 20 74 68 65 20 2d  above). If the -
1b00: 6e 6f 72 6f 6c 6c 62 61 63 6b 0a 23 20 73 77 69  norollback.# swi
1b10: 74 63 68 20 69 73 20 70 72 65 73 65 6e 74 2c 20  tch is present, 
1b20: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
1b30: 6e 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  nt is not allowe
1b40: 64 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  d to automatical
1b50: 6c 79 20 72 6f 6c 6c 0a 23 20 62 61 63 6b 20 61  ly roll.# back a
1b60: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
1b70: 63 74 69 6f 6e 20 69 66 20 6d 61 6c 6c 6f 63 28  ction if malloc(
1b80: 29 20 66 61 69 6c 73 2e 20 49 74 20 6d 75 73 74  ) fails. It must
1b90: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
1ba0: 61 74 65 6d 65 6e 74 0a 23 20 74 72 61 6e 73 61  atement.# transa
1bb0: 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 23 0a 70 72  ction only..#.pr
1bc0: 6f 63 20 53 51 4c 20 20 7b 61 31 20 7b 61 32 20  oc SQL  {a1 {a2 
1bd0: 22 22 7d 7d 20 7b 0a 20 20 23 20 41 6e 20 53 51  ""}} {.  # An SQ
1be0: 4c 20 70 72 69 6d 69 74 69 76 65 20 70 61 72 61  L primitive para
1bf0: 6d 65 74 65 72 20 69 73 20 61 20 6c 69 73 74 20  meter is a list 
1c00: 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c  of two elements,
1c10: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1c20: 0a 20 20 23 20 69 6e 64 69 63 61 74 69 6e 67 20  .  # indicating 
1c30: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
1c40: 20 6d 61 79 20 63 61 75 73 65 20 74 72 61 6e 73   may cause trans
1c50: 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
1c60: 77 68 65 6e 20 6d 61 6c 6c 6f 63 28 29 0a 20 20  when malloc().  
1c70: 23 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 65  # fails, and the
1c80: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69   sql statement i
1c90: 74 73 65 6c 66 2e 0a 20 20 69 66 20 7b 24 61 32  tself..  if {$a2
1ca0: 20 3d 3d 20 22 22 7d 20 7b 0a 20 20 20 20 6c 61   == ""} {.    la
1cb0: 70 70 65 6e 64 20 3a 3a 72 75 6e 5f 74 65 73 74  ppend ::run_test
1cc0: 5f 73 63 72 69 70 74 20 2d 73 71 6c 20 5b 6c 69  _script -sql [li
1cd0: 73 74 20 74 72 75 65 20 5b 73 74 72 69 6e 67 20  st true [string 
1ce0: 74 72 69 6d 20 24 61 31 5d 5d 0a 20 20 7d 20 65  trim $a1]].  } e
1cf0: 6c 73 65 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  lse {.    lappen
1d00: 64 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73 63 72  d ::run_test_scr
1d10: 69 70 74 20 2d 73 71 6c 20 5b 6c 69 73 74 20 66  ipt -sql [list f
1d20: 61 6c 73 65 20 5b 73 74 72 69 6e 67 20 74 72 69  alse [string tri
1d30: 6d 20 24 61 32 5d 5d 0a 20 20 7d 0a 7d 0a 0a 23  m $a2]].  }.}..#
1d40: 20 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54   TEST_AUTOCOMMIT
1d50: 20 2d 2d 0a 23 20 0a 23 20 20 20 20 20 41 20 73   --.# .#     A s
1d60: 68 6f 72 74 68 61 6e 64 20 74 65 73 74 20 74 6f  horthand test to
1d70: 20 73 65 65 20 69 66 20 61 20 74 72 61 6e 73 61   see if a transa
1d80: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
1d90: 6f 72 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73  or not. The firs
1da0: 74 0a 23 20 20 20 20 20 61 72 67 75 6d 65 6e 74  t.#     argument
1db0: 20 2d 20 24 69 64 20 2d 20 69 73 20 74 68 65 20   - $id - is the 
1dc0: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
1dd0: 66 20 74 68 65 20 74 65 73 74 20 63 61 73 65 2e  f the test case.
1de0: 20 54 68 65 20 73 65 63 6f 6e 64 0a 23 20 20 20   The second.#   
1df0: 20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 69    argument is ei
1e00: 74 68 65 72 20 31 20 6f 72 20 30 2c 20 74 68 65  ther 1 or 0, the
1e10: 20 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 20   expected value 
1e20: 6f 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  of the auto-comm
1e30: 69 74 20 66 6c 61 67 2e 0a 23 0a 70 72 6f 63 20  it flag..#.proc 
1e40: 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54 20  TEST_AUTOCOMMIT 
1e50: 7b 69 64 20 61 7d 20 7b 0a 20 20 20 20 54 45 53  {id a} {.    TES
1e60: 54 20 24 69 64 20 22 64 6f 5f 74 65 73 74 20 5c  T $id "do_test \
1e70: 24 74 65 73 74 69 64 20 7b 20 73 71 6c 69 74 65  $testid { sqlite
1e80: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1e90: 20 5c 24 3a 3a 44 42 20 7d 20 7b 24 61 7d 22 0a   \$::DB } {$a}".
1ea0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1ef0: 20 53 74 61 72 74 20 6f 66 20 74 65 73 74 20 70   Start of test p
1f00: 72 6f 67 72 61 6d 20 64 65 63 6c 61 72 61 74 69  rogram declarati
1f10: 6f 6e 0a 23 0a 0a 0a 23 20 57 61 72 6d 20 62 6f  on.#...# Warm bo
1f20: 64 79 20 74 65 73 74 2e 20 41 20 6d 61 6c 6c 6f  dy test. A mallo
1f30: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 74 68 65  c() fails in the
1f40: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 43 52 45   middle of a CRE
1f50: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1f60: 65 6e 74 0a 23 20 69 6e 20 61 20 73 69 6e 67 6c  ent.# in a singl
1f70: 65 2d 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e-statement tran
1f80: 73 61 63 74 69 6f 6e 20 6f 6e 20 61 6e 20 65 6d  saction on an em
1f90: 70 74 79 20 64 61 74 61 62 61 73 65 2e 20 4e 6f  pty database. No
1fa0: 74 20 74 6f 6f 20 6d 75 63 68 20 63 61 6e 20 67  t too much can g
1fb0: 6f 0a 23 20 77 72 6f 6e 67 20 68 65 72 65 2e 0a  o.# wrong here..
1fc0: 23 0a 54 45 53 54 20 31 20 7b 0a 20 20 64 6f 5f  #.TEST 1 {.  do_
1fd0: 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20  test $testid {. 
1fe0: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
1ff0: 43 54 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f 4d  CT tbl_name FROM
2000: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 7d   sqlite_master;}
2010: 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c 20 7b 20  .  } {}.}.SQL { 
2020: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
2030: 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 20 0a 7d  abc(a, b, c); .}
2040: 0a 54 45 53 54 20 32 20 7b 0a 20 20 64 6f 5f 74  .TEST 2 {.  do_t
2050: 65 73 74 20 24 74 65 73 74 69 64 2e 31 20 7b 0a  est $testid.1 {.
2060: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
2070: 45 43 54 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f  ECT tbl_name FRO
2080: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
2090: 7d 0a 20 20 7d 20 7b 61 62 63 7d 0a 7d 0a 0a 23  }.  } {abc}.}..#
20a0: 20 49 6e 73 65 72 74 20 61 20 63 6f 75 70 6c 65   Insert a couple
20b0: 20 6f 66 20 72 6f 77 73 20 69 6e 74 6f 20 74 68   of rows into th
20c0: 65 20 74 61 62 6c 65 2e 20 65 61 63 68 20 69 6e  e table. each in
20d0: 73 65 72 74 20 69 73 20 69 6e 20 69 74 73 20 6f  sert is in its o
20e0: 77 6e 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  wn.# transaction
20f0: 2e 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  . test that the 
2100: 74 61 62 6c 65 20 69 73 20 75 6e 70 6f 70 75 6c  table is unpopul
2110: 61 74 65 64 20 62 65 66 6f 72 65 20 72 75 6e 6e  ated before runn
2120: 69 6e 67 20 74 68 65 20 69 6e 73 65 72 74 73 0a  ing the inserts.
2130: 23 20 28 61 6e 64 20 68 65 6e 63 65 20 61 66 74  # (and hence aft
2140: 65 72 20 65 61 63 68 20 66 61 69 6c 75 72 65 20  er each failure 
2150: 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  of the first ins
2160: 65 72 74 29 2c 20 61 6e 64 20 74 68 61 74 20 69  ert), and that i
2170: 74 20 68 61 73 20 62 65 65 6e 0a 23 20 70 6f 70  t has been.# pop
2180: 75 6c 61 74 65 64 20 63 6f 72 72 65 63 74 6c 79  ulated correctly
2190: 20 61 66 74 65 72 20 74 68 65 20 66 69 6e 61 6c   after the final
21a0: 20 69 6e 73 65 72 74 20 73 75 63 63 65 65 64 73   insert succeeds
21b0: 2e 0a 23 0a 54 45 53 54 20 33 20 7b 0a 20 20 64  ..#.TEST 3 {.  d
21c0: 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 2e 32  o_test $testid.2
21d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
21e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
21f0: 63 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c 20  c}.  } {}.}.SQL 
2200: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63  {INSERT INTO abc
2210: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
2220: 3b 7d 0a 53 51 4c 20 7b 49 4e 53 45 52 54 20 49  ;}.SQL {INSERT I
2230: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 34  NTO abc VALUES(4
2240: 2c 20 35 2c 20 36 29 3b 7d 0a 53 51 4c 20 7b 49  , 5, 6);}.SQL {I
2250: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
2260: 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 7d  ALUES(7, 8, 9);}
2270: 0a 54 45 53 54 20 34 20 7b 0a 20 20 64 6f 5f 74  .TEST 4 {.  do_t
2280: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
2290: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
22a0: 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20  T * FROM abc}.  
22b0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
22c0: 20 38 20 39 7d 0a 7d 0a 0a 23 20 54 65 73 74 20   8 9}.}..# Test 
22d0: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  a CREATE INDEX s
22e0: 74 61 74 65 6d 65 6e 74 2e 20 42 65 63 61 75 73  tatement. Becaus
22f0: 65 20 74 68 65 20 74 61 62 6c 65 20 27 61 62 63  e the table 'abc
2300: 27 20 69 73 20 73 6f 20 73 6d 61 6c 6c 2c 20 74  ' is so small, t
2310: 68 65 20 69 6e 64 65 78 0a 23 20 77 69 6c 6c 20  he index.# will 
2320: 61 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  all fit on a sin
2330: 67 6c 65 20 70 61 67 65 2c 20 73 6f 20 74 68 69  gle page, so thi
2340: 73 20 64 6f 65 73 6e 27 74 20 74 65 73 74 20 74  s doesn't test t
2350: 6f 6f 20 6d 75 63 68 20 74 68 61 74 20 74 68 65  oo much that the
2360: 20 43 52 45 41 54 45 0a 23 20 54 41 42 4c 45 20   CREATE.# TABLE 
2370: 73 74 61 74 65 6d 65 6e 74 20 64 69 64 6e 27 74  statement didn't
2380: 20 74 65 73 74 2e 20 41 20 66 65 77 20 6f 66 20   test. A few of 
2390: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 6d 61  the transient ma
23a0: 6c 6c 6f 63 28 29 73 20 69 6e 20 62 74 72 65 65  lloc()s in btree
23b0: 2e 63 0a 23 20 70 65 72 68 61 70 73 2e 0a 23 0a  .c.# perhaps..#.
23c0: 53 51 4c 20 7b 43 52 45 41 54 45 20 49 4e 44 45  SQL {CREATE INDE
23d0: 58 20 61 62 63 5f 69 20 4f 4e 20 61 62 63 28 61  X abc_i ON abc(a
23e0: 2c 20 62 2c 20 63 29 3b 7d 0a 54 45 53 54 20 34  , b, c);}.TEST 4
23f0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65   {.  do_test $te
2400: 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73  stid {.    execs
2410: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
2420: 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 4f 52 44  T * FROM abc ORD
2430: 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a 20 20  ER BY a DESC;.  
2440: 20 20 7d 0a 20 20 7d 20 7b 37 20 38 20 39 20 34    }.  } {7 8 9 4
2450: 20 35 20 36 20 31 20 32 20 33 7d 0a 7d 0a 0a 23   5 6 1 2 3}.}..#
2460: 20 54 65 73 74 20 61 20 44 45 4c 45 54 45 20 73   Test a DELETE s
2470: 74 61 74 65 6d 65 6e 74 2e 20 41 6c 73 6f 20 63  tatement. Also c
2480: 72 65 61 74 65 20 61 20 74 72 69 67 67 65 72 20  reate a trigger 
2490: 61 6e 64 20 61 20 76 69 65 77 2c 20 6a 75 73 74  and a view, just
24a0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a 23 20   to make sure.# 
24b0: 74 68 65 73 65 20 73 74 61 74 65 6d 65 6e 74 73  these statements
24c0: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 20   don't have any 
24d0: 6f 62 76 69 6f 75 73 20 6d 61 6c 6c 6f 63 28 29  obvious malloc()
24e0: 20 72 65 6c 61 74 65 64 20 62 75 67 73 20 69 6e   related bugs in
24f0: 20 74 68 65 6d 2e 20 4e 6f 74 65 0a 23 20 74 68   them. Note.# th
2500: 61 74 20 74 68 65 20 74 65 73 74 20 61 62 6f 76  at the test abov
2510: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
2520: 65 64 20 65 61 63 68 20 74 69 6d 65 20 74 68 65  ed each time the
2530: 20 44 45 4c 45 54 45 20 66 61 69 6c 73 2c 20 73   DELETE fails, s
2540: 6f 20 77 65 27 72 65 0a 23 20 61 6c 73 6f 20 74  o we're.# also t
2550: 65 73 74 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  esting rollback 
2560: 6f 66 20 61 20 44 45 4c 45 54 45 20 66 72 6f 6d  of a DELETE from
2570: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e   a table with an
2580: 20 69 6e 64 65 78 20 6f 6e 20 69 74 2e 0a 23 0a   index on it..#.
2590: 53 51 4c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  SQL {DELETE FROM
25a0: 20 61 62 63 20 57 48 45 52 45 20 61 20 3e 20 32   abc WHERE a > 2
25b0: 3b 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 54  ;}.SQL {CREATE T
25c0: 52 49 47 47 45 52 20 61 62 63 5f 74 20 41 46 54  RIGGER abc_t AFT
25d0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 61 62 63  ER INSERT ON abc
25e0: 20 42 45 47 49 4e 20 53 45 4c 45 43 54 20 27 74   BEGIN SELECT 't
25f0: 72 69 67 67 65 72 21 27 3b 20 45 4e 44 3b 7d 0a  rigger!'; END;}.
2600: 53 51 4c 20 7b 43 52 45 41 54 45 20 56 49 45 57  SQL {CREATE VIEW
2610: 20 61 62 63 5f 76 20 41 53 20 53 45 4c 45 43 54   abc_v AS SELECT
2620: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 7d 0a 54 45   * FROM abc;}.TE
2630: 53 54 20 35 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ST 5 {.  do_test
2640: 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65   $testid {.    e
2650: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
2660: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 62 6c 5f  ELECT name, tbl_
2670: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
2680: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
2690: 20 6e 61 6d 65 3b 0a 20 20 20 20 20 20 53 45 4c   name;.      SEL
26a0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
26b0: 20 20 20 20 7d 0a 20 20 7d 20 7b 61 62 63 20 61      }.  } {abc a
26c0: 62 63 20 61 62 63 5f 69 20 61 62 63 20 61 62 63  bc abc_i abc abc
26d0: 5f 74 20 61 62 63 20 61 62 63 5f 76 20 61 62 63  _t abc abc_v abc
26e0: 5f 76 20 31 20 32 20 33 7d 0a 7d 0a 0a 73 65 74  _v 1 2 3}.}..set
26f0: 20 73 71 6c 20 7b 0a 20 20 42 45 47 49 4e 3b 44   sql {.  BEGIN;D
2700: 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 3b 0a  ELETE FROM abc;.
2710: 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20  }.for {set i 1} 
2720: 7b 24 69 20 3c 20 31 35 7d 20 7b 69 6e 63 72 20  {$i < 15} {incr 
2730: 69 7d 20 7b 0a 20 20 73 65 74 20 61 20 24 69 0a  i} {.  set a $i.
2740: 20 20 73 65 74 20 62 20 22 53 74 72 69 6e 67 20    set b "String 
2750: 76 61 6c 75 65 20 24 69 22 0a 20 20 73 65 74 20  value $i".  set 
2760: 63 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  c [string repeat
2770: 20 58 20 24 69 5d 0a 20 20 61 70 70 65 6e 64 20   X $i].  append 
2780: 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  sql "INSERT INTO
2790: 20 61 62 63 20 56 41 4c 55 45 53 20 28 24 61 2c   abc VALUES ($a,
27a0: 20 27 24 62 27 2c 20 27 24 63 27 29 3b 22 0a 7d   '$b', '$c');".}
27b0: 0a 61 70 70 65 6e 64 20 73 71 6c 20 7b 43 4f 4d  .append sql {COM
27c0: 4d 49 54 3b 7d 0a 50 52 45 50 20 24 73 71 6c 0a  MIT;}.PREP $sql.
27d0: 0a 53 51 4c 20 7b 0a 20 20 44 45 4c 45 54 45 20  .SQL {.  DELETE 
27e0: 46 52 4f 4d 20 61 62 63 20 57 48 45 52 45 20 6f  FROM abc WHERE o
27f0: 69 64 20 49 4e 20 28 53 45 4c 45 43 54 20 6f 69  id IN (SELECT oi
2800: 64 20 46 52 4f 4d 20 61 62 63 20 4f 52 44 45 52  d FROM abc ORDER
2810: 20 42 59 20 72 61 6e 64 6f 6d 28 29 20 4c 49 4d   BY random() LIM
2820: 49 54 20 35 29 3b 0a 7d 0a 54 45 53 54 20 36 20  IT 5);.}.TEST 6 
2830: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73  {.  do_test $tes
2840: 74 69 64 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  tid.1 {.    exec
2850: 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e  sql {SELECT coun
2860: 74 28 2a 29 20 46 52 4f 4d 20 61 62 63 7d 0a 20  t(*) FROM abc}. 
2870: 20 7d 20 7b 39 34 7d 0a 20 20 64 6f 5f 74 65 73   } {94}.  do_tes
2880: 74 20 24 74 65 73 74 69 64 2e 32 20 7b 0a 20 20  t $testid.2 {.  
2890: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
28a0: 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 0a 20 20    SELECT min(.  
28b0: 20 20 20 20 20 20 20 20 28 6f 69 64 20 3d 3d 20          (oid == 
28c0: 61 29 20 41 4e 44 20 27 53 74 72 69 6e 67 20 76  a) AND 'String v
28d0: 61 6c 75 65 20 27 20 7c 7c 20 61 20 3d 3d 20 62  alue ' || a == b
28e0: 20 41 4e 44 20 61 20 3d 3d 20 6c 65 6e 67 74 68   AND a == length
28f0: 28 63 29 20 0a 20 20 20 20 20 20 29 20 46 52 4f  (c) .      ) FRO
2900: 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  M abc;.    }.  }
2910: 20 7b 31 7d 0a 7d 0a 53 51 4c 20 7b 0a 20 20 44   {1}.}.SQL {.  D
2920: 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 20 57  ELETE FROM abc W
2930: 48 45 52 45 20 6f 69 64 20 49 4e 20 28 53 45 4c  HERE oid IN (SEL
2940: 45 43 54 20 6f 69 64 20 46 52 4f 4d 20 61 62 63  ECT oid FROM abc
2950: 20 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f 6d   ORDER BY random
2960: 28 29 20 4c 49 4d 49 54 20 35 29 3b 0a 7d 0a 54  () LIMIT 5);.}.T
2970: 45 53 54 20 37 20 7b 0a 20 20 64 6f 5f 74 65 73  EST 7 {.  do_tes
2980: 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20  t $testid {.    
2990: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
29a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
29b0: 63 7d 0a 20 20 7d 20 7b 38 39 7d 0a 20 20 64 6f  c}.  } {89}.  do
29c0: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
29d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
29e0: 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 0a      SELECT min(.
29f0: 20 20 20 20 20 20 20 20 20 20 28 6f 69 64 20 3d            (oid =
2a00: 3d 20 61 29 20 41 4e 44 20 27 53 74 72 69 6e 67  = a) AND 'String
2a10: 20 76 61 6c 75 65 20 27 20 7c 7c 20 61 20 3d 3d   value ' || a ==
2a20: 20 62 20 41 4e 44 20 61 20 3d 3d 20 6c 65 6e 67   b AND a == leng
2a30: 74 68 28 63 29 20 0a 20 20 20 20 20 20 29 20 46  th(c) .      ) F
2a40: 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20  ROM abc;.    }. 
2a50: 20 7d 20 7b 31 7d 0a 7d 0a 53 51 4c 20 7b 0a 20   } {1}.}.SQL {. 
2a60: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63   DELETE FROM abc
2a70: 20 57 48 45 52 45 20 6f 69 64 20 49 4e 20 28 53   WHERE oid IN (S
2a80: 45 4c 45 43 54 20 6f 69 64 20 46 52 4f 4d 20 61  ELECT oid FROM a
2a90: 62 63 20 4f 52 44 45 52 20 42 59 20 72 61 6e 64  bc ORDER BY rand
2aa0: 6f 6d 28 29 20 4c 49 4d 49 54 20 35 29 3b 0a 7d  om() LIMIT 5);.}
2ab0: 0a 54 45 53 54 20 39 20 7b 0a 20 20 64 6f 5f 74  .TEST 9 {.  do_t
2ac0: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
2ad0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2ae0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2af0: 61 62 63 7d 0a 20 20 7d 20 7b 38 34 7d 0a 20 20  abc}.  } {84}.  
2b00: 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20  do_test $testid 
2b10: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
2b20: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e        SELECT min
2b30: 28 0a 20 20 20 20 20 20 20 20 20 20 28 6f 69 64  (.          (oid
2b40: 20 3d 3d 20 61 29 20 41 4e 44 20 27 53 74 72 69   == a) AND 'Stri
2b50: 6e 67 20 76 61 6c 75 65 20 27 20 7c 7c 20 61 20  ng value ' || a 
2b60: 3d 3d 20 62 20 41 4e 44 20 61 20 3d 3d 20 6c 65  == b AND a == le
2b70: 6e 67 74 68 28 63 29 20 0a 20 20 20 20 20 20 29  ngth(c) .      )
2b80: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d   FROM abc;.    }
2b90: 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 0a 73 65 74 20  .  } {1}.}..set 
2ba0: 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20  padding [string 
2bb0: 72 65 70 65 61 74 20 58 20 35 30 30 5d 0a 50 52  repeat X 500].PR
2bc0: 45 50 20 5b 73 75 62 73 74 20 7b 0a 20 20 44 52  EP [subst {.  DR
2bd0: 4f 50 20 54 41 42 4c 45 20 61 62 63 3b 0a 20 20  OP TABLE abc;.  
2be0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
2bf0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
2c00: 70 61 64 64 69 6e 67 2c 20 62 2c 20 63 29 3b 0a  padding, b, c);.
2c10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
2c20: 63 20 56 41 4c 55 45 53 28 30 2c 20 27 24 70 61  c VALUES(0, '$pa
2c30: 64 64 69 6e 67 27 2c 20 32 2c 20 32 29 3b 0a 20  dding', 2, 2);. 
2c40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
2c50: 20 56 41 4c 55 45 53 28 33 2c 20 27 24 70 61 64   VALUES(3, '$pad
2c60: 64 69 6e 67 27 2c 20 35 2c 20 35 29 3b 0a 20 20  ding', 5, 5);.  
2c70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
2c80: 56 41 4c 55 45 53 28 36 2c 20 27 24 70 61 64 64  VALUES(6, '$padd
2c90: 69 6e 67 27 2c 20 38 2c 20 38 29 3b 0a 7d 5d 0a  ing', 8, 8);.}].
2ca0: 0a 54 45 53 54 20 31 30 20 7b 0a 20 20 64 6f 5f  .TEST 10 {.  do_
2cb0: 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20  test $testid {. 
2cc0: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
2cd0: 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
2ce0: 61 62 63 7d 0a 20 20 7d 20 7b 30 20 32 20 32 20  abc}.  } {0 2 2 
2cf0: 33 20 35 20 35 20 36 20 38 20 38 7d 0a 7d 0a 0a  3 5 5 6 8 8}.}..
2d00: 53 51 4c 20 7b 42 45 47 49 4e 3b 7d 0a 53 51 4c  SQL {BEGIN;}.SQL
2d10: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62   {INSERT INTO ab
2d20: 63 20 56 41 4c 55 45 53 28 39 2c 20 27 58 58 58  c VALUES(9, 'XXX
2d30: 58 58 27 2c 20 31 31 2c 20 31 32 29 3b 7d 0a 54  XX', 11, 12);}.T
2d40: 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54 20 31  EST_AUTOCOMMIT 1
2d50: 31 20 30 0a 53 51 4c 20 2d 6e 6f 72 6f 6c 6c 62  1 0.SQL -norollb
2d60: 61 63 6b 20 7b 55 50 44 41 54 45 20 61 62 63 20  ack {UPDATE abc 
2d70: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 2c 20 63  SET a = a + 1, c
2d80: 20 3d 20 63 20 2b 20 31 3b 7d 0a 54 45 53 54 5f   = c + 1;}.TEST_
2d90: 41 55 54 4f 43 4f 4d 4d 49 54 20 31 32 20 30 0a  AUTOCOMMIT 12 0.
2da0: 53 51 4c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  SQL {DELETE FROM
2db0: 20 61 62 63 20 57 48 45 52 45 20 61 20 3d 20 31   abc WHERE a = 1
2dc0: 30 3b 7d 0a 54 45 53 54 5f 41 55 54 4f 43 4f 4d  0;}.TEST_AUTOCOM
2dd0: 4d 49 54 20 31 33 20 30 0a 53 51 4c 20 7b 43 4f  MIT 13 0.SQL {CO
2de0: 4d 4d 49 54 3b 7d 0a 0a 54 45 53 54 20 31 34 20  MMIT;}..TEST 14 
2df0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73  {.  do_test $tes
2e00: 74 69 64 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69  tid.1 {.    sqli
2e10: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
2e20: 69 74 20 24 3a 3a 44 42 0a 20 20 7d 20 7b 31 7d  it $::DB.  } {1}
2e30: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
2e40: 69 64 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  id.2 {.    execs
2e50: 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20 62 2c  ql {SELECT a, b,
2e60: 20 63 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20 7d   c FROM abc}.  }
2e70: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
2e80: 38 20 39 7d 0a 7d 0a 0a 50 52 45 50 20 5b 73 75  8 9}.}..PREP [su
2e90: 62 73 74 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  bst {.  DROP TAB
2ea0: 4c 45 20 61 62 63 3b 0a 20 20 43 52 45 41 54 45  LE abc;.  CREATE
2eb0: 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 70 61   TABLE abc(a, pa
2ec0: 64 64 69 6e 67 2c 20 62 2c 20 63 29 3b 0a 20 20  dding, b, c);.  
2ed0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
2ee0: 56 41 4c 55 45 53 28 31 2c 20 27 24 70 61 64 64  VALUES(1, '$padd
2ef0: 69 6e 67 27 2c 20 32 2c 20 33 29 3b 0a 20 20 49  ing', 2, 3);.  I
2f00: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
2f10: 41 4c 55 45 53 28 34 2c 20 27 24 70 61 64 64 69  ALUES(4, '$paddi
2f20: 6e 67 27 2c 20 35 2c 20 36 29 3b 0a 20 20 49 4e  ng', 5, 6);.  IN
2f30: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
2f40: 4c 55 45 53 28 37 2c 20 27 24 70 61 64 64 69 6e  LUES(7, '$paddin
2f50: 67 27 2c 20 38 2c 20 39 29 3b 0a 20 20 43 52 45  g', 8, 9);.  CRE
2f60: 41 54 45 20 49 4e 44 45 58 20 61 62 63 5f 69 20  ATE INDEX abc_i 
2f70: 4f 4e 20 61 62 63 28 61 2c 20 70 61 64 64 69 6e  ON abc(a, paddin
2f80: 67 2c 20 62 2c 20 63 29 3b 0a 7d 5d 0a 0a 54 45  g, b, c);.}]..TE
2f90: 53 54 20 31 35 20 7b 0a 20 20 64 62 20 65 76 61  ST 15 {.  db eva
2fa0: 6c 20 7b 50 52 41 47 4d 41 20 63 61 63 68 65 5f  l {PRAGMA cache_
2fb0: 73 69 7a 65 20 3d 20 31 30 7d 0a 7d 0a 0a 53 51  size = 10}.}..SQ
2fc0: 4c 20 7b 42 45 47 49 4e 3b 7d 0a 53 51 4c 20 2d  L {BEGIN;}.SQL -
2fd0: 6e 6f 72 6c 6c 62 63 6b 20 7b 49 4e 53 45 52 54  norllbck {INSERT
2fe0: 20 49 4e 54 4f 20 61 62 63 20 28 6f 69 64 2c 20   INTO abc (oid, 
2ff0: 61 2c 20 70 61 64 64 69 6e 67 2c 20 62 2c 20 63  a, padding, b, c
3000: 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 2a  ) SELECT NULL, *
3010: 20 46 52 4f 4d 20 61 62 63 7d 0a 54 45 53 54 20   FROM abc}.TEST 
3020: 31 36 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24  16 {.  do_test $
3030: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
3040: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20  csql {SELECT a, 
3050: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
3060: 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20  c GROUP BY a;}. 
3070: 20 7d 20 7b 31 20 32 20 34 20 32 20 37 20 32 7d   } {1 2 4 2 7 2}
3080: 0a 7d 0a 53 51 4c 20 2d 6e 6f 72 6c 6c 62 63 6b  .}.SQL -norllbck
3090: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62   {INSERT INTO ab
30a0: 63 20 28 6f 69 64 2c 20 61 2c 20 70 61 64 64 69  c (oid, a, paddi
30b0: 6e 67 2c 20 62 2c 20 63 29 20 53 45 4c 45 43 54  ng, b, c) SELECT
30c0: 20 4e 55 4c 4c 2c 20 2a 20 46 52 4f 4d 20 61 62   NULL, * FROM ab
30d0: 63 7d 0a 54 45 53 54 20 31 37 20 7b 0a 20 20 64  c}.TEST 17 {.  d
30e0: 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b  o_test $testid {
30f0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
3100: 4c 45 43 54 20 61 2c 20 63 6f 75 6e 74 28 2a 29  LECT a, count(*)
3110: 20 46 52 4f 4d 20 61 62 63 20 47 52 4f 55 50 20   FROM abc GROUP 
3120: 42 59 20 61 3b 7d 0a 20 20 7d 20 7b 31 20 34 20  BY a;}.  } {1 4 
3130: 34 20 34 20 37 20 34 7d 0a 7d 0a 53 51 4c 20 2d  4 4 7 4}.}.SQL -
3140: 6e 6f 72 6c 6c 62 63 6b 20 7b 49 4e 53 45 52 54  norllbck {INSERT
3150: 20 49 4e 54 4f 20 61 62 63 20 28 6f 69 64 2c 20   INTO abc (oid, 
3160: 61 2c 20 70 61 64 64 69 6e 67 2c 20 62 2c 20 63  a, padding, b, c
3170: 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 2a  ) SELECT NULL, *
3180: 20 46 52 4f 4d 20 61 62 63 7d 0a 54 45 53 54 20   FROM abc}.TEST 
3190: 31 38 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24  18 {.  do_test $
31a0: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
31b0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20  csql {SELECT a, 
31c0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
31d0: 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20  c GROUP BY a;}. 
31e0: 20 7d 20 7b 31 20 38 20 34 20 38 20 37 20 38 7d   } {1 8 4 8 7 8}
31f0: 0a 7d 0a 53 51 4c 20 2d 6e 6f 72 6c 6c 62 63 6b  .}.SQL -norllbck
3200: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62   {INSERT INTO ab
3210: 63 20 28 6f 69 64 2c 20 61 2c 20 70 61 64 64 69  c (oid, a, paddi
3220: 6e 67 2c 20 62 2c 20 63 29 20 53 45 4c 45 43 54  ng, b, c) SELECT
3230: 20 4e 55 4c 4c 2c 20 2a 20 46 52 4f 4d 20 61 62   NULL, * FROM ab
3240: 63 7d 0a 54 45 53 54 20 31 39 20 7b 0a 20 20 64  c}.TEST 19 {.  d
3250: 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b  o_test $testid {
3260: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
3270: 4c 45 43 54 20 61 2c 20 63 6f 75 6e 74 28 2a 29  LECT a, count(*)
3280: 20 46 52 4f 4d 20 61 62 63 20 47 52 4f 55 50 20   FROM abc GROUP 
3290: 42 59 20 61 3b 7d 0a 20 20 7d 20 7b 31 20 31 36  BY a;}.  } {1 16
32a0: 20 34 20 31 36 20 37 20 31 36 7d 0a 7d 0a 53 51   4 16 7 16}.}.SQ
32b0: 4c 20 7b 43 4f 4d 4d 49 54 3b 7d 0a 54 45 53 54  L {COMMIT;}.TEST
32c0: 20 32 31 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   21 {.  do_test 
32d0: 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78  $testid {.    ex
32e0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c  ecsql {SELECT a,
32f0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
3300: 62 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a  bc GROUP BY a;}.
3310: 20 20 7d 20 7b 31 20 31 36 20 34 20 31 36 20 37    } {1 16 4 16 7
3320: 20 31 36 7d 0a 7d 0a 0a 53 51 4c 20 7b 42 45 47   16}.}..SQL {BEG
3330: 49 4e 3b 7d 0a 53 51 4c 20 7b 44 45 4c 45 54 45  IN;}.SQL {DELETE
3340: 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52 45 20   FROM abc WHERE 
3350: 6f 69 64 20 25 32 7d 0a 54 45 53 54 20 32 32 20  oid %2}.TEST 22 
3360: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73  {.  do_test $tes
3370: 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71  tid {.    execsq
3380: 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20 63 6f 75  l {SELECT a, cou
3390: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63 20 47  nt(*) FROM abc G
33a0: 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20 20 7d 20  ROUP BY a;}.  } 
33b0: 7b 31 20 38 20 34 20 38 20 37 20 38 7d 0a 7d 0a  {1 8 4 8 7 8}.}.
33c0: 53 51 4c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  SQL {DELETE FROM
33d0: 20 61 62 63 7d 0a 54 45 53 54 20 32 33 20 7b 0a   abc}.TEST 23 {.
33e0: 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69    do_test $testi
33f0: 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  d {.    execsql 
3400: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61  {SELECT * FROM a
3410: 62 63 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c  bc}.  } {}.}.SQL
3420: 20 7b 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 54 45 53   {ROLLBACK;}.TES
3430: 54 20 32 34 20 7b 0a 20 20 64 6f 5f 74 65 73 74  T 24 {.  do_test
3440: 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65   $testid {.    e
3450: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61  xecsql {SELECT a
3460: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
3470: 61 62 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d  abc GROUP BY a;}
3480: 0a 20 20 7d 20 7b 31 20 31 36 20 34 20 31 36 20  .  } {1 16 4 16 
3490: 37 20 31 36 7d 0a 7d 0a 0a 23 20 54 65 73 74 20  7 16}.}..# Test 
34a0: 73 6f 6d 65 20 73 63 68 65 6d 61 20 6d 6f 64 69  some schema modi
34b0: 66 69 63 61 74 69 6f 6e 73 20 69 6e 73 69 64 65  fications inside
34c0: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
34d0: 6e 2e 20 54 68 65 73 65 20 73 68 6f 75 6c 64 20  n. These should 
34e0: 61 6c 6c 0a 23 20 63 61 75 73 65 20 74 72 61 6e  all.# cause tran
34f0: 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
3500: 20 69 66 20 74 68 65 79 20 66 61 69 6c 2e 20 41   if they fail. A
3510: 6c 73 6f 20 71 75 65 72 79 20 61 20 76 69 65 77  lso query a view
3520: 2c 20 74 6f 20 63 6f 76 65 72 20 61 20 62 69 74  , to cover a bit
3530: 0a 23 20 6d 6f 72 65 20 63 6f 64 65 2e 0a 23 0a  .# more code..#.
3540: 50 52 45 50 20 7b 44 52 4f 50 20 56 49 45 57 20  PREP {DROP VIEW 
3550: 61 62 63 5f 76 3b 7d 0a 54 45 53 54 20 32 35 20  abc_v;}.TEST 25 
3560: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73  {.  do_test $tes
3570: 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71  tid {.    execsq
3580: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
3590: 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 20   name, tbl_name 
35a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
35b0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61  er;.    }.  } {a
35c0: 62 63 20 61 62 63 20 61 62 63 5f 69 20 61 62 63  bc abc abc_i abc
35d0: 7d 0a 7d 0a 53 51 4c 20 7b 42 45 47 49 4e 3b 7d  }.}.SQL {BEGIN;}
35e0: 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 54 41 42  .SQL {CREATE TAB
35f0: 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66 29 3b  LE def(d, e, f);
3600: 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 54 41  }.SQL {CREATE TA
3610: 42 4c 45 20 67 68 69 28 67 2c 20 68 2c 20 69 29  BLE ghi(g, h, i)
3620: 3b 7d 0a 54 45 53 54 20 32 36 20 7b 0a 20 20 64  ;}.TEST 26 {.  d
3630: 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b  o_test $testid {
3640: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3650: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65       SELECT name
3660: 2c 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f 4d 20  , tbl_name FROM 
3670: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
3680: 20 20 20 7d 0a 20 20 7d 20 7b 61 62 63 20 61 62     }.  } {abc ab
3690: 63 20 61 62 63 5f 69 20 61 62 63 20 64 65 66 20  c abc_i abc def 
36a0: 64 65 66 20 67 68 69 20 67 68 69 7d 0a 7d 0a 53  def ghi ghi}.}.S
36b0: 51 4c 20 7b 43 52 45 41 54 45 20 56 49 45 57 20  QL {CREATE VIEW 
36c0: 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  v1 AS SELECT * F
36d0: 52 4f 4d 20 64 65 66 2c 20 67 68 69 7d 0a 53 51  ROM def, ghi}.SQ
36e0: 4c 20 7b 43 52 45 41 54 45 20 55 4e 49 51 55 45  L {CREATE UNIQUE
36f0: 20 49 4e 44 45 58 20 67 68 69 5f 69 31 20 4f 4e   INDEX ghi_i1 ON
3700: 20 67 68 69 28 67 29 3b 7d 0a 54 45 53 54 20 32   ghi(g);}.TEST 2
3710: 37 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74  7 {.  do_test $t
3720: 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63  estid {.    exec
3730: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3740: 43 54 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d  CT name, tbl_nam
3750: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
3760: 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  ster;.    }.  } 
3770: 7b 61 62 63 20 61 62 63 20 61 62 63 5f 69 20 61  {abc abc abc_i a
3780: 62 63 20 64 65 66 20 64 65 66 20 67 68 69 20 67  bc def def ghi g
3790: 68 69 20 76 31 20 76 31 20 67 68 69 5f 69 31 20  hi v1 v1 ghi_i1 
37a0: 67 68 69 7d 0a 7d 0a 53 51 4c 20 7b 49 4e 53 45  ghi}.}.SQL {INSE
37b0: 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55  RT INTO def VALU
37c0: 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63 27  ES('a', 'b', 'c'
37d0: 29 7d 0a 53 51 4c 20 7b 49 4e 53 45 52 54 20 49  )}.SQL {INSERT I
37e0: 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 31  NTO def VALUES(1
37f0: 2c 20 32 2c 20 33 29 7d 0a 53 51 4c 20 2d 6e 6f  , 2, 3)}.SQL -no
3800: 72 6f 6c 6c 62 61 63 6b 20 7b 49 4e 53 45 52 54  rollback {INSERT
3810: 20 49 4e 54 4f 20 67 68 69 20 53 45 4c 45 43 54   INTO ghi SELECT
3820: 20 2a 20 46 52 4f 4d 20 64 65 66 7d 0a 54 45 53   * FROM def}.TES
3830: 54 20 32 38 20 7b 0a 20 20 64 6f 5f 74 65 73 74  T 28 {.  do_test
3840: 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65   $testid {.    e
3850: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3860: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66  ELECT * FROM def
3870: 2c 20 67 68 69 20 57 48 45 52 45 20 64 20 3d 20  , ghi WHERE d = 
3880: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61 20  g;.    }.  } {a 
3890: 62 20 63 20 61 20 62 20 63 20 31 20 32 20 33 20  b c a b c 1 2 3 
38a0: 31 20 32 20 33 7d 0a 7d 0a 53 51 4c 20 7b 43 4f  1 2 3}.}.SQL {CO
38b0: 4d 4d 49 54 7d 0a 54 45 53 54 20 32 39 20 7b 0a  MMIT}.TEST 29 {.
38c0: 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69    do_test $testi
38d0: 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  d {.    execsql 
38e0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
38f0: 20 46 52 4f 4d 20 76 31 20 57 48 45 52 45 20 64   FROM v1 WHERE d
3900: 20 3d 20 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = g;.    }.  } 
3910: 7b 61 20 62 20 63 20 61 20 62 20 63 20 31 20 32  {a b c a b c 1 2
3920: 20 33 20 31 20 32 20 33 7d 0a 7d 0a 0a 23 20 54   3 1 2 3}.}..# T
3930: 65 73 74 20 61 20 73 69 6d 70 6c 65 20 6d 75 6c  est a simple mul
3940: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
3950: 69 6f 6e 20 0a 23 0a 66 69 6c 65 20 64 65 6c 65  ion .#.file dele
3960: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e  te -force test2.
3970: 64 62 0a 69 66 63 61 70 61 62 6c 65 20 61 74 74  db.ifcapable att
3980: 61 63 68 20 7b 0a 20 20 53 51 4c 20 7b 41 54 54  ach {.  SQL {ATT
3990: 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41  ACH 'test2.db' A
39a0: 53 20 61 75 78 3b 7d 0a 20 20 53 51 4c 20 7b 42  S aux;}.  SQL {B
39b0: 45 47 49 4e 7d 0a 20 20 53 51 4c 20 7b 43 52 45  EGIN}.  SQL {CRE
39c0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 62  ATE TABLE aux.tb
39d0: 6c 32 28 78 2c 20 79 2c 20 7a 29 7d 0a 20 20 53  l2(x, y, z)}.  S
39e0: 51 4c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  QL {INSERT INTO 
39f0: 74 62 6c 32 20 56 41 4c 55 45 53 28 31 2c 20 32  tbl2 VALUES(1, 2
3a00: 2c 20 33 29 7d 0a 20 20 53 51 4c 20 7b 49 4e 53  , 3)}.  SQL {INS
3a10: 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c  ERT INTO def VAL
3a20: 55 45 53 28 34 2c 20 35 2c 20 36 29 7d 0a 20 20  UES(4, 5, 6)}.  
3a30: 54 45 53 54 20 33 30 20 7b 0a 20 20 20 20 64 6f  TEST 30 {.    do
3a40: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
3a50: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a        execsql {.
3a60: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
3a70: 20 46 52 4f 4d 20 74 62 6c 32 2c 20 64 65 66 20   FROM tbl2, def 
3a80: 57 48 45 52 45 20 64 20 3d 20 78 3b 0a 20 20 20  WHERE d = x;.   
3a90: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32 20     }.    } {1 2 
3aa0: 33 20 31 20 32 20 33 7d 0a 20 20 7d 0a 20 20 53  3 1 2 3}.  }.  S
3ab0: 51 4c 20 7b 43 4f 4d 4d 49 54 7d 0a 20 20 54 45  QL {COMMIT}.  TE
3ac0: 53 54 20 33 31 20 7b 0a 20 20 20 20 64 6f 5f 74  ST 31 {.    do_t
3ad0: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
3ae0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3af0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
3b00: 52 4f 4d 20 74 62 6c 32 2c 20 64 65 66 20 57 48  ROM tbl2, def WH
3b10: 45 52 45 20 64 20 3d 20 78 3b 0a 20 20 20 20 20  ERE d = x;.     
3b20: 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32 20 33 20   }.    } {1 2 3 
3b30: 31 20 32 20 33 7d 0a 20 20 7d 0a 7d 0a 0a 23 20  1 2 3}.  }.}..# 
3b40: 54 65 73 74 20 77 68 61 74 20 68 61 70 70 65 6e  Test what happen
3b50: 73 20 77 68 65 6e 20 61 20 6d 61 6c 6c 6f 63 28  s when a malloc(
3b60: 29 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  ) fails while th
3b70: 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
3b80: 74 69 76 65 0a 23 20 73 74 61 74 65 6d 65 6e 74  tive.# statement
3b90: 73 2e 20 54 68 69 73 20 63 68 61 6e 67 65 73 20  s. This changes 
3ba0: 74 68 65 20 77 61 79 20 73 71 6c 69 74 65 33 56  the way sqlite3V
3bb0: 64 62 65 48 61 6c 74 28 29 20 77 6f 72 6b 73 2e  dbeHalt() works.
3bc0: 0a 54 45 53 54 20 33 32 20 7b 0a 20 20 69 66 20  .TEST 32 {.  if 
3bd0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
3be0: 3a 53 54 4d 54 33 32 5d 7d 20 7b 0a 20 20 20 20  :STMT32]} {.    
3bf0: 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20  set sql "SELECT 
3c00: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
3c10: 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 73 65 74  _master".    set
3c20: 20 3a 3a 53 54 4d 54 33 32 20 5b 73 71 6c 69 74   ::STMT32 [sqlit
3c30: 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a 44 42  e3_prepare $::DB
3c40: 20 24 73 71 6c 20 2d 31 20 44 55 4d 4d 59 5d 0a   $sql -1 DUMMY].
3c50: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73      do_test $tes
3c60: 74 69 64 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  tid {.      sqli
3c70: 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54  te3_step $::STMT
3c80: 33 32 0a 20 20 20 20 7d 20 7b 53 51 4c 49 54 45  32.    } {SQLITE
3c90: 5f 52 4f 57 7d 0a 20 20 7d 0a 7d 0a 53 51 4c 20  _ROW}.  }.}.SQL 
3ca0: 42 45 47 49 4e 0a 54 45 53 54 20 33 33 20 7b 20  BEGIN.TEST 33 { 
3cb0: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
3cc0: 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  id {.    execsql
3cd0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
3ce0: 67 68 69 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20  ghi}.  } {a b c 
3cf0: 31 20 32 20 33 7d 0a 7d 0a 53 51 4c 20 2d 6e 6f  1 2 3}.}.SQL -no
3d00: 72 6f 6c 6c 62 61 63 6b 20 7b 20 0a 20 20 2d 2d  rollback { .  --
3d10: 20 54 68 65 72 65 20 69 73 20 61 20 75 6e 69 71   There is a uniq
3d20: 75 65 20 69 6e 64 65 78 20 6f 6e 20 67 68 69 28  ue index on ghi(
3d30: 67 29 2c 20 73 6f 20 74 68 69 73 20 73 74 61 74  g), so this stat
3d40: 65 6d 65 6e 74 20 6d 61 79 20 6e 6f 74 20 63 61  ement may not ca
3d50: 75 73 65 0a 20 20 2d 2d 20 61 6e 20 61 75 74 6f  use.  -- an auto
3d60: 6d 61 74 69 63 20 52 4f 4c 4c 42 41 43 4b 2e 20  matic ROLLBACK. 
3d70: 48 65 6e 63 65 20 74 68 65 20 22 2d 6e 6f 72 6f  Hence the "-noro
3d80: 6c 6c 62 61 63 6b 22 20 73 77 69 74 63 68 2e 0a  llback" switch..
3d90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 67 68    INSERT INTO gh
3da0: 69 20 53 45 4c 45 43 54 20 27 32 27 7c 7c 67 2c  i SELECT '2'||g,
3db0: 20 68 2c 20 69 20 46 52 4f 4d 20 67 68 69 3b 0a   h, i FROM ghi;.
3dc0: 7d 0a 54 45 53 54 20 33 34 20 7b 0a 20 20 69 66  }.TEST 34 {.  if
3dd0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
3de0: 3a 53 54 4d 54 33 32 5d 7d 20 7b 0a 20 20 20 20  :STMT32]} {.    
3df0: 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20  do_test $testid 
3e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3e10: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
3e20: 33 32 0a 20 20 20 20 7d 20 7b 53 51 4c 49 54 45  32.    } {SQLITE
3e30: 5f 4f 4b 7d 0a 20 20 20 20 75 6e 73 65 74 20 3a  _OK}.    unset :
3e40: 3a 53 54 4d 54 33 32 0a 20 20 7d 0a 7d 0a 53 51  :STMT32.  }.}.SQ
3e50: 4c 20 43 4f 4d 4d 49 54 0a 0a 23 0a 23 20 45 6e  L COMMIT..#.# En
3e60: 64 20 6f 66 20 74 65 73 74 20 70 72 6f 67 72 61  d of test progra
3e70: 6d 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 23 2d  m declaration.#-
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 72 6f 63 20  ---------..proc 
3ed0: 72 75 6e 5f 74 65 73 74 20 7b 61 72 67 6c 69 73  run_test {arglis
3ee0: 74 20 69 52 65 70 65 61 74 20 7b 70 63 73 74 61  t iRepeat {pcsta
3ef0: 72 74 20 30 7d 20 7b 69 46 61 69 6c 53 74 61 72  rt 0} {iFailStar
3f00: 74 20 31 7d 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c  t 1}} {.  if {[l
3f10: 6c 65 6e 67 74 68 20 24 61 72 67 6c 69 73 74 5d  length $arglist]
3f20: 20 25 32 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72   %2} {.    error
3f30: 20 22 55 6e 65 76 65 6e 20 6e 75 6d 62 65 72 20   "Uneven number 
3f40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
3f50: 54 45 53 54 22 0a 20 20 7d 0a 0a 20 20 66 6f 72  TEST".  }..  for
3f60: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
3f70: 20 24 70 63 73 74 61 72 74 7d 20 7b 69 6e 63 72   $pcstart} {incr
3f80: 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 6b 32   i} {.    set k2
3f90: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 6c 69 73   [lindex $arglis
3fa0: 74 20 5b 65 78 70 72 20 32 20 2a 20 24 69 5d 5d  t [expr 2 * $i]]
3fb0: 0a 20 20 20 20 73 65 74 20 76 32 20 5b 6c 69 6e  .    set v2 [lin
3fc0: 64 65 78 20 24 61 72 67 6c 69 73 74 20 5b 65 78  dex $arglist [ex
3fd0: 70 72 20 32 20 2a 20 24 69 20 2b 20 31 5d 5d 0a  pr 2 * $i + 1]].
3fe0: 20 20 20 20 73 65 74 20 61 63 20 5b 73 71 6c 69      set ac [sqli
3ff0: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
4000: 69 74 20 24 3a 3a 44 42 5d 20 20 20 20 20 20 20  it $::DB]       
4010: 20 3b 23 20 41 75 74 6f 2d 43 6f 6d 6d 69 74 0a   ;# Auto-Commit.
4020: 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6b      switch -- $k
4030: 32 20 7b 0a 20 20 20 20 20 20 2d 73 71 6c 20 20  2 {.      -sql  
4040: 7b 64 62 20 65 76 61 6c 20 5b 6c 69 6e 64 65 78  {db eval [lindex
4050: 20 24 76 32 20 31 5d 7d 0a 20 20 20 20 20 20 2d   $v2 1]}.      -
4060: 70 72 65 70 20 7b 64 62 20 65 76 61 6c 20 24 76  prep {db eval $v
4070: 32 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  2}.    }.    set
4080: 20 6e 61 63 20 5b 73 71 6c 69 74 65 33 5f 67 65   nac [sqlite3_ge
4090: 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 24 3a 3a  t_autocommit $::
40a0: 44 42 5d 20 20 20 20 20 20 20 3b 23 20 4e 65 77  DB]       ;# New
40b0: 20 41 75 74 6f 2d 43 6f 6d 6d 69 74 20 0a 20 20   Auto-Commit .  
40c0: 20 20 69 66 20 7b 24 61 63 20 26 26 20 21 24 6e    if {$ac && !$n
40d0: 61 63 7d 20 7b 73 65 74 20 62 65 67 69 6e 5f 70  ac} {set begin_p
40e0: 63 20 24 69 7d 0a 20 20 7d 0a 0a 20 20 64 62 20  c $i}.  }..  db 
40f0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 5b 6c  rollback_hook [l
4100: 69 73 74 20 69 6e 63 72 20 3a 3a 72 6f 6c 6c 62  ist incr ::rollb
4110: 61 63 6b 5f 68 6f 6f 6b 5f 63 6f 75 6e 74 5d 0a  ack_hook_count].
4120: 0a 20 20 73 65 74 20 69 46 61 69 6c 20 24 69 46  .  set iFail $iF
4130: 61 69 6c 53 74 61 72 74 0a 20 20 73 65 74 20 70  ailStart.  set p
4140: 63 20 24 70 63 73 74 61 72 74 0a 20 20 77 68 69  c $pcstart.  whi
4150: 6c 65 20 7b 24 70 63 2a 32 20 3c 20 5b 6c 6c 65  le {$pc*2 < [lle
4160: 6e 67 74 68 20 24 61 72 67 6c 69 73 74 5d 7d 20  ngth $arglist]} 
4170: 7b 0a 0a 20 20 20 20 23 20 49 64 20 6f 66 20 74  {..    # Id of t
4180: 68 69 73 20 69 74 65 72 61 74 69 6f 6e 3a 0a 20  his iteration:. 
4190: 20 20 20 73 65 74 20 6b 20 5b 6c 69 6e 64 65 78     set k [lindex
41a0: 20 24 61 72 67 6c 69 73 74 20 5b 65 78 70 72 20   $arglist [expr 
41b0: 32 20 2a 20 24 70 63 5d 5d 0a 20 20 20 20 73 65  2 * $pc]].    se
41c0: 74 20 69 74 65 72 69 64 20 22 70 63 3d 24 70 63  t iterid "pc=$pc
41d0: 2e 69 46 61 69 6c 3d 24 69 46 61 69 6c 24 6b 22  .iFail=$iFail$k"
41e0: 0a 20 20 20 20 73 65 74 20 76 20 5b 6c 69 6e 64  .    set v [lind
41f0: 65 78 20 24 61 72 67 6c 69 73 74 20 5b 65 78 70  ex $arglist [exp
4200: 72 20 32 20 2a 20 24 70 63 20 2b 20 31 5d 5d 0a  r 2 * $pc + 1]].
4210: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24  .    switch -- $
4220: 6b 20 7b 0a 0a 20 20 20 20 20 20 2d 74 65 73 74  k {..      -test
4230: 20 7b 20 0a 20 20 20 20 20 20 20 20 66 6f 72 65   { .        fore
4240: 61 63 68 20 7b 69 64 20 73 63 72 69 70 74 7d 20  ach {id script} 
4250: 24 76 20 7b 7d 0a 20 20 20 20 20 20 20 20 69 6e  $v {}.        in
4260: 63 72 20 70 63 0a 20 20 20 20 20 20 7d 0a 0a 20  cr pc.      }.. 
4270: 20 20 20 20 20 2d 73 71 6c 20 7b 0a 20 20 20 20       -sql {.    
4280: 20 20 20 20 73 65 74 20 3a 3a 72 6f 6c 6c 62 61      set ::rollba
4290: 63 6b 5f 68 6f 6f 6b 5f 63 6f 75 6e 74 20 30 0a  ck_hook_count 0.
42a0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 63 20  .        set ac 
42b0: 5b 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74  [sqlite3_get_aut
42c0: 6f 63 6f 6d 6d 69 74 20 24 3a 3a 44 42 5d 20 20  ocommit $::DB]  
42d0: 20 20 20 20 20 20 3b 23 20 41 75 74 6f 2d 43 6f        ;# Auto-Co
42e0: 6d 6d 69 74 0a 20 20 20 20 20 20 20 20 73 71 6c  mmit.        sql
42f0: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61  ite3_memdebug_fa
4300: 69 6c 20 24 69 46 61 69 6c 20 2d 72 65 70 65 61  il $iFail -repea
4310: 74 20 30 0a 20 20 20 20 20 20 20 20 73 65 74 20  t 0.        set 
4320: 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76  rc [catch {db ev
4330: 61 6c 20 5b 6c 69 6e 64 65 78 20 24 76 20 31 5d  al [lindex $v 1]
4340: 7d 20 6d 73 67 5d 20 20 20 3b 23 20 54 72 75 65  } msg]   ;# True
4350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
4360: 20 20 20 20 20 20 73 65 74 20 6e 61 63 20 5b 73        set nac [s
4370: 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
4380: 6f 6d 6d 69 74 20 24 3a 3a 44 42 5d 20 20 20 20  ommit $::DB]    
4390: 20 20 20 3b 23 20 4e 65 77 20 41 75 74 6f 2d 43     ;# New Auto-C
43a0: 6f 6d 6d 69 74 20 0a 0a 20 20 20 20 20 20 20 20  ommit ..        
43b0: 69 66 20 7b 24 72 63 20 21 3d 20 30 20 26 26 20  if {$rc != 0 && 
43c0: 24 6e 61 63 20 26 26 20 21 24 61 63 7d 20 7b 0a  $nac && !$ac} {.
43d0: 20 20 20 20 20 20 20 20 20 20 23 20 42 65 66 6f            # Befo
43e0: 72 65 20 5b 64 62 20 65 76 61 6c 5d 20 74 68 65  re [db eval] the
43f0: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
4400: 67 20 77 61 73 20 63 6c 65 61 72 2e 20 4e 6f 77  g was clear. Now
4410: 20 69 74 0a 20 20 20 20 20 20 20 20 20 20 23 20   it.          # 
4420: 69 73 20 73 65 74 2e 20 53 69 6e 63 65 20 61 6e  is set. Since an
4430: 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
4440: 65 20 61 73 73 75 6d 65 20 74 68 69 73 20 77 61  e assume this wa
4450: 73 20 6e 6f 74 20 61 0a 20 20 20 20 20 20 20 20  s not a.        
4460: 20 20 23 20 63 6f 6d 6d 69 74 20 2d 20 74 68 65    # commit - the
4470: 72 65 66 6f 72 65 20 61 20 72 6f 6c 6c 62 61 63  refore a rollbac
4480: 6b 20 6f 63 63 75 72 65 64 2e 20 43 68 65 63 6b  k occured. Check
4490: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
44a0: 20 20 20 20 23 20 72 6f 6c 6c 62 61 63 6b 2d 68      # rollback-h
44b0: 6f 6f 6b 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e  ook was invoked.
44c0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 5f 74 65  .          do_te
44d0: 73 74 20 6d 61 6c 6c 6f 63 33 2d 72 6f 6c 6c 62  st malloc3-rollb
44e0: 61 63 6b 5f 68 6f 6f 6b 2e 24 69 74 65 72 69 64  ack_hook.$iterid
44f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
4500: 65 74 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f  et ::rollback_ho
4510: 6f 6b 5f 63 6f 75 6e 74 0a 20 20 20 20 20 20 20  ok_count.       
4520: 20 20 20 7d 20 7b 31 7d 0a 20 20 20 20 20 20 20     } {1}.       
4530: 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20   }..        set 
4540: 6e 46 61 69 6c 20 5b 73 71 6c 69 74 65 33 5f 6d  nFail [sqlite3_m
4550: 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 2d 31 20  emdebug_fail -1 
4560: 2d 62 65 6e 69 67 6e 63 6e 74 20 6e 42 65 6e 69  -benigncnt nBeni
4570: 67 6e 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  gn].        if {
4580: 24 72 63 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20  $rc == 0} {.    
4590: 20 20 20 20 20 20 20 20 23 20 53 75 63 63 65 73          # Succes
45a0: 73 66 75 6c 20 65 78 65 63 75 74 69 6f 6e 20 6f  sful execution o
45b0: 66 20 73 71 6c 2e 20 54 68 65 20 6e 75 6d 62 65  f sql. The numbe
45c0: 72 20 6f 66 20 66 61 69 6c 65 64 20 6d 61 6c 6c  r of failed mall
45d0: 6f 63 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  oc().           
45e0: 20 23 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20   # calls should 
45f0: 62 65 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  be equal to the 
4600: 6e 75 6d 62 65 72 20 6f 66 20 62 65 6e 69 67 6e  number of benign
4610: 20 66 61 69 6c 75 72 65 73 2e 0a 20 20 20 20 20   failures..     
4620: 20 20 20 20 20 20 20 23 20 4f 74 68 65 72 77 69         # Otherwi
4630: 73 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  se a malloc() fa
4640: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  iled and the err
4650: 6f 72 20 77 61 73 20 6e 6f 74 20 72 65 70 6f 72  or was not repor
4660: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ted..           
4670: 20 23 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   # .            
4680: 69 66 20 7b 24 6e 46 61 69 6c 21 3d 24 6e 42 65  if {$nFail!=$nBe
4690: 6e 69 67 6e 7d 20 7b 0a 20 20 20 20 20 20 20 20  nign} {.        
46a0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 55 6e 72        error "Unr
46b0: 65 70 6f 72 74 65 64 20 6d 61 6c 6c 6f 63 28 29  eported malloc()
46c0: 20 66 61 69 6c 75 72 65 22 0a 20 20 20 20 20 20   failure".      
46d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
46e0: 20 20 20 20 20 69 66 20 7b 24 61 63 20 26 26 20       if {$ac && 
46f0: 21 24 6e 61 63 7d 20 7b 0a 20 20 20 20 20 20 20  !$nac} {.       
4700: 20 20 20 20 20 20 20 23 20 42 65 66 6f 72 65 20         # Before 
4710: 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 74 68  the [db eval] th
4720: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
4730: 61 67 20 77 61 73 20 73 65 74 2c 20 6e 6f 77 20  ag was set, now 
4740: 69 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  it.             
4750: 20 23 20 69 73 20 63 6c 65 61 72 2e 20 57 65 20   # is clear. We 
4760: 63 61 6e 20 64 65 64 75 63 65 20 74 68 61 74 20  can deduce that 
4770: 61 20 22 42 45 47 49 4e 22 20 73 74 61 74 65 6d  a "BEGIN" statem
4780: 65 6e 74 20 68 61 73 20 6a 75 73 74 0a 20 20 20  ent has just.   
4790: 20 20 20 20 20 20 20 20 20 20 20 23 20 62 65 65             # bee
47a0: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  n successfully e
47b0: 78 65 63 75 74 65 64 2e 0a 20 20 20 20 20 20 20  xecuted..       
47c0: 20 20 20 20 20 20 20 73 65 74 20 62 65 67 69 6e         set begin
47d0: 5f 70 63 20 24 70 63 0a 20 20 20 20 20 20 20 20  _pc $pc.        
47e0: 20 20 20 20 7d 20 0a 0a 20 20 20 20 20 20 20 20      } ..        
47f0: 20 20 20 20 69 6e 63 72 20 70 63 0a 20 20 20 20      incr pc.    
4800: 20 20 20 20 20 20 20 20 73 65 74 20 69 46 61 69          set iFai
4810: 6c 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  l 1.            
4820: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
4830: 22 6d 61 6c 6c 6f 63 33 2d 28 69 6e 74 65 67 72  "malloc3-(integr
4840: 69 74 79 29 2e 24 69 74 65 72 69 64 22 0a 20 20  ity).$iterid".  
4850: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
4860: 5b 72 65 67 65 78 70 20 7b 2e 2a 6f 75 74 20 6f  [regexp {.*out o
4870: 66 20 6d 65 6d 6f 72 79 7d 20 24 6d 73 67 5d 20  f memory} $msg] 
4880: 7c 7c 20 5b 64 62 20 65 72 72 6f 72 63 6f 64 65  || [db errorcode
4890: 5d 20 3d 3d 20 33 30 38 32 7d 20 7b 0a 20 20 20  ] == 3082} {.   
48a0: 20 20 20 20 20 20 20 20 20 23 20 4f 75 74 20 6f           # Out o
48b0: 66 20 6d 65 6d 6f 72 79 20 65 72 72 6f 72 2c 20  f memory error, 
48c0: 61 73 20 65 78 70 65 63 74 65 64 2e 0a 20 20 20  as expected..   
48d0: 20 20 20 20 20 20 20 20 20 23 0a 20 20 20 20 20           #.     
48e0: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
48f0: 5f 63 68 65 63 6b 20 22 6d 61 6c 6c 6f 63 33 2d  _check "malloc3-
4900: 28 69 6e 74 65 67 72 69 74 79 29 2e 24 69 74 65  (integrity).$ite
4910: 72 69 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  rid".           
4920: 20 69 6e 63 72 20 69 46 61 69 6c 0a 20 20 20 20   incr iFail.    
4930: 20 20 20 20 20 20 20 20 69 66 20 7b 24 6e 61 63          if {$nac
4940: 20 26 26 20 21 24 61 63 7d 20 7b 0a 0a 20 20 20   && !$ac} {..   
4950: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
4960: 5b 6c 69 6e 64 65 78 20 24 76 20 30 5d 20 26 26  [lindex $v 0] &&
4970: 20 5b 64 62 20 65 72 72 6f 72 63 6f 64 65 5d 20   [db errorcode] 
4980: 21 3d 20 33 30 38 32 7d 20 7b 0a 20 20 20 20 20  != 3082} {.     
4990: 20 20 20 20 20 20 20 20 20 20 20 23 20 65 72 72             # err
49a0: 6f 72 20 22 53 74 61 74 65 6d 65 6e 74 20 5c 22  or "Statement \"
49b0: 5b 6c 69 6e 64 65 78 20 24 76 20 31 5d 5c 22 20  [lindex $v 1]\" 
49c0: 63 61 75 73 65 64 20 61 20 72 6f 6c 6c 62 61 63  caused a rollbac
49d0: 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k".             
49e0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
49f0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 24 62 65    for {set i $be
4a00: 67 69 6e 5f 70 63 7d 20 7b 24 69 20 3c 20 24 70  gin_pc} {$i < $p
4a10: 63 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  c} {incr i} {.  
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4a30: 74 20 6b 32 20 5b 6c 69 6e 64 65 78 20 24 61 72  t k2 [lindex $ar
4a40: 67 6c 69 73 74 20 5b 65 78 70 72 20 32 20 2a 20  glist [expr 2 * 
4a50: 24 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  $i]].           
4a60: 20 20 20 20 20 73 65 74 20 76 32 20 5b 6c 69 6e       set v2 [lin
4a70: 64 65 78 20 24 61 72 67 6c 69 73 74 20 5b 65 78  dex $arglist [ex
4a80: 70 72 20 32 20 2a 20 24 69 20 2b 20 31 5d 5d 0a  pr 2 * $i + 1]].
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 73 65 74 20 63 61 74 63 68 75 70 73 71 6c 20 22  set catchupsql "
4ab0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
4ac0: 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6b 32 20    switch -- $k2 
4ad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4ae0: 20 20 20 20 2d 73 71 6c 20 20 7b 73 65 74 20 63      -sql  {set c
4af0: 61 74 63 68 75 70 73 71 6c 20 5b 6c 69 6e 64 65  atchupsql [linde
4b00: 78 20 24 76 32 20 31 5d 7d 0a 20 20 20 20 20 20  x $v2 1]}.      
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 2d 70 72 65              -pre
4b20: 70 20 7b 73 65 74 20 63 61 74 63 68 75 70 73 71  p {set catchupsq
4b30: 6c 20 24 76 32 7d 0a 20 20 20 20 20 20 20 20 20  l $v2}.         
4b40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b50: 20 20 20 20 20 20 20 20 20 64 62 20 65 76 61 6c           db eval
4b60: 20 24 63 61 74 63 68 75 70 73 71 6c 0a 20 20 20   $catchupsql.   
4b70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4b80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4b90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
4ba0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 24 6d          error $m
4bb0: 73 67 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  sg.        }..  
4bc0: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 6c 69        while {[li
4bd0: 6e 64 65 78 20 24 61 72 67 6c 69 73 74 20 5b 65  ndex $arglist [e
4be0: 78 70 72 20 32 20 2a 20 28 24 70 63 20 2d 31 29  xpr 2 * ($pc -1)
4bf0: 5d 5d 20 3d 3d 20 22 2d 74 65 73 74 22 7d 20 7b  ]] == "-test"} {
4c00: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20  .          incr 
4c10: 70 63 20 2d 31 0a 20 20 20 20 20 20 20 20 7d 0a  pc -1.        }.
4c20: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2d        }..      -
4c30: 70 72 65 70 20 7b 0a 20 20 20 20 20 20 20 20 64  prep {.        d
4c40: 62 20 65 76 61 6c 20 24 76 0a 20 20 20 20 20 20  b eval $v.      
4c50: 20 20 69 6e 63 72 20 70 63 0a 20 20 20 20 20 20    incr pc.      
4c60: 7d 0a 0a 20 20 20 20 20 20 2d 64 65 62 75 67 20  }..      -debug 
4c70: 7b 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 24  {.        eval $
4c80: 76 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 70  v.        incr p
4c90: 63 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  c.      }..     
4ca0: 20 64 65 66 61 75 6c 74 20 7b 20 65 72 72 6f 72   default { error
4cb0: 20 22 55 6e 6b 6e 6f 77 6e 20 73 77 69 74 63 68   "Unknown switch
4cc0: 3a 20 24 6b 22 20 7d 0a 20 20 20 20 7d 0a 20 20  : $k" }.    }.  
4cd0: 7d 0a 7d 0a 0a 23 20 54 75 72 6e 20 6f 66 20 74  }.}..# Turn of t
4ce0: 68 65 20 54 63 6c 20 69 6e 74 65 72 66 61 63 65  he Tcl interface
4cf0: 27 73 20 70 72 65 70 61 72 65 64 20 73 74 61 74  's prepared stat
4d00: 65 6d 65 6e 74 20 63 61 63 68 69 6e 67 20 66 61  ement caching fa
4d10: 63 69 6c 69 74 79 2e 20 54 68 65 6e 0a 23 20 72  cility. Then.# r
4d20: 75 6e 20 74 68 65 20 74 65 73 74 73 20 77 69 74  un the tests wit
4d30: 68 20 22 70 65 72 73 69 73 74 65 6e 74 22 20 6d  h "persistent" m
4d40: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 2e 0a  alloc failures..
4d50: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
4d60: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62  _result_codes db
4d70: 20 31 0a 64 62 20 63 61 63 68 65 20 73 69 7a 65   1.db cache size
4d80: 20 30 0a 72 75 6e 5f 74 65 73 74 20 24 3a 3a 72   0.run_test $::r
4d90: 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20 31  un_test_script 1
4da0: 0a 0a 23 20 43 6c 6f 73 65 20 61 6e 64 20 72 65  ..# Close and re
4db0: 6f 70 65 6e 20 74 68 65 20 64 62 2e 0a 64 62 20  open the db..db 
4dc0: 63 6c 6f 73 65 0a 66 69 6c 65 20 64 65 6c 65 74  close.file delet
4dd0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
4de0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
4df0: 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e   test2.db test2.
4e00: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74  db-journal.sqlit
4e10: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73 71  e3 db test.db.sq
4e20: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
4e30: 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62 20 31  esult_codes db 1
4e40: 0a 73 65 74 20 3a 3a 44 42 20 5b 73 71 6c 69 74  .set ::DB [sqlit
4e50: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
4e60: 69 6e 74 65 72 20 64 62 5d 0a 0a 23 20 54 75 72  inter db]..# Tur
4e70: 6e 20 6f 66 20 74 68 65 20 54 63 6c 20 69 6e 74  n of the Tcl int
4e80: 65 72 66 61 63 65 27 73 20 70 72 65 70 61 72 65  erface's prepare
4e90: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
4ea0: 69 6e 67 20 66 61 63 69 6c 69 74 79 20 69 6e 0a  ing facility in.
4eb0: 23 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 6e 65  # the new connne
4ec0: 63 74 69 6f 6e 2e 20 54 68 65 6e 20 72 75 6e 20  ction. Then run 
4ed0: 74 68 65 20 74 65 73 74 73 20 77 69 74 68 20 22  the tests with "
4ee0: 74 72 61 6e 73 69 65 6e 74 22 20 6d 61 6c 6c 6f  transient" mallo
4ef0: 63 20 66 61 69 6c 75 72 65 73 2e 0a 64 62 20 63  c failures..db c
4f00: 61 63 68 65 20 73 69 7a 65 20 30 0a 72 75 6e 5f  ache size 0.run_
4f10: 74 65 73 74 20 24 3a 3a 72 75 6e 5f 74 65 73 74  test $::run_test
4f20: 5f 73 63 72 69 70 74 20 30 0a 0a 73 71 6c 69 74  _script 0..sqlit
4f30: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c  e3_memdebug_fail
4f40: 20 2d 31 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a   -1.finish_test.