/ Hex Artifact Content
Login

Artifact 464d55beb32e3b12ce2b4bbf9857d063c4c34297:


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 65 64 20 64 69 64 20 6e 6f 74 20 6f  ccured did not o
0ca0: 70 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  pen a statement.
0cb0: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 53  # transaction, S
0cc0: 51 4c 69 74 65 20 68 61 64 20 6e 6f 20 63 68 6f  QLite had no cho
0cd0: 69 63 65 20 62 75 74 20 74 6f 20 72 6f 6c 6c 20  ice but to roll 
0ce0: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
0cf0: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
0d00: 74 6b 74 32 34 30 39 2d 31 2e 34 20 7b 0a 20 20  tkt2409-1.4 {.  
0d10: 75 6e 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 0a 20  unread_lock_db. 
0d20: 20 63 61 74 63 68 73 71 6c 20 7b 20 52 4f 4c 4c   catchsql { ROLL
0d30: 42 41 43 4b 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  BACK }.} {0 {}}.
0d40: 0a 73 65 74 20 3a 3a 7a 53 68 6f 72 74 20 5b 73  .set ::zShort [s
0d50: 74 72 69 6e 67 20 72 65 70 65 61 74 20 30 31 32  tring repeat 012
0d60: 33 34 35 36 37 38 39 20 31 5d 0a 73 65 74 20 3a  3456789 1].set :
0d70: 3a 7a 4c 6f 6e 67 20 20 5b 73 74 72 69 6e 67 20  :zLong  [string 
0d80: 72 65 70 65 61 74 20 30 31 32 33 34 35 36 37 38  repeat 012345678
0d90: 39 20 31 35 30 30 5d 0a 73 65 74 20 3a 3a 72 63  9 1500].set ::rc
0da0: 20 31 0a 66 6f 72 20 7b 73 65 74 20 69 43 61 63   1.for {set iCac
0db0: 68 65 20 31 30 7d 20 7b 24 3a 3a 72 63 7d 20 7b  he 10} {$::rc} {
0dc0: 69 6e 63 72 20 69 43 61 63 68 65 7d 20 7b 0a 20  incr iCache} {. 
0dd0: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
0de0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 24 69   cache_size = $i
0df0: 43 61 63 68 65 22 0a 20 20 64 6f 5f 74 65 73 74  Cache".  do_test
0e00: 20 74 6b 74 32 34 30 39 2d 32 2e 31 2e 24 69 43   tkt2409-2.1.$iC
0e10: 61 63 68 65 20 7b 0a 20 20 20 20 72 65 61 64 5f  ache {.    read_
0e20: 6c 6f 63 6b 5f 64 62 0a 20 20 20 20 73 65 74 20  lock_db.    set 
0e30: 3a 3a 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20  ::rc [catch {.  
0e40: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
0e50: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
0e60: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0e70: 20 74 31 20 56 41 4c 55 45 53 28 24 3a 3a 7a 53   t1 VALUES($::zS
0e80: 68 6f 72 74 2c 20 24 3a 3a 7a 4c 6f 6e 67 29 3b  hort, $::zLong);
0e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 6d  .      }.    } m
0ea0: 73 67 5d 0a 20 20 20 20 65 78 70 72 20 7b 28 24  sg].    expr {($
0eb0: 3a 3a 72 63 20 3d 3d 20 31 20 26 26 20 24 6d 73  ::rc == 1 && $ms
0ec0: 67 20 65 71 20 22 64 69 73 6b 20 49 2f 4f 20 65  g eq "disk I/O e
0ed0: 72 72 6f 72 22 29 20 7c 7c 20 24 3a 3a 72 63 20  rror") || $::rc 
0ee0: 3d 3d 20 30 7d 0a 20 20 7d 20 7b 31 7d 0a 7d 0a  == 0}.  } {1}.}.
0ef0: 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32 34 30 39  .do_test tkt2409
0f00: 2d 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  -2.2 {.  catchsq
0f10: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
0f20: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
0f30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f40: 56 41 4c 55 45 53 28 24 3a 3a 7a 53 68 6f 72 74  VALUES($::zShort
0f50: 2c 20 24 3a 3a 7a 4c 6f 6e 67 29 3b 0a 20 20 20  , $::zLong);.   
0f60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
0f70: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f80: 6f 63 6b 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ocked}}..do_test
0f90: 20 74 6b 74 32 34 30 39 2d 32 2e 33 20 7b 0a 20   tkt2409-2.3 {. 
0fa0: 20 75 6e 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 0a   unread_lock_db.
0fb0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0fc0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
0fd0: 30 20 7b 7d 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20  0 {}}...do_test 
0fe0: 74 6b 74 32 34 30 39 2d 33 2e 31 20 7b 0a 20 20  tkt2409-3.1 {.  
0ff0: 64 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 3a  db close.  set :
1000: 3a 44 42 20 5b 73 71 6c 69 74 65 33 20 64 62 20  :DB [sqlite3 db 
1010: 74 65 73 74 2e 64 62 3b 20 73 71 6c 69 74 65 33  test.db; sqlite3
1020: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
1030: 74 65 72 20 64 62 5d 0a 20 20 73 71 6c 69 74 65  ter db].  sqlite
1040: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
1050: 74 5f 63 6f 64 65 73 20 24 3a 3a 44 42 20 31 0a  t_codes $::DB 1.
1060: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1070: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1080: 65 3d 31 30 3b 0a 20 20 20 20 44 45 4c 45 54 45  e=10;.    DELETE
1090: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
10a0: 72 65 61 64 5f 6c 6f 63 6b 5f 64 62 0a 20 20 73  read_lock_db.  s
10b0: 65 74 20 3a 3a 7a 53 68 6f 72 74 20 5b 73 74 72  et ::zShort [str
10c0: 69 6e 67 20 72 65 70 65 61 74 20 30 31 32 33 34  ing repeat 01234
10d0: 35 36 37 38 39 20 31 5d 0a 20 20 73 65 74 20 3a  56789 1].  set :
10e0: 3a 7a 4c 6f 6e 67 20 20 5b 73 74 72 69 6e 67 20  :zLong  [string 
10f0: 72 65 70 65 61 74 20 30 31 32 33 34 35 36 37 38  repeat 012345678
1100: 39 20 31 35 30 30 5d 0a 20 20 63 61 74 63 68 73  9 1500].  catchs
1110: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1120: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1130: 74 31 20 53 45 4c 45 43 54 20 24 3a 3a 7a 53 68  t1 SELECT $::zSh
1140: 6f 72 74 2c 20 24 3a 3a 7a 4c 6f 6e 67 3b 0a 20  ort, $::zLong;. 
1150: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f   }.} {0 {}}..do_
1160: 74 65 73 74 20 74 6b 74 32 34 30 39 2d 33 2e 32  test tkt2409-3.2
1170: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72   {.  sqlite3_err
1180: 63 6f 64 65 20 24 3a 3a 44 42 0a 7d 20 7b 53 51  code $::DB.} {SQ
1190: 4c 49 54 45 5f 4f 4b 7d 0a 0a 23 20 43 68 65 63  LITE_OK}..# Chec
11a0: 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
11b0: 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 23 0a  of the cache..#.
11c0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
11d0: 74 6b 74 32 34 30 39 2d 33 2e 33 0a 0a 23 20 43  tkt2409-3.3..# C
11e0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72  heck that the tr
11f0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 72 6f  ansaction was ro
1200: 6c 6c 65 64 20 62 61 63 6b 2e 20 42 65 63 61 75  lled back. Becau
1210: 73 65 20 74 68 65 20 49 4e 53 45 52 54 0a 23 20  se the INSERT.# 
1220: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1230: 63 68 20 74 68 65 20 22 49 2f 4f 20 65 72 72 6f  ch the "I/O erro
1240: 72 22 20 6f 63 63 75 72 65 64 20 64 69 64 20 6e  r" occured did n
1250: 6f 74 20 6f 70 65 6e 20 61 20 73 74 61 74 65 6d  ot open a statem
1260: 65 6e 74 0a 23 20 74 72 61 6e 73 61 63 74 69 6f  ent.# transactio
1270: 6e 2c 20 53 51 4c 69 74 65 20 68 61 64 20 6e 6f  n, SQLite had no
1280: 20 63 68 6f 69 63 65 20 62 75 74 20 74 6f 20 72   choice but to r
1290: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 74 72 61  oll back the tra
12a0: 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  nsaction..#.do_t
12b0: 65 73 74 20 74 6b 74 32 34 30 39 2d 33 2e 34 20  est tkt2409-3.4 
12c0: 7b 0a 20 20 75 6e 72 65 61 64 5f 6c 6f 63 6b 5f  {.  unread_lock_
12d0: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
12e0: 52 4f 4c 4c 42 41 43 4b 20 7d 0a 7d 20 7b 30 20  ROLLBACK }.} {0 
12f0: 7b 7d 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68  {}}.integrity_ch
1300: 65 63 6b 20 74 6b 74 32 34 30 39 2d 33 2e 35 0a  eck tkt2409-3.5.
1310: 0a 65 78 70 72 20 7b 73 72 61 6e 64 28 31 29 7d  .expr {srand(1)}
1320: 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32 34 30 39  .do_test tkt2409
1330: 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.1 {.  execsql
1340: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
1350: 63 68 65 5f 73 69 7a 65 3d 32 30 3b 0a 20 20 20  che_size=20;.   
1360: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a   DROP TABLE t1;.
1370: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1380: 20 74 31 20 28 78 20 54 45 58 54 20 55 4e 49 51   t1 (x TEXT UNIQ
1390: 55 45 20 4e 4f 54 20 4e 55 4c 4c 29 3b 0a 20 20  UE NOT NULL);.  
13a0: 7d 0a 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f  }..  unset -noco
13b0: 6d 70 6c 61 69 6e 20 74 31 0a 20 20 61 72 72 61  mplain t1.  arra
13c0: 79 20 75 6e 73 65 74 20 74 31 0a 20 20 73 65 74  y unset t1.  set
13d0: 20 74 31 28 30 29 20 31 0a 20 20 73 65 74 20 73   t1(0) 1.  set s
13e0: 71 6c 20 22 22 0a 20 20 66 6f 72 20 7b 73 65 74  ql "".  for {set
13f0: 20 69 20 30 7d 20 7b 24 69 3c 35 30 30 30 7d 20   i 0} {$i<5000} 
1400: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73  {incr i} {.    s
1410: 65 74 20 72 20 30 0a 20 20 20 20 77 68 69 6c 65  et r 0.    while
1420: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74   {[info exists t
1430: 31 28 24 72 29 5d 7d 20 7b 0a 20 20 20 20 20 20  1($r)]} {.      
1440: 73 65 74 20 72 20 5b 65 78 70 72 20 7b 69 6e 74  set r [expr {int
1450: 28 72 61 6e 64 28 29 2a 31 30 30 30 30 30 30 30  (rand()*10000000
1460: 30 30 29 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20  00)}].    }.    
1470: 73 65 74 20 74 31 28 24 72 29 20 31 0a 20 20 20  set t1($r) 1.   
1480: 20 61 70 70 65 6e 64 20 73 71 6c 20 22 49 4e 53   append sql "INS
1490: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
14a0: 45 53 28 27 73 6f 6d 65 2d 74 65 78 74 2d 24 72  ES('some-text-$r
14b0: 27 29 3b 22 0a 20 20 7d 0a 0a 20 20 72 65 61 64  ');".  }..  read
14c0: 5f 6c 6f 63 6b 5f 64 62 0a 20 20 65 78 65 63 73  _lock_db.  execs
14d0: 71 6c 20 42 45 47 49 4e 0a 20 20 63 61 74 63 68  ql BEGIN.  catch
14e0: 73 71 6c 20 24 73 71 6c 0a 7d 20 7b 30 20 7b 7d  sql $sql.} {0 {}
14f0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32 34  }..do_test tkt24
1500: 30 39 2d 34 2e 32 20 7b 0a 20 20 73 71 6c 69 74  09-4.2 {.  sqlit
1510: 65 33 5f 65 72 72 63 6f 64 65 20 24 3a 3a 44 42  e3_errcode $::DB
1520: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a  .} {SQLITE_OK}..
1530: 23 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  # Check the inte
1540: 67 72 69 74 79 20 6f 66 20 74 68 65 20 63 61 63  grity of the cac
1550: 68 65 2e 0a 23 0a 69 6e 74 65 67 72 69 74 79 5f  he..#.integrity_
1560: 63 68 65 63 6b 20 74 6b 74 32 34 30 39 2d 34 2e  check tkt2409-4.
1570: 33 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74 32 34  3..do_test tkt24
1580: 30 39 2d 34 2e 34 20 7b 0a 20 20 63 61 74 63 68  09-4.4 {.  catch
1590: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
15a0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 69 6e 74 65 67 72  .} {0 {}}.integr
15b0: 69 74 79 5f 63 68 65 63 6b 20 74 6b 74 32 34 30  ity_check tkt240
15c0: 39 2d 34 2e 35 0a 0a 75 6e 72 65 61 64 5f 6c 6f  9-4.5..unread_lo
15d0: 63 6b 5f 64 62 0a 64 62 32 20 63 6c 6f 73 65 0a  ck_db.db2 close.
15e0: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
15f0: 6e 20 74 31 0a 66 69 6e 69 73 68 5f 74 65 73 74  n t1.finish_test
1600: 0a                                               .