/ Hex Artifact Content
Login

Artifact be0d60e7d283f639dccea4b0b5e1cd3a4851fb5b:


0000: 23 20 32 30 30 37 20 4a 75 6e 65 20 31 33 0a 23  # 2007 June 13.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 49 6e 20 70 6c 61 63 65 20   code. In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a  SQLite library..
01a0: 23 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69 6d  #.# This file im
01b0: 70 6c 65 6d 65 6e 74 73 20 74 65 73 74 73 20 74  plements tests t
01c0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 69  o verify that ti
01d0: 63 6b 65 74 20 23 32 34 30 39 20 68 61 73 20 62  cket #2409 has b
01e0: 65 65 6e 0a 23 20 66 69 78 65 64 2e 20 4d 6f 72  een.# fixed. Mor
01f0: 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
0200: 74 68 65 79 20 76 65 72 69 66 79 20 74 68 61 74  they verify that
0210: 20 69 66 20 53 51 4c 69 74 65 20 63 61 6e 6e 6f   if SQLite canno
0220: 74 0a 23 20 6f 62 74 61 69 6e 20 61 6e 20 45 58  t.# obtain an EX
0230: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 69  CLUSIVE lock whi
0240: 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 70 69  le trying to spi
0250: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 64 75 72  ll the cache dur
0260: 69 6e 67 0a 23 20 61 6e 79 20 73 74 61 74 65 6d  ing.# any statem
0270: 65 6e 74 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ent other than a
0280: 20 43 4f 4d 4d 49 54 2c 20 61 6e 20 49 2f 4f 20   COMMIT, an I/O 
0290: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
02a0: 64 20 69 6e 73 74 65 61 64 0a 23 20 6f 66 20 53  d instead.# of S
02b0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 23 0a 23 20  QLITE_BUSY..#.# 
02c0: 24 49 64 3a 20 74 6b 74 32 34 30 39 2e 74 65 73  $Id: tkt2409.tes
02d0: 74 2c 76 20 31 2e 36 20 32 30 30 38 2f 30 38 2f  t,v 1.6 2008/08/
02e0: 32 38 20 31 37 3a 34 36 3a 31 39 20 64 72 68 20  28 17:46:19 drh 
02f0: 45 78 70 20 24 0a 0a 23 20 54 65 73 74 20 4f 75  Exp $..# Test Ou
0300: 74 6c 69 6e 65 3a 0a 23 0a 23 20 20 20 74 6b 74  tline:.#.#   tkt
0310: 2d 32 34 30 39 2d 31 2e 2a 3a 20 43 61 75 73 65  -2409-1.*: Cause
0320: 20 61 20 63 61 63 68 65 2d 73 70 69 6c 6c 20 64   a cache-spill d
0330: 75 72 69 6e 67 20 61 6e 20 49 4e 53 45 52 54 20  uring an INSERT 
0340: 74 68 61 74 20 69 73 20 77 69 74 68 69 6e 0a 23  that is within.#
0350: 20 20 20 20 20 20 20 61 20 64 62 20 74 72 61 6e         a db tran
0360: 73 61 63 74 69 6f 6e 20 62 75 74 20 64 6f 65 73  saction but does
0370: 20 6e 6f 74 20 73 74 61 72 74 20 61 20 73 74 61   not start a sta
0380: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
0390: 6f 6e 2e 0a 23 20 20 20 20 20 20 20 56 65 72 69  on..#       Veri
03a0: 66 79 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  fy that the tran
03b0: 73 61 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6d  saction is autom
03c0: 61 74 69 63 61 6c 6c 79 20 72 6f 6c 6c 65 64 20  atically rolled 
03d0: 62 61 63 6b 0a 23 20 20 20 20 20 20 20 61 6e 64  back.#       and
03e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
03f0: 4f 43 4b 45 44 20 69 73 20 72 65 74 75 72 6e 65  OCKED is returne
0400: 64 0a 23 0a 23 20 20 20 20 20 20 20 55 50 44 41  d.#.#       UPDA
0410: 54 45 3a 20 41 73 20 6f 66 20 74 68 65 20 70 63  TE: As of the pc
0420: 61 63 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f  ache modificatio
0430: 6e 73 2c 20 66 61 69 6c 69 6e 67 20 74 6f 20 75  ns, failing to u
0440: 70 67 72 61 64 65 20 74 6f 0a 23 20 20 20 20 20  pgrade to.#     
0450: 20 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c    an exclusive l
0460: 6f 63 6b 20 77 68 65 6e 20 61 74 74 65 6d 70 74  ock when attempt
0470: 69 6e 67 20 61 20 63 61 63 68 65 2d 73 70 69 6c  ing a cache-spil
0480: 6c 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  l is no longer a
0490: 6e 0a 23 20 20 20 20 20 20 20 65 72 72 6f 72 2e  n.#       error.
04a0: 20 54 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   The pcache modu
04b0: 6c 65 20 61 6c 6c 6f 63 61 74 65 73 20 6d 6f 72  le allocates mor
04c0: 65 20 73 70 61 63 65 20 61 6e 64 20 6b 65 65 70  e space and keep
04d0: 73 20 77 6f 72 6b 69 6e 67 0a 23 20 20 20 20 20  s working.#     
04e0: 20 20 69 6e 20 6d 65 6d 6f 72 79 20 69 66 20 74    in memory if t
04f0: 68 69 73 20 6f 63 63 75 72 73 2e 0a 23 0a 23 20  his occurs..#.# 
0500: 20 20 74 6b 74 2d 32 34 30 39 2d 32 2e 2a 3a 20    tkt-2409-2.*: 
0510: 43 61 75 73 65 20 61 20 63 61 63 68 65 2d 73 70  Cause a cache-sp
0520: 69 6c 6c 20 77 68 69 6c 65 20 75 70 64 61 74 69  ill while updati
0530: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
0540: 75 6e 74 65 72 0a 23 20 20 20 20 20 20 20 64 75  unter.#       du
0550: 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
0560: 43 4f 4d 4d 49 54 2e 20 56 65 72 69 66 79 20 74  COMMIT. Verify t
0570: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
0580: 69 6f 6e 20 69 73 20 6e 6f 74 0a 23 20 20 20 20  ion is not.#    
0590: 20 20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61     rolled back a
05a0: 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
05b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 23 20  s returned..#.# 
05c0: 20 20 74 6b 74 2d 32 34 30 39 2d 33 2e 2a 3a 20    tkt-2409-3.*: 
05d0: 53 69 6d 69 6c 61 72 20 74 6f 20 32 34 30 39 2d  Similar to 2409-
05e0: 31 2e 2a 2c 20 62 75 74 20 75 73 69 6e 67 20 6d  1.*, but using m
05f0: 61 6e 79 20 49 4e 53 45 52 54 20 73 74 61 74 65  any INSERT state
0600: 6d 65 6e 74 73 0a 23 20 20 20 20 20 20 20 77 69  ments.#       wi
0610: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0620: 6f 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75  on instead of ju
0630: 73 74 20 6f 6e 65 2e 0a 23 0a 23 20 20 20 20 20  st one..#.#     
0640: 20 20 55 50 44 41 54 45 3a 20 41 67 61 69 6e 2c    UPDATE: Again,
0650: 20 70 63 61 63 68 65 20 6e 6f 77 20 6a 75 73 74   pcache now just
0660: 20 6b 65 65 70 73 20 77 6f 72 6b 69 6e 67 20 69   keeps working i
0670: 6e 20 6d 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 23  n main memory..#
0680: 0a 23 20 20 20 74 6b 74 2d 32 34 30 39 2d 34 2e  .#   tkt-2409-4.
0690: 2a 3a 20 53 69 6d 69 6c 61 72 20 74 6f 20 32 34  *: Similar to 24
06a0: 30 39 2d 31 2e 2a 2c 20 62 75 74 20 72 69 67 20  09-1.*, but rig 
06b0: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 23  it so that the.#
06c0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 73 74         INSERT st
06d0: 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20 61  atement starts a
06e0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
06f0: 61 63 74 69 6f 6e 2e 20 56 65 72 69 66 79 20 74  action. Verify t
0700: 68 61 74 0a 23 20 20 20 20 20 20 20 53 51 4c 49  hat.#       SQLI
0710: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
0720: 6e 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ned and the tran
0730: 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72  saction is not r
0740: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20  olled back..#.# 
0750: 20 20 20 20 20 20 55 50 44 41 54 45 3a 20 54 68        UPDATE: Th
0760: 69 73 20 74 69 6d 65 2c 20 53 51 4c 49 54 45 5f  is time, SQLITE_
0770: 42 55 53 59 20 69 73 20 6e 6f 74 20 72 65 74 75  BUSY is not retu
0780: 72 6e 65 64 2e 20 70 63 61 63 68 65 20 6a 75 73  rned. pcache jus
0790: 74 20 75 73 65 73 0a 23 20 20 20 20 20 20 20 6d  t uses.#       m
07a0: 6f 72 65 20 6d 61 6c 6c 6f 63 28 29 27 64 20 6d  ore malloc()'d m
07b0: 65 6d 6f 72 79 2e 0a 23 0a 0a 73 65 74 20 74 65  emory..#..set te
07c0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
07d0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
07e0: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
07f0: 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c  er.tcl..ifcapabl
0800: 65 20 21 70 61 67 65 72 5f 70 72 61 67 6d 61 73  e !pager_pragmas
0810: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0820: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 71 6c  .  return.}..sql
0830: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
0840: 73 75 6c 74 5f 63 6f 64 65 73 20 24 3a 3a 44 42  sult_codes $::DB
0850: 20 31 0a 0a 23 20 41 71 75 69 72 65 20 61 20 72   1..# Aquire a r
0860: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
0870: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 68  database using h
0880: 61 6e 64 6c 65 20 5b 64 62 32 5d 2e 0a 23 0a 70  andle [db2]..#.p
0890: 72 6f 63 20 72 65 61 64 5f 6c 6f 63 6b 5f 64 62  roc read_lock_db
08a0: 20 7b 7d 20 7b 0a 20 20 69 66 20 7b 24 3a 3a 53   {} {.  if {$::S
08b0: 54 4d 54 20 65 71 20 22 22 7d 20 7b 0a 20 20 20  TMT eq ""} {.   
08c0: 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c   set ::STMT [sql
08d0: 69 74 65 33 5f 70 72 65 70 61 72 65 20 64 62 32  ite3_prepare db2
08e0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   {SELECT rowid F
08f0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0900: 72 7d 20 2d 31 20 54 41 49 4c 5d 0a 20 20 20 20  r} -1 TAIL].    
0910: 73 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f  set rc [sqlite3_
0920: 73 74 65 70 20 24 3a 3a 53 54 4d 54 5d 0a 20 20  step $::STMT].  
0930: 20 20 69 66 20 7b 24 72 63 20 65 71 20 22 53 51    if {$rc eq "SQ
0940: 4c 49 54 45 5f 45 52 52 4f 52 22 7d 20 7b 0a 20  LITE_ERROR"} {. 
0950: 20 20 20 20 20 75 6e 72 65 61 64 5f 6c 6f 63 6b       unread_lock
0960: 5f 64 62 0a 20 20 20 20 20 20 72 65 61 64 5f 6c  _db.      read_l
0970: 6f 63 6b 5f 64 62 0a 20 20 20 20 7d 0a 20 20 7d  ock_db.    }.  }
0980: 0a 7d 0a 0a 23 20 52 65 6c 65 61 73 65 20 61 6e  .}..# Release an
0990: 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61  y read-lock obta
09a0: 69 6e 65 64 20 75 73 69 6e 67 20 5b 72 65 61 64  ined using [read
09b0: 5f 6c 6f 63 6b 5f 64 62 5d 0a 23 0a 70 72 6f 63  _lock_db].#.proc
09c0: 20 75 6e 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 20   unread_lock_db 
09d0: 7b 7d 20 7b 0a 20 20 69 66 20 7b 24 3a 3a 53 54  {} {.  if {$::ST
09e0: 4d 54 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20  MT ne ""} {.    
09f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0a00: 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20 73 65 74   $::STMT.    set
0a10: 20 3a 3a 53 54 4d 54 20 22 22 0a 20 20 7d 0a 7d   ::STMT "".  }.}
0a20: 0a 0a 23 20 4f 70 65 6e 20 74 68 65 20 64 62 20  ..# Open the db 
0a30: 68 61 6e 64 6c 65 20 75 73 65 64 20 62 79 20 5b  handle used by [
0a40: 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 5d 2e 0a 23  read_lock_db]..#
0a50: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
0a60: 74 2e 64 62 0a 73 65 74 20 3a 3a 53 54 4d 54 20  t.db.set ::STMT 
0a70: 22 22 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32  ""..do_test tkt2
0a80: 34 30 39 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63  409-1.1 {.  exec
0a90: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
0aa0: 20 63 61 63 68 65 5f 73 69 7a 65 3d 31 30 3b 0a   cache_size=10;.
0ab0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0ac0: 20 74 31 28 78 20 54 45 58 54 20 55 4e 49 51 55   t1(x TEXT UNIQU
0ad0: 45 20 4e 4f 54 20 4e 55 4c 4c 2c 20 79 20 42 4c  E NOT NULL, y BL
0ae0: 4f 42 29 3b 0a 20 20 7d 0a 20 20 72 65 61 64 5f  OB);.  }.  read_
0af0: 6c 6f 63 6b 5f 64 62 0a 20 20 73 65 74 20 3a 3a  lock_db.  set ::
0b00: 7a 53 68 6f 72 74 20 5b 73 74 72 69 6e 67 20 72  zShort [string r
0b10: 65 70 65 61 74 20 30 31 32 33 34 35 36 37 38 39  epeat 0123456789
0b20: 20 31 5d 0a 20 20 73 65 74 20 3a 3a 7a 4c 6f 6e   1].  set ::zLon
0b30: 67 20 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  g  [string repea
0b40: 74 20 30 31 32 33 34 35 36 37 38 39 20 31 35 30  t 0123456789 150
0b50: 30 5d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  0].  catchsql {.
0b60: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49      BEGIN;.    I
0b70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0b80: 4c 55 45 53 28 24 3a 3a 7a 53 68 6f 72 74 2c 20  LUES($::zShort, 
0b90: 24 3a 3a 7a 4c 6f 6e 67 29 3b 0a 20 20 7d 0a 7d  $::zLong);.  }.}
0ba0: 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74   {0 {}}..do_test
0bb0: 20 74 6b 74 32 34 30 39 2d 31 2e 32 20 7b 0a 20   tkt2409-1.2 {. 
0bc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0bd0: 20 24 3a 3a 44 42 0a 7d 20 7b 53 51 4c 49 54 45   $::DB.} {SQLITE
0be0: 5f 4f 4b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  _OK}..# Check th
0bf0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
0c00: 68 65 20 63 61 63 68 65 2e 0a 23 0a 69 6e 74 65  he cache..#.inte
0c10: 67 72 69 74 79 5f 63 68 65 63 6b 20 74 6b 74 32  grity_check tkt2
0c20: 34 30 39 2d 31 2e 33 0a 0a 23 20 43 68 65 63 6b  409-1.3..# Check
0c30: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
0c40: 63 74 69 6f 6e 20 77 61 73 20 72 6f 6c 6c 65 64  ction was rolled
0c50: 20 62 61 63 6b 2e 20 42 65 63 61 75 73 65 20 74   back. Because t
0c60: 68 65 20 49 4e 53 45 52 54 0a 23 20 73 74 61 74  he INSERT.# stat
0c70: 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
0c80: 68 65 20 22 49 2f 4f 20 65 72 72 6f 72 22 20 6f  he "I/O error" o
0c90: 63 63 75 72 72 65 64 20 64 69 64 20 6e 6f 74 20  ccurred did not 
0ca0: 6f 70 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  open a statement
0cb0: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  .# transaction, 
0cc0: 53 51 4c 69 74 65 20 68 61 64 20 6e 6f 20 63 68  SQLite had no ch
0cd0: 6f 69 63 65 20 62 75 74 20 74 6f 20 72 6f 6c 6c  oice but to roll
0ce0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
0cf0: 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74  ction..#.do_test
0d00: 20 74 6b 74 32 34 30 39 2d 31 2e 34 20 7b 0a 20   tkt2409-1.4 {. 
0d10: 20 75 6e 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 0a   unread_lock_db.
0d20: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52 4f 4c    catchsql { ROL
0d30: 4c 42 41 43 4b 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  LBACK }.} {0 {}}
0d40: 0a 0a 73 65 74 20 3a 3a 7a 53 68 6f 72 74 20 5b  ..set ::zShort [
0d50: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 30 31  string repeat 01
0d60: 32 33 34 35 36 37 38 39 20 31 5d 0a 73 65 74 20  23456789 1].set 
0d70: 3a 3a 7a 4c 6f 6e 67 20 20 5b 73 74 72 69 6e 67  ::zLong  [string
0d80: 20 72 65 70 65 61 74 20 30 31 32 33 34 35 36 37   repeat 01234567
0d90: 38 39 20 31 35 30 30 5d 0a 73 65 74 20 3a 3a 72  89 1500].set ::r
0da0: 63 20 31 0a 66 6f 72 20 7b 73 65 74 20 69 43 61  c 1.for {set iCa
0db0: 63 68 65 20 31 30 7d 20 7b 24 3a 3a 72 63 7d 20  che 10} {$::rc} 
0dc0: 7b 69 6e 63 72 20 69 43 61 63 68 65 7d 20 7b 0a  {incr iCache} {.
0dd0: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
0de0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 24  A cache_size = $
0df0: 69 43 61 63 68 65 22 0a 20 20 64 6f 5f 74 65 73  iCache".  do_tes
0e00: 74 20 74 6b 74 32 34 30 39 2d 32 2e 31 2e 24 69  t tkt2409-2.1.$i
0e10: 43 61 63 68 65 20 7b 0a 20 20 20 20 72 65 61 64  Cache {.    read
0e20: 5f 6c 6f 63 6b 5f 64 62 0a 20 20 20 20 73 65 74  _lock_db.    set
0e30: 20 3a 3a 72 63 20 5b 63 61 74 63 68 20 7b 0a 20   ::rc [catch {. 
0e40: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
0e50: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
0e60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0e70: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 3a 3a 7a  O t1 VALUES($::z
0e80: 53 68 6f 72 74 2c 20 24 3a 3a 7a 4c 6f 6e 67 29  Short, $::zLong)
0e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
0ea0: 6d 73 67 5d 0a 20 20 20 20 65 78 70 72 20 7b 28  msg].    expr {(
0eb0: 24 3a 3a 72 63 20 3d 3d 20 31 20 26 26 20 24 6d  $::rc == 1 && $m
0ec0: 73 67 20 65 71 20 22 64 69 73 6b 20 49 2f 4f 20  sg eq "disk I/O 
0ed0: 65 72 72 6f 72 22 29 20 7c 7c 20 24 3a 3a 72 63  error") || $::rc
0ee0: 20 3d 3d 20 30 7d 0a 20 20 7d 20 7b 31 7d 0a 7d   == 0}.  } {1}.}
0ef0: 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32 34 30  ..do_test tkt240
0f00: 39 2d 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  9-2.2 {.  catchs
0f10: 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ql {.    ROLLBAC
0f20: 4b 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  K;.    BEGIN;.  
0f30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0f40: 20 56 41 4c 55 45 53 28 24 3a 3a 7a 53 68 6f 72   VALUES($::zShor
0f50: 74 2c 20 24 3a 3a 7a 4c 6f 6e 67 29 3b 0a 20 20  t, $::zLong);.  
0f60: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
0f70: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
0f80: 6c 6f 63 6b 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73  locked}}..do_tes
0f90: 74 20 74 6b 74 32 34 30 39 2d 32 2e 33 20 7b 0a  t tkt2409-2.3 {.
0fa0: 20 20 75 6e 72 65 61 64 5f 6c 6f 63 6b 5f 64 62    unread_lock_db
0fb0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0fc0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
0fd0: 7b 30 20 7b 7d 7d 0a 0a 0a 64 6f 5f 74 65 73 74  {0 {}}...do_test
0fe0: 20 74 6b 74 32 34 30 39 2d 33 2e 31 20 7b 0a 20   tkt2409-3.1 {. 
0ff0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20   db close.  set 
1000: 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33 20 64 62  ::DB [sqlite3 db
1010: 20 74 65 73 74 2e 64 62 3b 20 73 71 6c 69 74 65   test.db; sqlite
1020: 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
1030: 6e 74 65 72 20 64 62 5d 0a 20 20 73 71 6c 69 74  nter db].  sqlit
1040: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1050: 6c 74 5f 63 6f 64 65 73 20 24 3a 3a 44 42 20 31  lt_codes $::DB 1
1060: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1070: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
1080: 7a 65 3d 31 30 3b 0a 20 20 20 20 44 45 4c 45 54  ze=10;.    DELET
1090: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  E FROM t1;.  }. 
10a0: 20 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 0a 20 20   read_lock_db.  
10b0: 73 65 74 20 3a 3a 7a 53 68 6f 72 74 20 5b 73 74  set ::zShort [st
10c0: 72 69 6e 67 20 72 65 70 65 61 74 20 30 31 32 33  ring repeat 0123
10d0: 34 35 36 37 38 39 20 31 5d 0a 20 20 73 65 74 20  456789 1].  set 
10e0: 3a 3a 7a 4c 6f 6e 67 20 20 5b 73 74 72 69 6e 67  ::zLong  [string
10f0: 20 72 65 70 65 61 74 20 30 31 32 33 34 35 36 37   repeat 01234567
1100: 38 39 20 31 35 30 30 5d 0a 20 20 63 61 74 63 68  89 1500].  catch
1110: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
1120: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1130: 20 74 31 20 53 45 4c 45 43 54 20 24 3a 3a 7a 53   t1 SELECT $::zS
1140: 68 6f 72 74 2c 20 24 3a 3a 7a 4c 6f 6e 67 3b 0a  hort, $::zLong;.
1150: 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f    }.} {0 {}}..do
1160: 5f 74 65 73 74 20 74 6b 74 32 34 30 39 2d 33 2e  _test tkt2409-3.
1170: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72  2 {.  sqlite3_er
1180: 72 63 6f 64 65 20 24 3a 3a 44 42 0a 7d 20 7b 53  rcode $::DB.} {S
1190: 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 23 20 43 68 65  QLITE_OK}..# Che
11a0: 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
11b0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 23   of the cache..#
11c0: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
11d0: 20 74 6b 74 32 34 30 39 2d 33 2e 33 0a 0a 23 20   tkt2409-3.3..# 
11e0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74  Check that the t
11f0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 72  ransaction was r
1200: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 42 65 63 61  olled back. Beca
1210: 75 73 65 20 74 68 65 20 49 4e 53 45 52 54 0a 23  use the INSERT.#
1220: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1230: 69 63 68 20 74 68 65 20 22 49 2f 4f 20 65 72 72  ich the "I/O err
1240: 6f 72 22 20 6f 63 63 75 72 72 65 64 20 64 69 64  or" occurred did
1250: 20 6e 6f 74 20 6f 70 65 6e 20 61 20 73 74 61 74   not open a stat
1260: 65 6d 65 6e 74 0a 23 20 74 72 61 6e 73 61 63 74  ement.# transact
1270: 69 6f 6e 2c 20 53 51 4c 69 74 65 20 68 61 64 20  ion, SQLite had 
1280: 6e 6f 20 63 68 6f 69 63 65 20 62 75 74 20 74 6f  no choice but to
1290: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 74   roll back the t
12a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 64 6f  ransaction..#.do
12b0: 5f 74 65 73 74 20 74 6b 74 32 34 30 39 2d 33 2e  _test tkt2409-3.
12c0: 34 20 7b 0a 20 20 75 6e 72 65 61 64 5f 6c 6f 63  4 {.  unread_loc
12d0: 6b 5f 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  k_db.  catchsql 
12e0: 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 7d 20 7b  { ROLLBACK }.} {
12f0: 30 20 7b 7d 7d 0a 69 6e 74 65 67 72 69 74 79 5f  0 {}}.integrity_
1300: 63 68 65 63 6b 20 74 6b 74 32 34 30 39 2d 33 2e  check tkt2409-3.
1310: 35 0a 0a 65 78 70 72 20 7b 73 72 61 6e 64 28 31  5..expr {srand(1
1320: 29 7d 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32 34  )}.do_test tkt24
1330: 30 39 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  09-4.1 {.  execs
1340: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
1350: 63 61 63 68 65 5f 73 69 7a 65 3d 32 30 3b 0a 20  cache_size=20;. 
1360: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
1370: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
1380: 4c 45 20 74 31 20 28 78 20 54 45 58 54 20 55 4e  LE t1 (x TEXT UN
1390: 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 29 3b 0a  IQUE NOT NULL);.
13a0: 20 20 7d 0a 0a 20 20 75 6e 73 65 74 20 2d 6e 6f    }..  unset -no
13b0: 63 6f 6d 70 6c 61 69 6e 20 74 31 0a 20 20 61 72  complain t1.  ar
13c0: 72 61 79 20 75 6e 73 65 74 20 74 31 0a 20 20 73  ray unset t1.  s
13d0: 65 74 20 74 31 28 30 29 20 31 0a 20 20 73 65 74  et t1(0) 1.  set
13e0: 20 73 71 6c 20 22 22 0a 20 20 66 6f 72 20 7b 73   sql "".  for {s
13f0: 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 30 30 30  et i 0} {$i<5000
1400: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
1410: 20 73 65 74 20 72 20 30 0a 20 20 20 20 77 68 69   set r 0.    whi
1420: 6c 65 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  le {[info exists
1430: 20 74 31 28 24 72 29 5d 7d 20 7b 0a 20 20 20 20   t1($r)]} {.    
1440: 20 20 73 65 74 20 72 20 5b 65 78 70 72 20 7b 69    set r [expr {i
1450: 6e 74 28 72 61 6e 64 28 29 2a 31 30 30 30 30 30  nt(rand()*100000
1460: 30 30 30 30 29 7d 5d 0a 20 20 20 20 7d 0a 20 20  0000)}].    }.  
1470: 20 20 73 65 74 20 74 31 28 24 72 29 20 31 0a 20    set t1($r) 1. 
1480: 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 49     append sql "I
1490: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
14a0: 4c 55 45 53 28 27 73 6f 6d 65 2d 74 65 78 74 2d  LUES('some-text-
14b0: 24 72 27 29 3b 22 0a 20 20 7d 0a 0a 20 20 72 65  $r');".  }..  re
14c0: 61 64 5f 6c 6f 63 6b 5f 64 62 0a 20 20 65 78 65  ad_lock_db.  exe
14d0: 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 63 61 74  csql BEGIN.  cat
14e0: 63 68 73 71 6c 20 24 73 71 6c 0a 7d 20 7b 30 20  chsql $sql.} {0 
14f0: 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74  {}}..do_test tkt
1500: 32 34 30 39 2d 34 2e 32 20 7b 0a 20 20 73 71 6c  2409-4.2 {.  sql
1510: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 24 3a 3a  ite3_errcode $::
1520: 44 42 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  DB.} {SQLITE_OK}
1530: 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20 69 6e  ..# Check the in
1540: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 63  tegrity of the c
1550: 61 63 68 65 2e 0a 23 0a 69 6e 74 65 67 72 69 74  ache..#.integrit
1560: 79 5f 63 68 65 63 6b 20 74 6b 74 32 34 30 39 2d  y_check tkt2409-
1570: 34 2e 33 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74  4.3..do_test tkt
1580: 32 34 30 39 2d 34 2e 34 20 7b 0a 20 20 63 61 74  2409-4.4 {.  cat
1590: 63 68 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  chsql { ROLLBACK
15a0: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 69 6e 74 65   }.} {0 {}}.inte
15b0: 67 72 69 74 79 5f 63 68 65 63 6b 20 74 6b 74 32  grity_check tkt2
15c0: 34 30 39 2d 34 2e 35 0a 0a 75 6e 72 65 61 64 5f  409-4.5..unread_
15d0: 6c 6f 63 6b 5f 64 62 0a 64 62 32 20 63 6c 6f 73  lock_db.db2 clos
15e0: 65 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  e.unset -nocompl
15f0: 61 69 6e 20 74 31 0a 66 69 6e 69 73 68 5f 74 65  ain t1.finish_te
1600: 73 74 0a                                         st.