/ Hex Artifact Content
Login

Artifact e3b32c724b5a124b57cb0ed177f675249ad0c66a:


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 34 20 32 30 30 38 2f 31 30 2f 31 34   1.24 2008/10/14
0240: 20 31 35 3a 35 34 3a 30 38 20 64 72 68 20 45 78   15:54:08 drh Ex
0250: 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72  p $..set testdir
0260: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0270: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0280: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0290: 6c 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  l.source $testdi
02a0: 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d 6f 6e 2e  r/malloc_common.
02b0: 74 63 6c 0a 0a 23 20 4f 6e 6c 79 20 72 75 6e 20  tcl..# Only run 
02c0: 74 68 65 73 65 20 74 65 73 74 73 20 69 66 20 6d  these tests if m
02d0: 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67 20  emory debugging 
02e0: 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 23 0a  is turned on..#.
02f0: 69 66 20 7b 21 24 4d 45 4d 44 45 42 55 47 7d 20  if {!$MEMDEBUG} 
0300: 7b 0a 20 20 20 70 75 74 73 20 22 53 6b 69 70 70  {.   puts "Skipp
0310: 69 6e 67 20 6d 61 6c 6c 6f 63 33 20 74 65 73 74  ing malloc3 test
0320: 73 3a 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 64 20  s: not compiled 
0330: 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 4d 45  with -DSQLITE_ME
0340: 4d 44 45 42 55 47 2e 2e 2e 22 0a 20 20 20 66 69  MDEBUG...".   fi
0350: 6e 69 73 68 5f 74 65 73 74 0a 20 20 20 72 65 74  nish_test.   ret
0360: 75 72 6e 0a 7d 0a 0a 0a 23 20 44 6f 20 6e 6f 74  urn.}...# Do not
0370: 20 72 75 6e 20 74 68 65 73 65 20 74 65 73 74 73   run these tests
0380: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
0390: 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 23 20  ry journal..#.# 
03a0: 49 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  In the pager lay
03b0: 65 72 2c 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  er, if an IO or 
03c0: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
03d0: 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
03e0: 43 4b 2c 20 6f 72 0a 23 20 77 68 65 6e 20 66 6c  CK, or.# when fl
03f0: 75 73 68 69 6e 67 20 61 20 70 61 67 65 20 74 6f  ushing a page to
0400: 20 64 69 73 6b 20 64 75 65 20 74 6f 20 63 61 63   disk due to cac
0410: 68 65 2d 73 74 72 65 73 73 2c 20 74 68 65 20 70  he-stress, the p
0420: 61 67 65 72 20 65 6e 74 65 72 73 20 61 6e 0a 23  ager enters an.#
0430: 20 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 20   "error state". 
0440: 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 6f 75 74  The only way out
0450: 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 73 74   of the error st
0460: 61 74 65 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b  ate is to unlock
0470: 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20   the.# database 
0480: 66 69 6c 65 20 61 6e 64 20 65 6e 64 20 74 68 65  file and end the
0490: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6c 65   transaction, le
04a0: 61 76 69 6e 67 20 77 68 61 74 65 76 65 72 20 6a  aving whatever j
04b0: 6f 75 72 6e 61 6c 20 61 6e 64 0a 23 20 64 61 74  ournal and.# dat
04c0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 70 70  abase files happ
04d0: 65 6e 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b  en to be on disk
04e0: 20 69 6e 20 70 6c 61 63 65 2e 20 54 68 65 20 6e   in place. The n
04f0: 65 78 74 20 74 69 6d 65 20 74 68 65 20 63 75 72  ext time the cur
0500: 72 65 6e 74 0a 23 20 28 6f 72 20 61 6e 79 20 6f  rent.# (or any o
0510: 74 68 65 72 29 20 63 6f 6e 6e 65 63 74 69 6f 6e  ther) connection
0520: 20 6f 70 65 6e 73 20 61 20 72 65 61 64 20 74 72   opens a read tr
0530: 61 6e 73 61 63 74 69 6f 6e 2c 20 68 6f 74 2d 6a  ansaction, hot-j
0540: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
0550: 23 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  # is performed i
0560: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 23 0a 23  f necessary..#.#
0570: 20 4f 66 20 63 6f 75 72 73 65 2c 20 74 68 69 73   Of course, this
0580: 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 77 69   doesn't work wi
0590: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
05a0: 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 69 66 20 7b 5b  journal..#.if {[
05b0: 70 65 72 6d 75 74 61 74 69 6f 6e 5d 3d 3d 22 69  permutation]=="i
05c0: 6e 6d 65 6d 6f 72 79 5f 6a 6f 75 72 6e 61 6c 22  nmemory_journal"
05d0: 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73  } {.  finish_tes
05e0: 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d  t.  return.}..#-
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 4f 54 45  ---------.# NOTE
0640: 53 20 4f 4e 20 52 45 43 4f 56 45 52 49 4e 47 20  S ON RECOVERING 
0650: 46 52 4f 4d 20 41 20 4d 41 4c 4c 4f 43 20 46 41  FROM A MALLOC FA
0660: 49 4c 55 52 45 0a 23 20 0a 23 20 54 68 65 20 74  ILURE.# .# The t
0670: 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
0680: 65 20 74 65 73 74 20 74 68 65 20 62 65 68 61 76  e test the behav
0690: 69 6f 75 72 73 20 64 65 73 63 72 69 62 65 64 20  iours described 
06a0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
06b0: 0a 23 20 70 61 72 61 67 72 61 70 68 73 2e 20 54  .# paragraphs. T
06c0: 68 65 73 65 20 74 65 73 74 73 20 74 65 73 74 20  hese tests test 
06d0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
06e0: 20 74 68 65 20 73 79 73 74 65 6d 20 77 68 65 6e   the system when
06f0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 0a   malloc() fails.
0700: 23 20 69 6e 73 69 64 65 20 6f 66 20 61 20 63 61  # inside of a ca
0710: 6c 6c 20 74 6f 20 5f 70 72 65 70 61 72 65 28 29  ll to _prepare()
0720: 2c 20 5f 73 74 65 70 28 29 2c 20 5f 66 69 6e 61  , _step(), _fina
0730: 6c 69 7a 65 28 29 20 6f 72 20 5f 72 65 73 65 74  lize() or _reset
0740: 28 29 2e 20 54 68 65 0a 23 20 68 61 6e 64 6c 69  (). The.# handli
0750: 6e 67 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 66  ng of malloc() f
0760: 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e 20 61  ailures within a
0770: 6e 63 69 6c 6c 61 72 79 20 70 72 6f 63 65 64 75  ncillary procedu
0780: 72 65 73 20 69 73 20 74 65 73 74 65 64 0a 23 20  res is tested.# 
0790: 65 6c 73 65 77 68 65 72 65 2e 0a 23 0a 23 20 4f  elsewhere..#.# O
07a0: 76 65 72 76 69 65 77 3a 0a 23 0a 23 20 45 78 65  verview:.#.# Exe
07b0: 63 75 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65  cuting a stateme
07c0: 6e 74 20 69 73 20 64 6f 6e 65 20 69 6e 20 74 68  nt is done in th
07d0: 72 65 65 20 73 74 61 67 65 73 20 28 70 72 65 70  ree stages (prep
07e0: 61 72 65 2c 20 73 74 65 70 20 61 6e 64 20 66 69  are, step and fi
07f0: 6e 61 6c 69 7a 65 29 2e 20 41 0a 23 20 6d 61 6c  nalize). A.# mal
0800: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6d 61  loc() failure ma
0810: 79 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61  y occur within a
0820: 6e 79 20 73 74 61 67 65 2e 20 49 66 20 61 20 6d  ny stage. If a m
0830: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0840: 20 66 61 69 6c 73 0a 23 20 64 75 72 69 6e 67 20   fails.# during 
0850: 73 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72  statement prepar
0860: 61 74 69 6f 6e 2c 20 6e 6f 20 73 74 61 74 65 6d  ation, no statem
0870: 65 6e 74 20 68 61 6e 64 6c 65 20 69 73 20 72 65  ent handle is re
0880: 74 75 72 6e 65 64 2e 20 46 72 6f 6d 20 74 68 65  turned. From the
0890: 20 75 73 65 72 73 0a 23 20 70 6f 69 6e 74 20 6f   users.# point o
08a0: 66 20 76 69 65 77 20 74 68 65 20 73 79 73 74 65  f view the syste
08b0: 6d 20 73 74 61 74 65 20 69 73 20 61 73 20 69 66  m state is as if
08c0: 20 5f 70 72 65 70 61 72 65 28 29 20 68 61 64 20   _prepare() had 
08d0: 6e 65 76 65 72 20 62 65 65 6e 20 63 61 6c 6c 65  never been calle
08e0: 64 2e 0a 23 0a 23 20 49 66 20 74 68 65 20 6d 65  d..#.# If the me
08f0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0900: 66 61 69 6c 73 20 64 75 72 69 6e 67 20 74 68 65  fails during the
0910: 20 5f 73 74 65 70 28 29 20 6f 72 20 5f 66 69 6e   _step() or _fin
0920: 61 6c 69 7a 65 28 29 20 63 61 6c 6c 73 2c 20 74  alize() calls, t
0930: 68 65 6e 0a 23 20 74 68 65 20 64 61 74 61 62 61  hen.# the databa
0940: 73 65 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  se may be left i
0950: 6e 20 6f 6e 65 20 6f 66 20 74 77 6f 20 73 74 61  n one of two sta
0960: 74 65 73 20 28 61 66 74 65 72 20 66 69 6e 61 6c  tes (after final
0970: 69 7a 65 28 29 20 68 61 73 20 62 65 65 6e 0a 23  ize() has been.#
0980: 20 63 61 6c 6c 65 64 29 3a 0a 23 0a 23 20 20 20   called):.#.#   
0990: 20 20 2a 20 41 73 20 69 66 20 74 68 65 20 6e 65    * As if the ne
09a0: 69 74 68 65 72 20 5f 73 74 65 70 28 29 20 6e 6f  ither _step() no
09b0: 72 20 5f 66 69 6e 61 6c 69 7a 65 28 29 20 68 61  r _finalize() ha
09c0: 64 20 65 76 65 72 20 62 65 65 6e 20 63 61 6c 6c  d ever been call
09d0: 65 64 20 6f 6e 0a 23 20 20 20 20 20 20 20 74 68  ed on.#       th
09e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
09f0: 6c 65 20 28 69 2e 65 2e 20 61 6e 79 20 63 68 61  le (i.e. any cha
0a00: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
0a10: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 0a 23   statement are.#
0a20: 20 20 20 20 20 20 20 72 6f 6c 6c 65 64 20 62 61         rolled ba
0a30: 63 6b 29 2e 0a 23 20 20 20 20 20 2a 20 54 68 65  ck)..#     * The
0a40: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
0a50: 74 69 6f 6e 20 6d 61 79 20 62 65 20 72 6f 6c 6c  tion may be roll
0a60: 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
0a70: 20 63 61 73 65 20 61 20 68 6f 74 2d 6a 6f 75 72   case a hot-jour
0a80: 6e 61 6c 0a 23 20 20 20 20 20 20 20 6d 61 79 20  nal.#       may 
0a90: 6f 72 20 6d 61 79 20 6e 6f 74 20 61 63 74 75 61  or may not actua
0aa0: 6c 6c 79 20 62 65 20 70 72 65 73 65 6e 74 20 69  lly be present i
0ab0: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
0ac0: 2e 0a 23 0a 23 20 54 68 65 20 63 61 6c 6c 65 72  ..#.# The caller
0ad0: 20 63 61 6e 20 74 65 6c 6c 20 74 68 65 20 64 69   can tell the di
0ae0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
0af0: 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
0b00: 72 69 6f 73 20 62 79 20 69 6e 76 6f 6b 69 6e 67  rios by invoking
0b10: 0a 23 20 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  .# _get_autocomm
0b20: 69 74 28 29 2e 0a 23 0a 23 0a 23 20 48 61 6e 64  it()..#.#.# Hand
0b30: 6c 69 6e 67 20 6f 66 20 73 71 6c 69 74 65 33 5f  ling of sqlite3_
0b40: 72 65 73 65 74 28 29 3a 0a 23 0a 23 20 49 66 20  reset():.#.# If 
0b50: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
0b60: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
0b70: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65   an sqlite3_rese
0b80: 74 28 29 20 63 61 6c 6c 2c 20 74 68 69 73 20 69  t() call, this i
0b90: 73 20 68 61 6e 64 6c 65 64 0a 23 20 69 6e 20 74  s handled.# in t
0ba0: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 61  he same way as a
0bb0: 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
0bc0: 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 54 68 65  _finalize(). The
0bd0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
0be0: 65 0a 23 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  e.# is not delet
0bf0: 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 70  ed and must be p
0c00: 61 73 73 65 64 20 74 6f 20 5f 66 69 6e 61 6c 69  assed to _finali
0c10: 7a 65 28 29 20 66 6f 72 20 72 65 73 6f 75 72 63  ze() for resourc
0c20: 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  e deallocation..
0c30: 23 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  # Attempting to 
0c40: 5f 73 74 65 70 28 29 20 6f 72 20 5f 72 65 73 65  _step() or _rese
0c50: 74 28 29 20 74 68 65 20 73 74 61 74 65 6d 65 6e  t() the statemen
0c60: 74 20 61 66 74 65 72 20 61 20 66 61 69 6c 65 64  t after a failed
0c70: 20 5f 72 65 73 65 74 28 29 20 77 69 6c 6c 0a 23   _reset() will.#
0c80: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   always return S
0c90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 23 0a 23  QLITE_NOMEM..#.#
0ca0: 0a 23 20 4f 74 68 65 72 20 61 63 74 69 76 65 20  .# Other active 
0cb0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a  SQL statements:.
0cc0: 23 0a 23 20 54 68 65 20 65 66 66 65 63 74 20 6f  #.# The effect o
0cd0: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
0ce0: 72 65 20 6f 6e 20 63 6f 6e 63 75 72 72 65 6e 74  re on concurrent
0cf0: 6c 79 20 65 78 65 63 75 74 69 6e 67 20 53 51 4c  ly executing SQL
0d00: 20 73 74 61 74 65 6d 65 6e 74 73 2c 0a 23 20 70   statements,.# p
0d10: 61 72 74 69 63 75 6c 61 72 6c 79 20 77 68 65 6e  articularly when
0d20: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
0d30: 73 20 65 78 65 63 75 74 69 6e 67 20 77 69 74 68  s executing with
0d40: 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
0d50: 44 20 73 65 74 20 61 6e 64 0a 23 20 74 68 65 20  D set and.# the 
0d60: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
0d70: 20 6d 61 6e 64 61 74 65 73 20 73 74 61 74 65 6d   mandates statem
0d80: 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 6f 6e 6c  ent rollback onl
0d90: 79 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 69 66  y. Currently, if
0da0: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  .# transaction r
0db0: 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
0dc0: 72 65 64 2c 20 61 6c 6c 20 6f 74 68 65 72 20 76  red, all other v
0dd0: 64 62 65 27 73 20 61 72 65 20 61 62 6f 72 74 65  dbe's are aborte
0de0: 64 2e 0a 23 0a 23 20 20 20 20 20 4e 6f 6e 2d 74  d..#.#     Non-t
0df0: 72 61 6e 73 69 65 6e 74 20 6d 61 6c 6c 6f 63 73  ransient mallocs
0e00: 20 69 6e 20 62 74 72 65 65 2e 63 3a 0a 23 20 20   in btree.c:.#  
0e10: 20 20 20 20 20 20 20 2a 20 54 68 65 20 42 74 72         * The Btr
0e20: 65 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ee structure its
0e30: 65 6c 66 0a 23 20 20 20 20 20 20 20 20 20 2a 20  elf.#         * 
0e40: 45 61 63 68 20 42 74 43 75 72 73 6f 72 20 73 74  Each BtCursor st
0e50: 72 75 63 74 75 72 65 0a 23 0a 23 20 20 20 20 20  ructure.#.#     
0e60: 4d 61 6c 6c 6f 63 73 20 69 6e 20 70 61 67 65 72  Mallocs in pager
0e70: 2e 63 3a 0a 23 20 20 20 20 20 20 20 20 20 72 65  .c:.#         re
0e80: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
0e90: 29 20 20 2d 20 53 70 61 63 65 20 74 6f 20 72 65  )  - Space to re
0ea0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
0eb0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 23 20 20 20 20  urnal name.#    
0ec0: 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61       pager_delma
0ed0: 73 74 65 72 28 29 20 20 20 20 2d 20 53 70 61 63  ster()    - Spac
0ee0: 65 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  e for the entire
0ef0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
0f00: 66 69 6c 65 0a 23 0a 23 20 20 20 20 20 20 20 20  file.#.#        
0f10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
0f20: 65 6e 28 29 20 20 2d 20 54 68 65 20 70 61 67 65  en()  - The page
0f30: 72 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  r structure itse
0f40: 6c 66 0a 23 20 20 20 20 20 20 20 20 20 73 71 6c  lf.#         sql
0f50: 69 74 65 33 5f 70 61 67 65 72 67 65 74 28 29 20  ite3_pagerget() 
0f60: 20 20 2d 20 53 70 61 63 65 20 66 6f 72 20 61 20    - Space for a 
0f70: 6e 65 77 20 70 61 67 65 0a 23 20 20 20 20 20 20  new page.#      
0f80: 20 20 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f     pager_open_jo
0f90: 75 72 6e 61 6c 28 29 20 2d 20 50 61 67 65 72 2e  urnal() - Pager.
0fa0: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20 62 69 74  aInJournal[] bit
0fb0: 6d 61 70 0a 23 20 20 20 20 20 20 20 20 20 73 71  map.#         sq
0fc0: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0fd0: 28 29 20 2d 20 46 6f 72 20 69 6e 2d 6d 65 6d 6f  () - For in-memo
0fe0: 72 79 20 64 61 74 61 62 61 73 65 73 20 6f 6e 6c  ry databases onl
0ff0: 79 3a 20 68 69 73 74 6f 72 79 20 70 61 67 65 20  y: history page 
1000: 61 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  and.#           
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 68       statement h
1030: 69 73 74 6f 72 79 20 70 61 67 65 2e 0a 23 20 20  istory page..#  
1040: 20 20 20 20 20 20 20 70 61 67 65 72 5f 73 74 6d         pager_stm
1050: 74 5f 62 65 67 69 6e 28 29 20 20 20 2d 20 50 61  t_begin()   - Pa
1060: 67 65 72 2e 61 49 6e 53 74 6d 74 5b 5d 20 62 69  ger.aInStmt[] bi
1070: 74 6d 61 70 0a 23 0a 23 20 4e 6f 6e 65 20 6f 66  tmap.#.# None of
1080: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 61   the above are a
1090: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 54   huge problem. T
10a0: 68 65 20 6d 6f 73 74 20 74 72 6f 75 62 6c 65 73  he most troubles
10b0: 6f 6d 65 20 66 61 69 6c 75 72 65 73 20 61 72 65  ome failures are
10c0: 20 74 68 65 0a 23 20 74 72 61 6e 73 69 65 6e 74   the.# transient
10d0: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 73 20   malloc() calls 
10e0: 69 6e 20 62 74 72 65 65 2e 63 2c 20 77 68 69 63  in btree.c, whic
10f0: 68 20 63 61 6e 20 6f 63 63 75 72 20 64 75 72 69  h can occur duri
1100: 6e 67 20 74 68 65 20 74 72 65 65 2d 62 61 6c 61  ng the tree-bala
1110: 6e 63 65 0a 23 20 6f 70 65 72 61 74 69 6f 6e 2e  nce.# operation.
1120: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
1130: 74 72 65 65 20 62 65 69 6e 67 20 62 61 6c 61 6e  tree being balan
1140: 63 65 64 20 77 69 6c 6c 20 62 65 20 69 6e 74 65  ced will be inte
1150: 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
1160: 65 6e 74 0a 23 20 61 66 74 65 72 20 74 68 65 20  ent.# after the 
1170: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 20  malloc() fails. 
1180: 54 6f 20 61 76 6f 69 64 20 74 68 65 20 63 6f 72  To avoid the cor
1190: 72 75 70 74 20 74 72 65 65 20 62 65 69 6e 67 20  rupt tree being 
11a0: 72 65 61 64 20 62 79 20 61 0a 23 20 52 45 41 44  read by a.# READ
11b0: 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 71 75 65  _UNCOMMITTED que
11c0: 72 79 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ry, we have to m
11d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 72 61  ake sure the tra
11e0: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74  nsaction or stat
11f0: 65 6d 65 6e 74 0a 23 20 72 6f 6c 6c 62 61 63 6b  ement.# rollback
1200: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 73   occurs before s
1210: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 72 65  qlite3_step() re
1220: 74 75 72 6e 73 2c 20 6e 6f 74 20 64 75 72 69 6e  turns, not durin
1230: 67 20 61 20 73 75 62 73 65 71 75 65 6e 74 0a 23  g a subsequent.#
1240: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1250: 65 28 29 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e()..#----------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12f0: 4e 4f 54 45 53 20 4f 4e 20 54 45 53 54 20 49 4d  NOTES ON TEST IM
1300: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 0a 23 0a 23  PLEMENTATION.#.#
1310: 20 54 68 65 20 74 65 73 74 73 20 69 6e 20 74 68   The tests in th
1320: 69 73 20 66 69 6c 65 20 61 72 65 20 69 6d 70 6c  is file are impl
1330: 65 6d 65 6e 74 65 64 20 64 69 66 66 65 72 65 6e  emented differen
1340: 74 6c 79 20 66 72 6f 6d 20 74 68 6f 73 65 20 69  tly from those i
1350: 6e 20 6f 74 68 65 72 0a 23 20 66 69 6c 65 73 2e  n other.# files.
1360: 20 49 6e 73 74 65 61 64 2c 20 74 65 73 74 73 20   Instead, tests 
1370: 61 72 65 20 73 70 65 63 69 66 69 65 64 20 75 73  are specified us
1380: 69 6e 67 20 74 68 72 65 65 20 70 72 69 6d 69 74  ing three primit
1390: 69 76 65 73 3a 20 53 51 4c 2c 20 50 52 45 50 20  ives: SQL, PREP 
13a0: 61 6e 64 0a 23 20 54 45 53 54 2e 20 45 61 63 68  and.# TEST. Each
13b0: 20 70 72 69 6d 69 74 69 76 65 20 68 61 73 20 61   primitive has a
13c0: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
13d0: 2e 20 50 72 69 6d 69 74 69 76 65 73 20 61 72 65  . Primitives are
13e0: 20 70 72 6f 63 65 73 73 65 64 20 69 6e 0a 23 20   processed in.# 
13f0: 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61  the order they a
1400: 72 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  re specified in 
1410: 74 68 65 20 66 69 6c 65 2e 0a 23 0a 23 20 41 20  the file..#.# A 
1420: 54 45 53 54 20 70 72 69 6d 69 74 69 76 65 20 73  TEST primitive s
1430: 70 65 63 69 66 69 65 73 20 61 20 54 43 4c 20 73  pecifies a TCL s
1440: 63 72 69 70 74 20 61 73 20 69 74 73 20 61 72 67  cript as its arg
1450: 75 6d 65 6e 74 2e 20 57 68 65 6e 20 61 20 54 45  ument. When a TE
1460: 53 54 0a 23 20 64 69 72 65 63 74 69 76 65 20 69  ST.# directive i
1470: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 74 68  s encountered th
1480: 65 20 54 63 6c 20 73 63 72 69 70 74 20 69 73 20  e Tcl script is 
1490: 65 76 61 6c 75 61 74 65 64 2e 20 55 73 75 61 6c  evaluated. Usual
14a0: 6c 79 2c 20 74 68 69 73 20 54 63 6c 0a 23 20 73  ly, this Tcl.# s
14b0: 63 72 69 70 74 20 63 6f 6e 74 61 69 6e 73 20 6f  cript contains o
14c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
14d0: 20 74 6f 20 5b 64 6f 5f 74 65 73 74 5d 2e 0a 23   to [do_test]..#
14e0: 0a 23 20 41 20 50 52 45 50 20 70 72 69 6d 69 74  .# A PREP primit
14f0: 69 76 65 20 73 70 65 63 69 66 69 65 73 20 61 6e  ive specifies an
1500: 20 53 51 4c 20 73 63 72 69 70 74 20 61 73 20 69   SQL script as i
1510: 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 57 68 65  ts argument. Whe
1520: 6e 20 61 20 50 52 45 50 0a 23 20 64 69 72 65 63  n a PREP.# direc
1530: 74 69 76 65 20 69 73 20 65 6e 63 6f 75 6e 74 65  tive is encounte
1540: 72 65 64 20 74 68 65 20 53 51 4c 20 69 73 20 65  red the SQL is e
1550: 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 64  valuated using d
1560: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1570: 6f 6e 0a 23 20 5b 64 62 5d 2e 0a 23 0a 23 20 54  on.# [db]..#.# T
1580: 68 65 20 53 51 4c 20 70 72 69 6d 69 74 69 76 65  he SQL primitive
1590: 73 20 61 72 65 20 77 68 65 72 65 20 74 68 65 20  s are where the 
15a0: 61 63 74 69 6f 6e 20 68 61 70 70 65 6e 73 2e 20  action happens. 
15b0: 41 6e 20 53 51 4c 20 70 72 69 6d 69 74 69 76 65  An SQL primitive
15c0: 20 6d 75 73 74 0a 23 20 63 6f 6e 74 61 69 6e 20   must.# contain 
15d0: 61 20 73 69 6e 67 6c 65 2c 20 76 61 6c 69 64 20  a single, valid 
15e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73  SQL statement as
15f0: 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 57   its argument. W
1600: 68 65 6e 20 61 6e 20 53 51 4c 0a 23 20 70 72 69  hen an SQL.# pri
1610: 6d 69 74 69 76 65 20 69 73 20 65 6e 63 6f 75 6e  mitive is encoun
1620: 74 65 72 65 64 2c 20 69 74 20 69 73 20 65 76 61  tered, it is eva
1630: 6c 75 61 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  luated one or mo
1640: 72 65 20 74 69 6d 65 73 20 74 6f 20 74 65 73 74  re times to test
1650: 20 74 68 65 0a 23 20 62 65 68 61 76 69 6f 75 72   the.# behaviour
1660: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 77   of the system w
1670: 68 65 6e 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  hen malloc() fai
1680: 6c 73 20 64 75 72 69 6e 67 20 70 72 65 70 61 72  ls during prepar
1690: 61 74 69 6f 6e 20 6f 72 0a 23 20 65 78 65 63 75  ation or.# execu
16a0: 74 69 6f 6e 20 6f 66 20 73 61 69 64 20 73 74 61  tion of said sta
16b0: 74 65 6d 65 6e 74 2e 20 54 68 65 20 4e 74 68 20  tement. The Nth 
16c0: 74 69 6d 65 20 74 68 65 20 73 74 61 74 65 6d 65  time the stateme
16d0: 6e 74 20 69 73 20 65 78 65 63 75 74 65 64 2c 0a  nt is executed,.
16e0: 23 20 74 68 65 20 4e 74 68 20 6d 61 6c 6c 6f 63  # the Nth malloc
16f0: 20 69 73 20 73 61 69 64 20 74 6f 20 66 61 69 6c   is said to fail
1700: 2e 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  . The statement 
1710: 69 73 20 65 78 65 63 75 74 65 64 20 75 6e 74 69  is executed unti
1720: 6c 20 69 74 0a 23 20 73 75 63 63 65 65 64 73 2c  l it.# succeeds,
1730: 20 69 2e 65 2e 20 28 4d 2b 31 29 20 74 69 6d 65   i.e. (M+1) time
1740: 73 2c 20 77 68 65 72 65 20 4d 20 69 73 20 74 68  s, where M is th
1750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c  e number of mall
1760: 6f 63 73 28 29 20 72 65 71 75 69 72 65 64 0a 23  ocs() required.#
1770: 20 74 6f 20 70 72 65 70 61 72 65 20 61 6e 64 20   to prepare and 
1780: 65 78 65 63 75 74 65 20 74 68 65 20 73 74 61 74  execute the stat
1790: 65 6d 65 6e 74 2e 0a 23 0a 23 20 45 61 63 68 20  ement..#.# Each 
17a0: 74 69 6d 65 20 61 6e 20 53 51 4c 20 73 74 61 74  time an SQL stat
17b0: 65 6d 65 6e 74 20 66 61 69 6c 73 2c 20 74 68 65  ement fails, the
17c0: 20 64 72 69 76 65 72 20 70 72 6f 67 72 61 6d 20   driver program 
17d0: 28 73 65 65 20 70 72 6f 63 20 5b 72 75 6e 5f 74  (see proc [run_t
17e0: 65 73 74 5d 0a 23 20 62 65 6c 6f 77 29 20 66 69  est].# below) fi
17f0: 67 75 72 65 73 20 6f 75 74 20 69 66 20 61 20 74  gures out if a t
1800: 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1810: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
1820: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23  y rolled back..#
1830: 20 49 66 20 6e 6f 74 2c 20 69 74 20 65 78 65 63   If not, it exec
1840: 75 74 65 73 20 61 6e 79 20 54 45 53 54 20 62 6c  utes any TEST bl
1850: 6f 63 6b 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ock immediately 
1860: 70 72 6f 63 65 65 64 69 6e 67 20 74 68 65 20 53  proceeding the S
1870: 51 4c 0a 23 20 73 74 61 74 65 6d 65 6e 74 2c 20  QL.# statement, 
1880: 74 68 65 6e 20 72 65 65 78 65 63 75 74 65 73 20  then reexecutes 
1890: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
18a0: 74 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  t with the next 
18b0: 76 61 6c 75 65 20 6f 66 20 4e 2e 0a 23 0a 23 20  value of N..#.# 
18c0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
18d0: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
18e0: 74 69 63 61 6c 6c 79 20 72 6f 6c 6c 65 64 20 62  tically rolled b
18f0: 61 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 72  ack, then the dr
1900: 69 76 65 72 0a 23 20 70 72 6f 67 72 61 6d 20 65  iver.# program e
1910: 78 65 63 75 74 65 73 20 61 6c 6c 20 74 68 65 20  xecutes all the 
1920: 53 51 4c 20 73 70 65 63 69 66 69 65 64 20 61 73  SQL specified as
1930: 20 70 61 72 74 20 6f 66 20 53 51 4c 20 6f 72 20   part of SQL or 
1940: 50 52 45 50 20 70 72 69 6d 69 74 69 76 65 73 0a  PREP primitives.
1950: 23 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 75  # between the cu
1960: 72 72 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d  rrent SQL statem
1970: 65 6e 74 20 61 6e 64 20 74 68 65 20 6d 6f 73 74  ent and the most
1980: 20 72 65 63 65 6e 74 20 22 42 45 47 49 4e 22 2e   recent "BEGIN".
1990: 20 41 6e 79 20 0a 23 20 54 45 53 54 20 62 6c 6f   Any .# TEST blo
19a0: 63 6b 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70  ck immediately p
19b0: 72 6f 63 65 65 64 69 6e 67 20 74 68 65 20 53 51  roceeding the SQ
19c0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65  L statement is e
19d0: 76 61 6c 75 61 74 65 64 2c 20 61 6e 64 0a 23 20  valuated, and.# 
19e0: 74 68 65 6e 20 74 68 65 20 53 51 4c 20 73 74 61  then the SQL sta
19f0: 74 65 6d 65 6e 74 20 72 65 65 78 65 63 75 74 65  tement reexecute
1a00: 64 20 77 69 74 68 20 74 68 65 20 69 6e 63 72 65  d with the incre
1a10: 6d 65 6e 74 65 64 20 4e 20 76 61 6c 75 65 2e 0a  mented N value..
1a20: 23 0a 23 20 54 68 61 74 20 6d 61 6b 65 20 61 6e  #.# That make an
1a30: 79 20 73 65 6e 73 65 3f 20 49 66 20 6e 6f 74 2c  y sense? If not,
1a40: 20 72 65 61 64 20 74 68 65 20 63 6f 64 65 20 69   read the code i
1a50: 6e 20 5b 72 75 6e 5f 74 65 73 74 5d 20 61 6e 64  n [run_test] and
1a60: 20 69 74 20 6d 69 67 68 74 2e 0a 23 0a 23 20 45   it might..#.# E
1a70: 78 74 72 61 20 72 65 73 74 72 69 63 74 69 6f 6e  xtra restriction
1a80: 20 69 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20   imposed by the 
1a90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3a 0a  implementation:.
1aa0: 23 0a 23 20 2a 20 49 66 20 61 20 50 52 45 50 20  #.# * If a PREP 
1ab0: 62 6c 6f 63 6b 20 73 74 61 72 74 73 20 61 20 74  block starts a t
1ac0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
1ad0: 75 73 74 20 66 69 6e 69 73 68 20 69 74 2e 0a 23  ust finish it..#
1ae0: 20 2a 20 41 20 50 52 45 50 20 62 6c 6f 63 6b 20   * A PREP block 
1af0: 6d 61 79 20 6e 6f 74 20 63 6c 6f 73 65 20 61 20  may not close a 
1b00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 74 20 64  transaction it d
1b10: 69 64 20 6e 6f 74 20 73 74 61 72 74 2e 0a 23 0a  id not start..#.
1b20: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 20  -----------...# 
1b70: 54 68 65 73 65 20 70 72 6f 63 73 20 61 72 65 20  These procs are 
1b80: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70  used to build up
1b90: 20 61 20 22 70 72 6f 67 72 61 6d 22 20 69 6e 20   a "program" in 
1ba0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a  global variable.
1bb0: 23 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73 63 72  # ::run_test_scr
1bc0: 69 70 74 2e 20 41 74 20 74 68 65 20 65 6e 64 20  ipt. At the end 
1bd0: 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  of this file, th
1be0: 65 20 70 72 6f 63 20 5b 72 75 6e 5f 74 65 73 74  e proc [run_test
1bf0: 5d 20 69 73 20 75 73 65 64 0a 23 20 74 6f 20 65  ] is used.# to e
1c00: 78 65 63 75 74 65 20 74 68 65 20 70 72 6f 67 72  xecute the progr
1c10: 61 6d 20 28 61 6e 64 20 61 6c 6c 20 74 65 73 74  am (and all test
1c20: 20 63 61 73 65 73 20 63 6f 6e 74 61 69 6e 65 64   cases contained
1c30: 20 74 68 65 72 65 69 6e 29 2e 0a 23 0a 73 65 74   therein)..#.set
1c40: 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73 71 6c 5f   ::run_test_sql_
1c50: 69 64 20 30 0a 73 65 74 20 3a 3a 72 75 6e 5f 74  id 0.set ::run_t
1c60: 65 73 74 5f 73 63 72 69 70 74 20 5b 6c 69 73 74  est_script [list
1c70: 5d 0a 70 72 6f 63 20 54 45 53 54 20 7b 69 64 20  ].proc TEST {id 
1c80: 74 7d 20 7b 6c 61 70 70 65 6e 64 20 3a 3a 72 75  t} {lappend ::ru
1c90: 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20 2d 74  n_test_script -t
1ca0: 65 73 74 20 5b 6c 69 73 74 20 24 69 64 20 24 74  est [list $id $t
1cb0: 5d 7d 0a 70 72 6f 63 20 50 52 45 50 20 7b 70 7d  ]}.proc PREP {p}
1cc0: 20 7b 6c 61 70 70 65 6e 64 20 3a 3a 72 75 6e 5f   {lappend ::run_
1cd0: 74 65 73 74 5f 73 63 72 69 70 74 20 2d 70 72 65  test_script -pre
1ce0: 70 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  p [string trim $
1cf0: 70 5d 7d 0a 70 72 6f 63 20 44 45 42 55 47 20 7b  p]}.proc DEBUG {
1d00: 73 7d 20 7b 6c 61 70 70 65 6e 64 20 3a 3a 72 75  s} {lappend ::ru
1d10: 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20 2d 64  n_test_script -d
1d20: 65 62 75 67 20 24 73 7d 0a 0a 23 20 53 51 4c 20  ebug $s}..# SQL 
1d30: 2d 2d 0a 23 0a 23 20 20 20 20 20 53 51 4c 20 3f  --.#.#     SQL ?
1d40: 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 3f 20 3c 73 71  -norollback? <sq
1d50: 6c 2d 74 65 78 74 3e 0a 23 0a 23 20 41 64 64 20  l-text>.#.# Add 
1d60: 61 6e 20 27 53 51 4c 27 20 70 72 69 6d 69 74 69  an 'SQL' primiti
1d70: 76 65 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  ve to the progra
1d80: 6d 20 28 73 65 65 20 6e 6f 74 65 73 20 61 62 6f  m (see notes abo
1d90: 76 65 29 2e 20 49 66 20 74 68 65 20 2d 6e 6f 72  ve). If the -nor
1da0: 6f 6c 6c 62 61 63 6b 0a 23 20 73 77 69 74 63 68  ollback.# switch
1db0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
1dc0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
1dd0: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
1de0: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
1df0: 72 6f 6c 6c 0a 23 20 62 61 63 6b 20 61 6e 79 20  roll.# back any 
1e00: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1e10: 6f 6e 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  on if malloc() f
1e20: 61 69 6c 73 2e 20 49 74 20 6d 75 73 74 20 72 6f  ails. It must ro
1e30: 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
1e40: 6d 65 6e 74 0a 23 20 74 72 61 6e 73 61 63 74 69  ment.# transacti
1e50: 6f 6e 20 6f 6e 6c 79 2e 0a 23 0a 70 72 6f 63 20  on only..#.proc 
1e60: 53 51 4c 20 20 7b 61 31 20 7b 61 32 20 22 22 7d  SQL  {a1 {a2 ""}
1e70: 7d 20 7b 0a 20 20 23 20 41 6e 20 53 51 4c 20 70  } {.  # An SQL p
1e80: 72 69 6d 69 74 69 76 65 20 70 61 72 61 6d 65 74  rimitive paramet
1e90: 65 72 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  er is a list of 
1ea0: 74 68 72 65 65 20 65 6c 65 6d 65 6e 74 73 2c 20  three elements, 
1eb0: 61 6e 20 69 64 2c 20 61 20 62 6f 6f 6c 65 61 6e  an id, a boolean
1ec0: 0a 20 20 23 20 76 61 6c 75 65 20 69 6e 64 69 63  .  # value indic
1ed0: 61 74 69 6e 67 20 69 66 20 74 68 65 20 73 74 61  ating if the sta
1ee0: 74 65 6d 65 6e 74 20 6d 61 79 20 63 61 75 73 65  tement may cause
1ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
1f00: 6c 62 61 63 6b 20 77 68 65 6e 0a 20 20 23 20 6d  lback when.  # m
1f10: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 61  alloc() fails, a
1f20: 6e 64 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  nd the sql state
1f30: 6d 65 6e 74 20 69 74 73 65 6c 66 2e 0a 20 20 73  ment itself..  s
1f40: 65 74 20 69 64 20 5b 69 6e 63 72 20 3a 3a 72 75  et id [incr ::ru
1f50: 6e 5f 74 65 73 74 5f 73 71 6c 5f 69 64 5d 0a 20  n_test_sql_id]. 
1f60: 20 69 66 20 7b 24 61 32 20 3d 3d 20 22 22 7d 20   if {$a2 == ""} 
1f70: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a  {.    lappend ::
1f80: 72 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20  run_test_script 
1f90: 2d 73 71 6c 20 5b 6c 69 73 74 20 24 69 64 20 74  -sql [list $id t
1fa0: 72 75 65 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  rue [string trim
1fb0: 20 24 61 31 5d 5d 0a 20 20 7d 20 65 6c 73 65 20   $a1]].  } else 
1fc0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a  {.    lappend ::
1fd0: 72 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20  run_test_script 
1fe0: 2d 73 71 6c 20 5b 6c 69 73 74 20 24 69 64 20 66  -sql [list $id f
1ff0: 61 6c 73 65 20 5b 73 74 72 69 6e 67 20 74 72 69  alse [string tri
2000: 6d 20 24 61 32 5d 5d 0a 20 20 7d 0a 7d 0a 0a 23  m $a2]].  }.}..#
2010: 20 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54   TEST_AUTOCOMMIT
2020: 20 2d 2d 0a 23 20 0a 23 20 20 20 20 20 41 20 73   --.# .#     A s
2030: 68 6f 72 74 68 61 6e 64 20 74 65 73 74 20 74 6f  horthand test to
2040: 20 73 65 65 20 69 66 20 61 20 74 72 61 6e 73 61   see if a transa
2050: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
2060: 6f 72 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73  or not. The firs
2070: 74 0a 23 20 20 20 20 20 61 72 67 75 6d 65 6e 74  t.#     argument
2080: 20 2d 20 24 69 64 20 2d 20 69 73 20 74 68 65 20   - $id - is the 
2090: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
20a0: 66 20 74 68 65 20 74 65 73 74 20 63 61 73 65 2e  f the test case.
20b0: 20 54 68 65 20 73 65 63 6f 6e 64 0a 23 20 20 20   The second.#   
20c0: 20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 69    argument is ei
20d0: 74 68 65 72 20 31 20 6f 72 20 30 2c 20 74 68 65  ther 1 or 0, the
20e0: 20 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 20   expected value 
20f0: 6f 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  of the auto-comm
2100: 69 74 20 66 6c 61 67 2e 0a 23 0a 70 72 6f 63 20  it flag..#.proc 
2110: 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54 20  TEST_AUTOCOMMIT 
2120: 7b 69 64 20 61 7d 20 7b 0a 20 20 20 20 54 45 53  {id a} {.    TES
2130: 54 20 24 69 64 20 22 64 6f 5f 74 65 73 74 20 5c  T $id "do_test \
2140: 24 74 65 73 74 69 64 20 7b 20 73 71 6c 69 74 65  $testid { sqlite
2150: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
2160: 20 5c 24 3a 3a 44 42 20 7d 20 7b 24 61 7d 22 0a   \$::DB } {$a}".
2170: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
21c0: 20 53 74 61 72 74 20 6f 66 20 74 65 73 74 20 70   Start of test p
21d0: 72 6f 67 72 61 6d 20 64 65 63 6c 61 72 61 74 69  rogram declarati
21e0: 6f 6e 0a 23 0a 0a 0a 23 20 57 61 72 6d 20 62 6f  on.#...# Warm bo
21f0: 64 79 20 74 65 73 74 2e 20 41 20 6d 61 6c 6c 6f  dy test. A mallo
2200: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 74 68 65  c() fails in the
2210: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 43 52 45   middle of a CRE
2220: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2230: 65 6e 74 0a 23 20 69 6e 20 61 20 73 69 6e 67 6c  ent.# in a singl
2240: 65 2d 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e-statement tran
2250: 73 61 63 74 69 6f 6e 20 6f 6e 20 61 6e 20 65 6d  saction on an em
2260: 70 74 79 20 64 61 74 61 62 61 73 65 2e 20 4e 6f  pty database. No
2270: 74 20 74 6f 6f 20 6d 75 63 68 20 63 61 6e 20 67  t too much can g
2280: 6f 0a 23 20 77 72 6f 6e 67 20 68 65 72 65 2e 0a  o.# wrong here..
2290: 23 0a 54 45 53 54 20 31 20 7b 0a 20 20 64 6f 5f  #.TEST 1 {.  do_
22a0: 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20  test $testid {. 
22b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
22c0: 43 54 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f 4d  CT tbl_name FROM
22d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 7d   sqlite_master;}
22e0: 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c 20 7b 20  .  } {}.}.SQL { 
22f0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
2300: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 61 62  IF NOT EXISTS ab
2310: 63 28 61 2c 20 62 2c 20 63 29 3b 20 0a 7d 0a 54  c(a, b, c); .}.T
2320: 45 53 54 20 32 20 7b 0a 20 20 64 6f 5f 74 65 73  EST 2 {.  do_tes
2330: 74 20 24 74 65 73 74 69 64 2e 31 20 7b 0a 20 20  t $testid.1 {.  
2340: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2350: 54 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f 4d 20  T tbl_name FROM 
2360: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 7d 0a  sqlite_master;}.
2370: 20 20 7d 20 7b 61 62 63 7d 0a 7d 0a 0a 23 20 49    } {abc}.}..# I
2380: 6e 73 65 72 74 20 61 20 63 6f 75 70 6c 65 20 6f  nsert a couple o
2390: 66 20 72 6f 77 73 20 69 6e 74 6f 20 74 68 65 20  f rows into the 
23a0: 74 61 62 6c 65 2e 20 65 61 63 68 20 69 6e 73 65  table. each inse
23b0: 72 74 20 69 73 20 69 6e 20 69 74 73 20 6f 77 6e  rt is in its own
23c0: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  .# transaction. 
23d0: 74 65 73 74 20 74 68 61 74 20 74 68 65 20 74 61  test that the ta
23e0: 62 6c 65 20 69 73 20 75 6e 70 6f 70 75 6c 61 74  ble is unpopulat
23f0: 65 64 20 62 65 66 6f 72 65 20 72 75 6e 6e 69 6e  ed before runnin
2400: 67 20 74 68 65 20 69 6e 73 65 72 74 73 0a 23 20  g the inserts.# 
2410: 28 61 6e 64 20 68 65 6e 63 65 20 61 66 74 65 72  (and hence after
2420: 20 65 61 63 68 20 66 61 69 6c 75 72 65 20 6f 66   each failure of
2430: 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 65 72   the first inser
2440: 74 29 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20  t), and that it 
2450: 68 61 73 20 62 65 65 6e 0a 23 20 70 6f 70 75 6c  has been.# popul
2460: 61 74 65 64 20 63 6f 72 72 65 63 74 6c 79 20 61  ated correctly a
2470: 66 74 65 72 20 74 68 65 20 66 69 6e 61 6c 20 69  fter the final i
2480: 6e 73 65 72 74 20 73 75 63 63 65 65 64 73 2e 0a  nsert succeeds..
2490: 23 0a 54 45 53 54 20 33 20 7b 0a 20 20 64 6f 5f  #.TEST 3 {.  do_
24a0: 74 65 73 74 20 24 74 65 73 74 69 64 2e 32 20 7b  test $testid.2 {
24b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
24c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d  LECT * FROM abc}
24d0: 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c 20 7b 49  .  } {}.}.SQL {I
24e0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
24f0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 7d  ALUES(1, 2, 3);}
2500: 0a 53 51 4c 20 7b 49 4e 53 45 52 54 20 49 4e 54  .SQL {INSERT INT
2510: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 34 2c 20  O abc VALUES(4, 
2520: 35 2c 20 36 29 3b 7d 0a 53 51 4c 20 7b 49 4e 53  5, 6);}.SQL {INS
2530: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
2540: 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 7d 0a 54  UES(7, 8, 9);}.T
2550: 45 53 54 20 34 20 7b 0a 20 20 64 6f 5f 74 65 73  EST 4 {.  do_tes
2560: 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20  t $testid {.    
2570: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
2580: 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20 7d 20  * FROM abc}.  } 
2590: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
25a0: 20 39 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 61 20   9}.}..# Test a 
25b0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
25c0: 74 65 6d 65 6e 74 2e 20 42 65 63 61 75 73 65 20  tement. Because 
25d0: 74 68 65 20 74 61 62 6c 65 20 27 61 62 63 27 20  the table 'abc' 
25e0: 69 73 20 73 6f 20 73 6d 61 6c 6c 2c 20 74 68 65  is so small, the
25f0: 20 69 6e 64 65 78 0a 23 20 77 69 6c 6c 20 61 6c   index.# will al
2600: 6c 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  l fit on a singl
2610: 65 20 70 61 67 65 2c 20 73 6f 20 74 68 69 73 20  e page, so this 
2620: 64 6f 65 73 6e 27 74 20 74 65 73 74 20 74 6f 6f  doesn't test too
2630: 20 6d 75 63 68 20 74 68 61 74 20 74 68 65 20 43   much that the C
2640: 52 45 41 54 45 0a 23 20 54 41 42 4c 45 20 73 74  REATE.# TABLE st
2650: 61 74 65 6d 65 6e 74 20 64 69 64 6e 27 74 20 74  atement didn't t
2660: 65 73 74 2e 20 41 20 66 65 77 20 6f 66 20 74 68  est. A few of th
2670: 65 20 74 72 61 6e 73 69 65 6e 74 20 6d 61 6c 6c  e transient mall
2680: 6f 63 28 29 73 20 69 6e 20 62 74 72 65 65 2e 63  oc()s in btree.c
2690: 0a 23 20 70 65 72 68 61 70 73 2e 0a 23 0a 53 51  .# perhaps..#.SQ
26a0: 4c 20 7b 43 52 45 41 54 45 20 49 4e 44 45 58 20  L {CREATE INDEX 
26b0: 61 62 63 5f 69 20 4f 4e 20 61 62 63 28 61 2c 20  abc_i ON abc(a, 
26c0: 62 2c 20 63 29 3b 7d 0a 54 45 53 54 20 34 20 7b  b, c);}.TEST 4 {
26d0: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
26e0: 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  id {.    execsql
26f0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2700: 2a 20 46 52 4f 4d 20 61 62 63 20 4f 52 44 45 52  * FROM abc ORDER
2710: 20 42 59 20 61 20 44 45 53 43 3b 0a 20 20 20 20   BY a DESC;.    
2720: 7d 0a 20 20 7d 20 7b 37 20 38 20 39 20 34 20 35  }.  } {7 8 9 4 5
2730: 20 36 20 31 20 32 20 33 7d 0a 7d 0a 0a 23 20 54   6 1 2 3}.}..# T
2740: 65 73 74 20 61 20 44 45 4c 45 54 45 20 73 74 61  est a DELETE sta
2750: 74 65 6d 65 6e 74 2e 20 41 6c 73 6f 20 63 72 65  tement. Also cre
2760: 61 74 65 20 61 20 74 72 69 67 67 65 72 20 61 6e  ate a trigger an
2770: 64 20 61 20 76 69 65 77 2c 20 6a 75 73 74 20 74  d a view, just t
2780: 6f 20 6d 61 6b 65 20 73 75 72 65 0a 23 20 74 68  o make sure.# th
2790: 65 73 65 20 73 74 61 74 65 6d 65 6e 74 73 20 64  ese statements d
27a0: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 20 6f 62  on't have any ob
27b0: 76 69 6f 75 73 20 6d 61 6c 6c 6f 63 28 29 20 72  vious malloc() r
27c0: 65 6c 61 74 65 64 20 62 75 67 73 20 69 6e 20 74  elated bugs in t
27d0: 68 65 6d 2e 20 4e 6f 74 65 0a 23 20 74 68 61 74  hem. Note.# that
27e0: 20 74 68 65 20 74 65 73 74 20 61 62 6f 76 65 20   the test above 
27f0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 65 64  will be executed
2800: 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 44   each time the D
2810: 45 4c 45 54 45 20 66 61 69 6c 73 2c 20 73 6f 20  ELETE fails, so 
2820: 77 65 27 72 65 0a 23 20 61 6c 73 6f 20 74 65 73  we're.# also tes
2830: 74 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  ting rollback of
2840: 20 61 20 44 45 4c 45 54 45 20 66 72 6f 6d 20 61   a DELETE from a
2850: 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 69   table with an i
2860: 6e 64 65 78 20 6f 6e 20 69 74 2e 0a 23 0a 53 51  ndex on it..#.SQ
2870: 4c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 61  L {DELETE FROM a
2880: 62 63 20 57 48 45 52 45 20 61 20 3e 20 32 3b 7d  bc WHERE a > 2;}
2890: 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 54 52 49  .SQL {CREATE TRI
28a0: 47 47 45 52 20 61 62 63 5f 74 20 41 46 54 45 52  GGER abc_t AFTER
28b0: 20 49 4e 53 45 52 54 20 4f 4e 20 61 62 63 20 42   INSERT ON abc B
28c0: 45 47 49 4e 20 53 45 4c 45 43 54 20 27 74 72 69  EGIN SELECT 'tri
28d0: 67 67 65 72 21 27 3b 20 45 4e 44 3b 7d 0a 53 51  gger!'; END;}.SQ
28e0: 4c 20 7b 43 52 45 41 54 45 20 56 49 45 57 20 61  L {CREATE VIEW a
28f0: 62 63 5f 76 20 41 53 20 53 45 4c 45 43 54 20 2a  bc_v AS SELECT *
2900: 20 46 52 4f 4d 20 61 62 63 3b 7d 0a 54 45 53 54   FROM abc;}.TEST
2910: 20 35 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24   5 {.  do_test $
2920: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
2930: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
2940: 45 43 54 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61  ECT name, tbl_na
2950: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
2960: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 6e  aster ORDER BY n
2970: 61 6d 65 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  ame;.      SELEC
2980: 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20  T * FROM abc;.  
2990: 20 20 7d 0a 20 20 7d 20 7b 61 62 63 20 61 62 63    }.  } {abc abc
29a0: 20 61 62 63 5f 69 20 61 62 63 20 61 62 63 5f 74   abc_i abc abc_t
29b0: 20 61 62 63 20 61 62 63 5f 76 20 61 62 63 5f 76   abc abc_v abc_v
29c0: 20 31 20 32 20 33 7d 0a 7d 0a 0a 73 65 74 20 73   1 2 3}.}..set s
29d0: 71 6c 20 7b 0a 20 20 42 45 47 49 4e 3b 44 45 4c  ql {.  BEGIN;DEL
29e0: 45 54 45 20 46 52 4f 4d 20 61 62 63 3b 0a 7d 0a  ETE FROM abc;.}.
29f0: 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24  for {set i 1} {$
2a00: 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69  i < 100} {incr i
2a10: 7d 20 7b 0a 20 20 73 65 74 20 61 20 24 69 0a 20  } {.  set a $i. 
2a20: 20 73 65 74 20 62 20 22 53 74 72 69 6e 67 20 76   set b "String v
2a30: 61 6c 75 65 20 24 69 22 0a 20 20 73 65 74 20 63  alue $i".  set c
2a40: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
2a50: 58 20 24 69 5d 0a 20 20 61 70 70 65 6e 64 20 73  X $i].  append s
2a60: 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql "INSERT INTO 
2a70: 61 62 63 20 56 41 4c 55 45 53 20 28 24 61 2c 20  abc VALUES ($a, 
2a80: 27 24 62 27 2c 20 27 24 63 27 29 3b 22 0a 7d 0a  '$b', '$c');".}.
2a90: 61 70 70 65 6e 64 20 73 71 6c 20 7b 43 4f 4d 4d  append sql {COMM
2aa0: 49 54 3b 7d 0a 50 52 45 50 20 24 73 71 6c 0a 0a  IT;}.PREP $sql..
2ab0: 53 51 4c 20 7b 0a 20 20 44 45 4c 45 54 45 20 46  SQL {.  DELETE F
2ac0: 52 4f 4d 20 61 62 63 20 57 48 45 52 45 20 6f 69  ROM abc WHERE oi
2ad0: 64 20 49 4e 20 28 53 45 4c 45 43 54 20 6f 69 64  d IN (SELECT oid
2ae0: 20 46 52 4f 4d 20 61 62 63 20 4f 52 44 45 52 20   FROM abc ORDER 
2af0: 42 59 20 72 61 6e 64 6f 6d 28 29 20 4c 49 4d 49  BY random() LIMI
2b00: 54 20 35 29 3b 0a 7d 0a 54 45 53 54 20 36 20 7b  T 5);.}.TEST 6 {
2b10: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
2b20: 69 64 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  id.1 {.    execs
2b30: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  ql {SELECT count
2b40: 28 2a 29 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20  (*) FROM abc}.  
2b50: 7d 20 7b 39 34 7d 0a 20 20 64 6f 5f 74 65 73 74  } {94}.  do_test
2b60: 20 24 74 65 73 74 69 64 2e 32 20 7b 0a 20 20 20   $testid.2 {.   
2b70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2b80: 20 53 45 4c 45 43 54 20 6d 69 6e 28 0a 20 20 20   SELECT min(.   
2b90: 20 20 20 20 20 20 20 28 6f 69 64 20 3d 3d 20 61         (oid == a
2ba0: 29 20 41 4e 44 20 27 53 74 72 69 6e 67 20 76 61  ) AND 'String va
2bb0: 6c 75 65 20 27 20 7c 7c 20 61 20 3d 3d 20 62 20  lue ' || a == b 
2bc0: 41 4e 44 20 61 20 3d 3d 20 6c 65 6e 67 74 68 28  AND a == length(
2bd0: 63 29 20 0a 20 20 20 20 20 20 29 20 46 52 4f 4d  c) .      ) FROM
2be0: 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   abc;.    }.  } 
2bf0: 7b 31 7d 0a 7d 0a 53 51 4c 20 7b 0a 20 20 44 45  {1}.}.SQL {.  DE
2c00: 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48  LETE FROM abc WH
2c10: 45 52 45 20 6f 69 64 20 49 4e 20 28 53 45 4c 45  ERE oid IN (SELE
2c20: 43 54 20 6f 69 64 20 46 52 4f 4d 20 61 62 63 20  CT oid FROM abc 
2c30: 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f 6d 28  ORDER BY random(
2c40: 29 20 4c 49 4d 49 54 20 35 29 3b 0a 7d 0a 54 45  ) LIMIT 5);.}.TE
2c50: 53 54 20 37 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ST 7 {.  do_test
2c60: 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65   $testid {.    e
2c70: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  xecsql {SELECT c
2c80: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63  ount(*) FROM abc
2c90: 7d 0a 20 20 7d 20 7b 38 39 7d 0a 20 20 64 6f 5f  }.  } {89}.  do_
2ca0: 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20  test $testid {. 
2cb0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2cc0: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 0a 20     SELECT min(. 
2cd0: 20 20 20 20 20 20 20 20 20 28 6f 69 64 20 3d 3d           (oid ==
2ce0: 20 61 29 20 41 4e 44 20 27 53 74 72 69 6e 67 20   a) AND 'String 
2cf0: 76 61 6c 75 65 20 27 20 7c 7c 20 61 20 3d 3d 20  value ' || a == 
2d00: 62 20 41 4e 44 20 61 20 3d 3d 20 6c 65 6e 67 74  b AND a == lengt
2d10: 68 28 63 29 20 0a 20 20 20 20 20 20 29 20 46 52  h(c) .      ) FR
2d20: 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a 20 20  OM abc;.    }.  
2d30: 7d 20 7b 31 7d 0a 7d 0a 53 51 4c 20 7b 0a 20 20  } {1}.}.SQL {.  
2d40: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 20  DELETE FROM abc 
2d50: 57 48 45 52 45 20 6f 69 64 20 49 4e 20 28 53 45  WHERE oid IN (SE
2d60: 4c 45 43 54 20 6f 69 64 20 46 52 4f 4d 20 61 62  LECT oid FROM ab
2d70: 63 20 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f  c ORDER BY rando
2d80: 6d 28 29 20 4c 49 4d 49 54 20 35 29 3b 0a 7d 0a  m() LIMIT 5);.}.
2d90: 54 45 53 54 20 39 20 7b 0a 20 20 64 6f 5f 74 65  TEST 9 {.  do_te
2da0: 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20  st $testid {.   
2db0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2dc0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
2dd0: 62 63 7d 0a 20 20 7d 20 7b 38 34 7d 0a 20 20 64  bc}.  } {84}.  d
2de0: 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b  o_test $testid {
2df0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2e00: 20 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28       SELECT min(
2e10: 0a 20 20 20 20 20 20 20 20 20 20 28 6f 69 64 20  .          (oid 
2e20: 3d 3d 20 61 29 20 41 4e 44 20 27 53 74 72 69 6e  == a) AND 'Strin
2e30: 67 20 76 61 6c 75 65 20 27 20 7c 7c 20 61 20 3d  g value ' || a =
2e40: 3d 20 62 20 41 4e 44 20 61 20 3d 3d 20 6c 65 6e  = b AND a == len
2e50: 67 74 68 28 63 29 20 0a 20 20 20 20 20 20 29 20  gth(c) .      ) 
2e60: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a  FROM abc;.    }.
2e70: 20 20 7d 20 7b 31 7d 0a 7d 0a 0a 73 65 74 20 70    } {1}.}..set p
2e80: 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72  adding [string r
2e90: 65 70 65 61 74 20 58 20 35 30 30 5d 0a 50 52 45  epeat X 500].PRE
2ea0: 50 20 5b 73 75 62 73 74 20 7b 0a 20 20 44 52 4f  P [subst {.  DRO
2eb0: 50 20 54 41 42 4c 45 20 61 62 63 3b 0a 20 20 43  P TABLE abc;.  C
2ec0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28  REATE TABLE abc(
2ed0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70  a PRIMARY KEY, p
2ee0: 61 64 64 69 6e 67 2c 20 62 2c 20 63 29 3b 0a 20  adding, b, c);. 
2ef0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
2f00: 20 56 41 4c 55 45 53 28 30 2c 20 27 24 70 61 64   VALUES(0, '$pad
2f10: 64 69 6e 67 27 2c 20 32 2c 20 32 29 3b 0a 20 20  ding', 2, 2);.  
2f20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
2f30: 56 41 4c 55 45 53 28 33 2c 20 27 24 70 61 64 64  VALUES(3, '$padd
2f40: 69 6e 67 27 2c 20 35 2c 20 35 29 3b 0a 20 20 49  ing', 5, 5);.  I
2f50: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
2f60: 41 4c 55 45 53 28 36 2c 20 27 24 70 61 64 64 69  ALUES(6, '$paddi
2f70: 6e 67 27 2c 20 38 2c 20 38 29 3b 0a 7d 5d 0a 0a  ng', 8, 8);.}]..
2f80: 54 45 53 54 20 31 30 20 7b 0a 20 20 64 6f 5f 74  TEST 10 {.  do_t
2f90: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
2fa0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2fb0: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 61  T a, b, c FROM a
2fc0: 62 63 7d 0a 20 20 7d 20 7b 30 20 32 20 32 20 33  bc}.  } {0 2 2 3
2fd0: 20 35 20 35 20 36 20 38 20 38 7d 0a 7d 0a 0a 53   5 5 6 8 8}.}..S
2fe0: 51 4c 20 7b 42 45 47 49 4e 3b 7d 0a 53 51 4c 20  QL {BEGIN;}.SQL 
2ff0: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63  {INSERT INTO abc
3000: 20 56 41 4c 55 45 53 28 39 2c 20 27 58 58 58 58   VALUES(9, 'XXXX
3010: 58 27 2c 20 31 31 2c 20 31 32 29 3b 7d 0a 54 45  X', 11, 12);}.TE
3020: 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54 20 31 31  ST_AUTOCOMMIT 11
3030: 20 30 0a 53 51 4c 20 2d 6e 6f 72 6f 6c 6c 62 61   0.SQL -norollba
3040: 63 6b 20 7b 55 50 44 41 54 45 20 61 62 63 20 53  ck {UPDATE abc S
3050: 45 54 20 61 20 3d 20 61 20 2b 20 31 2c 20 63 20  ET a = a + 1, c 
3060: 3d 20 63 20 2b 20 31 3b 7d 0a 54 45 53 54 5f 41  = c + 1;}.TEST_A
3070: 55 54 4f 43 4f 4d 4d 49 54 20 31 32 20 30 0a 53  UTOCOMMIT 12 0.S
3080: 51 4c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  QL {DELETE FROM 
3090: 61 62 63 20 57 48 45 52 45 20 61 20 3d 20 31 30  abc WHERE a = 10
30a0: 3b 7d 0a 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d  ;}.TEST_AUTOCOMM
30b0: 49 54 20 31 33 20 30 0a 53 51 4c 20 7b 43 4f 4d  IT 13 0.SQL {COM
30c0: 4d 49 54 3b 7d 0a 0a 54 45 53 54 20 31 34 20 7b  MIT;}..TEST 14 {
30d0: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
30e0: 69 64 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74  id.1 {.    sqlit
30f0: 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
3100: 74 20 24 3a 3a 44 42 0a 20 20 7d 20 7b 31 7d 0a  t $::DB.  } {1}.
3110: 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69    do_test $testi
3120: 64 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  d.2 {.    execsq
3130: 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20 62 2c 20  l {SELECT a, b, 
3140: 63 20 46 52 4f 4d 20 61 62 63 7d 0a 20 20 7d 20  c FROM abc}.  } 
3150: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3160: 20 39 7d 0a 7d 0a 0a 50 52 45 50 20 5b 73 75 62   9}.}..PREP [sub
3170: 73 74 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  st {.  DROP TABL
3180: 45 20 61 62 63 3b 0a 20 20 43 52 45 41 54 45 20  E abc;.  CREATE 
3190: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 70 61 64  TABLE abc(a, pad
31a0: 64 69 6e 67 2c 20 62 2c 20 63 29 3b 0a 20 20 49  ding, b, c);.  I
31b0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
31c0: 41 4c 55 45 53 28 31 2c 20 27 24 70 61 64 64 69  ALUES(1, '$paddi
31d0: 6e 67 27 2c 20 32 2c 20 33 29 3b 0a 20 20 49 4e  ng', 2, 3);.  IN
31e0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
31f0: 4c 55 45 53 28 34 2c 20 27 24 70 61 64 64 69 6e  LUES(4, '$paddin
3200: 67 27 2c 20 35 2c 20 36 29 3b 0a 20 20 49 4e 53  g', 5, 6);.  INS
3210: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
3220: 55 45 53 28 37 2c 20 27 24 70 61 64 64 69 6e 67  UES(7, '$padding
3230: 27 2c 20 38 2c 20 39 29 3b 0a 20 20 43 52 45 41  ', 8, 9);.  CREA
3240: 54 45 20 49 4e 44 45 58 20 61 62 63 5f 69 20 4f  TE INDEX abc_i O
3250: 4e 20 61 62 63 28 61 2c 20 70 61 64 64 69 6e 67  N abc(a, padding
3260: 2c 20 62 2c 20 63 29 3b 0a 7d 5d 0a 0a 54 45 53  , b, c);.}]..TES
3270: 54 20 31 35 20 7b 0a 20 20 64 62 20 65 76 61 6c  T 15 {.  db eval
3280: 20 7b 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   {PRAGMA cache_s
3290: 69 7a 65 20 3d 20 31 30 7d 0a 7d 0a 0a 53 51 4c  ize = 10}.}..SQL
32a0: 20 7b 42 45 47 49 4e 3b 7d 0a 53 51 4c 20 2d 6e   {BEGIN;}.SQL -n
32b0: 6f 72 6c 6c 62 63 6b 20 7b 49 4e 53 45 52 54 20  orllbck {INSERT 
32c0: 49 4e 54 4f 20 61 62 63 20 28 6f 69 64 2c 20 61  INTO abc (oid, a
32d0: 2c 20 70 61 64 64 69 6e 67 2c 20 62 2c 20 63 29  , padding, b, c)
32e0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 2a 20   SELECT NULL, * 
32f0: 46 52 4f 4d 20 61 62 63 7d 0a 54 45 53 54 20 31  FROM abc}.TEST 1
3300: 36 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74  6 {.  do_test $t
3310: 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63  estid {.    exec
3320: 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20 63  sql {SELECT a, c
3330: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63  ount(*) FROM abc
3340: 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20 20   GROUP BY a;}.  
3350: 7d 20 7b 31 20 32 20 34 20 32 20 37 20 32 7d 0a  } {1 2 4 2 7 2}.
3360: 7d 0a 53 51 4c 20 2d 6e 6f 72 6c 6c 62 63 6b 20  }.SQL -norllbck 
3370: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63  {INSERT INTO abc
3380: 20 28 6f 69 64 2c 20 61 2c 20 70 61 64 64 69 6e   (oid, a, paddin
3390: 67 2c 20 62 2c 20 63 29 20 53 45 4c 45 43 54 20  g, b, c) SELECT 
33a0: 4e 55 4c 4c 2c 20 2a 20 46 52 4f 4d 20 61 62 63  NULL, * FROM abc
33b0: 7d 0a 54 45 53 54 20 31 37 20 7b 0a 20 20 64 6f  }.TEST 17 {.  do
33c0: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
33d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
33e0: 45 43 54 20 61 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT a, count(*) 
33f0: 46 52 4f 4d 20 61 62 63 20 47 52 4f 55 50 20 42  FROM abc GROUP B
3400: 59 20 61 3b 7d 0a 20 20 7d 20 7b 31 20 34 20 34  Y a;}.  } {1 4 4
3410: 20 34 20 37 20 34 7d 0a 7d 0a 53 51 4c 20 2d 6e   4 7 4}.}.SQL -n
3420: 6f 72 6c 6c 62 63 6b 20 7b 49 4e 53 45 52 54 20  orllbck {INSERT 
3430: 49 4e 54 4f 20 61 62 63 20 28 6f 69 64 2c 20 61  INTO abc (oid, a
3440: 2c 20 70 61 64 64 69 6e 67 2c 20 62 2c 20 63 29  , padding, b, c)
3450: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 2a 20   SELECT NULL, * 
3460: 46 52 4f 4d 20 61 62 63 7d 0a 54 45 53 54 20 31  FROM abc}.TEST 1
3470: 38 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74  8 {.  do_test $t
3480: 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63  estid {.    exec
3490: 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20 63  sql {SELECT a, c
34a0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63  ount(*) FROM abc
34b0: 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20 20   GROUP BY a;}.  
34c0: 7d 20 7b 31 20 38 20 34 20 38 20 37 20 38 7d 0a  } {1 8 4 8 7 8}.
34d0: 7d 0a 53 51 4c 20 2d 6e 6f 72 6c 6c 62 63 6b 20  }.SQL -norllbck 
34e0: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63  {INSERT INTO abc
34f0: 20 28 6f 69 64 2c 20 61 2c 20 70 61 64 64 69 6e   (oid, a, paddin
3500: 67 2c 20 62 2c 20 63 29 20 53 45 4c 45 43 54 20  g, b, c) SELECT 
3510: 4e 55 4c 4c 2c 20 2a 20 46 52 4f 4d 20 61 62 63  NULL, * FROM abc
3520: 7d 0a 54 45 53 54 20 31 39 20 7b 0a 20 20 64 6f  }.TEST 19 {.  do
3530: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
3540: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
3550: 45 43 54 20 61 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT a, count(*) 
3560: 46 52 4f 4d 20 61 62 63 20 47 52 4f 55 50 20 42  FROM abc GROUP B
3570: 59 20 61 3b 7d 0a 20 20 7d 20 7b 31 20 31 36 20  Y a;}.  } {1 16 
3580: 34 20 31 36 20 37 20 31 36 7d 0a 7d 0a 53 51 4c  4 16 7 16}.}.SQL
3590: 20 7b 43 4f 4d 4d 49 54 3b 7d 0a 54 45 53 54 20   {COMMIT;}.TEST 
35a0: 32 31 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24  21 {.  do_test $
35b0: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
35c0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20  csql {SELECT a, 
35d0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
35e0: 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20  c GROUP BY a;}. 
35f0: 20 7d 20 7b 31 20 31 36 20 34 20 31 36 20 37 20   } {1 16 4 16 7 
3600: 31 36 7d 0a 7d 0a 0a 53 51 4c 20 7b 42 45 47 49  16}.}..SQL {BEGI
3610: 4e 3b 7d 0a 53 51 4c 20 7b 44 45 4c 45 54 45 20  N;}.SQL {DELETE 
3620: 46 52 4f 4d 20 61 62 63 20 57 48 45 52 45 20 6f  FROM abc WHERE o
3630: 69 64 20 25 32 7d 0a 54 45 53 54 20 32 32 20 7b  id %2}.TEST 22 {
3640: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
3650: 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  id {.    execsql
3660: 20 7b 53 45 4c 45 43 54 20 61 2c 20 63 6f 75 6e   {SELECT a, coun
3670: 74 28 2a 29 20 46 52 4f 4d 20 61 62 63 20 47 52  t(*) FROM abc GR
3680: 4f 55 50 20 42 59 20 61 3b 7d 0a 20 20 7d 20 7b  OUP BY a;}.  } {
3690: 31 20 38 20 34 20 38 20 37 20 38 7d 0a 7d 0a 53  1 8 4 8 7 8}.}.S
36a0: 51 4c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  QL {DELETE FROM 
36b0: 61 62 63 7d 0a 54 45 53 54 20 32 33 20 7b 0a 20  abc}.TEST 23 {. 
36c0: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64   do_test $testid
36d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
36e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
36f0: 63 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c 20  c}.  } {}.}.SQL 
3700: 7b 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 54 45 53 54  {ROLLBACK;}.TEST
3710: 20 32 34 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   24 {.  do_test 
3720: 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78  $testid {.    ex
3730: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c  ecsql {SELECT a,
3740: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
3750: 62 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a  bc GROUP BY a;}.
3760: 20 20 7d 20 7b 31 20 31 36 20 34 20 31 36 20 37    } {1 16 4 16 7
3770: 20 31 36 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 73   16}.}..# Test s
3780: 6f 6d 65 20 73 63 68 65 6d 61 20 6d 6f 64 69 66  ome schema modif
3790: 69 63 61 74 69 6f 6e 73 20 69 6e 73 69 64 65 20  ications inside 
37a0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
37b0: 2e 20 54 68 65 73 65 20 73 68 6f 75 6c 64 20 61  . These should a
37c0: 6c 6c 0a 23 20 63 61 75 73 65 20 74 72 61 6e 73  ll.# cause trans
37d0: 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
37e0: 69 66 20 74 68 65 79 20 66 61 69 6c 2e 20 41 6c  if they fail. Al
37f0: 73 6f 20 71 75 65 72 79 20 61 20 76 69 65 77 2c  so query a view,
3800: 20 74 6f 20 63 6f 76 65 72 20 61 20 62 69 74 0a   to cover a bit.
3810: 23 20 6d 6f 72 65 20 63 6f 64 65 2e 0a 23 0a 50  # more code..#.P
3820: 52 45 50 20 7b 44 52 4f 50 20 56 49 45 57 20 61  REP {DROP VIEW a
3830: 62 63 5f 76 3b 7d 0a 54 45 53 54 20 32 35 20 7b  bc_v;}.TEST 25 {
3840: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
3850: 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  id {.    execsql
3860: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
3870: 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 46  name, tbl_name F
3880: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
3890: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61 62  r;.    }.  } {ab
38a0: 63 20 61 62 63 20 61 62 63 5f 69 20 61 62 63 7d  c abc abc_i abc}
38b0: 0a 7d 0a 53 51 4c 20 7b 42 45 47 49 4e 3b 7d 0a  .}.SQL {BEGIN;}.
38c0: 53 51 4c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  SQL {CREATE TABL
38d0: 45 20 64 65 66 28 64 2c 20 65 2c 20 66 29 3b 7d  E def(d, e, f);}
38e0: 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 54 41 42  .SQL {CREATE TAB
38f0: 4c 45 20 67 68 69 28 67 2c 20 68 2c 20 69 29 3b  LE ghi(g, h, i);
3900: 7d 0a 54 45 53 54 20 32 36 20 7b 0a 20 20 64 6f  }.TEST 26 {.  do
3910: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
3920: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3930: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c      SELECT name,
3940: 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f 4d 20 73   tbl_name FROM s
3950: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
3960: 20 20 7d 0a 20 20 7d 20 7b 61 62 63 20 61 62 63    }.  } {abc abc
3970: 20 61 62 63 5f 69 20 61 62 63 20 64 65 66 20 64   abc_i abc def d
3980: 65 66 20 67 68 69 20 67 68 69 7d 0a 7d 0a 53 51  ef ghi ghi}.}.SQ
3990: 4c 20 7b 43 52 45 41 54 45 20 56 49 45 57 20 76  L {CREATE VIEW v
39a0: 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  1 AS SELECT * FR
39b0: 4f 4d 20 64 65 66 2c 20 67 68 69 7d 0a 53 51 4c  OM def, ghi}.SQL
39c0: 20 7b 43 52 45 41 54 45 20 55 4e 49 51 55 45 20   {CREATE UNIQUE 
39d0: 49 4e 44 45 58 20 67 68 69 5f 69 31 20 4f 4e 20  INDEX ghi_i1 ON 
39e0: 67 68 69 28 67 29 3b 7d 0a 54 45 53 54 20 32 37  ghi(g);}.TEST 27
39f0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65   {.  do_test $te
3a00: 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73  stid {.    execs
3a10: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3a20: 54 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65  T name, tbl_name
3a30: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
3a40: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ter;.    }.  } {
3a50: 61 62 63 20 61 62 63 20 61 62 63 5f 69 20 61 62  abc abc abc_i ab
3a60: 63 20 64 65 66 20 64 65 66 20 67 68 69 20 67 68  c def def ghi gh
3a70: 69 20 76 31 20 76 31 20 67 68 69 5f 69 31 20 67  i v1 v1 ghi_i1 g
3a80: 68 69 7d 0a 7d 0a 53 51 4c 20 7b 49 4e 53 45 52  hi}.}.SQL {INSER
3a90: 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45  T INTO def VALUE
3aa0: 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63 27 29  S('a', 'b', 'c')
3ab0: 7d 0a 53 51 4c 20 7b 49 4e 53 45 52 54 20 49 4e  }.SQL {INSERT IN
3ac0: 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 31 2c  TO def VALUES(1,
3ad0: 20 32 2c 20 33 29 7d 0a 53 51 4c 20 2d 6e 6f 72   2, 3)}.SQL -nor
3ae0: 6f 6c 6c 62 61 63 6b 20 7b 49 4e 53 45 52 54 20  ollback {INSERT 
3af0: 49 4e 54 4f 20 67 68 69 20 53 45 4c 45 43 54 20  INTO ghi SELECT 
3b00: 2a 20 46 52 4f 4d 20 64 65 66 7d 0a 54 45 53 54  * FROM def}.TEST
3b10: 20 32 38 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   28 {.  do_test 
3b20: 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78  $testid {.    ex
3b30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
3b40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 2c  LECT * FROM def,
3b50: 20 67 68 69 20 57 48 45 52 45 20 64 20 3d 20 67   ghi WHERE d = g
3b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61 20 62  ;.    }.  } {a b
3b70: 20 63 20 61 20 62 20 63 20 31 20 32 20 33 20 31   c a b c 1 2 3 1
3b80: 20 32 20 33 7d 0a 7d 0a 53 51 4c 20 7b 43 4f 4d   2 3}.}.SQL {COM
3b90: 4d 49 54 7d 0a 54 45 53 54 20 32 39 20 7b 0a 20  MIT}.TEST 29 {. 
3ba0: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64   do_test $testid
3bb0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3bc0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
3bd0: 46 52 4f 4d 20 76 31 20 57 48 45 52 45 20 64 20  FROM v1 WHERE d 
3be0: 3d 20 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  = g;.    }.  } {
3bf0: 61 20 62 20 63 20 61 20 62 20 63 20 31 20 32 20  a b c a b c 1 2 
3c00: 33 20 31 20 32 20 33 7d 0a 7d 0a 0a 23 20 54 65  3 1 2 3}.}..# Te
3c10: 73 74 20 61 20 73 69 6d 70 6c 65 20 6d 75 6c 74  st a simple mult
3c20: 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
3c30: 6f 6e 20 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74  on .#.forcedelet
3c40: 65 20 74 65 73 74 32 2e 64 62 0a 69 66 63 61 70  e test2.db.ifcap
3c50: 61 62 6c 65 20 61 74 74 61 63 68 20 7b 0a 20 20  able attach {.  
3c60: 53 51 4c 20 7b 41 54 54 41 43 48 20 27 74 65 73  SQL {ATTACH 'tes
3c70: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 7d 0a  t2.db' AS aux;}.
3c80: 20 20 53 51 4c 20 7b 42 45 47 49 4e 7d 0a 20 20    SQL {BEGIN}.  
3c90: 53 51 4c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  SQL {CREATE TABL
3ca0: 45 20 61 75 78 2e 74 62 6c 32 28 78 2c 20 79 2c  E aux.tbl2(x, y,
3cb0: 20 7a 29 7d 0a 20 20 53 51 4c 20 7b 49 4e 53 45   z)}.  SQL {INSE
3cc0: 52 54 20 49 4e 54 4f 20 74 62 6c 32 20 56 41 4c  RT INTO tbl2 VAL
3cd0: 55 45 53 28 31 2c 20 32 2c 20 33 29 7d 0a 20 20  UES(1, 2, 3)}.  
3ce0: 53 51 4c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  SQL {INSERT INTO
3cf0: 20 64 65 66 20 56 41 4c 55 45 53 28 34 2c 20 35   def VALUES(4, 5
3d00: 2c 20 36 29 7d 0a 20 20 54 45 53 54 20 33 30 20  , 6)}.  TEST 30 
3d10: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74  {.    do_test $t
3d20: 65 73 74 69 64 20 7b 0a 20 20 20 20 20 20 65 78  estid {.      ex
3d30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
3d40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62  SELECT * FROM tb
3d50: 6c 32 2c 20 64 65 66 20 57 48 45 52 45 20 64 20  l2, def WHERE d 
3d60: 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = x;.      }.   
3d70: 20 7d 20 7b 31 20 32 20 33 20 31 20 32 20 33 7d   } {1 2 3 1 2 3}
3d80: 0a 20 20 7d 0a 20 20 53 51 4c 20 7b 43 4f 4d 4d  .  }.  SQL {COMM
3d90: 49 54 7d 0a 20 20 54 45 53 54 20 33 31 20 7b 0a  IT}.  TEST 31 {.
3da0: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73      do_test $tes
3db0: 74 69 64 20 7b 0a 20 20 20 20 20 20 65 78 65 63  tid {.      exec
3dc0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 53 45  sql {.        SE
3dd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 32  LECT * FROM tbl2
3de0: 2c 20 64 65 66 20 57 48 45 52 45 20 64 20 3d 20  , def WHERE d = 
3df0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
3e00: 20 7b 31 20 32 20 33 20 31 20 32 20 33 7d 0a 20   {1 2 3 1 2 3}. 
3e10: 20 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 77 68 61   }.}..# Test wha
3e20: 74 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  t happens when a
3e30: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
3e40: 77 68 69 6c 65 20 74 68 65 72 65 20 61 72 65 20  while there are 
3e50: 6f 74 68 65 72 20 61 63 74 69 76 65 0a 23 20 73  other active.# s
3e60: 74 61 74 65 6d 65 6e 74 73 2e 20 54 68 69 73 20  tatements. This 
3e70: 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
3e80: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
3e90: 29 20 77 6f 72 6b 73 2e 0a 54 45 53 54 20 33 32  ) works..TEST 32
3ea0: 20 7b 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20   {.  if {![info 
3eb0: 65 78 69 73 74 73 20 3a 3a 53 54 4d 54 33 32 5d  exists ::STMT32]
3ec0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20  } {.    set sql 
3ed0: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
3ee0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
3ef0: 0a 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 33  .    set ::STMT3
3f00: 32 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  2 [sqlite3_prepa
3f10: 72 65 20 24 3a 3a 44 42 20 24 73 71 6c 20 2d 31  re $::DB $sql -1
3f20: 20 44 55 4d 4d 59 5d 0a 20 20 20 20 64 6f 5f 74   DUMMY].    do_t
3f30: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
3f50: 20 24 3a 3a 53 54 4d 54 33 32 0a 20 20 20 20 7d   $::STMT32.    }
3f60: 20 7b 53 51 4c 49 54 45 5f 52 4f 57 7d 0a 20 20   {SQLITE_ROW}.  
3f70: 7d 0a 7d 0a 53 51 4c 20 42 45 47 49 4e 0a 54 45  }.}.SQL BEGIN.TE
3f80: 53 54 20 33 33 20 7b 20 0a 20 20 64 6f 5f 74 65  ST 33 { .  do_te
3f90: 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20  st $testid {.   
3fa0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
3fb0: 20 2a 20 46 52 4f 4d 20 67 68 69 7d 0a 20 20 7d   * FROM ghi}.  }
3fc0: 20 7b 61 20 62 20 63 20 31 20 32 20 33 7d 0a 7d   {a b c 1 2 3}.}
3fd0: 0a 53 51 4c 20 2d 6e 6f 72 6f 6c 6c 62 61 63 6b  .SQL -norollback
3fe0: 20 7b 20 0a 20 20 2d 2d 20 54 68 65 72 65 20 69   { .  -- There i
3ff0: 73 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  s a unique index
4000: 20 6f 6e 20 67 68 69 28 67 29 2c 20 73 6f 20 74   on ghi(g), so t
4010: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  his statement ma
4020: 79 20 6e 6f 74 20 63 61 75 73 65 0a 20 20 2d 2d  y not cause.  --
4030: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 52 4f   an automatic RO
4040: 4c 4c 42 41 43 4b 2e 20 48 65 6e 63 65 20 74 68  LLBACK. Hence th
4050: 65 20 22 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 22 20  e "-norollback" 
4060: 73 77 69 74 63 68 2e 0a 20 20 49 4e 53 45 52 54  switch..  INSERT
4070: 20 49 4e 54 4f 20 67 68 69 20 53 45 4c 45 43 54   INTO ghi SELECT
4080: 20 27 32 27 7c 7c 67 2c 20 68 2c 20 69 20 46 52   '2'||g, h, i FR
4090: 4f 4d 20 67 68 69 3b 0a 7d 0a 54 45 53 54 20 33  OM ghi;.}.TEST 3
40a0: 34 20 7b 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20  4 {.  if {[info 
40b0: 65 78 69 73 74 73 20 3a 3a 53 54 4d 54 33 32 5d  exists ::STMT32]
40c0: 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  } {.    do_test 
40d0: 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 20 20  $testid {.      
40e0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
40f0: 20 24 3a 3a 53 54 4d 54 33 32 0a 20 20 20 20 7d   $::STMT32.    }
4100: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 20   {SQLITE_OK}.   
4110: 20 75 6e 73 65 74 20 3a 3a 53 54 4d 54 33 32 0a   unset ::STMT32.
4120: 20 20 7d 0a 7d 0a 53 51 4c 20 43 4f 4d 4d 49 54    }.}.SQL COMMIT
4130: 0a 0a 23 0a 23 20 45 6e 64 20 6f 66 20 74 65 73  ..#.# End of tes
4140: 74 20 70 72 6f 67 72 61 6d 20 64 65 63 6c 61 72  t program declar
4150: 61 74 69 6f 6e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ation.#---------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 0a 0a 70 72 6f 63 20 72 75 6e 5f 74 65 73 74  -..proc run_test
41b0: 20 7b 61 72 67 6c 69 73 74 20 69 52 65 70 65 61   {arglist iRepea
41c0: 74 20 7b 70 63 73 74 61 72 74 20 30 7d 20 7b 69  t {pcstart 0} {i
41d0: 46 61 69 6c 53 74 61 72 74 20 31 7d 7d 20 7b 0a  FailStart 1}} {.
41e0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
41f0: 61 72 67 6c 69 73 74 5d 20 25 32 7d 20 7b 0a 20  arglist] %2} {. 
4200: 20 20 20 65 72 72 6f 72 20 22 55 6e 65 76 65 6e     error "Uneven
4210: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
4220: 65 6e 74 73 20 74 6f 20 54 45 53 54 22 0a 20 20  ents to TEST".  
4230: 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20  }..  for {set i 
4240: 30 7d 20 7b 24 69 20 3c 20 24 70 63 73 74 61 72  0} {$i < $pcstar
4250: 74 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  t} {incr i} {.  
4260: 20 20 73 65 74 20 6b 32 20 5b 6c 69 6e 64 65 78    set k2 [lindex
4270: 20 24 61 72 67 6c 69 73 74 20 5b 65 78 70 72 20   $arglist [expr 
4280: 7b 32 20 2a 20 24 69 7d 5d 5d 0a 20 20 20 20 73  {2 * $i}]].    s
4290: 65 74 20 76 32 20 5b 6c 69 6e 64 65 78 20 24 61  et v2 [lindex $a
42a0: 72 67 6c 69 73 74 20 5b 65 78 70 72 20 7b 32 20  rglist [expr {2 
42b0: 2a 20 24 69 20 2b 20 31 7d 5d 5d 0a 20 20 20 20  * $i + 1}]].    
42c0: 73 65 74 20 61 63 20 5b 73 71 6c 69 74 65 33 5f  set ac [sqlite3_
42d0: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 24  get_autocommit $
42e0: 3a 3a 44 42 5d 20 20 20 20 20 20 20 20 3b 23 20  ::DB]        ;# 
42f0: 41 75 74 6f 2d 43 6f 6d 6d 69 74 0a 20 20 20 20  Auto-Commit.    
4300: 73 77 69 74 63 68 20 2d 2d 20 24 6b 32 20 7b 0a  switch -- $k2 {.
4310: 20 20 20 20 20 20 2d 73 71 6c 20 20 7b 64 62 20        -sql  {db 
4320: 65 76 61 6c 20 5b 6c 69 6e 64 65 78 20 24 76 32  eval [lindex $v2
4330: 20 32 5d 7d 0a 20 20 20 20 20 20 2d 70 72 65 70   2]}.      -prep
4340: 20 7b 64 62 20 65 76 61 6c 20 24 76 32 7d 0a 20   {db eval $v2}. 
4350: 20 20 20 20 20 2d 64 65 62 75 67 20 7b 65 76 61       -debug {eva
4360: 6c 20 24 76 32 7d 0a 20 20 20 20 7d 0a 20 20 20  l $v2}.    }.   
4370: 20 73 65 74 20 6e 61 63 20 5b 73 71 6c 69 74 65   set nac [sqlite
4380: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
4390: 20 24 3a 3a 44 42 5d 20 20 20 20 20 20 20 3b 23   $::DB]       ;#
43a0: 20 4e 65 77 20 41 75 74 6f 2d 43 6f 6d 6d 69 74   New Auto-Commit
43b0: 20 0a 20 20 20 20 69 66 20 7b 24 61 63 20 26 26   .    if {$ac &&
43c0: 20 21 24 6e 61 63 7d 20 7b 73 65 74 20 62 65 67   !$nac} {set beg
43d0: 69 6e 5f 70 63 20 24 69 7d 0a 20 20 7d 0a 0a 20  in_pc $i}.  }.. 
43e0: 20 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f   db rollback_hoo
43f0: 6b 20 5b 6c 69 73 74 20 69 6e 63 72 20 3a 3a 72  k [list incr ::r
4400: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5f 63 6f 75  ollback_hook_cou
4410: 6e 74 5d 0a 0a 20 20 73 65 74 20 69 46 61 69 6c  nt]..  set iFail
4420: 20 24 69 46 61 69 6c 53 74 61 72 74 0a 20 20 73   $iFailStart.  s
4430: 65 74 20 70 63 20 24 70 63 73 74 61 72 74 0a 20  et pc $pcstart. 
4440: 20 77 68 69 6c 65 20 7b 24 70 63 2a 32 20 3c 20   while {$pc*2 < 
4450: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 6c 69 73  [llength $arglis
4460: 74 5d 7d 20 7b 0a 20 20 20 20 23 20 46 65 74 63  t]} {.    # Fetc
4470: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  h the current in
4480: 73 74 72 75 63 74 69 6f 6e 20 74 79 70 65 20 61  struction type a
4490: 6e 64 20 70 61 79 6c 6f 61 64 2e 0a 20 20 20 20  nd payload..    
44a0: 73 65 74 20 6b 20 5b 6c 69 6e 64 65 78 20 24 61  set k [lindex $a
44b0: 72 67 6c 69 73 74 20 5b 65 78 70 72 20 7b 32 20  rglist [expr {2 
44c0: 2a 20 24 70 63 7d 5d 5d 0a 20 20 20 20 73 65 74  * $pc}]].    set
44d0: 20 76 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 6c   v [lindex $argl
44e0: 69 73 74 20 5b 65 78 70 72 20 7b 32 20 2a 20 24  ist [expr {2 * $
44f0: 70 63 20 2b 20 31 7d 5d 5d 0a 0a 20 20 20 20 23  pc + 1}]]..    #
4500: 20 49 64 20 6f 66 20 74 68 69 73 20 69 74 65 72   Id of this iter
4510: 61 74 69 6f 6e 3a 0a 20 20 20 20 73 65 74 20 69  ation:.    set i
4520: 74 65 72 69 64 20 22 70 63 3d 24 70 63 2e 69 46  terid "pc=$pc.iF
4530: 61 69 6c 3d 24 69 46 61 69 6c 24 6b 22 0a 0a 20  ail=$iFail$k".. 
4540: 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6b 20     switch -- $k 
4550: 7b 0a 0a 20 20 20 20 20 20 2d 74 65 73 74 20 7b  {..      -test {
4560: 20 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63   .        foreac
4570: 68 20 7b 69 64 20 73 63 72 69 70 74 7d 20 24 76  h {id script} $v
4580: 20 7b 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {}.        set 
4590: 74 65 73 74 69 64 20 22 6d 61 6c 6c 6f 63 33 2d  testid "malloc3-
45a0: 28 74 65 73 74 20 24 69 64 29 2e 24 69 74 65 72  (test $id).$iter
45b0: 69 64 22 0a 20 20 20 20 20 20 20 20 65 76 61 6c  id".        eval
45c0: 20 24 73 63 72 69 70 74 0a 20 20 20 20 20 20 20   $script.       
45d0: 20 69 6e 63 72 20 70 63 0a 20 20 20 20 20 20 7d   incr pc.      }
45e0: 0a 0a 20 20 20 20 20 20 2d 73 71 6c 20 7b 0a 20  ..      -sql {. 
45f0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 72 6f 6c         set ::rol
4600: 6c 62 61 63 6b 5f 68 6f 6f 6b 5f 63 6f 75 6e 74  lback_hook_count
4610: 20 30 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20   0..        set 
4620: 69 64 20 5b 6c 69 6e 64 65 78 20 24 76 20 30 5d  id [lindex $v 0]
4630: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
4640: 74 69 64 20 22 6d 61 6c 6c 6f 63 33 2d 28 69 6e  tid "malloc3-(in
4650: 74 65 67 72 69 74 79 20 24 69 64 29 2e 24 69 74  tegrity $id).$it
4660: 65 72 69 64 22 0a 0a 20 20 20 20 20 20 20 20 73  erid"..        s
4670: 65 74 20 61 63 20 5b 73 71 6c 69 74 65 33 5f 67  et ac [sqlite3_g
4680: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 24 3a  et_autocommit $:
4690: 3a 44 42 5d 20 20 20 20 20 20 20 20 3b 23 20 41  :DB]        ;# A
46a0: 75 74 6f 2d 43 6f 6d 6d 69 74 0a 20 20 20 20 20  uto-Commit.     
46b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
46c0: 62 75 67 5f 66 61 69 6c 20 24 69 46 61 69 6c 20  bug_fail $iFail 
46d0: 2d 72 65 70 65 61 74 20 30 0a 20 20 20 20 20 20  -repeat 0.      
46e0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
46f0: 7b 64 62 20 65 76 61 6c 20 5b 6c 69 6e 64 65 78  {db eval [lindex
4700: 20 24 76 20 32 5d 7d 20 6d 73 67 5d 20 20 20 3b   $v 2]} msg]   ;
4710: 23 20 54 72 75 65 20 65 72 72 6f 72 20 6f 63 63  # True error occ
4720: 75 72 73 0a 20 20 20 20 20 20 20 20 73 65 74 20  urs.        set 
4730: 6e 61 63 20 5b 73 71 6c 69 74 65 33 5f 67 65 74  nac [sqlite3_get
4740: 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 24 3a 3a 44  _autocommit $::D
4750: 42 5d 20 20 20 20 20 20 20 3b 23 20 4e 65 77 20  B]       ;# New 
4760: 41 75 74 6f 2d 43 6f 6d 6d 69 74 20 0a 0a 20 20  Auto-Commit ..  
4770: 20 20 20 20 20 20 69 66 20 7b 24 72 63 20 21 3d        if {$rc !=
4780: 20 30 20 26 26 20 24 6e 61 63 20 26 26 20 21 24   0 && $nac && !$
4790: 61 63 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ac} {.          
47a0: 23 20 42 65 66 6f 72 65 20 5b 64 62 20 65 76 61  # Before [db eva
47b0: 6c 5d 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  l] the auto-comm
47c0: 69 74 20 66 6c 61 67 20 77 61 73 20 63 6c 65 61  it flag was clea
47d0: 72 2e 20 4e 6f 77 20 69 74 0a 20 20 20 20 20 20  r. Now it.      
47e0: 20 20 20 20 23 20 69 73 20 73 65 74 2e 20 53 69      # is set. Si
47f0: 6e 63 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  nce an error occ
4800: 75 72 72 65 64 20 77 65 20 61 73 73 75 6d 65 20  urred we assume 
4810: 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 0a 20  this was not a. 
4820: 20 20 20 20 20 20 20 20 20 23 20 63 6f 6d 6d 69           # commi
4830: 74 20 2d 20 74 68 65 72 65 66 6f 72 65 20 61 20  t - therefore a 
4840: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 72 65  rollback occurre
4850: 64 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  d. Check that th
4860: 65 0a 20 20 20 20 20 20 20 20 20 20 23 20 72 6f  e.          # ro
4870: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 77 61 73 20  llback-hook was 
4880: 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 20 20 20  invoked..       
4890: 20 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f     do_test mallo
48a0: 63 33 2d 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  c3-rollback_hook
48b0: 5f 63 6f 75 6e 74 2e 24 69 74 65 72 69 64 20 7b  _count.$iterid {
48c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
48d0: 20 3a 3a 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b   ::rollback_hook
48e0: 5f 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  _count.         
48f0: 20 7d 20 7b 31 7d 0a 20 20 20 20 20 20 20 20 7d   } {1}.        }
4900: 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 46  ..        set nF
4910: 61 69 6c 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d  ail [sqlite3_mem
4920: 64 65 62 75 67 5f 66 61 69 6c 20 2d 31 20 2d 62  debug_fail -1 -b
4930: 65 6e 69 67 6e 63 6e 74 20 6e 42 65 6e 69 67 6e  enigncnt nBenign
4940: 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ].        if {$r
4950: 63 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20  c == 0} {.      
4960: 20 20 20 20 20 20 23 20 53 75 63 63 65 73 73 66        # Successf
4970: 75 6c 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ul execution of 
4980: 73 71 6c 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  sql. The number 
4990: 6f 66 20 66 61 69 6c 65 64 20 6d 61 6c 6c 6f 63  of failed malloc
49a0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ().            #
49b0: 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 62 65   calls should be
49c0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
49d0: 6d 62 65 72 20 6f 66 20 62 65 6e 69 67 6e 20 66  mber of benign f
49e0: 61 69 6c 75 72 65 73 2e 0a 20 20 20 20 20 20 20  ailures..       
49f0: 20 20 20 20 20 23 20 4f 74 68 65 72 77 69 73 65       # Otherwise
4a00: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
4a10: 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ed and the error
4a20: 20 77 61 73 20 6e 6f 74 20 72 65 70 6f 72 74 65   was not reporte
4a30: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
4a40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65   .            se
4a50: 74 20 65 78 70 72 20 7b 24 6e 46 61 69 6c 21 3d  t expr {$nFail!=
4a60: 24 6e 42 65 6e 69 67 6e 7d 0a 20 20 20 20 20 20  $nBenign}.      
4a70: 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70 72 20        if {[expr 
4a80: 24 65 78 70 72 5d 7d 20 7b 0a 20 20 20 20 20 20  $expr]} {.      
4a90: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 55          error "U
4aa0: 6e 72 65 70 6f 72 74 65 64 20 6d 61 6c 6c 6f 63  nreported malloc
4ab0: 28 29 20 66 61 69 6c 75 72 65 2c 20 74 65 73 74  () failure, test
4ac0: 20 5c 22 24 74 65 73 74 69 64 5c 22 2c 20 24 65   \"$testid\", $e
4ad0: 78 70 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  xpr".           
4ae0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4af0: 69 66 20 7b 24 61 63 20 26 26 20 21 24 6e 61 63  if {$ac && !$nac
4b00: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
4b10: 20 20 23 20 42 65 66 6f 72 65 20 74 68 65 20 5b    # Before the [
4b20: 64 62 20 65 76 61 6c 5d 20 74 68 65 20 61 75 74  db eval] the aut
4b30: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 77 61  o-commit flag wa
4b40: 73 20 73 65 74 2c 20 6e 6f 77 20 69 74 0a 20 20  s set, now it.  
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 69 73              # is
4b60: 20 63 6c 65 61 72 2e 20 57 65 20 63 61 6e 20 64   clear. We can d
4b70: 65 64 75 63 65 20 74 68 61 74 20 61 20 22 42 45  educe that a "BE
4b80: 47 49 4e 22 20 73 74 61 74 65 6d 65 6e 74 20 68  GIN" statement h
4b90: 61 73 20 6a 75 73 74 0a 20 20 20 20 20 20 20 20  as just.        
4ba0: 20 20 20 20 20 20 23 20 62 65 65 6e 20 73 75 63        # been suc
4bb0: 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75 74  cessfully execut
4bc0: 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
4bd0: 20 20 73 65 74 20 62 65 67 69 6e 5f 70 63 20 24    set begin_pc $
4be0: 70 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  pc.            }
4bf0: 20 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   ..            i
4c00: 6e 63 72 20 70 63 0a 20 20 20 20 20 20 20 20 20  ncr pc.         
4c10: 20 20 20 73 65 74 20 69 46 61 69 6c 20 31 0a 20     set iFail 1. 
4c20: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67             integ
4c30: 72 69 74 79 5f 63 68 65 63 6b 20 24 74 65 73 74  rity_check $test
4c40: 69 64 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  id.        } els
4c50: 65 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 2e 2a  eif {[regexp {.*
4c60: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 7d 20 24  out of memory} $
4c70: 6d 73 67 5d 20 7c 7c 20 5b 64 62 20 65 72 72 6f  msg] || [db erro
4c80: 72 63 6f 64 65 5d 20 3d 3d 20 33 30 38 32 7d 20  rcode] == 3082} 
4c90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  {.            # 
4ca0: 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 65 72  Out of memory er
4cb0: 72 6f 72 2c 20 61 73 20 65 78 70 65 63 74 65 64  ror, as expected
4cc0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0a  ..            #.
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
4ce0: 67 72 69 74 79 5f 63 68 65 63 6b 20 24 74 65 73  grity_check $tes
4cf0: 74 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  tid.            
4d00: 69 6e 63 72 20 69 46 61 69 6c 0a 20 20 20 20 20  incr iFail.     
4d10: 20 20 20 20 20 20 20 69 66 20 7b 24 6e 61 63 20         if {$nac 
4d20: 26 26 20 21 24 61 63 7d 20 7b 0a 20 20 20 20 20  && !$ac} {.     
4d30: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 6c           if {![l
4d40: 69 6e 64 65 78 20 24 76 20 31 5d 20 26 26 20 5b  index $v 1] && [
4d50: 64 62 20 65 72 72 6f 72 63 6f 64 65 5d 20 21 3d  db errorcode] !=
4d60: 20 33 30 38 32 7d 20 7b 0a 20 20 20 20 20 20 20   3082} {.       
4d70: 20 20 20 20 20 20 20 20 20 23 20 65 72 72 6f 72           # error
4d80: 20 22 53 74 61 74 65 6d 65 6e 74 20 5c 22 5b 6c   "Statement \"[l
4d90: 69 6e 64 65 78 20 24 76 20 32 5d 5c 22 20 63 61  index $v 2]\" ca
4da0: 75 73 65 64 20 61 20 72 6f 6c 6c 62 61 63 6b 22  used a rollback"
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
4dc0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4dd0: 66 6f 72 20 7b 73 65 74 20 69 20 24 62 65 67 69  for {set i $begi
4de0: 6e 5f 70 63 7d 20 7b 24 69 20 3c 20 24 70 63 7d  n_pc} {$i < $pc}
4df0: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
4e10: 6b 32 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 6c  k2 [lindex $argl
4e20: 69 73 74 20 5b 65 78 70 72 20 7b 32 20 2a 20 24  ist [expr {2 * $
4e30: 69 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  i}]].           
4e40: 20 20 20 20 20 73 65 74 20 76 32 20 5b 6c 69 6e       set v2 [lin
4e50: 64 65 78 20 24 61 72 67 6c 69 73 74 20 5b 65 78  dex $arglist [ex
4e60: 70 72 20 7b 32 20 2a 20 24 69 20 2b 20 31 7d 5d  pr {2 * $i + 1}]
4e70: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
4e80: 20 20 73 65 74 20 63 61 74 63 68 75 70 73 71 6c    set catchupsql
4e90: 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20   "".            
4ea0: 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6b      switch -- $k
4eb0: 32 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2 {.            
4ec0: 20 20 20 20 20 20 2d 73 71 6c 20 20 7b 73 65 74        -sql  {set
4ed0: 20 63 61 74 63 68 75 70 73 71 6c 20 5b 6c 69 6e   catchupsql [lin
4ee0: 64 65 78 20 24 76 32 20 32 5d 7d 0a 20 20 20 20  dex $v2 2]}.    
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 70                -p
4f00: 72 65 70 20 7b 73 65 74 20 63 61 74 63 68 75 70  rep {set catchup
4f10: 73 71 6c 20 24 76 32 7d 0a 20 20 20 20 20 20 20  sql $v2}.       
4f20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4f30: 20 20 20 20 20 20 20 20 20 20 20 64 62 20 65 76             db ev
4f40: 61 6c 20 24 63 61 74 63 68 75 70 73 71 6c 0a 20  al $catchupsql. 
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4f60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4f70: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
4f80: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
4f90: 24 6d 73 67 0a 20 20 20 20 20 20 20 20 7d 0a 0a  $msg.        }..
4fa0: 20 20 20 20 20 20 20 20 23 20 62 61 63 6b 20 75          # back u
4fb0: 70 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  p to the previou
4fc0: 73 20 22 2d 74 65 73 74 22 20 62 6c 6f 63 6b 2e  s "-test" block.
4fd0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b  .        while {
4fe0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 6c 69 73 74  [lindex $arglist
4ff0: 20 5b 65 78 70 72 20 7b 32 20 2a 20 28 24 70 63   [expr {2 * ($pc
5000: 20 2d 20 31 29 7d 5d 5d 20 3d 3d 20 22 2d 74 65   - 1)}]] == "-te
5010: 73 74 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  st"} {.         
5020: 20 69 6e 63 72 20 70 63 20 2d 31 0a 20 20 20 20   incr pc -1.    
5030: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
5040: 20 20 20 20 20 2d 70 72 65 70 20 7b 0a 20 20 20       -prep {.   
5050: 20 20 20 20 20 64 62 20 65 76 61 6c 20 24 76 0a       db eval $v.
5060: 20 20 20 20 20 20 20 20 69 6e 63 72 20 70 63 0a          incr pc.
5070: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2d        }..      -
5080: 64 65 62 75 67 20 7b 0a 20 20 20 20 20 20 20 20  debug {.        
5090: 65 76 61 6c 20 24 76 0a 20 20 20 20 20 20 20 20  eval $v.        
50a0: 69 6e 63 72 20 70 63 0a 20 20 20 20 20 20 7d 0a  incr pc.      }.
50b0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b  .      default {
50c0: 20 65 72 72 6f 72 20 22 55 6e 6b 6e 6f 77 6e 20   error "Unknown 
50d0: 73 77 69 74 63 68 3a 20 24 6b 22 20 7d 0a 20 20  switch: $k" }.  
50e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 54 75 72    }.  }.}..# Tur
50f0: 6e 20 6f 66 66 20 74 68 65 20 54 63 6c 20 69 6e  n off the Tcl in
5100: 74 65 72 66 61 63 65 27 73 20 70 72 65 70 61 72  terface's prepar
5110: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  ed statement cac
5120: 68 69 6e 67 20 66 61 63 69 6c 69 74 79 2e 20 54  hing facility. T
5130: 68 65 6e 0a 23 20 72 75 6e 20 74 68 65 20 74 65  hen.# run the te
5140: 73 74 73 20 77 69 74 68 20 22 70 65 72 73 69 73  sts with "persis
5150: 74 65 6e 74 22 20 6d 61 6c 6c 6f 63 20 66 61 69  tent" malloc fai
5160: 6c 75 72 65 73 2e 0a 73 71 6c 69 74 65 33 5f 65  lures..sqlite3_e
5170: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
5180: 6f 64 65 73 20 64 62 20 31 0a 64 62 20 63 61 63  odes db 1.db cac
5190: 68 65 20 73 69 7a 65 20 30 0a 72 75 6e 5f 74 65  he size 0.run_te
51a0: 73 74 20 24 3a 3a 72 75 6e 5f 74 65 73 74 5f 73  st $::run_test_s
51b0: 63 72 69 70 74 20 31 0a 0a 23 20 43 6c 6f 73 65  cript 1..# Close
51c0: 20 61 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20   and reopen the 
51d0: 64 62 2e 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72  db..db close.for
51e0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
51f0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
5200: 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e   test2.db test2.
5210: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74  db-journal.sqlit
5220: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73 71  e3 db test.db.sq
5230: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
5240: 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62 20 31  esult_codes db 1
5250: 0a 73 65 74 20 3a 3a 44 42 20 5b 73 71 6c 69 74  .set ::DB [sqlit
5260: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
5270: 69 6e 74 65 72 20 64 62 5d 0a 0a 23 20 54 75 72  inter db]..# Tur
5280: 6e 20 6f 66 66 20 74 68 65 20 54 63 6c 20 69 6e  n off the Tcl in
5290: 74 65 72 66 61 63 65 27 73 20 70 72 65 70 61 72  terface's prepar
52a0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  ed statement cac
52b0: 68 69 6e 67 20 66 61 63 69 6c 69 74 79 20 69 6e  hing facility in
52c0: 0a 23 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 6e  .# the new connn
52d0: 65 63 74 69 6f 6e 2e 20 54 68 65 6e 20 72 75 6e  ection. Then run
52e0: 20 74 68 65 20 74 65 73 74 73 20 77 69 74 68 20   the tests with 
52f0: 22 74 72 61 6e 73 69 65 6e 74 22 20 6d 61 6c 6c  "transient" mall
5300: 6f 63 20 66 61 69 6c 75 72 65 73 2e 0a 64 62 20  oc failures..db 
5310: 63 61 63 68 65 20 73 69 7a 65 20 30 0a 72 75 6e  cache size 0.run
5320: 5f 74 65 73 74 20 24 3a 3a 72 75 6e 5f 74 65 73  _test $::run_tes
5330: 74 5f 73 63 72 69 70 74 20 30 0a 0a 73 71 6c 69  t_script 0..sqli
5340: 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69  te3_memdebug_fai
5350: 6c 20 2d 31 0a 66 69 6e 69 73 68 5f 74 65 73 74  l -1.finish_test
5360: 0a                                               .