/ Hex Artifact Content
Login

Artifact c38b7f7c17914f0cd6a119beed5d03bc3f47f9eb:


0000: 23 20 32 30 30 34 20 46 65 62 20 38 0a 23 0a 23  # 2004 Feb 8.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u give..#.#*****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20  QLite library.  
01a0: 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20 74  The.# focus of t
01b0: 68 69 73 20 73 63 72 69 70 74 20 69 73 20 74 68  his script is th
01c0: 65 20 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75  e sqlite_interru
01d0: 70 74 28 29 20 41 50 49 2e 0a 23 0a 23 20 24 49  pt() API..#.# $I
01e0: 64 3a 20 69 6e 74 65 72 72 75 70 74 2e 74 65 73  d: interrupt.tes
01f0: 74 2c 76 20 31 2e 31 33 20 32 30 30 36 2f 30 37  t,v 1.13 2006/07
0200: 2f 31 37 20 30 30 3a 30 32 3a 34 36 20 64 72 68  /17 00:02:46 drh
0210: 20 45 78 70 20 24 0a 0a 0a 73 65 74 20 74 65 73   Exp $...set tes
0220: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0230: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0240: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0250: 72 2e 74 63 6c 0a 73 65 74 20 44 42 20 5b 73 71  r.tcl.set DB [sq
0260: 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite3_connection
0270: 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 0a 23 20  _pointer db]..# 
0280: 43 6f 6d 70 75 74 65 20 61 20 63 68 65 63 6b 73  Compute a checks
0290: 75 6d 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  um on the entire
02a0: 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 70 72 6f   database..#.pro
02b0: 63 20 63 6b 73 75 6d 20 7b 7b 64 62 20 64 62 7d  c cksum {{db db}
02c0: 7d 20 7b 0a 20 20 73 65 74 20 74 78 74 20 5b 24  } {.  set txt [$
02d0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
02e0: 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
02f0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0300: 65 72 7d 5d 5c 6e 0a 20 20 66 6f 72 65 61 63 68  er}]\n.  foreach
0310: 20 74 62 6c 20 5b 24 64 62 20 65 76 61 6c 20 7b   tbl [$db eval {
0320: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
0330: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
0340: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
0350: 27 7d 5d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64  '}] {.    append
0360: 20 74 78 74 20 5b 24 64 62 20 65 76 61 6c 20 22   txt [$db eval "
0370: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 24 74  SELECT * FROM $t
0380: 62 6c 22 5d 5c 6e 0a 20 20 7d 0a 20 20 66 6f 72  bl"]\n.  }.  for
0390: 65 61 63 68 20 70 72 61 67 20 7b 64 65 66 61 75  each prag {defau
03a0: 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 20 64  lt_synchronous d
03b0: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
03c0: 65 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20  e} {.    append 
03d0: 74 78 74 20 24 70 72 61 67 2d 5b 24 64 62 20 65  txt $prag-[$db e
03e0: 76 61 6c 20 22 50 52 41 47 4d 41 20 24 70 72 61  val "PRAGMA $pra
03f0: 67 22 5d 5c 6e 0a 20 20 7d 0a 20 20 73 65 74 20  g"]\n.  }.  set 
0400: 63 6b 73 75 6d 20 5b 73 74 72 69 6e 67 20 6c 65  cksum [string le
0410: 6e 67 74 68 20 24 74 78 74 5d 2d 5b 6d 64 35 20  ngth $txt]-[md5 
0420: 24 74 78 74 5d 0a 20 20 23 20 70 75 74 73 20 24  $txt].  # puts $
0430: 63 6b 73 75 6d 2d 5b 66 69 6c 65 20 73 69 7a 65  cksum-[file size
0440: 20 74 65 73 74 2e 64 62 5d 0a 20 20 72 65 74 75   test.db].  retu
0450: 72 6e 20 24 63 6b 73 75 6d 0a 7d 0a 0a 23 20 54  rn $cksum.}..# T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
0470: 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20  mpts to execute 
0480: 74 68 65 20 73 71 6c 20 69 6e 20 24 73 71 6c 2e  the sql in $sql.
0490: 20 20 49 74 20 74 72 69 67 67 65 72 73 20 61 6e    It triggers an
04a0: 0a 23 20 69 6e 74 65 72 72 75 70 74 20 61 74 20  .# interrupt at 
04b0: 70 72 6f 67 72 65 73 73 69 76 65 6c 79 20 6c 61  progressively la
04c0: 74 65 72 20 61 6e 64 20 6c 61 74 65 72 20 70 6f  ter and later po
04d0: 69 6e 74 73 20 64 75 72 69 6e 67 20 74 68 65 20  ints during the 
04e0: 70 72 6f 63 65 73 73 69 6e 67 0a 23 20 61 6e 64  processing.# and
04f0: 20 63 68 65 63 6b 73 20 74 6f 20 6d 61 6b 65 20   checks to make 
0500: 73 75 72 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  sure SQLITE_INTE
0510: 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
0520: 64 2e 20 20 45 76 65 6e 74 75 61 6c 6c 79 2c 0a  d.  Eventually,.
0530: 23 20 74 68 65 20 72 6f 75 74 69 6e 65 20 63 6f  # the routine co
0540: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
0550: 75 6c 6c 79 2e 0a 23 0a 70 72 6f 63 20 69 6e 74  ully..#.proc int
0560: 65 72 72 75 70 74 5f 74 65 73 74 20 7b 74 65 73  errupt_test {tes
0570: 74 69 64 20 73 71 6c 20 72 65 73 75 6c 74 20 7b  tid sql result {
0580: 69 6e 69 74 63 6e 74 20 30 7d 7d 20 7b 0a 20 20  initcnt 0}} {.  
0590: 73 65 74 20 6f 72 69 67 5f 73 75 6d 20 5b 63 6b  set orig_sum [ck
05a0: 73 75 6d 5d 0a 20 20 73 65 74 20 69 20 24 69 6e  sum].  set i $in
05b0: 69 74 63 6e 74 0a 20 20 77 68 69 6c 65 20 31 20  itcnt.  while 1 
05c0: 7b 0a 20 20 20 20 69 6e 63 72 20 69 0a 20 20 20  {.    incr i.   
05d0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6e   set ::sqlite_in
05e0: 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20 24 69  terrupt_count $i
05f0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65  .    do_test $te
0600: 73 74 69 64 2e 24 69 2e 31 20 5b 66 6f 72 6d 61  stid.$i.1 [forma
0610: 74 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a  t {.      set ::
0620: 72 20 5b 63 61 74 63 68 73 71 6c 20 25 73 5d 0a  r [catchsql %s].
0630: 20 20 20 20 20 20 73 65 74 20 3a 3a 63 6f 64 65        set ::code
0640: 20 5b 64 62 20 65 72 72 6f 72 63 6f 64 65 5d 0a   [db errorcode].
0650: 20 20 20 20 20 20 65 78 70 72 20 7b 24 3a 3a 63        expr {$::c
0660: 6f 64 65 3d 3d 30 20 7c 7c 20 24 3a 3a 63 6f 64  ode==0 || $::cod
0670: 65 3d 3d 39 7d 0a 20 20 20 20 7d 20 5b 6c 69 73  e==9}.    } [lis
0680: 74 20 24 73 71 6c 5d 5d 20 31 0a 20 20 20 20 69  t $sql]] 1.    i
0690: 66 20 7b 24 3a 3a 63 6f 64 65 3d 3d 39 7d 20 7b  f {$::code==9} {
06a0: 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24  .      do_test $
06b0: 74 65 73 74 69 64 2e 24 69 2e 32 20 7b 0a 20 20  testid.$i.2 {.  
06c0: 20 20 20 20 20 20 63 6b 73 75 6d 0a 20 20 20 20        cksum.    
06d0: 20 20 7d 20 24 6f 72 69 67 5f 73 75 6d 0a 20 20    } $orig_sum.  
06e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
06f0: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64   do_test $testid
0700: 2e 24 69 2e 39 39 20 7b 0a 20 20 20 20 20 20 20  .$i.99 {.       
0710: 20 73 65 74 20 3a 3a 72 0a 20 20 20 20 20 20 7d   set ::r.      }
0720: 20 5b 6c 69 73 74 20 30 20 24 72 65 73 75 6c 74   [list 0 $result
0730: 5d 0a 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20  ].      break.  
0740: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a    }.  }.  set ::
0750: 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74  sqlite_interrupt
0760: 5f 63 6f 75 6e 74 20 30 0a 7d 0a 0a 64 6f 5f 74  _count 0.}..do_t
0770: 65 73 74 20 69 6e 74 65 72 72 75 70 74 2d 31 2e  est interrupt-1.
0780: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0790: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
07a0: 20 74 31 28 61 2c 62 29 3b 0a 20 20 20 20 53 45   t1(a,b);.    SE
07b0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
07c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
07d0: 7d 0a 7d 20 7b 74 31 7d 0a 69 6e 74 65 72 72 75  }.} {t1}.interru
07e0: 70 74 5f 74 65 73 74 20 69 6e 74 65 72 72 75 70  pt_test interrup
07f0: 74 2d 31 2e 32 20 7b 44 52 4f 50 20 54 41 42 4c  t-1.2 {DROP TABL
0800: 45 20 74 31 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  E t1} {}.do_test
0810: 20 69 6e 74 65 72 72 75 70 74 2d 31 2e 33 20 7b   interrupt-1.3 {
0820: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0830: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
0840: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
0850: 0a 20 20 7d 0a 7d 20 7b 7d 0a 69 6e 74 65 67 72  .  }.} {}.integr
0860: 69 74 79 5f 63 68 65 63 6b 20 69 6e 74 65 72 72  ity_check interr
0870: 75 70 74 2d 31 2e 34 0a 0a 64 6f 5f 74 65 73 74  upt-1.4..do_test
0880: 20 69 6e 74 65 72 72 72 75 70 74 2d 32 2e 31 20   interrrupt-2.1 
0890: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
08a0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
08b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
08c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
08d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 72  TO t1 VALUES(1,r
08e0: 61 6e 64 73 74 72 28 33 30 30 2c 34 30 30 29 29  andstr(300,400))
08f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0900: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 31 2c  O t1 SELECT a+1,
0910: 20 72 61 6e 64 73 74 72 28 33 30 30 2c 34 30 30   randstr(300,400
0920: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
0930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
0940: 4c 45 43 54 20 61 2b 32 2c 20 61 20 7c 7c 20 27  LECT a+2, a || '
0950: 2d 27 20 7c 7c 20 62 20 46 52 4f 4d 20 74 31 3b  -' || b FROM t1;
0960: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0970: 20 74 31 20 53 45 4c 45 43 54 20 61 2b 34 2c 20   t1 SELECT a+4, 
0980: 61 20 7c 7c 20 27 2d 27 20 7c 7c 20 62 20 46 52  a || '-' || b FR
0990: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
09a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
09b0: 20 61 2b 38 2c 20 61 20 7c 7c 20 27 2d 27 20 7c   a+8, a || '-' |
09c0: 7c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  | b FROM t1;.   
09d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
09e0: 53 45 4c 45 43 54 20 61 2b 31 36 2c 20 61 20 7c  SELECT a+16, a |
09f0: 7c 20 27 2d 27 20 7c 7c 20 62 20 46 52 4f 4d 20  | '-' || b FROM 
0a00: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
0a10: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
0a20: 33 32 2c 20 61 20 7c 7c 20 27 2d 27 20 7c 7c 20  32, a || '-' || 
0a30: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  b FROM t1;.    C
0a40: 4f 4d 4d 49 54 3b 0a 20 20 20 20 55 50 44 41 54  OMMIT;.    UPDAT
0a50: 45 20 74 31 20 53 45 54 20 62 3d 73 75 62 73 74  E t1 SET b=subst
0a60: 72 28 62 2c 2d 35 2c 35 29 3b 0a 20 20 20 20 53  r(b,-5,5);.    S
0a70: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 66  ELECT count(*) f
0a80: 72 6f 6d 20 74 31 3b 0a 20 20 7d 0a 7d 20 36 34  rom t1;.  }.} 64
0a90: 0a 73 65 74 20 6f 72 69 67 73 69 7a 65 20 5b 66  .set origsize [f
0aa0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
0ab0: 5d 0a 73 65 74 20 63 6b 73 75 6d 20 5b 64 62 20  ].set cksum [db 
0ac0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 6d 64 35  eval {SELECT md5
0ad0: 73 75 6d 28 61 20 7c 7c 20 62 29 20 46 52 4f 4d  sum(a || b) FROM
0ae0: 20 74 31 7d 5d 0a 69 66 63 61 70 61 62 6c 65 20   t1}].ifcapable 
0af0: 7b 76 61 63 75 75 6d 7d 20 7b 0a 20 20 69 6e 74  {vacuum} {.  int
0b00: 65 72 72 75 70 74 5f 74 65 73 74 20 69 6e 74 65  errupt_test inte
0b10: 72 72 75 70 74 2d 32 2e 32 20 7b 56 41 43 55 55  rrupt-2.2 {VACUU
0b20: 4d 7d 20 7b 7d 20 31 30 30 0a 7d 0a 64 6f 5f 74  M} {} 100.}.do_t
0b30: 65 73 74 20 69 6e 74 65 72 72 75 70 74 2d 32 2e  est interrupt-2.
0b40: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
0b50: 20 20 20 20 53 45 4c 45 43 54 20 6d 64 35 73 75      SELECT md5su
0b60: 6d 28 61 20 7c 7c 20 62 29 20 46 52 4f 4d 20 74  m(a || b) FROM t
0b70: 31 3b 0a 20 20 7d 0a 7d 20 24 63 6b 73 75 6d 0a  1;.  }.} $cksum.
0b80: 69 66 63 61 70 61 62 6c 65 20 7b 76 61 63 75 75  ifcapable {vacuu
0b90: 6d 20 26 26 20 21 64 65 66 61 75 6c 74 5f 61 75  m && !default_au
0ba0: 74 6f 76 61 63 75 75 6d 7d 20 7b 0a 20 20 64 6f  tovacuum} {.  do
0bb0: 5f 74 65 73 74 20 69 6e 74 65 72 72 75 70 74 2d  _test interrupt-
0bc0: 32 2e 34 20 7b 0a 20 20 20 20 65 78 70 72 20 7b  2.4 {.    expr {
0bd0: 24 3a 3a 6f 72 69 67 73 69 7a 65 3e 5b 66 69 6c  $::origsize>[fil
0be0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 7d  e size test.db]}
0bf0: 0a 20 20 7d 20 31 0a 7d 0a 69 66 63 61 70 61 62  .  } 1.}.ifcapab
0c00: 6c 65 20 7b 65 78 70 6c 61 69 6e 7d 20 7b 0a 20  le {explain} {. 
0c10: 20 64 6f 5f 74 65 73 74 20 69 6e 74 65 72 72 75   do_test interru
0c20: 70 74 2d 32 2e 35 20 7b 0a 20 20 20 20 73 65 74  pt-2.5 {.    set
0c30: 20 73 71 6c 20 7b 45 58 50 4c 41 49 4e 20 53 45   sql {EXPLAIN SE
0c40: 4c 45 43 54 20 6d 61 78 28 61 2c 62 29 2c 20 61  LECT max(a,b), a
0c50: 2c 20 62 20 46 52 4f 4d 20 74 31 7d 0a 20 20 20  , b FROM t1}.   
0c60: 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20   execsql $sql.  
0c70: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
0c80: 7b 64 62 20 65 76 61 6c 20 24 73 71 6c 20 7b 73  {db eval $sql {s
0c90: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
0ca0: 20 24 44 42 7d 7d 20 6d 73 67 5d 0a 20 20 20 20   $DB}} msg].    
0cb0: 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73 67 0a  lappend rc $msg.
0cc0: 20 20 7d 20 7b 31 20 69 6e 74 65 72 72 75 70 74    } {1 interrupt
0cd0: 65 64 7d 0a 7d 0a 69 6e 74 65 67 72 69 74 79 5f  ed}.}.integrity_
0ce0: 63 68 65 63 6b 20 69 6e 74 65 72 72 75 70 74 2d  check interrupt-
0cf0: 32 2e 36 0a 0a 23 20 54 69 63 6b 65 74 20 23 35  2.6..# Ticket #5
0d00: 39 34 2e 20 20 49 66 20 61 6e 20 69 6e 74 65 72  94.  If an inter
0d10: 72 75 70 74 20 6f 63 63 75 72 73 20 69 6e 20 74  rupt occurs in t
0d20: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74  he middle of a t
0d30: 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 61 6e 64  ransaction.# and
0d40: 20 74 68 61 74 20 74 72 61 6e 73 61 63 74 69 6f   that transactio
0d50: 6e 20 69 73 20 6c 61 74 65 72 20 72 6f 6c 6c 65  n is later rolle
0d60: 64 20 62 61 63 6b 2c 20 74 68 65 20 69 6e 74 65  d back, the inte
0d70: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
0d80: 65 73 20 64 6f 0a 23 20 6e 6f 74 20 72 65 73 65  es do.# not rese
0d90: 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 74  t..#.ifcapable t
0da0: 65 6d 70 64 62 20 7b 0a 20 20 66 6f 72 20 7b 73  empdb {.  for {s
0db0: 65 74 20 69 20 31 7d 20 7b 24 69 3c 35 30 7d 20  et i 1} {$i<50} 
0dc0: 7b 69 6e 63 72 20 69 20 35 7d 20 7b 0a 20 20 20  {incr i 5} {.   
0dd0: 20 64 6f 5f 74 65 73 74 20 69 6e 74 65 72 72 75   do_test interru
0de0: 70 74 2d 33 2e 24 69 2e 31 20 7b 0a 20 20 20 20  pt-3.$i.1 {.    
0df0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0e00: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0e10: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
0e20: 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20 20  ABLE t2(x,y);.  
0e30: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d        SELECT nam
0e40: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65  e FROM sqlite_te
0e50: 6d 70 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20  mp_master;.     
0e60: 20 7d 0a 20 20 20 20 7d 20 7b 74 32 7d 0a 20 20   }.    } {t2}.  
0e70: 20 20 64 6f 5f 74 65 73 74 20 69 6e 74 65 72 72    do_test interr
0e80: 75 70 74 2d 33 2e 24 69 2e 32 20 7b 0a 20 20 20  upt-3.$i.2 {.   
0e90: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
0ea0: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0eb0: 24 3a 3a 69 0a 20 20 20 20 20 20 63 61 74 63 68  $::i.      catch
0ec0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 49 4e  sql {.        IN
0ed0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
0ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
0ef0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20       }.    } {1 
0f00: 69 6e 74 65 72 72 75 70 74 65 64 7d 0a 20 20 20  interrupted}.   
0f10: 20 64 6f 5f 74 65 73 74 20 69 6e 74 65 72 72 75   do_test interru
0f20: 70 74 2d 33 2e 24 69 2e 33 20 7b 0a 20 20 20 20  pt-3.$i.3 {.    
0f30: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0f40: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
0f50: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
0f60: 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 7d  _master;.      }
0f70: 0a 20 20 20 20 7d 20 7b 74 32 7d 0a 20 20 20 20  .    } {t2}.    
0f80: 64 6f 5f 74 65 73 74 20 69 6e 74 65 72 72 75 70  do_test interrup
0f90: 74 2d 33 2e 24 69 2e 34 20 7b 0a 20 20 20 20 20  t-3.$i.4 {.     
0fa0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0fb0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 20      ROLLBACK.   
0fc0: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 30 20 7b 7d     }.    } {0 {}
0fd0: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 69 6e  }.    do_test in
0fe0: 74 65 72 72 75 70 74 2d 33 2e 24 69 2e 35 20 7b  terrupt-3.$i.5 {
0ff0: 0a 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20  .      catchsql 
1000: 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  {SELECT name FRO
1010: 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  M sqlite_temp_ma
1020: 73 74 65 72 7d 3b 0a 20 20 20 20 20 20 65 78 65  ster};.      exe
1030: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 53  csql {.        S
1040: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
1050: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
1060: 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
1070: 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 54 68  } {}.  }.}..# Th
1080: 65 72 65 20 61 72 65 20 72 65 70 6f 72 74 73 20  ere are reports 
1090: 6f 66 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  of a memory leak
10a0: 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74   if an interrupt
10b0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 23   occurs during.#
10c0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
10d0: 66 20 61 20 63 6f 6d 70 6c 65 78 20 71 75 65 72  f a complex quer
10e0: 79 20 2d 20 62 65 66 6f 72 65 20 74 68 65 20 66  y - before the f
10f0: 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 2e 20 20  irst callback.  
1100: 57 65 0a 23 20 77 69 6c 6c 20 74 72 79 20 74 6f  We.# will try to
1110: 20 72 65 70 72 6f 64 75 63 65 20 69 74 20 68 65   reproduce it he
1120: 72 65 3a 0a 23 0a 65 78 65 63 73 71 6c 20 7b 0a  re:.#.execsql {.
1130: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1140: 32 28 61 2c 62 2c 63 29 3b 0a 20 20 49 4e 53 45  2(a,b,c);.  INSE
1150: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1160: 54 20 72 6f 75 6e 64 28 61 2f 31 30 29 2c 20 72  T round(a/10), r
1170: 61 6e 64 73 74 72 28 35 30 2c 38 30 29 2c 20 72  andstr(50,80), r
1180: 61 6e 64 73 74 72 28 35 30 2c 36 30 29 20 46 52  andstr(50,60) FR
1190: 4f 4d 20 74 31 3b 0a 7d 0a 73 65 74 20 73 71 6c  OM t1;.}.set sql
11a0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 6d 61 78 28   {.  SELECT max(
11b0: 6d 69 6e 28 62 2c 63 29 29 2c 20 6d 69 6e 28 6d  min(b,c)), min(m
11c0: 61 78 28 62 2c 63 29 29 2c 20 61 20 46 52 4f 4d  ax(b,c)), a FROM
11d0: 20 74 32 20 47 52 4f 55 50 20 42 59 20 61 20 4f   t2 GROUP BY a O
11e0: 52 44 45 52 20 42 59 20 61 3b 0a 7d 0a 73 65 74  RDER BY a;.}.set
11f0: 20 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70   sqlite_interrup
1200: 74 5f 63 6f 75 6e 74 20 31 30 30 30 30 30 30 0a  t_count 1000000.
1210: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 73 65 74  execsql $sql.set
1220: 20 6d 61 78 5f 63 6f 75 6e 74 20 5b 65 78 70 72   max_count [expr
1230: 20 7b 31 30 30 30 30 30 30 2d 24 73 71 6c 69 74   {1000000-$sqlit
1240: 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  e_interrupt_coun
1250: 74 7d 5d 0a 66 6f 72 20 7b 73 65 74 20 69 20 31  t}].for {set i 1
1260: 7d 20 7b 24 69 3c 24 6d 61 78 5f 63 6f 75 6e 74  } {$i<$max_count
1270: 2d 35 7d 20 7b 69 6e 63 72 20 69 20 31 7d 20 7b  -5} {incr i 1} {
1280: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 74 65 72  .  do_test inter
1290: 72 75 70 74 2d 34 2e 24 69 2e 31 20 7b 0a 20 20  rupt-4.$i.1 {.  
12a0: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
12b0: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20 24  nterrupt_count $
12c0: 3a 3a 69 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ::i.    catchsql
12d0: 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20 69 6e 74   $sql.  } {1 int
12e0: 65 72 72 75 70 74 65 64 7d 0a 7d 0a 0a 23 20 49  errupted}.}..# I
12f0: 6e 74 65 72 72 75 70 74 20 64 75 72 69 6e 67 20  nterrupt during 
1300: 70 61 72 73 69 6e 67 0a 23 0a 64 6f 5f 74 65 73  parsing.#.do_tes
1310: 74 20 69 6e 74 65 72 72 75 70 74 2d 35 2e 31 20  t interrupt-5.1 
1320: 7b 0a 20 20 70 72 6f 63 20 66 61 6b 65 5f 69 6e  {.  proc fake_in
1330: 74 65 72 72 75 70 74 20 7b 61 72 67 73 7d 20 7b  terrupt {args} {
1340: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1350: 74 20 24 3a 3a 44 42 3b 20 72 65 74 75 72 6e 20  t $::DB; return 
1360: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 62 20  SQLITE_OK}.  db 
1370: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1380: 20 66 61 6b 65 5f 69 6e 74 65 72 72 75 70 74 0a   fake_interrupt.
1390: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
13a0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 66 61   CREATE INDEX fa
13b0: 6b 65 20 4f 4e 20 66 61 6b 65 31 28 61 20 43 4f  ke ON fake1(a CO
13c0: 4c 4c 41 54 45 20 66 61 6b 65 5f 63 6f 6c 6c 61  LLATE fake_colla
13d0: 74 69 6f 6e 2c 20 62 2c 20 63 20 44 45 53 43 29  tion, b, c DESC)
13e0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 69 6e 74 65 72  ;.  }.} {1 inter
13f0: 72 75 70 74 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  rupt}.do_test in
1400: 74 65 72 72 75 70 74 2d 35 2e 32 20 7b 0a 20 20  terrupt-5.2 {.  
1410: 70 72 6f 63 20 66 61 6b 65 5f 69 6e 74 65 72 72  proc fake_interr
1420: 75 70 74 20 7b 61 72 67 73 7d 20 7b 64 62 20 69  upt {args} {db i
1430: 6e 74 65 72 72 75 70 74 3b 20 72 65 74 75 72 6e  nterrupt; return
1440: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 62   SQLITE_OK}.  db
1450: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
1460: 64 20 66 61 6b 65 5f 69 6e 74 65 72 72 75 70 74  d fake_interrupt
1470: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1480: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 66    CREATE INDEX f
1490: 61 6b 65 20 4f 4e 20 66 61 6b 65 31 28 61 20 43  ake ON fake1(a C
14a0: 4f 4c 4c 41 54 45 20 66 61 6b 65 5f 63 6f 6c 6c  OLLATE fake_coll
14b0: 61 74 69 6f 6e 2c 20 62 2c 20 63 20 44 45 53 43  ation, b, c DESC
14c0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 69 6e 74 65  );.  }.} {1 inte
14d0: 72 72 75 70 74 7d 0a 0a 66 69 6e 69 73 68 5f 74  rrupt}..finish_t
14e0: 65 73 74 0a                                      est.