/ Hex Artifact Content
Login

Artifact e965954b6f808876a63d3101fd70370320b509a7:


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 31 30 20 32 30 30 37 2f 30 33 2f 32 38   1.10 2007/03/28
0240: 20 30 31 3a 35 39 3a 33 34 20 64 72 68 20 45 78   01:59:34 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 0a 23 20 4f 6e 6c 79 20 72 75 6e 20 74 68  l..# Only run th
02a0: 65 73 65 20 74 65 73 74 73 20 69 66 20 6d 65 6d  ese tests if mem
02b0: 6f 72 79 20 64 65 62 75 67 67 69 6e 67 20 69 73  ory debugging is
02c0: 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 69 66 20 7b   turned on..if {
02d0: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 20 73 71  [info command sq
02e0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74  lite_malloc_stat
02f0: 5d 3d 3d 22 22 7d 20 7b 0a 20 20 20 70 75 74 73  ]==""} {.   puts
0300: 20 22 53 6b 69 70 70 69 6e 67 20 6d 61 6c 6c 6f   "Skipping mallo
0310: 63 20 74 65 73 74 73 3a 20 6e 6f 74 20 63 6f 6d  c tests: not com
0320: 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
0330: 49 54 45 5f 4d 45 4d 44 45 42 55 47 2e 2e 2e 22  ITE_MEMDEBUG..."
0340: 0a 20 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  .   finish_test.
0350: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d     return.}..#--
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 4f 54 45 53  --------.# NOTES
03b0: 20 4f 4e 20 52 45 43 4f 56 45 52 49 4e 47 20 46   ON RECOVERING F
03c0: 52 4f 4d 20 41 20 4d 41 4c 4c 4f 43 20 46 41 49  ROM A MALLOC FAI
03d0: 4c 55 52 45 0a 23 20 0a 23 20 54 68 65 20 74 65  LURE.# .# The te
03e0: 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  sts in this file
03f0: 20 74 65 73 74 20 74 68 65 20 62 65 68 61 76 69   test the behavi
0400: 6f 75 72 73 20 64 65 73 63 72 69 62 65 64 20 69  ours described i
0410: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
0420: 23 20 70 61 72 61 67 72 61 70 68 73 2e 20 54 68  # paragraphs. Th
0430: 65 73 65 20 74 65 73 74 73 20 74 65 73 74 20 74  ese tests test t
0440: 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66 20  he behaviour of 
0450: 74 68 65 20 73 79 73 74 65 6d 20 77 68 65 6e 20  the system when 
0460: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 0a 23  malloc() fails.#
0470: 20 69 6e 73 69 64 65 20 6f 66 20 61 20 63 61 6c   inside of a cal
0480: 6c 20 74 6f 20 5f 70 72 65 70 61 72 65 28 29 2c  l to _prepare(),
0490: 20 5f 73 74 65 70 28 29 2c 20 5f 66 69 6e 61 6c   _step(), _final
04a0: 69 7a 65 28 29 20 6f 72 20 5f 72 65 73 65 74 28  ize() or _reset(
04b0: 29 2e 20 54 68 65 0a 23 20 68 61 6e 64 6c 69 6e  ). The.# handlin
04c0: 67 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  g of malloc() fa
04d0: 69 6c 75 72 65 73 20 77 69 74 68 69 6e 20 61 6e  ilures within an
04e0: 63 69 6c 6c 61 72 79 20 70 72 6f 63 65 64 75 72  cillary procedur
04f0: 65 73 20 69 73 20 74 65 73 74 65 64 0a 23 20 65  es is tested.# e
0500: 6c 73 65 77 68 65 72 65 2e 0a 23 0a 23 20 4f 76  lsewhere..#.# Ov
0510: 65 72 76 69 65 77 3a 0a 23 0a 23 20 45 78 65 63  erview:.#.# Exec
0520: 75 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  uting a statemen
0530: 74 20 69 73 20 64 6f 6e 65 20 69 6e 20 74 68 72  t is done in thr
0540: 65 65 20 73 74 61 67 65 73 20 28 70 72 65 70 61  ee stages (prepa
0550: 72 65 2c 20 73 74 65 70 20 61 6e 64 20 66 69 6e  re, step and fin
0560: 61 6c 69 7a 65 29 2e 20 41 0a 23 20 6d 61 6c 6c  alize). A.# mall
0570: 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6d 61 79  oc() failure may
0580: 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61 6e   occur within an
0590: 79 20 73 74 61 67 65 2e 20 49 66 20 61 20 6d 65  y stage. If a me
05a0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
05b0: 66 61 69 6c 73 0a 23 20 64 75 72 69 6e 67 20 73  fails.# during s
05c0: 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72 61  tatement prepara
05d0: 74 69 6f 6e 2c 20 6e 6f 20 73 74 61 74 65 6d 65  tion, no stateme
05e0: 6e 74 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  nt handle is ret
05f0: 75 72 6e 65 64 2e 20 46 72 6f 6d 20 74 68 65 20  urned. From the 
0600: 75 73 65 72 73 0a 23 20 70 6f 69 6e 74 20 6f 66  users.# point of
0610: 20 76 69 65 77 20 74 68 65 20 73 79 73 74 65 6d   view the system
0620: 20 73 74 61 74 65 20 69 73 20 61 73 20 69 66 20   state is as if 
0630: 5f 70 72 65 70 61 72 65 28 29 20 68 61 64 20 6e  _prepare() had n
0640: 65 76 65 72 20 62 65 65 6e 20 63 61 6c 6c 65 64  ever been called
0650: 2e 0a 23 0a 23 20 49 66 20 74 68 65 20 6d 65 6d  ..#.# If the mem
0660: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
0670: 61 69 6c 73 20 64 75 72 69 6e 67 20 74 68 65 20  ails during the 
0680: 5f 73 74 65 70 28 29 20 6f 72 20 5f 66 69 6e 61  _step() or _fina
0690: 6c 69 7a 65 28 29 20 63 61 6c 6c 73 2c 20 74 68  lize() calls, th
06a0: 65 6e 0a 23 20 74 68 65 20 64 61 74 61 62 61 73  en.# the databas
06b0: 65 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  e may be left in
06c0: 20 6f 6e 65 20 6f 66 20 74 77 6f 20 73 74 61 74   one of two stat
06d0: 65 73 20 28 61 66 74 65 72 20 66 69 6e 61 6c 69  es (after finali
06e0: 7a 65 28 29 20 68 61 73 20 62 65 65 6e 0a 23 20  ze() has been.# 
06f0: 63 61 6c 6c 65 64 29 3a 0a 23 0a 23 20 20 20 20  called):.#.#    
0700: 20 2a 20 41 73 20 69 66 20 74 68 65 20 6e 65 69   * As if the nei
0710: 74 68 65 72 20 5f 73 74 65 70 28 29 20 6e 6f 72  ther _step() nor
0720: 20 5f 66 69 6e 61 6c 69 7a 65 28 29 20 68 61 64   _finalize() had
0730: 20 65 76 65 72 20 62 65 65 6e 20 63 61 6c 6c 65   ever been calle
0740: 64 20 6f 6e 0a 23 20 20 20 20 20 20 20 74 68 65  d on.#       the
0750: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
0760: 65 20 28 69 2e 65 2e 20 61 6e 79 20 63 68 61 6e  e (i.e. any chan
0770: 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ges made by the 
0780: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 0a 23 20  statement are.# 
0790: 20 20 20 20 20 20 72 6f 6c 6c 65 64 20 62 61 63        rolled bac
07a0: 6b 29 2e 0a 23 20 20 20 20 20 2a 20 54 68 65 20  k)..#     * The 
07b0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
07c0: 69 6f 6e 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  ion may be rolle
07d0: 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
07e0: 63 61 73 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  case a hot-journ
07f0: 61 6c 0a 23 20 20 20 20 20 20 20 6d 61 79 20 6f  al.#       may o
0800: 72 20 6d 61 79 20 6e 6f 74 20 61 63 74 75 61 6c  r may not actual
0810: 6c 79 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e  ly be present in
0820: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e   the filesystem.
0830: 0a 23 0a 23 20 54 68 65 20 63 61 6c 6c 65 72 20  .#.# The caller 
0840: 63 61 6e 20 74 65 6c 6c 20 74 68 65 20 64 69 66  can tell the dif
0850: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
0860: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
0870: 69 6f 73 20 62 79 20 69 6e 76 6f 6b 69 6e 67 0a  ios by invoking.
0880: 23 20 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  # _get_autocommi
0890: 74 28 29 2e 0a 23 0a 23 0a 23 20 48 61 6e 64 6c  t()..#.#.# Handl
08a0: 69 6e 67 20 6f 66 20 73 71 6c 69 74 65 33 5f 72  ing of sqlite3_r
08b0: 65 73 65 74 28 29 3a 0a 23 0a 23 20 49 66 20 61  eset():.#.# If a
08c0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
08d0: 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 20  while executing 
08e0: 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  an sqlite3_reset
08f0: 28 29 20 63 61 6c 6c 2c 20 74 68 69 73 20 69 73  () call, this is
0900: 20 68 61 6e 64 6c 65 64 0a 23 20 69 6e 20 74 68   handled.# in th
0910: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 61 20  e same way as a 
0920: 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 5f  failure within _
0930: 66 69 6e 61 6c 69 7a 65 28 29 2e 20 54 68 65 20  finalize(). The 
0940: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
0950: 0a 23 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  .# is not delete
0960: 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 70 61  d and must be pa
0970: 73 73 65 64 20 74 6f 20 5f 66 69 6e 61 6c 69 7a  ssed to _finaliz
0980: 65 28 29 20 66 6f 72 20 72 65 73 6f 75 72 63 65  e() for resource
0990: 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 23   deallocation..#
09a0: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 5f   Attempting to _
09b0: 73 74 65 70 28 29 20 6f 72 20 5f 72 65 73 65 74  step() or _reset
09c0: 28 29 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  () the statement
09d0: 20 61 66 74 65 72 20 61 20 66 61 69 6c 65 64 20   after a failed 
09e0: 5f 72 65 73 65 74 28 29 20 77 69 6c 6c 0a 23 20  _reset() will.# 
09f0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  always return SQ
0a00: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 23 0a 23 0a  LITE_NOMEM..#.#.
0a10: 23 20 4f 74 68 65 72 20 61 63 74 69 76 65 20 53  # Other active S
0a20: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 23  QL statements:.#
0a30: 0a 23 20 54 68 65 20 65 66 66 65 63 74 20 6f 66  .# The effect of
0a40: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
0a50: 65 20 6f 6e 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e on concurrentl
0a60: 79 20 65 78 65 63 75 74 69 6e 67 20 53 51 4c 20  y executing SQL 
0a70: 73 74 61 74 65 6d 65 6e 74 73 2c 0a 23 20 70 61  statements,.# pa
0a80: 72 74 69 63 75 6c 61 72 6c 79 20 77 68 65 6e 20  rticularly when 
0a90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
0aa0: 20 65 78 65 63 75 74 69 6e 67 20 77 69 74 68 20   executing with 
0ab0: 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
0ac0: 20 73 65 74 20 61 6e 64 0a 23 20 74 68 65 20 6d   set and.# the m
0ad0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
0ae0: 6d 61 6e 64 61 74 65 73 20 73 74 61 74 65 6d 65  mandates stateme
0af0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 6f 6e 6c 79  nt rollback only
0b00: 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 69 66 0a  . Currently, if.
0b10: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  # transaction ro
0b20: 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
0b30: 65 64 2c 20 61 6c 6c 20 6f 74 68 65 72 20 76 64  ed, all other vd
0b40: 62 65 27 73 20 61 72 65 20 61 62 6f 72 74 65 64  be's are aborted
0b50: 2e 0a 23 0a 23 20 20 20 20 20 4e 6f 6e 2d 74 72  ..#.#     Non-tr
0b60: 61 6e 73 69 65 6e 74 20 6d 61 6c 6c 6f 63 73 20  ansient mallocs 
0b70: 69 6e 20 62 74 72 65 65 2e 63 3a 0a 23 20 20 20  in btree.c:.#   
0b80: 20 20 20 20 20 20 2a 20 54 68 65 20 42 74 72 65        * The Btre
0b90: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
0ba0: 6c 66 0a 23 20 20 20 20 20 20 20 20 20 2a 20 45  lf.#         * E
0bb0: 61 63 68 20 42 74 43 75 72 73 6f 72 20 73 74 72  ach BtCursor str
0bc0: 75 63 74 75 72 65 0a 23 0a 23 20 20 20 20 20 4d  ucture.#.#     M
0bd0: 61 6c 6c 6f 63 73 20 69 6e 20 70 61 67 65 72 2e  allocs in pager.
0be0: 63 3a 0a 23 20 20 20 20 20 20 20 20 20 72 65 61  c:.#         rea
0bf0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  dMasterJournal()
0c00: 20 20 2d 20 53 70 61 63 65 20 74 6f 20 72 65 61    - Space to rea
0c10: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
0c20: 72 6e 61 6c 20 6e 61 6d 65 0a 23 20 20 20 20 20  rnal name.#     
0c30: 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73      pager_delmas
0c40: 74 65 72 28 29 20 20 20 20 2d 20 53 70 61 63 65  ter()    - Space
0c50: 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
0c60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
0c70: 69 6c 65 0a 23 0a 23 20 20 20 20 20 20 20 20 20  ile.#.#         
0c80: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
0c90: 6e 28 29 20 20 2d 20 54 68 65 20 70 61 67 65 72  n()  - The pager
0ca0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
0cb0: 66 0a 23 20 20 20 20 20 20 20 20 20 73 71 6c 69  f.#         sqli
0cc0: 74 65 33 5f 70 61 67 65 72 67 65 74 28 29 20 20  te3_pagerget()  
0cd0: 20 2d 20 53 70 61 63 65 20 66 6f 72 20 61 20 6e   - Space for a n
0ce0: 65 77 20 70 61 67 65 0a 23 20 20 20 20 20 20 20  ew page.#       
0cf0: 20 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75    pager_open_jou
0d00: 72 6e 61 6c 28 29 20 2d 20 50 61 67 65 72 2e 61  rnal() - Pager.a
0d10: 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20 62 69 74 6d  InJournal[] bitm
0d20: 61 70 0a 23 20 20 20 20 20 20 20 20 20 73 71 6c  ap.#         sql
0d30: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0d40: 29 20 2d 20 46 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ) - For in-memor
0d50: 79 20 64 61 74 61 62 61 73 65 73 20 6f 6e 6c 79  y databases only
0d60: 3a 20 68 69 73 74 6f 72 79 20 70 61 67 65 20 61  : history page a
0d70: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 68 69      statement hi
0da0: 73 74 6f 72 79 20 70 61 67 65 2e 0a 23 20 20 20  story page..#   
0db0: 20 20 20 20 20 20 70 61 67 65 72 5f 73 74 6d 74        pager_stmt
0dc0: 5f 62 65 67 69 6e 28 29 20 20 20 2d 20 50 61 67  _begin()   - Pag
0dd0: 65 72 2e 61 49 6e 53 74 6d 74 5b 5d 20 62 69 74  er.aInStmt[] bit
0de0: 6d 61 70 0a 23 0a 23 20 4e 6f 6e 65 20 6f 66 20  map.#.# None of 
0df0: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 61 20  the above are a 
0e00: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 54 68  huge problem. Th
0e10: 65 20 6d 6f 73 74 20 74 72 6f 75 62 6c 65 73 6f  e most troubleso
0e20: 6d 65 20 66 61 69 6c 75 72 65 73 20 61 72 65 20  me failures are 
0e30: 74 68 65 0a 23 20 74 72 61 6e 73 69 65 6e 74 20  the.# transient 
0e40: 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 73 20 69  malloc() calls i
0e50: 6e 20 62 74 72 65 65 2e 63 2c 20 77 68 69 63 68  n btree.c, which
0e60: 20 63 61 6e 20 6f 63 63 75 72 20 64 75 72 69 6e   can occur durin
0e70: 67 20 74 68 65 20 74 72 65 65 2d 62 61 6c 61 6e  g the tree-balan
0e80: 63 65 0a 23 20 6f 70 65 72 61 74 69 6f 6e 2e 20  ce.# operation. 
0e90: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 74  This means the t
0ea0: 72 65 65 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ree being balanc
0eb0: 65 64 20 77 69 6c 6c 20 62 65 20 69 6e 74 65 72  ed will be inter
0ec0: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
0ed0: 6e 74 0a 23 20 61 66 74 65 72 20 74 68 65 20 6d  nt.# after the m
0ee0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 20 54  alloc() fails. T
0ef0: 6f 20 61 76 6f 69 64 20 74 68 65 20 63 6f 72 72  o avoid the corr
0f00: 75 70 74 20 74 72 65 65 20 62 65 69 6e 67 20 72  upt tree being r
0f10: 65 61 64 20 62 79 20 61 0a 23 20 52 45 41 44 5f  ead by a.# READ_
0f20: 55 4e 43 4f 4d 4d 49 54 54 45 44 20 71 75 65 72  UNCOMMITTED quer
0f30: 79 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  y, we have to ma
0f40: 6b 65 20 73 75 72 65 20 74 68 65 20 74 72 61 6e  ke sure the tran
0f50: 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74 65  saction or state
0f60: 6d 65 6e 74 0a 23 20 72 6f 6c 6c 62 61 63 6b 20  ment.# rollback 
0f70: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 73 71  occurs before sq
0f80: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 72 65 74  lite3_step() ret
0f90: 75 72 6e 73 2c 20 6e 6f 74 20 64 75 72 69 6e 67  urns, not during
0fa0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 0a 23 20   a subsequent.# 
0fb0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0fc0: 28 29 2e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ()..#-----------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1010: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e  ------------.# N
1060: 4f 54 45 53 20 4f 4e 20 54 45 53 54 20 49 4d 50  OTES ON TEST IMP
1070: 4c 45 4d 45 4e 54 41 54 49 4f 4e 0a 23 0a 23 20  LEMENTATION.#.# 
1080: 54 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  The tests in thi
1090: 73 20 66 69 6c 65 20 61 72 65 20 69 6d 70 6c 65  s file are imple
10a0: 6d 65 6e 74 65 64 20 64 69 66 66 65 72 65 6e 74  mented different
10b0: 6c 79 20 66 72 6f 6d 20 74 68 6f 73 65 20 69 6e  ly from those in
10c0: 20 6f 74 68 65 72 0a 23 20 66 69 6c 65 73 2e 20   other.# files. 
10d0: 49 6e 73 74 65 61 64 2c 20 74 65 73 74 73 20 61  Instead, tests a
10e0: 72 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69  re specified usi
10f0: 6e 67 20 74 68 72 65 65 20 70 72 69 6d 69 74 69  ng three primiti
1100: 76 65 73 3a 20 53 51 4c 2c 20 50 52 45 50 20 61  ves: SQL, PREP a
1110: 6e 64 0a 23 20 54 45 53 54 2e 20 45 61 63 68 20  nd.# TEST. Each 
1120: 70 72 69 6d 69 74 69 76 65 20 68 61 73 20 61 20  primitive has a 
1130: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 2e  single argument.
1140: 20 50 72 69 6d 69 74 69 76 65 73 20 61 72 65 20   Primitives are 
1150: 70 72 6f 63 65 73 73 65 64 20 69 6e 0a 23 20 74  processed in.# t
1160: 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61 72  he order they ar
1170: 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
1180: 68 65 20 66 69 6c 65 2e 0a 23 0a 23 20 41 20 54  he file..#.# A T
1190: 45 53 54 20 70 72 69 6d 69 74 69 76 65 20 73 70  EST primitive sp
11a0: 65 63 69 66 69 65 73 20 61 20 54 43 4c 20 73 63  ecifies a TCL sc
11b0: 72 69 70 74 20 61 73 20 69 74 27 73 20 61 72 67  ript as it's arg
11c0: 75 6d 65 6e 74 2e 20 57 68 65 6e 20 61 20 54 45  ument. When a TE
11d0: 53 54 0a 23 20 64 69 72 65 63 74 69 76 65 20 69  ST.# directive i
11e0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 74 68  s encountered th
11f0: 65 20 54 63 6c 20 73 63 72 69 70 74 20 69 73 20  e Tcl script is 
1200: 65 76 61 6c 75 61 74 65 64 2e 20 55 73 75 61 6c  evaluated. Usual
1210: 6c 79 2c 20 74 68 69 73 20 54 63 6c 0a 23 20 73  ly, this Tcl.# s
1220: 63 72 69 70 74 20 63 6f 6e 74 61 69 6e 73 20 6f  cript contains o
1230: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
1240: 20 74 6f 20 5b 64 6f 5f 74 65 73 74 5d 2e 0a 23   to [do_test]..#
1250: 0a 23 20 41 20 50 52 45 50 20 70 72 69 6d 69 74  .# A PREP primit
1260: 69 76 65 20 73 70 65 63 69 66 69 65 73 20 61 6e  ive specifies an
1270: 20 53 51 4c 20 73 63 72 69 70 74 20 61 73 20 69   SQL script as i
1280: 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 57 68  t's argument. Wh
1290: 65 6e 20 61 20 50 52 45 50 0a 23 20 64 69 72 65  en a PREP.# dire
12a0: 63 74 69 76 65 20 69 73 20 65 6e 63 6f 75 6e 74  ctive is encount
12b0: 65 72 65 64 20 74 68 65 20 53 51 4c 20 69 73 20  ered the SQL is 
12c0: 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20  evaluated using 
12d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12e0: 69 6f 6e 0a 23 20 5b 64 62 5d 2e 0a 23 0a 23 20  ion.# [db]..#.# 
12f0: 54 68 65 20 53 51 4c 20 70 72 69 6d 69 74 69 76  The SQL primitiv
1300: 65 73 20 61 72 65 20 77 68 65 72 65 20 74 68 65  es are where the
1310: 20 61 63 74 69 6f 6e 20 68 61 70 70 65 6e 73 2e   action happens.
1320: 20 41 6e 20 53 51 4c 20 70 72 69 6d 69 74 69 76   An SQL primitiv
1330: 65 20 6d 75 73 74 0a 23 20 63 6f 6e 74 61 69 6e  e must.# contain
1340: 20 61 20 73 69 6e 67 6c 65 2c 20 76 61 6c 69 64   a single, valid
1350: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
1360: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
1370: 20 57 68 65 6e 20 61 6e 20 53 51 4c 0a 23 20 70   When an SQL.# p
1380: 72 69 6d 69 74 69 76 65 20 69 73 20 65 6e 63 6f  rimitive is enco
1390: 75 6e 74 65 72 65 64 2c 20 69 74 20 69 73 20 65  untered, it is e
13a0: 76 61 6c 75 61 74 65 64 20 6f 6e 65 20 6f 72 20  valuated one or 
13b0: 6d 6f 72 65 20 74 69 6d 65 73 20 74 6f 20 74 65  more times to te
13c0: 73 74 20 74 68 65 0a 23 20 62 65 68 61 76 69 6f  st the.# behavio
13d0: 75 72 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ur of the system
13e0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 28 29 20 66   when malloc() f
13f0: 61 69 6c 73 20 64 75 72 69 6e 67 20 70 72 65 70  ails during prep
1400: 61 72 61 74 69 6f 6e 20 6f 72 0a 23 20 65 78 65  aration or.# exe
1410: 63 75 74 69 6f 6e 20 6f 66 20 73 61 69 64 20 73  cution of said s
1420: 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 4e 74  tatement. The Nt
1430: 68 20 74 69 6d 65 20 74 68 65 20 73 74 61 74 65  h time the state
1440: 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65 64  ment is executed
1450: 2c 0a 23 20 74 68 65 20 4e 74 68 20 6d 61 6c 6c  ,.# the Nth mall
1460: 6f 63 20 69 73 20 73 61 69 64 20 74 6f 20 66 61  oc is said to fa
1470: 69 6c 2e 20 54 68 65 20 73 74 61 74 65 6d 65 6e  il. The statemen
1480: 74 20 69 73 20 65 78 65 63 75 74 65 64 20 75 6e  t is executed un
1490: 74 69 6c 20 69 74 0a 23 20 73 75 63 63 65 65 64  til it.# succeed
14a0: 73 2c 20 69 2e 65 2e 20 28 4d 2b 31 29 20 74 69  s, i.e. (M+1) ti
14b0: 6d 65 73 2c 20 77 68 65 72 65 20 4d 20 69 73 20  mes, where M is 
14c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
14d0: 6c 6c 6f 63 73 28 29 20 72 65 71 75 69 72 65 64  llocs() required
14e0: 0a 23 20 74 6f 20 70 72 65 70 61 72 65 20 61 6e  .# to prepare an
14f0: 64 20 65 78 65 63 75 74 65 20 74 68 65 20 73 74  d execute the st
1500: 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 45 61 63  atement..#.# Eac
1510: 68 20 74 69 6d 65 20 61 6e 20 53 51 4c 20 73 74  h time an SQL st
1520: 61 74 65 6d 65 6e 74 20 66 61 69 6c 73 2c 20 74  atement fails, t
1530: 68 65 20 64 72 69 76 65 72 20 70 72 6f 67 72 61  he driver progra
1540: 6d 20 28 73 65 65 20 70 72 6f 63 20 5b 72 75 6e  m (see proc [run
1550: 5f 74 65 73 74 5d 0a 23 20 62 65 6c 6f 77 29 20  _test].# below) 
1560: 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 61  figures out if a
1570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1580: 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
1590: 6c 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  lly rolled back.
15a0: 0a 23 20 49 66 20 6e 6f 74 2c 20 69 74 20 65 78  .# If not, it ex
15b0: 65 63 75 74 65 73 20 61 6e 79 20 54 45 53 54 20  ecutes any TEST 
15c0: 62 6c 6f 63 6b 20 69 6d 6d 65 64 69 61 74 65 6c  block immediatel
15d0: 79 20 70 72 6f 63 65 65 64 69 6e 67 20 74 68 65  y proceeding the
15e0: 20 53 51 4c 0a 23 20 73 74 61 74 65 6d 65 6e 74   SQL.# statement
15f0: 2c 20 74 68 65 6e 20 72 65 65 78 65 63 75 74 65  , then reexecute
1600: 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  s the SQL statem
1610: 65 6e 74 20 77 69 74 68 20 74 68 65 20 6e 65 78  ent with the nex
1620: 74 20 76 61 6c 75 65 20 6f 66 20 4e 2e 0a 23 0a  t value of N..#.
1630: 23 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  # If a transacti
1640: 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  on has been auto
1650: 6d 61 74 69 63 61 6c 6c 79 20 72 6f 6c 6c 65 64  matically rolled
1660: 20 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   back, then the 
1670: 64 72 69 76 65 72 0a 23 20 70 72 6f 67 72 61 6d  driver.# program
1680: 20 65 78 65 63 75 74 65 73 20 61 6c 6c 20 74 68   executes all th
1690: 65 20 53 51 4c 20 73 70 65 63 69 66 69 65 64 20  e SQL specified 
16a0: 61 73 20 70 61 72 74 20 6f 66 20 53 51 4c 20 6f  as part of SQL o
16b0: 72 20 50 52 45 50 20 70 72 69 6d 69 74 69 76 65  r PREP primitive
16c0: 73 0a 23 20 62 65 74 77 65 65 6e 20 74 68 65 20  s.# between the 
16d0: 63 75 72 72 65 6e 74 20 53 51 4c 20 73 74 61 74  current SQL stat
16e0: 65 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 6d 6f  ement and the mo
16f0: 73 74 20 72 65 63 65 6e 74 20 22 42 45 47 49 4e  st recent "BEGIN
1700: 22 2e 20 41 6e 79 20 0a 23 20 54 45 53 54 20 62  ". Any .# TEST b
1710: 6c 6f 63 6b 20 69 6d 6d 65 64 69 61 74 65 6c 79  lock immediately
1720: 20 70 72 6f 63 65 65 64 69 6e 67 20 74 68 65 20   proceeding the 
1730: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
1740: 20 65 76 61 6c 75 61 74 65 64 2c 20 61 6e 64 0a   evaluated, and.
1750: 23 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20 73  # then the SQL s
1760: 74 61 74 65 6d 65 6e 74 20 72 65 65 78 65 63 75  tatement reexecu
1770: 74 65 64 20 77 69 74 68 20 74 68 65 20 69 6e 63  ted with the inc
1780: 72 65 6d 65 6e 74 65 64 20 4e 20 76 61 6c 75 65  remented N value
1790: 2e 0a 23 0a 23 20 54 68 61 74 20 6d 61 6b 65 20  ..#.# That make 
17a0: 61 6e 79 20 73 65 6e 73 65 3f 20 49 66 20 6e 6f  any sense? If no
17b0: 74 2c 20 72 65 61 64 20 74 68 65 20 63 6f 64 65  t, read the code
17c0: 20 69 6e 20 5b 72 75 6e 5f 74 65 73 74 5d 20 61   in [run_test] a
17d0: 6e 64 20 69 74 20 6d 69 67 68 74 2e 0a 23 0a 23  nd it might..#.#
17e0: 20 45 78 74 72 61 20 72 65 73 74 72 69 63 74 69   Extra restricti
17f0: 6f 6e 20 69 6d 70 6f 73 65 64 20 62 79 20 74 68  on imposed by th
1800: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1810: 3a 0a 23 0a 23 20 2a 20 49 66 20 61 20 50 52 45  :.#.# * If a PRE
1820: 50 20 62 6c 6f 63 6b 20 73 74 61 72 74 73 20 61  P block starts a
1830: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
1840: 20 6d 75 73 74 20 66 69 6e 69 73 68 20 69 74 2e   must finish it.
1850: 0a 23 20 2a 20 41 20 50 52 45 50 20 62 6c 6f 63  .# * A PREP bloc
1860: 6b 20 6d 61 79 20 6e 6f 74 20 63 6c 6f 73 65 20  k may not close 
1870: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 74  a transaction it
1880: 20 64 69 64 20 6e 6f 74 20 73 74 61 72 74 2e 0a   did not start..
1890: 23 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #.#-------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a  -------------...
18e0: 23 20 54 68 65 73 65 20 70 72 6f 63 73 20 61 72  # These procs ar
18f0: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
1900: 75 70 20 61 20 22 70 72 6f 67 72 61 6d 22 20 69  up a "program" i
1910: 6e 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  n global variabl
1920: 65 0a 23 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73  e.# ::run_test_s
1930: 63 72 69 70 74 2e 20 41 74 20 74 68 65 20 65 6e  cript. At the en
1940: 64 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 20  d of this file, 
1950: 74 68 65 20 70 72 6f 63 20 5b 72 75 6e 5f 74 65  the proc [run_te
1960: 73 74 5d 20 69 73 20 75 73 65 64 0a 23 20 74 6f  st] is used.# to
1970: 20 65 78 65 63 75 74 65 20 74 68 65 20 70 72 6f   execute the pro
1980: 67 72 61 6d 20 28 61 6e 64 20 61 6c 6c 20 74 65  gram (and all te
1990: 73 74 20 63 61 73 65 73 20 63 6f 6e 74 61 69 6e  st cases contain
19a0: 65 64 20 74 68 65 72 65 69 6e 29 2e 0a 23 0a 73  ed therein)..#.s
19b0: 65 74 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73 63  et ::run_test_sc
19c0: 72 69 70 74 20 5b 6c 69 73 74 5d 0a 70 72 6f 63  ript [list].proc
19d0: 20 54 45 53 54 20 7b 69 64 20 74 7d 20 7b 6c 61   TEST {id t} {la
19e0: 70 70 65 6e 64 20 3a 3a 72 75 6e 5f 74 65 73 74  ppend ::run_test
19f0: 5f 73 63 72 69 70 74 20 2d 74 65 73 74 20 5b 6c  _script -test [l
1a00: 69 73 74 20 24 69 64 20 24 74 5d 7d 0a 70 72 6f  ist $id $t]}.pro
1a10: 63 20 50 52 45 50 20 7b 70 7d 20 7b 6c 61 70 70  c PREP {p} {lapp
1a20: 65 6e 64 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73  end ::run_test_s
1a30: 63 72 69 70 74 20 2d 70 72 65 70 20 5b 73 74 72  cript -prep [str
1a40: 69 6e 67 20 74 72 69 6d 20 24 70 5d 7d 0a 0a 23  ing trim $p]}..#
1a50: 20 53 51 4c 20 2d 2d 0a 23 0a 23 20 20 20 20 20   SQL --.#.#     
1a60: 53 51 4c 20 3f 2d 6e 6f 72 6f 6c 6c 62 61 63 6b  SQL ?-norollback
1a70: 3f 20 3c 73 71 6c 2d 74 65 78 74 3e 0a 23 0a 23  ? <sql-text>.#.#
1a80: 20 41 64 64 20 61 6e 20 27 53 51 4c 27 20 70 72   Add an 'SQL' pr
1a90: 69 6d 69 74 69 76 65 20 74 6f 20 74 68 65 20 70  imitive to the p
1aa0: 72 6f 67 72 61 6d 20 28 73 65 65 20 6e 6f 74 65  rogram (see note
1ab0: 73 20 61 62 6f 76 65 29 2e 20 49 66 20 74 68 65  s above). If the
1ac0: 20 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 0a 23 20 73   -norollback.# s
1ad0: 77 69 74 63 68 20 69 73 20 70 72 65 73 65 6e 74  witch is present
1ae0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
1af0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ment is not allo
1b00: 77 65 64 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  wed to automatic
1b10: 61 6c 6c 79 20 72 6f 6c 6c 0a 23 20 62 61 63 6b  ally roll.# back
1b20: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
1b30: 73 61 63 74 69 6f 6e 20 69 66 20 6d 61 6c 6c 6f  saction if mallo
1b40: 63 28 29 20 66 61 69 6c 73 2e 20 49 74 20 6d 75  c() fails. It mu
1b50: 73 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  st rollback the 
1b60: 73 74 61 74 65 6d 65 6e 74 0a 23 20 74 72 61 6e  statement.# tran
1b70: 73 61 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 23 0a  saction only..#.
1b80: 70 72 6f 63 20 53 51 4c 20 20 7b 61 31 20 7b 61  proc SQL  {a1 {a
1b90: 32 20 22 22 7d 7d 20 7b 0a 20 20 23 20 41 6e 20  2 ""}} {.  # An 
1ba0: 53 51 4c 20 70 72 69 6d 69 74 69 76 65 20 70 61  SQL primitive pa
1bb0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 6c 69 73  rameter is a lis
1bc0: 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74  t of two element
1bd0: 73 2c 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  s, a boolean val
1be0: 75 65 0a 20 20 23 20 69 6e 64 69 63 61 74 69 6e  ue.  # indicatin
1bf0: 67 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  g if the stateme
1c00: 6e 74 20 6d 61 79 20 63 61 75 73 65 20 74 72 61  nt may cause tra
1c10: 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1c20: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 28 29 0a  k when malloc().
1c30: 20 20 23 20 66 61 69 6c 73 2c 20 61 6e 64 20 74    # fails, and t
1c40: 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
1c50: 20 69 74 73 65 6c 66 2e 0a 20 20 69 66 20 7b 24   itself..  if {$
1c60: 61 32 20 3d 3d 20 22 22 7d 20 7b 0a 20 20 20 20  a2 == ""} {.    
1c70: 6c 61 70 70 65 6e 64 20 3a 3a 72 75 6e 5f 74 65  lappend ::run_te
1c80: 73 74 5f 73 63 72 69 70 74 20 2d 73 71 6c 20 5b  st_script -sql [
1c90: 6c 69 73 74 20 74 72 75 65 20 5b 73 74 72 69 6e  list true [strin
1ca0: 67 20 74 72 69 6d 20 24 61 31 5d 5d 0a 20 20 7d  g trim $a1]].  }
1cb0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6c 61 70 70   else {.    lapp
1cc0: 65 6e 64 20 3a 3a 72 75 6e 5f 74 65 73 74 5f 73  end ::run_test_s
1cd0: 63 72 69 70 74 20 2d 73 71 6c 20 5b 6c 69 73 74  cript -sql [list
1ce0: 20 66 61 6c 73 65 20 5b 73 74 72 69 6e 67 20 74   false [string t
1cf0: 72 69 6d 20 24 61 32 5d 5d 0a 20 20 7d 0a 7d 0a  rim $a2]].  }.}.
1d00: 0a 23 20 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d  .# TEST_AUTOCOMM
1d10: 49 54 20 2d 2d 0a 23 20 0a 23 20 20 20 20 20 41  IT --.# .#     A
1d20: 20 73 68 6f 72 74 68 61 6e 64 20 74 65 73 74 20   shorthand test 
1d30: 74 6f 20 73 65 65 20 69 66 20 61 20 74 72 61 6e  to see if a tran
1d40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
1d50: 65 20 6f 72 20 6e 6f 74 2e 20 54 68 65 20 66 69  e or not. The fi
1d60: 72 73 74 0a 23 20 20 20 20 20 61 72 67 75 6d 65  rst.#     argume
1d70: 6e 74 20 2d 20 24 69 64 20 2d 20 69 73 20 74 68  nt - $id - is th
1d80: 65 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  e integer number
1d90: 20 6f 66 20 74 68 65 20 74 65 73 74 20 63 61 73   of the test cas
1da0: 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 23 20  e. The second.# 
1db0: 20 20 20 20 61 72 67 75 6d 65 6e 74 20 69 73 20      argument is 
1dc0: 65 69 74 68 65 72 20 31 20 6f 72 20 30 2c 20 74  either 1 or 0, t
1dd0: 68 65 20 65 78 70 65 63 74 65 64 20 76 61 6c 75  he expected valu
1de0: 65 20 6f 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  e of the auto-co
1df0: 6d 6d 69 74 20 66 6c 61 67 2e 0a 23 0a 70 72 6f  mmit flag..#.pro
1e00: 63 20 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49  c TEST_AUTOCOMMI
1e10: 54 20 7b 69 64 20 61 7d 20 7b 0a 20 20 20 20 54  T {id a} {.    T
1e20: 45 53 54 20 24 69 64 20 22 64 6f 5f 74 65 73 74  EST $id "do_test
1e30: 20 5c 24 74 65 73 74 69 64 20 7b 20 73 71 6c 69   \$testid { sqli
1e40: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1e50: 69 74 20 24 3a 3a 44 42 20 7d 20 7b 24 61 7d 22  it $::DB } {$a}"
1e60: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1eb0: 23 20 53 74 61 72 74 20 6f 66 20 74 65 73 74 20  # Start of test 
1ec0: 70 72 6f 67 72 61 6d 20 64 65 63 6c 61 72 61 74  program declarat
1ed0: 69 6f 6e 0a 23 0a 0a 0a 23 20 57 61 72 6d 20 62  ion.#...# Warm b
1ee0: 6f 64 79 20 74 65 73 74 2e 20 41 20 6d 61 6c 6c  ody test. A mall
1ef0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 74 68  oc() fails in th
1f00: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 43 52  e middle of a CR
1f10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1f20: 6d 65 6e 74 0a 23 20 69 6e 20 61 20 73 69 6e 67  ment.# in a sing
1f30: 6c 65 2d 73 74 61 74 65 6d 65 6e 74 20 74 72 61  le-statement tra
1f40: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 6e 20 65  nsaction on an e
1f50: 6d 70 74 79 20 64 61 74 61 62 61 73 65 2e 20 4e  mpty database. N
1f60: 6f 74 20 74 6f 6f 20 6d 75 63 68 20 63 61 6e 20  ot too much can 
1f70: 67 6f 0a 23 20 77 72 6f 6e 67 20 68 65 72 65 2e  go.# wrong here.
1f80: 0a 23 0a 54 45 53 54 20 31 20 7b 0a 20 20 64 6f  .#.TEST 1 {.  do
1f90: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
1fa0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
1fb0: 45 43 54 20 74 62 6c 5f 6e 61 6d 65 20 46 52 4f  ECT tbl_name FRO
1fc0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
1fd0: 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51 4c 20 7b  }.  } {}.}.SQL {
1fe0: 20 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45   .  CREATE TABLE
1ff0: 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 20 0a   abc(a, b, c); .
2000: 7d 0a 54 45 53 54 20 32 20 7b 0a 20 20 64 6f 5f  }.TEST 2 {.  do_
2010: 74 65 73 74 20 24 74 65 73 74 69 64 2e 31 20 7b  test $testid.1 {
2020: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
2030: 4c 45 43 54 20 74 62 6c 5f 6e 61 6d 65 20 46 52  LECT tbl_name FR
2040: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2050: 3b 7d 0a 20 20 7d 20 7b 61 62 63 7d 0a 7d 0a 0a  ;}.  } {abc}.}..
2060: 23 20 49 6e 73 65 72 74 20 61 20 63 6f 75 70 6c  # Insert a coupl
2070: 65 20 6f 66 20 72 6f 77 73 20 69 6e 74 6f 20 74  e of rows into t
2080: 68 65 20 74 61 62 6c 65 2e 20 65 61 63 68 20 69  he table. each i
2090: 6e 73 65 72 74 20 69 73 20 69 6e 20 69 74 27 73  nsert is in it's
20a0: 20 6f 77 6e 0a 23 20 74 72 61 6e 73 61 63 74 69   own.# transacti
20b0: 6f 6e 2e 20 74 65 73 74 20 74 68 61 74 20 74 68  on. test that th
20c0: 65 20 74 61 62 6c 65 20 69 73 20 75 6e 70 6f 70  e table is unpop
20d0: 75 6c 61 74 65 64 20 62 65 66 6f 72 65 20 72 75  ulated before ru
20e0: 6e 6e 69 6e 67 20 74 68 65 20 69 6e 73 65 72 74  nning the insert
20f0: 73 0a 23 20 28 61 6e 64 20 68 65 6e 63 65 20 61  s.# (and hence a
2100: 66 74 65 72 20 65 61 63 68 20 66 61 69 6c 75 72  fter each failur
2110: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69  e of the first i
2120: 6e 73 65 72 74 29 2c 20 61 6e 64 20 74 68 61 74  nsert), and that
2130: 20 69 74 20 68 61 73 20 62 65 65 6e 0a 23 20 70   it has been.# p
2140: 6f 70 75 6c 61 74 65 64 20 63 6f 72 72 65 63 74  opulated correct
2150: 6c 79 20 61 66 74 65 72 20 74 68 65 20 66 69 6e  ly after the fin
2160: 61 6c 20 69 6e 73 65 72 74 20 73 75 63 63 65 65  al insert succee
2170: 64 73 2e 0a 23 0a 54 45 53 54 20 33 20 7b 0a 20  ds..#.TEST 3 {. 
2180: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64   do_test $testid
2190: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
21a0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
21b0: 61 62 63 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 53 51  abc}.  } {}.}.SQ
21c0: 4c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  L {INSERT INTO a
21d0: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bc VALUES(1, 2, 
21e0: 33 29 3b 7d 0a 53 51 4c 20 7b 49 4e 53 45 52 54  3);}.SQL {INSERT
21f0: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
2200: 28 34 2c 20 35 2c 20 36 29 3b 7d 0a 53 51 4c 20  (4, 5, 6);}.SQL 
2210: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63  {INSERT INTO abc
2220: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
2230: 3b 7d 0a 54 45 53 54 20 34 20 7b 0a 20 20 64 6f  ;}.TEST 4 {.  do
2240: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
2250: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
2260: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a  ECT * FROM abc}.
2270: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
2280: 20 37 20 38 20 39 7d 0a 7d 0a 0a 23 20 54 65 73   7 8 9}.}..# Tes
2290: 74 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  t a CREATE INDEX
22a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 63 61   statement. Beca
22b0: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 27 61  use the table 'a
22c0: 62 63 27 20 69 73 20 73 6f 20 73 6d 61 6c 6c 2c  bc' is so small,
22d0: 20 74 68 65 20 69 6e 64 65 78 0a 23 20 77 69 6c   the index.# wil
22e0: 6c 20 61 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73  l all fit on a s
22f0: 69 6e 67 6c 65 20 70 61 67 65 2c 20 73 6f 20 74  ingle page, so t
2300: 68 69 73 20 64 6f 65 73 6e 27 74 20 74 65 73 74  his doesn't test
2310: 20 74 6f 6f 20 6d 75 63 68 20 74 68 61 74 20 74   too much that t
2320: 68 65 20 43 52 45 41 54 45 0a 23 20 54 41 42 4c  he CREATE.# TABL
2330: 45 20 73 74 61 74 65 6d 65 6e 74 20 64 69 64 6e  E statement didn
2340: 27 74 20 74 65 73 74 2e 20 41 20 66 65 77 20 6f  't test. A few o
2350: 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  f the transient 
2360: 6d 61 6c 6c 6f 63 28 29 73 20 69 6e 20 62 74 72  malloc()s in btr
2370: 65 65 2e 63 0a 23 20 70 65 72 68 61 70 73 2e 0a  ee.c.# perhaps..
2380: 23 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 49 4e  #.SQL {CREATE IN
2390: 44 45 58 20 61 62 63 5f 69 20 4f 4e 20 61 62 63  DEX abc_i ON abc
23a0: 28 61 2c 20 62 2c 20 63 29 3b 7d 0a 54 45 53 54  (a, b, c);}.TEST
23b0: 20 34 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24   4 {.  do_test $
23c0: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
23d0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
23e0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 4f  ECT * FROM abc O
23f0: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a  RDER BY a DESC;.
2400: 20 20 20 20 7d 0a 20 20 7d 20 7b 37 20 38 20 39      }.  } {7 8 9
2410: 20 34 20 35 20 36 20 31 20 32 20 33 7d 0a 7d 0a   4 5 6 1 2 3}.}.
2420: 0a 23 20 54 65 73 74 20 61 20 44 45 4c 45 54 45  .# Test a DELETE
2430: 20 73 74 61 74 65 6d 65 6e 74 2e 20 41 6c 73 6f   statement. Also
2440: 20 63 72 65 61 74 65 20 61 20 74 72 69 67 67 65   create a trigge
2450: 72 20 61 6e 64 20 61 20 76 69 65 77 2c 20 6a 75  r and a view, ju
2460: 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a  st to make sure.
2470: 23 20 74 68 65 73 65 20 73 74 61 74 65 6d 65 6e  # these statemen
2480: 74 73 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e  ts don't have an
2490: 79 20 6f 62 76 69 6f 75 73 20 6d 61 6c 6c 6f 63  y obvious malloc
24a0: 28 29 20 72 65 6c 61 74 65 64 20 62 75 67 73 20  () related bugs 
24b0: 69 6e 20 74 68 65 6d 2e 20 4e 6f 74 65 0a 23 20  in them. Note.# 
24c0: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 61 62  that the test ab
24d0: 6f 76 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63  ove will be exec
24e0: 75 74 65 64 20 65 61 63 68 20 74 69 6d 65 20 74  uted each time t
24f0: 68 65 20 44 45 4c 45 54 45 20 66 61 69 6c 73 2c  he DELETE fails,
2500: 20 73 6f 20 77 65 27 72 65 0a 23 20 61 6c 73 6f   so we're.# also
2510: 20 74 65 73 74 69 6e 67 20 72 6f 6c 6c 62 61 63   testing rollbac
2520: 6b 20 6f 66 20 61 20 44 45 4c 45 54 45 20 66 72  k of a DELETE fr
2530: 6f 6d 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  om a table with 
2540: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 69 74 2e 0a  an index on it..
2550: 23 0a 53 51 4c 20 7b 44 45 4c 45 54 45 20 46 52  #.SQL {DELETE FR
2560: 4f 4d 20 61 62 63 20 57 48 45 52 45 20 61 20 3e  OM abc WHERE a >
2570: 20 32 3b 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45   2;}.SQL {CREATE
2580: 20 54 52 49 47 47 45 52 20 61 62 63 5f 74 20 41   TRIGGER abc_t A
2590: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 61  FTER INSERT ON a
25a0: 62 63 20 42 45 47 49 4e 20 53 45 4c 45 43 54 20  bc BEGIN SELECT 
25b0: 27 74 72 69 67 67 65 72 21 27 3b 20 45 4e 44 3b  'trigger!'; END;
25c0: 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 56 49  }.SQL {CREATE VI
25d0: 45 57 20 61 62 63 5f 76 20 41 53 20 53 45 4c 45  EW abc_v AS SELE
25e0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 7d 0a  CT * FROM abc;}.
25f0: 54 45 53 54 20 35 20 7b 0a 20 20 64 6f 5f 74 65  TEST 5 {.  do_te
2600: 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20  st $testid {.   
2610: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2620: 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 62   SELECT name, tb
2630: 6c 5f 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  l_name FROM sqli
2640: 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20  te_master ORDER 
2650: 42 59 20 6e 61 6d 65 3b 0a 20 20 20 20 20 20 53  BY name;.      S
2660: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
2670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61 62 63  ;.    }.  } {abc
2680: 20 61 62 63 20 61 62 63 5f 69 20 61 62 63 20 61   abc abc_i abc a
2690: 62 63 5f 74 20 61 62 63 20 61 62 63 5f 76 20 61  bc_t abc abc_v a
26a0: 62 63 5f 76 20 31 20 32 20 33 7d 0a 7d 0a 0a 73  bc_v 1 2 3}.}..s
26b0: 65 74 20 73 71 6c 20 7b 0a 20 20 42 45 47 49 4e  et sql {.  BEGIN
26c0: 3b 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63  ;DELETE FROM abc
26d0: 3b 0a 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 31  ;.}.for {set i 1
26e0: 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e  } {$i < 100} {in
26f0: 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20 61 20  cr i} {.  set a 
2700: 24 69 0a 20 20 73 65 74 20 62 20 22 53 74 72 69  $i.  set b "Stri
2710: 6e 67 20 76 61 6c 75 65 20 24 69 22 0a 20 20 73  ng value $i".  s
2720: 65 74 20 63 20 5b 73 74 72 69 6e 67 20 72 65 70  et c [string rep
2730: 65 61 74 20 58 20 24 69 5d 0a 20 20 61 70 70 65  eat X $i].  appe
2740: 6e 64 20 73 71 6c 20 22 49 4e 53 45 52 54 20 49  nd sql "INSERT I
2750: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 20 28  NTO abc VALUES (
2760: 24 61 2c 20 27 24 62 27 2c 20 27 24 63 27 29 3b  $a, '$b', '$c');
2770: 22 0a 7d 0a 61 70 70 65 6e 64 20 73 71 6c 20 7b  ".}.append sql {
2780: 43 4f 4d 4d 49 54 3b 7d 0a 50 52 45 50 20 24 73  COMMIT;}.PREP $s
2790: 71 6c 0a 0a 53 51 4c 20 7b 0a 20 20 44 45 4c 45  ql..SQL {.  DELE
27a0: 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45 52  TE FROM abc WHER
27b0: 45 20 6f 69 64 20 49 4e 20 28 53 45 4c 45 43 54  E oid IN (SELECT
27c0: 20 6f 69 64 20 46 52 4f 4d 20 61 62 63 20 4f 52   oid FROM abc OR
27d0: 44 45 52 20 42 59 20 72 61 6e 64 6f 6d 28 29 20  DER BY random() 
27e0: 4c 49 4d 49 54 20 35 29 3b 0a 7d 0a 54 45 53 54  LIMIT 5);.}.TEST
27f0: 20 36 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24   6 {.  do_test $
2800: 74 65 73 74 69 64 2e 31 20 7b 0a 20 20 20 20 65  testid.1 {.    e
2810: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  xecsql {SELECT c
2820: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63  ount(*) FROM abc
2830: 7d 0a 20 20 7d 20 7b 39 34 7d 0a 20 20 64 6f 5f  }.  } {94}.  do_
2840: 74 65 73 74 20 24 74 65 73 74 69 64 2e 32 20 7b  test $testid.2 {
2850: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2860: 20 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28       SELECT min(
2870: 0a 20 20 20 20 20 20 20 20 20 20 28 6f 69 64 20  .          (oid 
2880: 3d 3d 20 61 29 20 41 4e 44 20 27 53 74 72 69 6e  == a) AND 'Strin
2890: 67 20 76 61 6c 75 65 20 27 20 7c 7c 20 61 20 3d  g value ' || a =
28a0: 3d 20 62 20 41 4e 44 20 61 20 3d 3d 20 6c 65 6e  = b AND a == len
28b0: 67 74 68 28 63 29 20 0a 20 20 20 20 20 20 29 20  gth(c) .      ) 
28c0: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a  FROM abc;.    }.
28d0: 20 20 7d 20 7b 31 7d 0a 7d 0a 53 51 4c 20 7b 0a    } {1}.}.SQL {.
28e0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62    DELETE FROM ab
28f0: 63 20 57 48 45 52 45 20 6f 69 64 20 49 4e 20 28  c WHERE oid IN (
2900: 53 45 4c 45 43 54 20 6f 69 64 20 46 52 4f 4d 20  SELECT oid FROM 
2910: 61 62 63 20 4f 52 44 45 52 20 42 59 20 72 61 6e  abc ORDER BY ran
2920: 64 6f 6d 28 29 20 4c 49 4d 49 54 20 35 29 3b 0a  dom() LIMIT 5);.
2930: 7d 0a 54 45 53 54 20 37 20 7b 0a 20 20 64 6f 5f  }.TEST 7 {.  do_
2940: 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20  test $testid {. 
2950: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
2960: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2970: 20 61 62 63 7d 0a 20 20 7d 20 7b 38 39 7d 0a 20   abc}.  } {89}. 
2980: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64   do_test $testid
2990: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
29a0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .      SELECT mi
29b0: 6e 28 0a 20 20 20 20 20 20 20 20 20 20 28 6f 69  n(.          (oi
29c0: 64 20 3d 3d 20 61 29 20 41 4e 44 20 27 53 74 72  d == a) AND 'Str
29d0: 69 6e 67 20 76 61 6c 75 65 20 27 20 7c 7c 20 61  ing value ' || a
29e0: 20 3d 3d 20 62 20 41 4e 44 20 61 20 3d 3d 20 6c   == b AND a == l
29f0: 65 6e 67 74 68 28 63 29 20 0a 20 20 20 20 20 20  ength(c) .      
2a00: 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20  ) FROM abc;.    
2a10: 7d 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 53 51 4c 20  }.  } {1}.}.SQL 
2a20: 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  {.  DELETE FROM 
2a30: 61 62 63 20 57 48 45 52 45 20 6f 69 64 20 49 4e  abc WHERE oid IN
2a40: 20 28 53 45 4c 45 43 54 20 6f 69 64 20 46 52 4f   (SELECT oid FRO
2a50: 4d 20 61 62 63 20 4f 52 44 45 52 20 42 59 20 72  M abc ORDER BY r
2a60: 61 6e 64 6f 6d 28 29 20 4c 49 4d 49 54 20 35 29  andom() LIMIT 5)
2a70: 3b 0a 7d 0a 54 45 53 54 20 39 20 7b 0a 20 20 64  ;.}.TEST 9 {.  d
2a80: 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b  o_test $testid {
2a90: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
2aa0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2ab0: 4f 4d 20 61 62 63 7d 0a 20 20 7d 20 7b 38 34 7d  OM abc}.  } {84}
2ac0: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
2ad0: 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  id {.    execsql
2ae0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2af0: 6d 69 6e 28 0a 20 20 20 20 20 20 20 20 20 20 28  min(.          (
2b00: 6f 69 64 20 3d 3d 20 61 29 20 41 4e 44 20 27 53  oid == a) AND 'S
2b10: 74 72 69 6e 67 20 76 61 6c 75 65 20 27 20 7c 7c  tring value ' ||
2b20: 20 61 20 3d 3d 20 62 20 41 4e 44 20 61 20 3d 3d   a == b AND a ==
2b30: 20 6c 65 6e 67 74 68 28 63 29 20 0a 20 20 20 20   length(c) .    
2b40: 20 20 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20    ) FROM abc;.  
2b50: 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 0a 73    }.  } {1}.}..s
2b60: 65 74 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69  et padding [stri
2b70: 6e 67 20 72 65 70 65 61 74 20 58 20 35 30 30 5d  ng repeat X 500]
2b80: 0a 50 52 45 50 20 5b 73 75 62 73 74 20 7b 0a 20  .PREP [subst {. 
2b90: 20 44 52 4f 50 20 54 41 42 4c 45 20 61 62 63 3b   DROP TABLE abc;
2ba0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
2bb0: 61 62 63 28 61 20 50 52 49 4d 41 52 59 20 4b 45  abc(a PRIMARY KE
2bc0: 59 2c 20 70 61 64 64 69 6e 67 2c 20 62 2c 20 63  Y, padding, b, c
2bd0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2be0: 20 61 62 63 20 56 41 4c 55 45 53 28 30 2c 20 27   abc VALUES(0, '
2bf0: 24 70 61 64 64 69 6e 67 27 2c 20 32 2c 20 32 29  $padding', 2, 2)
2c00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2c10: 61 62 63 20 56 41 4c 55 45 53 28 33 2c 20 27 24  abc VALUES(3, '$
2c20: 70 61 64 64 69 6e 67 27 2c 20 35 2c 20 35 29 3b  padding', 5, 5);
2c30: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
2c40: 62 63 20 56 41 4c 55 45 53 28 36 2c 20 27 24 70  bc VALUES(6, '$p
2c50: 61 64 64 69 6e 67 27 2c 20 38 2c 20 38 29 3b 0a  adding', 8, 8);.
2c60: 7d 5d 0a 0a 54 45 53 54 20 31 30 20 7b 0a 20 20  }]..TEST 10 {.  
2c70: 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20  do_test $testid 
2c80: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53  {.    execsql {S
2c90: 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
2ca0: 4f 4d 20 61 62 63 7d 0a 20 20 7d 20 7b 30 20 32  OM abc}.  } {0 2
2cb0: 20 32 20 33 20 35 20 35 20 36 20 38 20 38 7d 0a   2 3 5 5 6 8 8}.
2cc0: 7d 0a 0a 53 51 4c 20 7b 42 45 47 49 4e 3b 7d 0a  }..SQL {BEGIN;}.
2cd0: 53 51 4c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  SQL {INSERT INTO
2ce0: 20 61 62 63 20 56 41 4c 55 45 53 28 39 2c 20 27   abc VALUES(9, '
2cf0: 58 58 58 58 58 27 2c 20 31 31 2c 20 31 32 29 3b  XXXXX', 11, 12);
2d00: 7d 0a 54 45 53 54 5f 41 55 54 4f 43 4f 4d 4d 49  }.TEST_AUTOCOMMI
2d10: 54 20 31 31 20 30 0a 53 51 4c 20 2d 6e 6f 72 6f  T 11 0.SQL -noro
2d20: 6c 6c 62 61 63 6b 20 7b 55 50 44 41 54 45 20 61  llback {UPDATE a
2d30: 62 63 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  bc SET a = a + 1
2d40: 2c 20 63 20 3d 20 63 20 2b 20 31 3b 7d 0a 54 45  , c = c + 1;}.TE
2d50: 53 54 5f 41 55 54 4f 43 4f 4d 4d 49 54 20 31 32  ST_AUTOCOMMIT 12
2d60: 20 30 0a 53 51 4c 20 7b 44 45 4c 45 54 45 20 46   0.SQL {DELETE F
2d70: 52 4f 4d 20 61 62 63 20 57 48 45 52 45 20 61 20  ROM abc WHERE a 
2d80: 3d 20 31 30 3b 7d 0a 54 45 53 54 5f 41 55 54 4f  = 10;}.TEST_AUTO
2d90: 43 4f 4d 4d 49 54 20 31 33 20 30 0a 53 51 4c 20  COMMIT 13 0.SQL 
2da0: 7b 43 4f 4d 4d 49 54 3b 7d 0a 0a 54 45 53 54 20  {COMMIT;}..TEST 
2db0: 31 34 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24  14 {.  do_test $
2dc0: 74 65 73 74 69 64 2e 31 20 7b 0a 20 20 20 20 73  testid.1 {.    s
2dd0: 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
2de0: 6f 6d 6d 69 74 20 24 3a 3a 44 42 0a 20 20 7d 20  ommit $::DB.  } 
2df0: 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 24 74  {1}.  do_test $t
2e00: 65 73 74 69 64 2e 32 20 7b 0a 20 20 20 20 65 78  estid.2 {.    ex
2e10: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c  ecsql {SELECT a,
2e20: 20 62 2c 20 63 20 46 52 4f 4d 20 61 62 63 7d 0a   b, c FROM abc}.
2e30: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
2e40: 20 37 20 38 20 39 7d 0a 7d 0a 0a 50 52 45 50 20   7 8 9}.}..PREP 
2e50: 5b 73 75 62 73 74 20 7b 0a 20 20 44 52 4f 50 20  [subst {.  DROP 
2e60: 54 41 42 4c 45 20 61 62 63 3b 0a 20 20 43 52 45  TABLE abc;.  CRE
2e70: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
2e80: 20 70 61 64 64 69 6e 67 2c 20 62 2c 20 63 29 3b   padding, b, c);
2e90: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
2ea0: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 27 24 70  bc VALUES(1, '$p
2eb0: 61 64 64 69 6e 67 27 2c 20 32 2c 20 33 29 3b 0a  adding', 2, 3);.
2ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
2ed0: 63 20 56 41 4c 55 45 53 28 34 2c 20 27 24 70 61  c VALUES(4, '$pa
2ee0: 64 64 69 6e 67 27 2c 20 35 2c 20 36 29 3b 0a 20  dding', 5, 6);. 
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 37 2c 20 27 24 70 61 64   VALUES(7, '$pad
2f10: 64 69 6e 67 27 2c 20 38 2c 20 39 29 3b 0a 20 20  ding', 8, 9);.  
2f20: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63  CREATE INDEX abc
2f30: 5f 69 20 4f 4e 20 61 62 63 28 61 2c 20 70 61 64  _i ON abc(a, pad
2f40: 64 69 6e 67 2c 20 62 2c 20 63 29 3b 0a 7d 5d 0a  ding, b, c);.}].
2f50: 0a 54 45 53 54 20 31 35 20 7b 0a 20 20 64 62 20  .TEST 15 {.  db 
2f60: 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 63  eval {PRAGMA cac
2f70: 68 65 5f 73 69 7a 65 20 3d 20 31 30 7d 0a 7d 0a  he_size = 10}.}.
2f80: 0a 53 51 4c 20 7b 42 45 47 49 4e 3b 7d 0a 53 51  .SQL {BEGIN;}.SQ
2f90: 4c 20 2d 6e 6f 72 6c 6c 62 63 6b 20 7b 49 4e 53  L -norllbck {INS
2fa0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 28 6f 69  ERT INTO abc (oi
2fb0: 64 2c 20 61 2c 20 70 61 64 64 69 6e 67 2c 20 62  d, a, padding, b
2fc0: 2c 20 63 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c  , c) SELECT NULL
2fd0: 2c 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 54 45  , * FROM abc}.TE
2fe0: 53 54 20 31 36 20 7b 0a 20 20 64 6f 5f 74 65 73  ST 16 {.  do_tes
2ff0: 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20  t $testid {.    
3000: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
3010: 61 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  a, count(*) FROM
3020: 20 61 62 63 20 47 52 4f 55 50 20 42 59 20 61 3b   abc GROUP BY a;
3030: 7d 0a 20 20 7d 20 7b 31 20 32 20 34 20 32 20 37  }.  } {1 2 4 2 7
3040: 20 32 7d 0a 7d 0a 53 51 4c 20 2d 6e 6f 72 6c 6c   2}.}.SQL -norll
3050: 62 63 6b 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  bck {INSERT INTO
3060: 20 61 62 63 20 28 6f 69 64 2c 20 61 2c 20 70 61   abc (oid, a, pa
3070: 64 64 69 6e 67 2c 20 62 2c 20 63 29 20 53 45 4c  dding, b, c) SEL
3080: 45 43 54 20 4e 55 4c 4c 2c 20 2a 20 46 52 4f 4d  ECT NULL, * FROM
3090: 20 61 62 63 7d 0a 54 45 53 54 20 31 37 20 7b 0a   abc}.TEST 17 {.
30a0: 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69    do_test $testi
30b0: 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  d {.    execsql 
30c0: 7b 53 45 4c 45 43 54 20 61 2c 20 63 6f 75 6e 74  {SELECT a, count
30d0: 28 2a 29 20 46 52 4f 4d 20 61 62 63 20 47 52 4f  (*) FROM abc GRO
30e0: 55 50 20 42 59 20 61 3b 7d 0a 20 20 7d 20 7b 31  UP BY a;}.  } {1
30f0: 20 34 20 34 20 34 20 37 20 34 7d 0a 7d 0a 53 51   4 4 4 7 4}.}.SQ
3100: 4c 20 2d 6e 6f 72 6c 6c 62 63 6b 20 7b 49 4e 53  L -norllbck {INS
3110: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 28 6f 69  ERT INTO abc (oi
3120: 64 2c 20 61 2c 20 70 61 64 64 69 6e 67 2c 20 62  d, a, padding, b
3130: 2c 20 63 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c  , c) SELECT NULL
3140: 2c 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 54 45  , * FROM abc}.TE
3150: 53 54 20 31 38 20 7b 0a 20 20 64 6f 5f 74 65 73  ST 18 {.  do_tes
3160: 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20  t $testid {.    
3170: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
3180: 61 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  a, count(*) FROM
3190: 20 61 62 63 20 47 52 4f 55 50 20 42 59 20 61 3b   abc GROUP BY a;
31a0: 7d 0a 20 20 7d 20 7b 31 20 38 20 34 20 38 20 37  }.  } {1 8 4 8 7
31b0: 20 38 7d 0a 7d 0a 53 51 4c 20 2d 6e 6f 72 6c 6c   8}.}.SQL -norll
31c0: 62 63 6b 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  bck {INSERT INTO
31d0: 20 61 62 63 20 28 6f 69 64 2c 20 61 2c 20 70 61   abc (oid, a, pa
31e0: 64 64 69 6e 67 2c 20 62 2c 20 63 29 20 53 45 4c  dding, b, c) SEL
31f0: 45 43 54 20 4e 55 4c 4c 2c 20 2a 20 46 52 4f 4d  ECT NULL, * FROM
3200: 20 61 62 63 7d 0a 54 45 53 54 20 31 39 20 7b 0a   abc}.TEST 19 {.
3210: 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69    do_test $testi
3220: 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  d {.    execsql 
3230: 7b 53 45 4c 45 43 54 20 61 2c 20 63 6f 75 6e 74  {SELECT a, count
3240: 28 2a 29 20 46 52 4f 4d 20 61 62 63 20 47 52 4f  (*) FROM abc GRO
3250: 55 50 20 42 59 20 61 3b 7d 0a 20 20 7d 20 7b 31  UP BY a;}.  } {1
3260: 20 31 36 20 34 20 31 36 20 37 20 31 36 7d 0a 7d   16 4 16 7 16}.}
3270: 0a 53 51 4c 20 7b 43 4f 4d 4d 49 54 3b 7d 0a 54  .SQL {COMMIT;}.T
3280: 45 53 54 20 32 31 20 7b 0a 20 20 64 6f 5f 74 65  EST 21 {.  do_te
3290: 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20  st $testid {.   
32a0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
32b0: 20 61 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   a, count(*) FRO
32c0: 4d 20 61 62 63 20 47 52 4f 55 50 20 42 59 20 61  M abc GROUP BY a
32d0: 3b 7d 0a 20 20 7d 20 7b 31 20 31 36 20 34 20 31  ;}.  } {1 16 4 1
32e0: 36 20 37 20 31 36 7d 0a 7d 0a 0a 53 51 4c 20 7b  6 7 16}.}..SQL {
32f0: 42 45 47 49 4e 3b 7d 0a 53 51 4c 20 7b 44 45 4c  BEGIN;}.SQL {DEL
3300: 45 54 45 20 46 52 4f 4d 20 61 62 63 20 57 48 45  ETE FROM abc WHE
3310: 52 45 20 6f 69 64 20 25 32 7d 0a 54 45 53 54 20  RE oid %2}.TEST 
3320: 32 32 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24  22 {.  do_test $
3330: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
3340: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20  csql {SELECT a, 
3350: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
3360: 63 20 47 52 4f 55 50 20 42 59 20 61 3b 7d 0a 20  c GROUP BY a;}. 
3370: 20 7d 20 7b 31 20 38 20 34 20 38 20 37 20 38 7d   } {1 8 4 8 7 8}
3380: 0a 7d 0a 53 51 4c 20 7b 44 45 4c 45 54 45 20 46  .}.SQL {DELETE F
3390: 52 4f 4d 20 61 62 63 7d 0a 54 45 53 54 20 32 33  ROM abc}.TEST 23
33a0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65   {.  do_test $te
33b0: 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73  stid {.    execs
33c0: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
33d0: 4d 20 61 62 63 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a  M abc}.  } {}.}.
33e0: 53 51 4c 20 7b 52 4f 4c 4c 42 41 43 4b 3b 7d 0a  SQL {ROLLBACK;}.
33f0: 54 45 53 54 20 32 34 20 7b 0a 20 20 64 6f 5f 74  TEST 24 {.  do_t
3400: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
3410: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
3420: 54 20 61 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T a, count(*) FR
3430: 4f 4d 20 61 62 63 20 47 52 4f 55 50 20 42 59 20  OM abc GROUP BY 
3440: 61 3b 7d 0a 20 20 7d 20 7b 31 20 31 36 20 34 20  a;}.  } {1 16 4 
3450: 31 36 20 37 20 31 36 7d 0a 7d 0a 0a 23 20 54 65  16 7 16}.}..# Te
3460: 73 74 20 73 6f 6d 65 20 73 63 68 65 6d 61 20 6d  st some schema m
3470: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 69 6e 73  odifications ins
3480: 69 64 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ide of a transac
3490: 74 69 6f 6e 2e 20 54 68 65 73 65 20 73 68 6f 75  tion. These shou
34a0: 6c 64 20 61 6c 6c 0a 23 20 63 61 75 73 65 20 74  ld all.# cause t
34b0: 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
34c0: 61 63 6b 20 69 66 20 74 68 65 79 20 66 61 69 6c  ack if they fail
34d0: 2e 20 41 6c 73 6f 20 71 75 65 72 79 20 61 20 76  . Also query a v
34e0: 69 65 77 2c 20 74 6f 20 63 6f 76 65 72 20 61 20  iew, to cover a 
34f0: 62 69 74 0a 23 20 6d 6f 72 65 20 63 6f 64 65 2e  bit.# more code.
3500: 0a 23 0a 50 52 45 50 20 7b 44 52 4f 50 20 56 49  .#.PREP {DROP VI
3510: 45 57 20 61 62 63 5f 76 3b 7d 0a 54 45 53 54 20  EW abc_v;}.TEST 
3520: 32 35 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24  25 {.  do_test $
3530: 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65  testid {.    exe
3540: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
3550: 45 43 54 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61  ECT name, tbl_na
3560: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
3570: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  aster;.    }.  }
3580: 20 7b 61 62 63 20 61 62 63 20 61 62 63 5f 69 20   {abc abc abc_i 
3590: 61 62 63 7d 0a 7d 0a 53 51 4c 20 7b 42 45 47 49  abc}.}.SQL {BEGI
35a0: 4e 3b 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45 20  N;}.SQL {CREATE 
35b0: 54 41 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20  TABLE def(d, e, 
35c0: 66 29 3b 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45  f);}.SQL {CREATE
35d0: 20 54 41 42 4c 45 20 67 68 69 28 67 2c 20 68 2c   TABLE ghi(g, h,
35e0: 20 69 29 3b 7d 0a 54 45 53 54 20 32 36 20 7b 0a   i);}.TEST 26 {.
35f0: 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69    do_test $testi
3600: 64 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  d {.    execsql 
3610: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e  {.      SELECT n
3620: 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 46 52  ame, tbl_name FR
3630: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
3640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61 62 63  ;.    }.  } {abc
3650: 20 61 62 63 20 61 62 63 5f 69 20 61 62 63 20 64   abc abc_i abc d
3660: 65 66 20 64 65 66 20 67 68 69 20 67 68 69 7d 0a  ef def ghi ghi}.
3670: 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 56 49  }.SQL {CREATE VI
3680: 45 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20  EW v1 AS SELECT 
3690: 2a 20 46 52 4f 4d 20 64 65 66 2c 20 67 68 69 7d  * FROM def, ghi}
36a0: 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 55 4e 49  .SQL {CREATE UNI
36b0: 51 55 45 20 49 4e 44 45 58 20 67 68 69 5f 69 31  QUE INDEX ghi_i1
36c0: 20 4f 4e 20 67 68 69 28 67 29 3b 7d 0a 54 45 53   ON ghi(g);}.TES
36d0: 54 20 32 37 20 7b 0a 20 20 64 6f 5f 74 65 73 74  T 27 {.  do_test
36e0: 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65   $testid {.    e
36f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3700: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 62 6c 5f  ELECT name, tbl_
3710: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
3720: 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20  _master;.    }. 
3730: 20 7d 20 7b 61 62 63 20 61 62 63 20 61 62 63 5f   } {abc abc abc_
3740: 69 20 61 62 63 20 64 65 66 20 64 65 66 20 67 68  i abc def def gh
3750: 69 20 67 68 69 20 76 31 20 76 31 20 67 68 69 5f  i ghi v1 v1 ghi_
3760: 69 31 20 67 68 69 7d 0a 7d 0a 53 51 4c 20 7b 49  i1 ghi}.}.SQL {I
3770: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56  NSERT INTO def V
3780: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20  ALUES('a', 'b', 
3790: 27 63 27 29 7d 0a 53 51 4c 20 7b 49 4e 53 45 52  'c')}.SQL {INSER
37a0: 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45  T INTO def VALUE
37b0: 53 28 31 2c 20 32 2c 20 33 29 7d 0a 53 51 4c 20  S(1, 2, 3)}.SQL 
37c0: 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 20 7b 49 4e 53  -norollback {INS
37d0: 45 52 54 20 49 4e 54 4f 20 67 68 69 20 53 45 4c  ERT INTO ghi SEL
37e0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 7d 0a  ECT * FROM def}.
37f0: 54 45 53 54 20 32 38 20 7b 0a 20 20 64 6f 5f 74  TEST 28 {.  do_t
3800: 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20  est $testid {.  
3810: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3820: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3830: 64 65 66 2c 20 67 68 69 20 57 48 45 52 45 20 64  def, ghi WHERE d
3840: 20 3d 20 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = g;.    }.  } 
3850: 7b 61 20 62 20 63 20 61 20 62 20 63 20 31 20 32  {a b c a b c 1 2
3860: 20 33 20 31 20 32 20 33 7d 0a 7d 0a 53 51 4c 20   3 1 2 3}.}.SQL 
3870: 7b 43 4f 4d 4d 49 54 7d 0a 54 45 53 54 20 32 39  {COMMIT}.TEST 29
3880: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65   {.  do_test $te
3890: 73 74 69 64 20 7b 0a 20 20 20 20 65 78 65 63 73  stid {.    execs
38a0: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
38b0: 54 20 2a 20 46 52 4f 4d 20 76 31 20 57 48 45 52  T * FROM v1 WHER
38c0: 45 20 64 20 3d 20 67 3b 0a 20 20 20 20 7d 0a 20  E d = g;.    }. 
38d0: 20 7d 20 7b 61 20 62 20 63 20 61 20 62 20 63 20   } {a b c a b c 
38e0: 31 20 32 20 33 20 31 20 32 20 33 7d 0a 7d 0a 0a  1 2 3 1 2 3}.}..
38f0: 23 20 54 65 73 74 20 61 20 73 69 6d 70 6c 65 20  # Test a simple 
3900: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
3910: 61 63 74 69 6f 6e 20 0a 23 0a 66 69 6c 65 20 64  action .#.file d
3920: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
3930: 74 32 2e 64 62 0a 53 51 4c 20 7b 41 54 54 41 43  t2.db.SQL {ATTAC
3940: 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  H 'test2.db' AS 
3950: 61 75 78 3b 7d 0a 53 51 4c 20 7b 42 45 47 49 4e  aux;}.SQL {BEGIN
3960: 7d 0a 53 51 4c 20 7b 43 52 45 41 54 45 20 54 41  }.SQL {CREATE TA
3970: 42 4c 45 20 61 75 78 2e 74 62 6c 32 28 78 2c 20  BLE aux.tbl2(x, 
3980: 79 2c 20 7a 29 7d 0a 53 51 4c 20 7b 49 4e 53 45  y, z)}.SQL {INSE
3990: 52 54 20 49 4e 54 4f 20 74 62 6c 32 20 56 41 4c  RT INTO tbl2 VAL
39a0: 55 45 53 28 31 2c 20 32 2c 20 33 29 7d 0a 53 51  UES(1, 2, 3)}.SQ
39b0: 4c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  L {INSERT INTO d
39c0: 65 66 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  ef VALUES(4, 5, 
39d0: 36 29 7d 0a 54 45 53 54 20 33 30 20 7b 0a 20 20  6)}.TEST 30 {.  
39e0: 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64 20  do_test $testid 
39f0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3a00: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
3a10: 52 4f 4d 20 74 62 6c 32 2c 20 64 65 66 20 57 48  ROM tbl2, def WH
3a20: 45 52 45 20 64 20 3d 20 78 3b 0a 20 20 20 20 7d  ERE d = x;.    }
3a30: 0a 20 20 7d 20 7b 31 20 32 20 33 20 31 20 32 20  .  } {1 2 3 1 2 
3a40: 33 7d 0a 7d 0a 53 51 4c 20 7b 43 4f 4d 4d 49 54  3}.}.SQL {COMMIT
3a50: 7d 0a 54 45 53 54 20 33 31 20 7b 0a 20 20 64 6f  }.TEST 31 {.  do
3a60: 5f 74 65 73 74 20 24 74 65 73 74 69 64 20 7b 0a  _test $testid {.
3a70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3a80: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3a90: 4d 20 74 62 6c 32 2c 20 64 65 66 20 57 48 45 52  M tbl2, def WHER
3aa0: 45 20 64 20 3d 20 78 3b 0a 20 20 20 20 7d 0a 20  E d = x;.    }. 
3ab0: 20 7d 20 7b 31 20 32 20 33 20 31 20 32 20 33 7d   } {1 2 3 1 2 3}
3ac0: 0a 7d 0a 0a 23 20 54 65 73 74 20 77 68 61 74 20  .}..# Test what 
3ad0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 6d  happens when a m
3ae0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 77 68  alloc() fails wh
3af0: 69 6c 65 20 74 68 65 72 65 20 61 72 65 20 6f 74  ile there are ot
3b00: 68 65 72 20 61 63 74 69 76 65 0a 23 20 73 74 61  her active.# sta
3b10: 74 65 6d 65 6e 74 73 2e 20 54 68 69 73 20 63 68  tements. This ch
3b20: 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 73 71  anges the way sq
3b30: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 29 20  lite3VdbeHalt() 
3b40: 77 6f 72 6b 73 2e 0a 54 45 53 54 20 33 32 20 7b  works..TEST 32 {
3b50: 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
3b60: 69 73 74 73 20 3a 3a 53 54 4d 54 33 32 5d 7d 20  ists ::STMT32]} 
3b70: 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 53  {.    set sql "S
3b80: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
3b90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
3ba0: 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 33 32 20     set ::STMT32 
3bb0: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
3bc0: 20 24 3a 3a 44 42 20 24 73 71 6c 20 2d 31 20 44   $::DB $sql -1 D
3bd0: 55 4d 4d 59 5d 0a 20 20 20 20 64 6f 5f 74 65 73  UMMY].    do_tes
3be0: 74 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20  t $testid {.    
3bf0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
3c00: 3a 3a 53 54 4d 54 33 32 0a 20 20 20 20 7d 20 7b  ::STMT32.    } {
3c10: 53 51 4c 49 54 45 5f 52 4f 57 7d 0a 20 20 7d 0a  SQLITE_ROW}.  }.
3c20: 7d 0a 53 51 4c 20 42 45 47 49 4e 0a 54 45 53 54  }.SQL BEGIN.TEST
3c30: 20 33 33 20 7b 20 0a 20 20 64 6f 5f 74 65 73 74   33 { .  do_test
3c40: 20 24 74 65 73 74 69 64 20 7b 0a 20 20 20 20 65   $testid {.    e
3c50: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
3c60: 20 46 52 4f 4d 20 67 68 69 7d 0a 20 20 7d 20 7b   FROM ghi}.  } {
3c70: 61 20 62 20 63 20 31 20 32 20 33 7d 0a 7d 0a 53  a b c 1 2 3}.}.S
3c80: 51 4c 20 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 20 7b  QL -norollback {
3c90: 20 0a 20 20 2d 2d 20 54 68 65 72 65 20 69 73 20   .  -- There is 
3ca0: 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6f  a unique index o
3cb0: 6e 20 67 68 69 28 67 29 2c 20 73 6f 20 74 68 69  n ghi(g), so thi
3cc0: 73 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  s statement may 
3cd0: 6e 6f 74 20 63 61 75 73 65 0a 20 20 2d 2d 20 61  not cause.  -- a
3ce0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 52 4f 4c 4c  n automatic ROLL
3cf0: 42 41 43 4b 2e 20 48 65 6e 63 65 20 74 68 65 20  BACK. Hence the 
3d00: 22 2d 6e 6f 72 6f 6c 6c 62 61 63 6b 22 20 73 77  "-norollback" sw
3d10: 69 74 63 68 2e 0a 20 20 49 4e 53 45 52 54 20 49  itch..  INSERT I
3d20: 4e 54 4f 20 67 68 69 20 53 45 4c 45 43 54 20 27  NTO ghi SELECT '
3d30: 32 27 7c 7c 67 2c 20 68 2c 20 69 20 46 52 4f 4d  2'||g, h, i FROM
3d40: 20 67 68 69 3b 0a 7d 0a 54 45 53 54 20 33 34 20   ghi;.}.TEST 34 
3d50: 7b 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78  {.  if {[info ex
3d60: 69 73 74 73 20 3a 3a 53 54 4d 54 33 32 5d 7d 20  ists ::STMT32]} 
3d70: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74  {.    do_test $t
3d80: 65 73 74 69 64 20 7b 0a 20 20 20 20 20 20 73 71  estid {.      sq
3d90: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
3da0: 3a 3a 53 54 4d 54 33 32 0a 20 20 20 20 7d 20 7b  ::STMT32.    } {
3db0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 20 20 75  SQLITE_OK}.    u
3dc0: 6e 73 65 74 20 3a 3a 53 54 4d 54 33 32 0a 20 20  nset ::STMT32.  
3dd0: 7d 0a 7d 0a 53 51 4c 20 43 4f 4d 4d 49 54 0a 0a  }.}.SQL COMMIT..
3de0: 23 0a 23 20 45 6e 64 20 6f 66 20 74 65 73 74 20  #.# End of test 
3df0: 70 72 6f 67 72 61 6d 20 64 65 63 6c 61 72 61 74  program declarat
3e00: 69 6f 6e 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ion.#-----------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3e50: 0a 70 72 6f 63 20 72 75 6e 5f 74 65 73 74 20 7b  .proc run_test {
3e60: 61 72 67 6c 69 73 74 20 7b 70 63 73 74 61 72 74  arglist {pcstart
3e70: 20 30 7d 20 7b 69 46 61 69 6c 53 74 61 72 74 20   0} {iFailStart 
3e80: 31 7d 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c 6c 65  1}} {.  if {[lle
3e90: 6e 67 74 68 20 24 61 72 67 6c 69 73 74 5d 20 25  ngth $arglist] %
3ea0: 32 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 22  2} {.    error "
3eb0: 55 6e 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66  Uneven number of
3ec0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 54 45   arguments to TE
3ed0: 53 54 22 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b  ST".  }..  for {
3ee0: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24  set i 0} {$i < $
3ef0: 70 63 73 74 61 72 74 7d 20 7b 69 6e 63 72 20 69  pcstart} {incr i
3f00: 7d 20 7b 0a 20 20 20 20 73 65 74 20 6b 32 20 5b  } {.    set k2 [
3f10: 6c 69 6e 64 65 78 20 24 61 72 67 6c 69 73 74 20  lindex $arglist 
3f20: 5b 65 78 70 72 20 32 20 2a 20 24 69 5d 5d 0a 20  [expr 2 * $i]]. 
3f30: 20 20 20 73 65 74 20 76 32 20 5b 6c 69 6e 64 65     set v2 [linde
3f40: 78 20 24 61 72 67 6c 69 73 74 20 5b 65 78 70 72  x $arglist [expr
3f50: 20 32 20 2a 20 24 69 20 2b 20 31 5d 5d 0a 20 20   2 * $i + 1]].  
3f60: 20 20 73 65 74 20 61 63 20 5b 73 71 6c 69 74 65    set ac [sqlite
3f70: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
3f80: 20 24 3a 3a 44 42 5d 20 20 20 20 20 20 20 20 3b   $::DB]        ;
3f90: 23 20 41 75 74 6f 2d 43 6f 6d 6d 69 74 0a 20 20  # Auto-Commit.  
3fa0: 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6b 32 20    switch -- $k2 
3fb0: 7b 0a 20 20 20 20 20 20 2d 73 71 6c 20 20 7b 64  {.      -sql  {d
3fc0: 62 20 65 76 61 6c 20 5b 6c 69 6e 64 65 78 20 24  b eval [lindex $
3fd0: 76 32 20 31 5d 7d 0a 20 20 20 20 20 20 2d 70 72  v2 1]}.      -pr
3fe0: 65 70 20 7b 64 62 20 65 76 61 6c 20 24 76 32 7d  ep {db eval $v2}
3ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 6e  .    }.    set n
4000: 61 63 20 5b 73 71 6c 69 74 65 33 5f 67 65 74 5f  ac [sqlite3_get_
4010: 61 75 74 6f 63 6f 6d 6d 69 74 20 24 3a 3a 44 42  autocommit $::DB
4020: 5d 20 20 20 20 20 20 20 3b 23 20 4e 65 77 20 41  ]       ;# New A
4030: 75 74 6f 2d 43 6f 6d 6d 69 74 20 0a 20 20 20 20  uto-Commit .    
4040: 69 66 20 7b 24 61 63 20 26 26 20 21 24 6e 61 63  if {$ac && !$nac
4050: 7d 20 7b 73 65 74 20 62 65 67 69 6e 5f 70 63 20  } {set begin_pc 
4060: 24 69 7d 0a 20 20 7d 0a 0a 20 20 64 62 20 72 6f  $i}.  }..  db ro
4070: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 5b 6c 69 73  llback_hook [lis
4080: 74 20 69 6e 63 72 20 3a 3a 72 6f 6c 6c 62 61 63  t incr ::rollbac
4090: 6b 5f 68 6f 6f 6b 5f 63 6f 75 6e 74 5d 0a 0a 20  k_hook_count].. 
40a0: 20 73 65 74 20 69 46 61 69 6c 20 24 69 46 61 69   set iFail $iFai
40b0: 6c 53 74 61 72 74 0a 20 20 73 65 74 20 70 63 20  lStart.  set pc 
40c0: 24 70 63 73 74 61 72 74 0a 20 20 77 68 69 6c 65  $pcstart.  while
40d0: 20 7b 24 70 63 2a 32 20 3c 20 5b 6c 6c 65 6e 67   {$pc*2 < [lleng
40e0: 74 68 20 24 61 72 67 6c 69 73 74 5d 7d 20 7b 0a  th $arglist]} {.
40f0: 0a 20 20 20 20 23 20 49 64 20 6f 66 20 74 68 69  .    # Id of thi
4100: 73 20 69 74 65 72 61 74 69 6f 6e 3a 0a 20 20 20  s iteration:.   
4110: 20 73 65 74 20 69 74 65 72 69 64 20 22 28 70 63   set iterid "(pc
4120: 20 24 70 63 29 2e 28 69 46 61 69 6c 20 24 69 46   $pc).(iFail $iF
4130: 61 69 6c 29 22 0a 20 20 20 20 73 65 74 20 6b 20  ail)".    set k 
4140: 5b 6c 69 6e 64 65 78 20 24 61 72 67 6c 69 73 74  [lindex $arglist
4150: 20 5b 65 78 70 72 20 32 20 2a 20 24 70 63 5d 5d   [expr 2 * $pc]]
4160: 0a 20 20 20 20 73 65 74 20 76 20 5b 6c 69 6e 64  .    set v [lind
4170: 65 78 20 24 61 72 67 6c 69 73 74 20 5b 65 78 70  ex $arglist [exp
4180: 72 20 32 20 2a 20 24 70 63 20 2b 20 31 5d 5d 0a  r 2 * $pc + 1]].
4190: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24  .    switch -- $
41a0: 6b 20 7b 0a 0a 20 20 20 20 20 20 2d 74 65 73 74  k {..      -test
41b0: 20 7b 20 0a 20 20 20 20 20 20 20 20 66 6f 72 65   { .        fore
41c0: 61 63 68 20 7b 69 64 20 73 63 72 69 70 74 7d 20  ach {id script} 
41d0: 24 76 20 7b 7d 0a 20 20 20 20 20 20 20 20 73 65  $v {}.        se
41e0: 74 20 74 65 73 74 69 64 20 22 6d 61 6c 6c 6f 63  t testid "malloc
41f0: 33 2d 28 74 65 73 74 20 24 69 64 29 2e 24 69 74  3-(test $id).$it
4200: 65 72 69 64 22 0a 20 20 20 20 20 20 20 20 65 76  erid".        ev
4210: 61 6c 20 24 73 63 72 69 70 74 0a 20 20 20 20 20  al $script.     
4220: 20 20 20 69 6e 63 72 20 70 63 0a 20 20 20 20 20     incr pc.     
4230: 20 7d 0a 0a 20 20 20 20 20 20 2d 73 71 6c 20 7b   }..      -sql {
4240: 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 72  .        set ::r
4250: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5f 63 6f 75  ollback_hook_cou
4260: 6e 74 20 30 0a 0a 20 20 20 20 20 20 20 20 73 65  nt 0..        se
4270: 74 20 61 63 20 5b 73 71 6c 69 74 65 33 5f 67 65  t ac [sqlite3_ge
4280: 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 24 3a 3a  t_autocommit $::
4290: 44 42 5d 20 20 20 20 20 20 20 20 3b 23 20 41 75  DB]        ;# Au
42a0: 74 6f 2d 43 6f 6d 6d 69 74 0a 20 20 20 20 20 20  to-Commit.      
42b0: 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f    sqlite_malloc_
42c0: 66 61 69 6c 20 24 69 46 61 69 6c 0a 20 20 20 20  fail $iFail.    
42d0: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
42e0: 68 20 7b 64 62 20 65 76 61 6c 20 5b 6c 69 6e 64  h {db eval [lind
42f0: 65 78 20 24 76 20 31 5d 7d 20 6d 73 67 5d 20 20  ex $v 1]} msg]  
4300: 20 3b 23 20 54 72 75 65 20 65 72 72 6f 72 20 6f   ;# True error o
4310: 63 63 75 72 73 0a 20 20 20 20 20 20 20 20 73 65  ccurs.        se
4320: 74 20 6e 61 63 20 5b 73 71 6c 69 74 65 33 5f 67  t nac [sqlite3_g
4330: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 24 3a  et_autocommit $:
4340: 3a 44 42 5d 20 20 20 20 20 20 20 3b 23 20 4e 65  :DB]       ;# Ne
4350: 77 20 41 75 74 6f 2d 43 6f 6d 6d 69 74 20 0a 0a  w Auto-Commit ..
4360: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 63  .        if {$rc
4370: 20 21 3d 20 30 20 26 26 20 24 6e 61 63 20 26 26   != 0 && $nac &&
4380: 20 21 24 61 63 7d 20 7b 0a 20 20 20 20 20 20 20   !$ac} {.       
4390: 20 20 20 23 20 42 65 66 6f 72 65 20 5b 64 62 20     # Before [db 
43a0: 65 76 61 6c 5d 20 74 68 65 20 61 75 74 6f 2d 63  eval] the auto-c
43b0: 6f 6d 6d 69 74 20 66 6c 61 67 20 77 61 73 20 63  ommit flag was c
43c0: 6c 65 61 72 2e 20 4e 6f 77 20 69 74 0a 20 20 20  lear. Now it.   
43d0: 20 20 20 20 20 20 20 23 20 69 73 20 73 65 74 2e         # is set.
43e0: 20 53 69 6e 63 65 20 61 6e 20 65 72 72 6f 72 20   Since an error 
43f0: 6f 63 63 75 72 65 64 20 77 65 20 61 73 73 75 6d  occured we assum
4400: 65 20 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61  e this was not a
4410: 0a 09 20 20 23 20 63 6f 6d 6d 69 74 20 2d 20 74  ..  # commit - t
4420: 68 65 72 65 66 6f 72 65 20 61 20 72 6f 6c 6c 62  herefore a rollb
4430: 61 63 6b 20 6f 63 63 75 72 65 64 2e 20 43 68 65  ack occured. Che
4440: 63 6b 20 74 68 61 74 20 74 68 65 0a 09 20 20 23  ck that the..  #
4450: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 77   rollback-hook w
4460: 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20  as invoked..    
4470: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 6d 61        do_test ma
4480: 6c 6c 6f 63 33 2d 72 6f 6c 6c 62 61 63 6b 5f 68  lloc3-rollback_h
4490: 6f 6f 6b 2e 24 69 74 65 72 69 64 20 7b 0a 20 20  ook.$iterid {.  
44a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
44b0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5f 63 6f  rollback_hook_co
44c0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 7d 20  unt.          } 
44d0: 7b 31 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  {1}.        }.. 
44e0: 20 20 20 20 20 20 20 69 66 20 7b 24 72 63 20 3d         if {$rc =
44f0: 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  = 0} {.         
4500: 20 20 20 23 20 53 75 63 63 65 73 73 66 75 6c 20     # Successful 
4510: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 73 71 6c  execution of sql
4520: 2e 20 4f 75 72 20 22 6d 61 6c 6c 6f 63 73 2d 75  . Our "mallocs-u
4530: 6e 74 69 6c 2d 66 61 69 6c 75 72 65 22 20 0a 20  ntil-failure" . 
4540: 20 20 20 20 20 20 20 20 20 20 20 23 20 63 6f 75             # cou
4550: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 67 72 65  nt should be gre
4560: 61 74 65 72 20 74 68 61 6e 20 30 2e 20 4f 74 68  ater than 0. Oth
4570: 65 72 77 69 73 65 20 61 20 6d 61 6c 6c 6f 63 28  erwise a malloc(
4580: 29 20 66 61 69 6c 65 64 0a 20 20 20 20 20 20 20  ) failed.       
4590: 20 20 20 20 20 23 20 61 6e 64 20 74 68 65 20 65       # and the e
45a0: 72 72 6f 72 20 77 61 73 20 6e 6f 74 20 72 65 70  rror was not rep
45b0: 6f 72 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  orted..         
45c0: 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 5b     if {[lindex [
45d0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74  sqlite_malloc_st
45e0: 61 74 5d 20 32 5d 20 3c 3d 20 30 7d 20 7b 0a 20  at] 2] <= 0} {. 
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
4600: 6f 72 20 22 55 6e 72 65 70 6f 72 74 65 64 20 6d  or "Unreported m
4610: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 22  alloc() failure"
4620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
4630: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
4640: 24 61 63 20 26 26 20 21 24 6e 61 63 7d 20 7b 0a  $ac && !$nac} {.
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
4660: 42 65 66 6f 72 65 20 74 68 65 20 5b 64 62 20 65  Before the [db e
4670: 76 61 6c 5d 20 74 68 65 20 61 75 74 6f 2d 63 6f  val] the auto-co
4680: 6d 6d 69 74 20 66 6c 61 67 20 77 61 73 20 73 65  mmit flag was se
4690: 74 2c 20 6e 6f 77 20 69 74 0a 20 20 20 20 20 20  t, now it.      
46a0: 20 20 20 20 20 20 20 20 23 20 69 73 20 63 6c 65          # is cle
46b0: 61 72 2e 20 57 65 20 63 61 6e 20 64 65 64 75 63  ar. We can deduc
46c0: 65 20 74 68 61 74 20 61 20 22 42 45 47 49 4e 22  e that a "BEGIN"
46d0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 6a   statement has j
46e0: 75 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ust.            
46f0: 20 20 23 20 62 65 65 6e 20 73 75 63 63 65 73 73    # been success
4700: 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a  fully executed..
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4720: 74 20 62 65 67 69 6e 5f 70 63 20 24 70 63 0a 20  t begin_pc $pc. 
4730: 20 20 20 20 20 20 20 20 20 20 20 7d 20 0a 0a 20             } .. 
4740: 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
4750: 70 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  pc.            s
4760: 65 74 20 69 46 61 69 6c 20 31 0a 20 20 20 20 20  et iFail 1.     
4770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 6d 61         sqlite_ma
4780: 6c 6c 6f 63 5f 66 61 69 6c 20 30 0a 20 20 20 20  lloc_fail 0.    
4790: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
47a0: 79 5f 63 68 65 63 6b 20 22 6d 61 6c 6c 6f 63 33  y_check "malloc3
47b0: 2d 28 69 6e 74 65 67 72 69 74 79 29 2e 24 69 74  -(integrity).$it
47c0: 65 72 69 64 22 0a 20 20 20 20 20 20 20 20 7d 20  erid".        } 
47d0: 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20  elseif {[regexp 
47e0: 7b 2e 2a 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  {.*out of memory
47f0: 7d 20 24 6d 73 67 5d 7d 20 7b 0a 20 20 20 20 20  } $msg]} {.     
4800: 20 20 20 20 20 20 20 23 20 4f 75 74 20 6f 66 20         # Out of 
4810: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 2c 20 61 73  memory error, as
4820: 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20   expected.      
4830: 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 5f        integrity_
4840: 63 68 65 63 6b 20 22 6d 61 6c 6c 6f 63 33 2d 28  check "malloc3-(
4850: 69 6e 74 65 67 72 69 74 79 29 2e 24 69 74 65 72  integrity).$iter
4860: 69 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  id".            
4870: 69 6e 63 72 20 69 46 61 69 6c 0a 20 20 20 20 20  incr iFail.     
4880: 20 20 20 20 20 20 20 69 66 20 7b 24 6e 61 63 20         if {$nac 
4890: 26 26 20 21 24 61 63 7d 20 7b 0a 0a 20 20 20 20  && !$ac} {..    
48a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
48b0: 6c 69 6e 64 65 78 20 24 76 20 30 5d 7d 20 7b 0a  lindex $v 0]} {.
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 65 72 72 6f 72 20 22 53 74 61 74 65 6d 65 6e 74  error "Statement
48e0: 20 5c 22 5b 6c 69 6e 64 65 78 20 24 76 20 31 5d   \"[lindex $v 1]
48f0: 5c 22 20 63 61 75 73 65 64 20 61 20 72 6f 6c 6c  \" caused a roll
4900: 62 61 63 6b 22 0a 20 20 20 20 20 20 20 20 20 20  back".          
4910: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
4920: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20       for {set i 
4930: 24 62 65 67 69 6e 5f 70 63 7d 20 7b 24 69 20 3c  $begin_pc} {$i <
4940: 20 24 70 63 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   $pc} {incr i} {
4950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4960: 20 73 65 74 20 6b 32 20 5b 6c 69 6e 64 65 78 20   set k2 [lindex 
4970: 24 61 72 67 6c 69 73 74 20 5b 65 78 70 72 20 32  $arglist [expr 2
4980: 20 2a 20 24 69 5d 5d 0a 20 20 20 20 20 20 20 20   * $i]].        
4990: 20 20 20 20 20 20 20 20 73 65 74 20 76 32 20 5b          set v2 [
49a0: 6c 69 6e 64 65 78 20 24 61 72 67 6c 69 73 74 20  lindex $arglist 
49b0: 5b 65 78 70 72 20 32 20 2a 20 24 69 20 2b 20 31  [expr 2 * $i + 1
49c0: 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]].             
49d0: 20 20 20 73 65 74 20 63 61 74 63 68 75 70 73 71     set catchupsq
49e0: 6c 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  l "".           
49f0: 20 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24       switch -- $
4a00: 6b 32 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k2 {.           
4a10: 20 20 20 20 20 20 20 2d 73 71 6c 20 20 7b 73 65         -sql  {se
4a20: 74 20 63 61 74 63 68 75 70 73 71 6c 20 5b 6c 69  t catchupsql [li
4a30: 6e 64 65 78 20 24 76 32 20 31 5d 7d 0a 20 20 20  ndex $v2 1]}.   
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
4a50: 70 72 65 70 20 7b 73 65 74 20 63 61 74 63 68 75  prep {set catchu
4a60: 70 73 71 6c 20 24 76 32 7d 0a 20 20 20 20 20 20  psql $v2}.      
4a70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 20 65              db e
4a90: 76 61 6c 20 24 63 61 74 63 68 75 70 73 71 6c 0a  val $catchupsql.
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4ac0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
4ae0: 20 24 6d 73 67 0a 20 20 20 20 20 20 20 20 7d 0a   $msg.        }.
4af0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b  .        while {
4b00: 5b 6c 69 6e 64 65 78 20 24 61 72 67 6c 69 73 74  [lindex $arglist
4b10: 20 5b 65 78 70 72 20 32 20 2a 20 28 24 70 63 20   [expr 2 * ($pc 
4b20: 2d 31 29 5d 5d 20 3d 3d 20 22 2d 74 65 73 74 22  -1)]] == "-test"
4b30: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  } {.          in
4b40: 63 72 20 70 63 20 2d 31 0a 20 20 20 20 20 20 20  cr pc -1.       
4b50: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
4b60: 20 20 2d 70 72 65 70 20 7b 0a 20 20 20 20 20 20    -prep {.      
4b70: 20 20 64 62 20 65 76 61 6c 20 24 76 0a 20 20 20    db eval $v.   
4b80: 20 20 20 20 20 69 6e 63 72 20 70 63 0a 20 20 20       incr pc.   
4b90: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
4ba0: 75 6c 74 20 7b 20 65 72 72 6f 72 20 22 55 6e 6b  ult { error "Unk
4bb0: 6e 6f 77 6e 20 73 77 69 74 63 68 3a 20 24 6b 22  nown switch: $k"
4bc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4bd0: 23 20 54 75 72 6e 20 6f 66 20 74 68 65 20 54 63  # Turn of the Tc
4be0: 6c 20 69 6e 74 65 72 66 61 63 65 27 73 20 70 72  l interface's pr
4bf0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
4c00: 20 63 61 63 68 69 6e 67 20 66 61 63 69 6c 69 74   caching facilit
4c10: 79 2e 0a 64 62 20 63 61 63 68 65 20 73 69 7a 65  y..db cache size
4c20: 20 30 0a 0a 72 75 6e 5f 74 65 73 74 20 24 3a 3a   0..run_test $::
4c30: 72 75 6e 5f 74 65 73 74 5f 73 63 72 69 70 74 20  run_test_script 
4c40: 39 20 31 0a 23 20 72 75 6e 5f 74 65 73 74 20 5b  9 1.# run_test [
4c50: 6c 72 61 6e 67 65 20 24 3a 3a 72 75 6e 5f 74 65  lrange $::run_te
4c60: 73 74 5f 73 63 72 69 70 74 20 30 20 33 5d 20 30  st_script 0 3] 0
4c70: 20 36 33 0a 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   63.sqlite_mallo
4c80: 63 5f 66 61 69 6c 20 30 0a 64 62 20 63 6c 6f 73  c_fail 0.db clos
4c90: 65 0a 0a 70 70 5f 63 68 65 63 6b 5f 66 6f 72 5f  e..pp_check_for_
4ca0: 6c 65 61 6b 73 0a 0a 66 69 6e 69 73 68 5f 74 65  leaks..finish_te
4cb0: 73 74 0a                                         st.