/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3e9815178b2f3ffcf9f5a6b7d40212be77b4f5bf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
71b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
71c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
71d0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
71e0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
71f0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
7200: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
7210: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
7220: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
7230: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7250: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7260: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7270: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7290: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
72a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
72b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7310: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7320: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7330: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7340: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7350: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
7360: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
7370: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
7380: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7390: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
73a0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
73b0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
73c0: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
73d0: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
73e0: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
73f0: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7400: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7410: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7420: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7440: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7450: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
7460: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
7470: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
7480: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7490: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
74a0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
74b0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
74c0: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
74d0: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
74e0: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
74f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7500: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7510: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7520: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7530: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7550: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
7560: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
7570: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
7580: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7590: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
75a0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
75b0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
75c0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
75f0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7600: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7610: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7620: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7630: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7640: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7650: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7660: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20  doNotSyncSpill; 
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
7680: 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68  ot do a spill th
7690: 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c  at requires jrnl
76a0: 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75   sync */.  u8 su
76b0: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
76c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
76d0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
76e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
76f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7710: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7720: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7730: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7740: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7750: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7760: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7780: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
77a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
77b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
77c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
77d0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
77e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
77f0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7800: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7810: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7830: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7840: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7880: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7890: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
78a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
78b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
78c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
78d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
78e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
78f0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7920: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7930: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7940: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7950: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7960: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7970: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
79a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
79b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
79c0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
79d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79e0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
79f0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a00: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7a10: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7a20: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7a30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a40: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7a50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7a60: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7a70: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7a80: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7a90: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7aa0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7ab0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7ac0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7ad0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7b00: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7b10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7b20: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7b30: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7b40: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7b50: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7b60: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7b70: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7b80: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7bb0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7bc0: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7bd0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7be0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7bf0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7c00: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7c10: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7c20: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7c30: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7c40: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
7ca0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7cc0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
7cd0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
7ce0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
7cf0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
7d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d10: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
7d20: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7d30: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7d40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7d50: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7d60: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7d70: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
7d80: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
7d90: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
7da0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
7db0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
7dc0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7de0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7df0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
7e00: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7e20: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
7e30: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
7e40: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
7e50: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
7e70: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
7e80: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
7e90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
7ea0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
7eb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ed0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
7ee0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
7ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
7f00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f10: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
7f20: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
7f30: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
7f40: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
7f50: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
7f60: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
7f70: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
7f80: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
7f90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7fa0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
7fb0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
7fc0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
7fd0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
7fe0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
7ff0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
8000: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
8010: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
8020: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8030: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8040: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8050: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8060: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8070: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8080: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8090: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
80a0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
80b0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
80c0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
80d0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
80e0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
80f0: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8100: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8110: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8120: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8130: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8150: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8160: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8170: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
81a0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
81b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
81c0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
81d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
81e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
81f0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8200: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8210: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8220: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8230: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8240: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8260: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8280: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8290: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
82a0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
82b0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
82e0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
82f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8300: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8310: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8320: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8330: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8340: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8350: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8360: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8370: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8380: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8390: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
83a0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
83b0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
83c0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
83d0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
83e0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
83f0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8400: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8410: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8420: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8430: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8460: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8470: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8490: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
84a0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
84b0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
84c0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
84d0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
84e0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
84f0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8500: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8510: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8520: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8530: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8540: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8550: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8560: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8570: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8580: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8590: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
85a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
85b0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
85c0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
85d0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
85e0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
85f0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8610: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8620: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8630: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8640: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8650: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8660: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8670: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8680: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8690: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
86b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
86c0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
86d0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
86e0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
86f0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8700: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8710: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8720: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8730: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8740: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8750: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8760: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8770: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8780: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8790: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
87a0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
87b0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
87c0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
87d0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
87e0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
87f0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8800: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8810: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8820: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8830: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8840: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8850: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8860: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8870: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8880: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8890: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
88a0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
88b0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
88c0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
88d0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
88e0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
88f0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8900: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8910: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8920: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
8930: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
8940: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
8950: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8960: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8970: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8980: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8990: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
89a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
89b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
89c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
89d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
89e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
89f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8a00: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8a10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8a20: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8a30: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8a40: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8a50: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8a60: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8a70: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8a80: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8a90: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8aa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8ab0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8ac0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8ae0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8af0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8b00: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8b10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8b20: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8b30: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8b40: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8b50: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8b60: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8b70: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8b80: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8b90: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8ba0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8bb0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8bc0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8bd0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8be0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8bf0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8c00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8c10: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8c20: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8c30: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8c40: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8c50: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8c60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8c70: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8c80: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8c90: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8ca0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8cb0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8cc0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8ce0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8cf0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8d00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8d10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8d20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8d30: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8d40: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8d50: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8d60: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8d70: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8d80: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8d90: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8da0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8db0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8dc0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8dd0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8de0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8df0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8e00: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8e10: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8e20: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8e30: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8e40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8e50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8e60: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8e70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8e80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8e90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8ea0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8eb0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8ec0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8ed0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8ee0: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8ef0: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8f00: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8f10: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8f20: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8f30: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8f40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8f50: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
8f60: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
8f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8f80: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
8f90: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
8fa0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
8fb0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
8fc0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
8fd0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
8fe0: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
8ff0: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
9000: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9010: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
9020: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
9030: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
9040: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
9050: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9060: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9070: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9080: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9090: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
90a0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
90b0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
90c0: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
90d0: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
90e0: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
90f0: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
9100: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
9110: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
9120: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
9130: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
9140: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
9150: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9160: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9170: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9180: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9190: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
91a0: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
91b0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
91c0: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
91d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
91e0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
91f0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9200: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9210: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9240: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9260: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9270: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9280: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9290: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
92a0: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
92b0: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
92c0: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
92d0: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
92e0: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
92f0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9300: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9310: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9320: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
9330: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
9340: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
9350: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9360: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9370: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9380: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9390: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
93a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
93b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
93c0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
93d0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
93e0: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
93f0: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9400: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9410: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9420: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
9430: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
9440: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
9450: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9460: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9470: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9490: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
94a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
94b0: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
94c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
94d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
94e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
94f0: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9500: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9510: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9520: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
9530: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
9540: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
9550: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9560: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9570: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9580: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9590: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
95a0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
95b0: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
95c0: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
95d0: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
95e0: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
95f0: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9600: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9620: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
9630: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
9640: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9650: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9670: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9680: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9690: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
96a0: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
96b0: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
96c0: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
96d0: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
96e0: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
96f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9700: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9710: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9720: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9730: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9740: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9750: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9760: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9770: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9780: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9790: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
97a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
97b0: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
97c0: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
97d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
97e0: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
97f0: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9800: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9810: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9820: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9830: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9850: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9860: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9870: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9890: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
98a0: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
98b0: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
98c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
98d0: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
98e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
98f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9900: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9910: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9920: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9930: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9940: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9950: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9960: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9970: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9980: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
99a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
99b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
99c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
99d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
99f0: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9a00: 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64  OCK || p->noRead
9a10: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72  lock );.      br
9a20: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9a30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9a40: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
9a50: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9a60: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9a70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9a80: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9a90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9aa0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ab0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ad0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9ae0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b00: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
9b10: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
9b20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b30: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b40: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
9b50: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
9b60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9b70: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9b80: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
9b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ba0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9bb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9bc0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9bd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9be0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
9bf0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9c00: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9c10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c20: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9c30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9c40: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9c50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9c60: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
9c70: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
9c80: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
9c90: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
9ca0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
9cb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
9cc0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
9cd0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
9ce0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
9cf0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
9d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9d10: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
9d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
9d30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
9d40: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
9d50: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9d70: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d80: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
9d90: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9da0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9db0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9dc0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9dd0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9de0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9df0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e10: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9e40: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9e50: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9e60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e70: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9e80: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9e90: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
9ea0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9eb0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9ec0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9ed0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9ee0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f00: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f10: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f20: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
9f30: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
9f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9f50: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
9f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
9f70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9f80: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9f90: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9fa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9fb0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9fc0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9fd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9fe0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
9ff0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a000: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a010: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a020: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a040: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a050: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a070: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a080: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a090: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a0d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a0e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a0f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a100: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a110: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a120: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a130: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a140: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a150: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a160: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a170: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a180: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a190: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a1a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a1b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a1c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a1d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a1e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a1f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a200: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a210: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a220: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a230: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a250: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a260: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a270: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a280: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a290: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a2a0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a2b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a2c0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a2d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a2e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a2f0: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a300: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a310: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a320: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a330: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a340: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a350: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a360: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a370: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a380: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a390: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a3a0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a3b0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a3c0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a3d0: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a3e0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a3f0: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
a400: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
a410: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
a420: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
a430: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
a440: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
a450: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
a460: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
a470: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
a480: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
a490: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
a4a0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
a4b0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
a4c0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
a4d0: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
a4e0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a4f0: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
a500: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
a510: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
a520: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
a530: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
a540: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
a550: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
a560: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
a570: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
a580: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
a590: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
a5a0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
a5b0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
a5c0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
a5d0: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
a5e0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
a5f0: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
a600: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
a610: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a620: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
a630: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
a640: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
a650: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a660: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
a670: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
a680: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a690: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a6a0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
a6b0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
a6c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a6d0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a6e0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
a6f0: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
a700: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a710: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a720: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
a730: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
a740: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a750: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
a760: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
a770: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
a780: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
a790: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
a7a0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
a7b0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
a7c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a7d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
a7e0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
a7f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a800: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a810: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
a820: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
a830: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
a840: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
a850: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a860: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
a870: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
a880: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
a890: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
a8a0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
a8b0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
a8c0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
a8d0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a8e0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a8f0: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
a900: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
a910: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a920: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
a930: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
a940: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a950: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a960: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
a970: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
a980: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a990: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a9a0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
a9b0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
a9c0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9d0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9e0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
a9f0: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
aa00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aa10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
aa30: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
aa40: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
aa50: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
aa60: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
aa70: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
aa80: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
aa90: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
aaa0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
aab0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
aac0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
aad0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
aae0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
aaf0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
ab00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ab10: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ab20: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ab30: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ab40: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ab50: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ab60: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
ab70: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
ab80: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
ab90: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
aba0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
abb0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
abc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
abd0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
abe0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
abf0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
ac00: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
ac10: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
ac20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ac30: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
ac40: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
ac50: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
ac60: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
ac70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ac80: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
ac90: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
aca0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
acb0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
acc0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
acd0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
ace0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
acf0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ad00: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
ad10: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
ad20: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ad30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
ad40: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
ad50: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
ad60: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
ad70: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
ad80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ad90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ada0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
adb0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
adc0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
add0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ade0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
adf0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
ae00: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ae10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
ae20: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
ae30: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
ae40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
ae50: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
ae60: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
ae70: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
ae80: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
ae90: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
aea0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
aeb0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
aec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
aed0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
aee0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
aef0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
af00: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
af10: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
af20: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
af30: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
af40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af50: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
af60: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
af70: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
af80: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
af90: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
afa0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
afb0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
afc0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
afd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
afe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
aff0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b000: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b020: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b030: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b040: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b050: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b060: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b070: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b080: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b090: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b0a0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b0b0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b0c0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b0d0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b0f0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b100: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b120: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b130: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b140: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b150: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b160: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b170: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b180: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b190: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b1a0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b1b0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b1c0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b1d0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b1e0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b1f0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b200: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b210: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b220: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b230: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b240: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b250: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b260: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b270: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b280: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b290: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b2a0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b2b0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b2c0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b2d0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b2e0: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b2f0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b300: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b310: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b320: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b330: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b340: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b350: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b360: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b370: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b380: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b390: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b3a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b3b0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b3c0: 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
b3d0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b3e0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b3f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b400: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b410: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b420: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b430: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b440: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b460: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b480: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b490: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
b4a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b4b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
b4c0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b4d0: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
b4e0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
b4f0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
b500: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b510: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
b520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b530: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
b540: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b550: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b560: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
b570: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
b580: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
b590: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
b5a0: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
b5b0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
b5c0: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
b5d0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b5e0: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
b5f0: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
b600: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
b610: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
b620: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
b630: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b640: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
b650: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
b660: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
b670: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
b680: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
b690: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
b6a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b6b0: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
b6c0: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
b6d0: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
b6e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b6f0: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
b700: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b710: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b730: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b740: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
b750: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
b760: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
b780: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b790: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
b7a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
b7b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
b7c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b7d0: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
b7e0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
b7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b800: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
b810: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
b820: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b830: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
b840: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b850: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
b860: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
b870: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b880: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
b890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b8a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b8b0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
b8c0: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
b8d0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
b8e0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
b8f0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
b900: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
b910: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
b920: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
b930: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
b940: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
b950: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
b960: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
b970: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
b980: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
b990: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
b9a0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
b9b0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
b9c0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
b9d0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
b9e0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b9f0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
ba00: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
ba10: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
ba20: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
ba30: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
ba40: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
ba50: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
ba60: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
ba70: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
ba80: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
ba90: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
baa0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
bab0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
bac0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
bad0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
bae0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
baf0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
bb00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
bb10: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
bb20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bb30: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
bb40: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
bb50: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
bb60: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
bb70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
bb80: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
bb90: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
bba0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
bbb0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
bbc0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
bbd0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
bbe0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
bbf0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc10: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
bc20: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
bc30: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
bc60: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
bc70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bc90: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
bca0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
bcb0: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
bcc0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
bcd0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bce0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
bcf0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
bd00: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
bd10: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
bd20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
bd30: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
bd40: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
bd50: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
bd60: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bd70: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
bd80: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
bd90: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
bda0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
bdb0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
bdc0: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
bdd0: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
bde0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
bdf0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
be00: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
be10: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
be20: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
be30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
be40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
be50: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
be60: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
be70: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
be80: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
be90: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
bea0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
beb0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
bec0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
bed0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
bee0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
bef0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
bf00: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
bf10: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
bf20: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
bf30: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
bf40: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
bf50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bf60: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
bf70: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
bf80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
bf90: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
bfa0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
bfb0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
bfc0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
bfd0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
bfe0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
bff0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
c000: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
c010: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
c020: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
c030: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
c040: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
c050: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
c060: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
c070: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
c080: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
c090: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c0a0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
c0b0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
c0c0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
c0d0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
c0e0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
c0f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
c100: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
c110: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
c120: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
c130: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
c140: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
c150: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
c160: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
c170: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
c180: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
c190: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
c1a0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
c1b0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
c1c0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
c1d0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
c1e0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
c1f0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
c200: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
c210: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
c220: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
c230: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
c240: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
c250: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
c260: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
c270: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
c280: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
c290: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c2a0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
c2b0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
c2c0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c2d0: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c2e0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c2f0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c300: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c310: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c320: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c330: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c340: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c350: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c370: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c380: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c390: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c3a0: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c3b0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c3c0: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c3d0: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c3e0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c3f0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c400: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c410: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c420: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c430: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c440: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
c450: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
c460: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
c470: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
c480: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
c490: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
c4a0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
c4b0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
c4c0: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
c4d0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
c4e0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
c4f0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
c500: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
c510: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
c520: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
c530: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
c540: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
c550: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
c560: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
c570: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
c580: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
c590: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
c5a0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
c5b0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
c5c0: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
c5d0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
c5e0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
c5f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
c600: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
c610: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
c620: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
c630: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
c640: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
c650: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
c660: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
c670: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
c680: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
c690: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
c6a0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
c6b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
c6c0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
c6d0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
c6e0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
c6f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
c700: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
c710: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
c720: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
c730: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
c740: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
c750: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
c760: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
c770: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
c780: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
c790: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
c7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
c7b0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
c7c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
c7d0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
c7e0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
c7f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
c820: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c840: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
c850: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
c860: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
c870: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
c880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
c890: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
c8a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
c8b0: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
c8c0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
c8d0: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
c8e0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
c8f0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
c900: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c920: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
c930: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
c940: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
c950: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
c960: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
c970: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
c980: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
c990: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
c9a0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
c9b0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
c9c0: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
c9d0: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
c9e0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
c9f0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
ca00: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
ca10: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
ca20: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
ca30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ca40: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
ca50: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
ca60: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ca70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ca80: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
ca90: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
caa0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
cab0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
cac0: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
cad0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cae0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
caf0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
cb00: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
cb10: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
cb20: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
cb30: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
cb40: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
cb50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cb60: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
cb70: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
cb80: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
cb90: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
cba0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
cbb0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
cbc0: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
cbd0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
cbe0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
cbf0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
cc00: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
cc10: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
cc20: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
cc30: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
cc40: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
cc50: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
cc60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
cc70: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
cc80: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
cc90: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
cca0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
ccb0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
ccc0: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
ccd0: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
cce0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ccf0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
cd00: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
cd10: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
cd20: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
cd30: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
cd40: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
cd50: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
cd60: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
cd70: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
cd80: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
cd90: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
cda0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
cdb0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
cdc0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
cdd0: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
cde0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce10: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
ce80: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
ce90: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
cea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
ceb0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
cec0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ced0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
cee0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
cef0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
cf00: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
cf10: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
cf20: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
cf30: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
cf40: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
cf50: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
cf60: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
cf70: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
cf80: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
cf90: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
cfa0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
cfb0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
cfc0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
cfd0: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
cfe0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
cff0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d000: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
d010: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d020: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
d030: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
d040: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
d050: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
d060: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
d070: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
d080: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d090: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
d0a0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
d0b0: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
d0c0: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
d0d0: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
d0e0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
d0f0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
d100: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
d110: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
d120: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
d130: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
d140: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
d150: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
d160: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
d170: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d180: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
d190: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
d1a0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
d1b0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
d1c0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
d1d0: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
d1e0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
d1f0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
d200: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
d210: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d220: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
d230: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
d240: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
d250: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
d260: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
d270: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
d280: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
d290: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
d2a0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
d2b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
d2c0: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
d2d0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
d2e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
d2f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d300: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
d310: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
d320: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
d330: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
d340: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
d350: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
d360: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d370: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
d380: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
d390: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
d3a0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
d3b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d3c0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
d3d0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
d3e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d3f0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
d400: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d410: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d440: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
d450: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
d460: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
d470: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d480: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
d490: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
d4a0: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
d4b0: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
d4c0: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
d4d0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
d4e0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
d4f0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
d500: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
d510: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
d520: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d530: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d540: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
d550: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
d560: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
d570: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
d580: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d590: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
d5a0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
d5b0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
d5c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
d5d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d5e0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
d5f0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
d600: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
d610: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
d620: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
d630: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
d640: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
d650: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d660: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
d670: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
d680: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
d690: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
d6a0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
d6b0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
d6c0: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
d6d0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
d6e0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
d6f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
d700: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d710: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
d720: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
d730: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
d740: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
d750: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
d760: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
d770: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
d780: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
d790: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
d7a0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
d7b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d7c0: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
d7d0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
d7e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d7f0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
d800: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
d810: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
d820: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
d830: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
d840: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
d850: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
d860: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
d870: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d880: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d890: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d8a0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d8b0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
d8c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
d8d0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
d8e0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
d8f0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
d900: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
d910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
d920: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
d930: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
d940: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
d950: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d960: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
d970: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
d980: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
d990: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
d9a0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
d9b0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
d9c0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
d9d0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
d9e0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
d9f0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
da00: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
da10: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
da20: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
da30: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
da40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
da50: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
da60: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
da70: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
da80: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
da90: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
daa0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
dab0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
dac0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
dad0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
dae0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
daf0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
db00: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
db10: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
db20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db40: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
db50: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
db60: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
db70: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
db80: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
db90: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
dba0: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
dbb0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
dbc0: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
dbd0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
dbe0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
dbf0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
dc20: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
dc30: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
dc40: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dc70: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
dc80: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dc90: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
dca0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
dcb0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
dcc0: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
dcd0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
dce0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
dcf0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
dd00: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
dd10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
dd20: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
dd30: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
dd40: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
dd50: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
dd60: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
dd70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
dd80: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
dd90: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
dda0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
ddb0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
ddc0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
ddd0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
dde0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
ddf0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
de00: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
de10: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
de20: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
de30: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
de40: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
de50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
de60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
de70: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
de80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
de90: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
dea0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
deb0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
dec0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
ded0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
dee0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
def0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
df00: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
df10: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
df20: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
df30: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
df40: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
df50: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
df60: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
df70: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
df80: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
df90: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
dfa0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
dfb0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
dfc0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
dfd0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
dfe0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
dff0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
e000: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
e010: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
e020: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
e030: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
e040: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
e050: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
e060: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
e070: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
e080: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
e090: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
e0a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e0b0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
e0c0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
e0d0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
e0e0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
e0f0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
e100: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
e110: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
e120: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e130: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
e140: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
e150: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
e160: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
e170: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
e180: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
e190: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
e1a0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
e1b0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e1c0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
e1d0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
e1e0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
e1f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
e200: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
e210: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
e220: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e230: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
e240: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
e250: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
e260: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
e270: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
e280: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e290: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
e2a0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
e2b0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
e2c0: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
e2d0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
e2e0: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
e2f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
e300: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
e310: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
e320: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
e330: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
e340: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
e350: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
e360: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
e370: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
e380: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
e390: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
e3a0: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
e3b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e3c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
e3d0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
e3e0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
e3f0: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
e400: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e410: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
e420: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
e430: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
e440: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
e450: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
e460: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
e470: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
e480: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
e490: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e4a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e4b0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
e4c0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
e4d0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
e4e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
e4f0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e500: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e510: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
e520: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
e530: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
e540: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
e550: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
e560: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
e570: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e580: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e590: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
e5a0: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
e5b0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
e5c0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e5d0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e5e0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
e5f0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
e600: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
e610: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
e620: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
e630: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
e640: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
e650: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
e660: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
e670: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
e680: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
e690: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
e6a0: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
e6b0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
e6c0: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
e6d0: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
e6e0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
e6f0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
e700: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
e710: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e720: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
e730: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
e740: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
e750: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
e760: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
e770: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
e780: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
e790: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
e7a0: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
e7b0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
e7c0: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
e7d0: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
e7e0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
e7f0: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
e800: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
e810: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
e820: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
e830: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
e840: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
e850: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
e860: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
e870: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
e880: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
e890: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
e8a0: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
e8b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
e8c0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
e8d0: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
e8e0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
e8f0: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
e900: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
e910: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
e920: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
e930: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
e940: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
e950: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
e960: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
e970: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
e980: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
e990: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
e9a0: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
e9b0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
e9c0: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
e9d0: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
e9e0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
e9f0: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
ea00: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
ea10: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
ea20: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
ea30: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
ea40: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
ea50: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
ea60: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
ea70: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
ea80: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
ea90: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
eaa0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
eab0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
eac0: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
ead0: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
eae0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
eaf0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
eb00: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
eb10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
eb20: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
eb30: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
eb40: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
eb50: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
eb60: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
eb70: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
eb80: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
eb90: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
eba0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
ebb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
ebc0: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
ebd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ebe0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ebf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
ec00: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
ec10: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
ec20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ec30: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
ec40: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
ec50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
ec60: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
ec70: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
ec80: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
ec90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
eca0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
ecb0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
ecc0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
ecd0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
ece0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
ecf0: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
ed00: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
ed10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
ed20: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
ed30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ed40: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
ed50: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
ed60: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
ed70: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
ed80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
ed90: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
eda0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
edb0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
edc0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
edd0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
ede0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
edf0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
ee00: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
ee10: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
ee20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
ee30: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
ee40: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
ee50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
ee60: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
ee70: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
ee80: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
ee90: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
eea0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
eeb0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
eec0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
eed0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
eee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
eef0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
ef00: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
ef10: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
ef20: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
ef30: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
ef40: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
ef50: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
ef60: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
ef70: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
ef80: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
ef90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
efa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
efb0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
efc0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
efd0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
efe0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
eff0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
f000: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
f010: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
f020: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
f030: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f040: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
f050: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
f060: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
f090: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
f0a0: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
f0b0: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
f0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f0d0: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
f0e0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
f0f0: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
f100: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f120: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
f130: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
f140: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
f150: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
f160: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
f170: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
f180: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
f190: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
f1a0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f1b0: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
f1c0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
f1d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
f1e0: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
f1f0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
f200: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
f210: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
f220: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
f230: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
f240: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
f250: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
f260: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
f270: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
f280: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
f290: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
f2a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f2b0: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
f2c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
f2d0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
f2e0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
f310: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
f320: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
f330: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
f340: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
f350: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
f360: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
f370: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
f380: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
f390: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
f3a0: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
f3b0: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
f3c0: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
f3d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
f3e0: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
f3f0: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
f400: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
f410: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
f420: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
f430: 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
f440: 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
f450: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
f460: 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
f470: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
f480: 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
f490: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
f4a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
f4b0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
f4c0: 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
f4d0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f4e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f4f0: 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
f500: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
f510: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
f520: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
f530: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f540: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
f550: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
f560: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
f570: 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
f580: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f590: 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
f5a0: 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
f5b0: 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
f5c0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
f5d0: 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
f5e0: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
f5f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
f600: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f610: 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
f620: 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
f630: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
f640: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
f650: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
f660: 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
f670: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
f680: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f690: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f6a0: 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
f6b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
f6c0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
f6d0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f6e0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f6f0: 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
f700: 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
f710: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
f720: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
f730: 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
f740: 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f760: 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
f770: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
f780: 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
f790: 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
f7b0: 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
f7c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
f7d0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
f7e0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
f7f0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
f800: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
f810: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
f820: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f830: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f840: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f850: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
f860: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
f870: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
f880: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
f890: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
f8a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
f8b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f8c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
f8d0: 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
f8e0: 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
f8f0: 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
f900: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
f910: 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
f920: 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
f930: 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
f940: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
f950: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f960: 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
f970: 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
f980: 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
f990: 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
f9a0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
f9b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
f9c0: 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
f9d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
f9e0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
f9f0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
fa00: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
fa10: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
fa20: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
fa30: 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
fa40: 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
fa50: 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
fa60: 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
fa70: 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
fa80: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
fa90: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
faa0: 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
fab0: 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
fac0: 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
fad0: 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
fae0: 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
faf0: 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
fb00: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
fb10: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
fb20: 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
fb30: 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
fb40: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
fb50: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
fb60: 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
fb70: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
fb80: 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
fb90: 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
fba0: 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
fbb0: 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
fbc0: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
fbd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
fbe0: 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
fbf0: 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
fc00: 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
fc10: 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
fc20: 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
fc30: 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
fc40: 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
fc50: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
fc60: 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
fc70: 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
fc80: 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
fc90: 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
fca0: 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
fcb0: 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
fcc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
fcd0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
fce0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fcf0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
fd00: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
fd10: 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
fd20: 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
fd30: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
fd40: 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
fd50: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
fd60: 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
fd70: 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
fd80: 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
fd90: 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
fda0: 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
fdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
fdc0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
fdd0: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
fde0: 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
fdf0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
fe00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
fe10: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
fe20: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
fe30: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
fe40: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
fe50: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
fe60: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
fe70: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
fe80: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
fe90: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
fea0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
feb0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
fec0: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
fed0: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
fee0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
fef0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
ff00: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
ff10: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
ff20: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
ff30: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
ff40: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
ff50: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
ff60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
ff70: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
ff80: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
ff90: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
ffa0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
ffb0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ffc0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ffd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
ffe0: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
fff0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10000 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10010 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
10020 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
10030 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10040 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
10050 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10060 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10070 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10080 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10090 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
100a0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
100b0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
100c0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
100d0 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
100e0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
100f0 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
10100 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
10110 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
10120 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
10130 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
10140 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
10150 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10170 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10180 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10190 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
101a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
101b0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
101c0 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
101d0 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
101e0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
101f0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
10200 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
10210 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
10220 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10230 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
10240 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
10250 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10260 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10270 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10280 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10290 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
102a0 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
102b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
102c0 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
102d0 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
102e0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
102f0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
10300 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10310 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10320 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10330 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10340 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10350 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10360 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10390 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
103a0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
103b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
103c0 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
103d0 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
103e0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
103f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10400 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
10410 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
10420 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
10430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10440 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
10460 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
10470 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
10480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
10490 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
104a0 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
104b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
104c0 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
104d0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
104e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
104f0 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
10500 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
10510 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
10520 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
10530 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
10540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10550 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10560 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
10570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10580 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
10590 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
105a0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
105b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
105c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
105d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
105e0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
105f0 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
10600 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
10610 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
10620 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
10630 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
10640 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
10650 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
10660 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
10670 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
10680 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
10690 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
106a0 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
106b0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
106c0 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
106d0 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
106e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
106f0 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
10700 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
10710 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
10720 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
10730 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
10740 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
10750 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
10760 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
10770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10780 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
10790 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
107a0 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
107b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
107c0 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
107d0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
107e0 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
107f0 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
10800 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
10810 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10820 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
10830 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
10840 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
10850 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10860 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10870 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
10880 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
10890 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
108a0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
108b0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
108c0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
108d0 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
108e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
108f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10900 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10910 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10920 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
10930 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10940 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10950 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10960 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
10970 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
10980 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10990 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
109a0 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
109b0 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
109c0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
109d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
109e0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
109f0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
10a00 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
10a10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
10a20 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
10a30 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
10a40 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
10a50 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
10a60 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
10a70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10a80 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10a90 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
10aa0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
10ab0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
10ac0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
10ad0 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
10ae0 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
10af0 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
10b00 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
10b10 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
10b20 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
10b30 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
10b40 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
10b50 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
10b60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
10b70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
10b80 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
10b90 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
10ba0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
10bb0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
10bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
10bd0 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
10be0 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
10bf0 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
10c00 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
10c10 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
10c20 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
10c30 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
10c40 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
10c50 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
10c60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
10c70 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
10c80 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
10c90 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
10ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10cb0 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
10cc0 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
10cd0 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
10ce0 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
10cf0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
10d00 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
10d10 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
10d20 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
10d30 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
10d40 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
10d50 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
10d60 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
10d70 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
10d80 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
10db0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
10dc0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
10dd0 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
10de0 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
10df0 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
10e00 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
10e10 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
10e20 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
10e30 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
10e40 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
10e50 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
10e60 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
10e70 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
10e80 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
10e90 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
10ea0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10eb0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
10ec0 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e  mory page-cache.
10ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10ee0 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
10ef0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
10f00 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
10f10 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
10f20 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
10f30 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
10f40 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
10f50 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
10f60 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
10f70 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
10f80 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
10f90 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
10fa0 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
10fb0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
10fc0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
10fd0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
10fe0 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
10ff0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11000 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11010 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11020 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11030 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11040 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11050 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11060 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
11070 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11080 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
11090 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
110a0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
110b0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
110c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
110d0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
110e0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
110f0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11100 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11110 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11120 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
11130 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
11140 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11150 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11160 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11180 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11190 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
111a0 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
111b0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
111c0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
111d0 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
111e0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
111f0 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
11200 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11210 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11220 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11230 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11240 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11250 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11260 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11270 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11280 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11290 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
112a0 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
112b0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
112c0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
112d0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11300 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11310 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11320 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11330 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11340 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11350 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11360 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11370 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11380 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11390 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
113a0 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
113b0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
113c0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
113d0 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
113e0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
113f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11400 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11410 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11420 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11450 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11460 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11470 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11480 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11490 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
114a0 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
114b0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
114c0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
114d0 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
114e0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
114f0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11500 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11510 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11520 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11530 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11540 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11550 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11560 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11570 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11580 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11590 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
115a0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
115b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
115c0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
115d0 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
115e0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
115f0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11600 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11610 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11620 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11630 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11640 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11650 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11660 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11670 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11680 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11690 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
116a0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
116b0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
116c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
116d0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
116e0 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
116f0 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11700 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11710 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11720 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11730 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11740 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11750 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11760 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11770 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11780 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11790 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
117a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
117b0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
117c0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
117d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
117e0 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
117f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11800 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
11810 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
11820 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11830 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
11840 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
11850 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
11860 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11870 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
11880 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
11890 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
118a0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
118b0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
118c0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
118d0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
118e0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
118f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11900 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11910 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
11920 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11930 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
11960 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
11970 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
11980 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
11990 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
119a0 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
119b0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
119c0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
119d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
119e0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
119f0 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
11a00 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
11a10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
11a20 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
11a30 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
11a40 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
11a50 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
11a60 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
11a70 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
11a80 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
11a90 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
11aa0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11ab0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
11ac0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
11ad0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11ae0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
11af0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11b00 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11b10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
11b20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11b30 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11b40 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
11b50 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
11b60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11b70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11b80 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
11b90 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11ba0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11bb0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
11bc0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
11bd0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11be0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
11bf0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
11c00 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
11c10 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
11c20 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
11c30 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
11c40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
11c50 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
11c60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11c70 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
11c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11c90 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11ca0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11cb0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
11cc0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
11cd0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
11ce0 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
11cf0 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
11d00 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
11d10 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
11d20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
11d30 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
11d40 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
11d50 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
11d60 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
11d70 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
11d80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
11d90 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
11da0 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
11db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11dc0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
11dd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11de0 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
11df0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
11e00 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
11e10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
11e20 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
11e30 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
11e40 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
11e50 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
11e60 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
11e70 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
11e80 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
11e90 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
11ea0 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
11eb0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
11ec0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
11ed0 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
11ee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
11ef0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
11f00 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
11f10 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
11f20 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
11f30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
11f40 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
11f50 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
11f60 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
11f70 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
11f80 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
11f90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
11fa0 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
11fb0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
11fc0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
11fd0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
11fe0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
11ff0 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12000 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12010 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12020 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12030 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12040 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12050 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12060 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12070 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12080 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12090 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
120a0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
120b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
120c0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
120d0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
120e0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
120f0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12100 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12110 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12130 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12140 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
12150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
12160 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
12170 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a  etMaster = 0;.}.
12180 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12190 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
121a0 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52  henever an IOERR
121b0 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74   or FULL error t
121c0 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20  hat requires.** 
121d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61  the pager to tra
121e0 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  nsition into the
121f0 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79   ERROR state may
12200 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a   ahve occurred..
12210 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
12220 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
12230 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
12240 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
12250 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72  econd .** the er
12260 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
12270 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
12280 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
12290 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76  ction. The .** v
122a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
122b0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
122c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
122d0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
122e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
122f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12300 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53  s SQLITE_FULL, S
12310 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f  QLITE_IOERR or o
12320 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45  ne of the.** IOE
12330 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68  RR sub-codes, th
12340 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74  e pager enters t
12350 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
12360 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
12370 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  e.** is stored i
12380 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12390 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
123a0 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
123b0 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20  ERROR state,.** 
123c0 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61  all major API ca
123d0 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72  lls on the Pager
123e0 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
123f0 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65  y return Pager.e
12400 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  rrCode..**.** Th
12410 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  e ERROR state in
12420 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
12430 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12440 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
12450 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
12460 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
12470 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
12480 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
12490 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
124a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
124b0 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
124c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
124d0 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
124e0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
124f0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
12500 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
12510 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
12520 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
12530 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
12540 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12560 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
12570 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
12580 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
12590 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
125a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
125b0 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
125c0 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
125d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
125e0 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
125f0 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
12600 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12610 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
12620 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
12630 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
12640 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
12650 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
12660 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
12670 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20  OERR.  );.  if( 
12680 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
12690 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   || rc2==SQLITE_
126a0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61  IOERR ){.    pPa
126b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
126c0 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  c;.    pPager->e
126d0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52  State = PAGER_ER
126e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
126f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
12700 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12710 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12720 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12730 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12740 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12750 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12760 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12770 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12780 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12790 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
127a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
127b0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
127c0 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
127d0 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
127e0 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
127f0 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
12800 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12810 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12820 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12830 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12840 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12850 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12860 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12870 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12880 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12890 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
128a0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
128b0 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
128c0 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
128d0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
128e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
128f0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12900 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12910 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12920 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12930 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
12940 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
12950 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
12960 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
12970 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
12980 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
12990 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
129a0 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
129b0 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
129c0 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
129d0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
129e0 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
129f0 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
12a00 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
12a10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
12a20 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
12a30 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12a40 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
12a50 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12a60 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12a70 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12a80 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
12a90 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
12aa0 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
12ab0 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
12ac0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12ad0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12ae0 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
12af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
12b00 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
12b10 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
12b20 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
12b30 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
12b40 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
12b50 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
12b60 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
12b70 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
12b80 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
12b90 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
12ba0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12bb0 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
12bc0 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
12bd0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
12be0 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
12bf0 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
12c00 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
12c10 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
12c20 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
12c30 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
12c40 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
12c50 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
12c60 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
12c70 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
12c80 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
12c90 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
12ca0 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
12cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12cc0 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
12cd0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
12ce0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
12cf0 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
12d00 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
12d10 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
12d20 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
12d30 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
12d40 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
12d50 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
12d60 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
12d70 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
12d80 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
12d90 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
12da0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12db0 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
12dc0 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
12dd0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
12de0 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
12df0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
12e00 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
12e10 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
12e20 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
12e30 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
12e40 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
12e50 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
12e60 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
12e70 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
12e80 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
12e90 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
12ea0 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
12eb0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
12ec0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
12ed0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
12ee0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12ef0 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
12f00 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
12f10 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
12f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12f30 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
12f40 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
12f50 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
12f60 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
12f70 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
12f80 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
12f90 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
12fa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
12fb0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
12fc0 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
12fd0 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
12fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
12ff0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
13000 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
13010 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
13020 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
13030 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13040 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
13050 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
13060 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
13070 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
13080 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13090 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
130a0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
130b0 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
130c0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
130d0 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
130e0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
130f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13100 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13110 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
13120 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
13130 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
13140 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
13150 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13160 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
13170 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
13180 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  /..  /* Do nothi
13190 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ng if the pager 
131a0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
131b0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
131c0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20  saction.  ** or 
131d0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
131e0 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66  VED lock. This f
131f0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
13200 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13210 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74  .  ** is no writ
13220 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
13230 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52  tive but a RESER
13240 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
13250 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64  ock is.  ** held
13260 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75   under two circu
13270 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20  mstances:.  **. 
13280 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61   **   1. After a
13290 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d   successful hot-
132a0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
132b0 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77  , it is called w
132c0 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53  ith.  **      eS
132d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
132e0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
132f0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a  USIVE_LOCK..  **
13300 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20  .  **   2. If a 
13310 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
13320 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
13330 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61  lusive holding a
13340 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a  n EXCLUSIVE .  *
13350 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74  *      lock swit
13360 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63  ches back to loc
13370 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
13380 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74   and then execut
13390 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72  es a.  **      r
133a0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ead-transaction,
133b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
133c0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53  s called with eS
133d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
133e0 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e  ER .  **      an
133f0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
13400 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  VE_LOCK when the
13410 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13420 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a  n is closed..  *
13430 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  /.  assert( asse
13440 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
13450 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
13460 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
13470 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
13480 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13490 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
134a0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70  ITER_LOCKED && p
134b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53  Pager->eLock<RES
134c0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
134d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
134e0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61  OK;.  }..  relea
134f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
13500 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
13510 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
13520 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
13530 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
13540 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
13550 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13560 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
13570 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13580 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   );..    /* Fina
13590 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
135a0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
135b0 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
135c0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
135d0 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
135e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
135f0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13600 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13610 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y );.      sqlit
13620 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13630 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
13640 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13650 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13660 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
13670 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
13680 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13690 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
136a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
136b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
136c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
136d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
136e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
136f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13700 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13710 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13720 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13730 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13740 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13750 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
13760 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13770 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
13780 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
13790 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
137a0 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
137b0 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
137c0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
137d0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50  aster);.      pP
137e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
137f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
13800 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
13810 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
13820 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
13830 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
13840 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
13850 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
13860 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
13870 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
13880 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
13890 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
138a0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
138b0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
138c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
138d0 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
138e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
138f0 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
13900 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
13910 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
13920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13940 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13950 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
13960 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
13970 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
13980 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13990 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
139a0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
139b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
139c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
139d0 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
139e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
139f0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
13a00 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
13a10 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
13a20 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
13a30 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
13a40 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
13a50 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
13a60 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
13a70 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
13a80 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
13a90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
13aa0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
13ab0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
13ac0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
13ad0 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  h);.#endif.  }. 
13ae0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
13af0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
13b00 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
13b10 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
13b20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
13b30 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Rec = 0;.  sqlit
13b40 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
13b50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13b60 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
13b70 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
13b80 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
13b90 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20  er->dbSize);..  
13ba0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
13bb0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
13bc0 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77  * Drop the WAL w
13bd0 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e  rite-lock, if an
13be0 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  y. Also, if the 
13bf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69  connection was i
13c00 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e  n .    ** lockin
13c10 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
13c20 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20   mode but is no 
13c30 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65  longer, drop the
13c40 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20   EXCLUSIVE .    
13c50 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ** lock held on 
13c60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13c70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
13c80 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  2 = sqlite3WalEn
13c90 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  dWriteTransactio
13ca0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
13cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32  .    assert( rc2
13cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
13cd0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
13ce0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13cf0 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
13d00 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
13d10 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
13d20 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
13d30 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
13d40 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
13d50 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
13d60 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13d70 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
13d80 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
13d90 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
13da0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
13db0 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
13dc0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
13dd0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
13de0 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
13df0 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
13e00 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
13e10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
13e20 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
13e30 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
13e40 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
13e50 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
13e60 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
13e70 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
13e80 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
13e90 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
13ea0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
13eb0 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
13ec0 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
13ed0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
13ee0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
13ef0 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
13f00 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
13f10 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
13f20 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
13f30 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
13f40 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
13f50 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
13f60 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
13f70 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
13f80 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
13f90 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
13fa0 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
13fb0 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
13fc0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
13fd0 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
13fe0 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
13ff0 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
14000 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
14010 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
14020 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
14030 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
14040 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
14050 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
14060 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
14070 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
14080 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
14090 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
140a0 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
140b0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
140c0 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
140d0 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
140e0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
140f0 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
14100 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
14110 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
14120 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
14130 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14140 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14150 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14160 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
14170 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
14180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
14190 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
141a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
141b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
141c0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
141d0 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
141e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
141f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14200 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14210 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
14220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14230 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14240 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14250 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14260 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
14270 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14280 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
14290 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
142a0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
142b0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
142c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
142d0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
142e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
142f0 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
14300 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
14310 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
14320 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
14330 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
14340 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
14350 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
14360 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
14370 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
14380 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
14390 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
143a0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
143b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
143c0 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
143d0 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
143e0 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
143f0 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
14400 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
14410 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14420 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
14430 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
14440 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
14450 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
14460 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
14470 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
14480 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
14490 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
144a0 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
144b0 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
144c0 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
144d0 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
144e0 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
144f0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
14500 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
14510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
14520 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
14530 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
14540 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
14550 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
14560 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
14570 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
14580 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
14590 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
145a0 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
145b0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
145c0 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
145d0 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
145e0 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
145f0 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
14600 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
14610 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
14620 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
14630 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
14640 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
14650 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
14660 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
14670 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
14680 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
14690 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
146a0 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
146b0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
146c0 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
146d0 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
146e0 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
146f0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
14700 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
14710 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
14720 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
14730 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
14740 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14750 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
14760 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
14770 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
14780 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
14790 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
147a0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
147b0 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
147c0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
147d0 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
147e0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
147f0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14800 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
14810 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
14820 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
14830 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
14840 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
14850 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
14860 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
14870 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
14880 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
14890 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
148c0 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
148d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
148e0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
148f0 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
14900 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
14910 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
14920 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
14930 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
14940 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
14950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
14960 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
14970 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
14980 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
14990 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
149a0 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
149b0 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
149c0 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
149d0 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
149e0 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
149f0 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
14a00 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
14a10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14a20 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
14a30 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
14a40 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
14a50 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20  ck journal uses 
14a60 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
14a70 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
14a80 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a  l does .** not..
14a90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14aa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14ab0 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
14ac0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
14ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
14ae0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
14af0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
14b00 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
14b10 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
14b20 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
14b30 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
14b40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
14b50 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
14b60 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
14b70 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
14b80 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
14b90 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
14ba0 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
14bb0 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
14bc0 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
14bd0 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
14be0 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
14bf0 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
14c00 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
14c10 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
14c20 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
14c30 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
14c40 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
14c50 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
14c60 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
14c70 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
14c80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c90 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
14ca0 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
14cb0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
14cc0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
14cd0 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
14ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
14cf0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
14d00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
14d10 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
14d20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
14d30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
14d40 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
14d50 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
14d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14d70 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
14d80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14d90 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
14da0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
14db0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
14dc0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14dd0 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
14de0 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
14df0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
14e00 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
14e10 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
14e20 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
14e30 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
14e40 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
14e50 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
14e60 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
14e70 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
14e80 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
14e90 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
14ea0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
14eb0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
14ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
14ed0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
14ee0 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
14ef0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
14f00 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
14f10 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
14f20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
14f30 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
14f40 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
14f50 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
14f60 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
14f70 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
14f80 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
14f90 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
14fa0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
14fb0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
14fc0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
14fd0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
14fe0 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
14ff0 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
15000 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
15010 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
15020 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
15030 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
15040 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
15050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15060 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
15070 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
15080 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150a0 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
150b0 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
150c0 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
150d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
150e0 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
150f0 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
15100 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
15110 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
15120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
15130 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
15140 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
15150 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
15160 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
15170 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
15180 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
15190 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
151a0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
151b0 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
151c0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
151d0 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
151e0 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
151f0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
15200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15210 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
15220 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
15230 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
15240 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
15250 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
15260 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
15270 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
15280 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
152a0 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
152b0 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
152c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
152d0 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
152e0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
152f0 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
15300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
15310 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
15320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15330 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
15340 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
15350 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ced */..  assert
15360 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
15370 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
15380 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
15390 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
153a0 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
153b0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
153c0 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
153d0 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
153e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
153f0 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
15400 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
15410 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
15420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
15430 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
15440 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
15450 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
15460 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
15470 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
15480 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
15490 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
154a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
154b0 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
154c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
154d0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
154e0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
154f0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
15500 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
15510 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
15520 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
15530 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
15540 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
15550 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
15560 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
15570 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
15580 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
15590 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
155a0 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
155b0 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
155c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
155d0 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
155e0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
155f0 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
15600 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
15610 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
15620 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
15630 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
15640 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
15650 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
15660 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
15670 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15680 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15690 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
156a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
156b0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
156c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
156d0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
156e0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
156f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
15700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15710 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
15720 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
15730 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
15740 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
15750 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
15760 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
15770 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
15780 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
15790 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
157a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
157b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
157c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
157d0 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
157e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
157f0 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
15800 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
15810 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
15820 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
15830 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15840 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15850 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
15860 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
15870 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
15880 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
15890 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
158a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
158b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
158c0 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
158d0 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
158e0 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
158f0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
15900 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
15910 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
15920 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
15930 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
15940 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
15950 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
15960 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
15970 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
15980 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
15990 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
159a0 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
159b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
159c0 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
159d0 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
159e0 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
159f0 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
15a00 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
15a10 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
15a20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
15a30 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
15a40 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
15a50 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
15a60 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
15a70 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
15a80 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
15a90 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
15aa0 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
15ab0 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
15ac0 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
15ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15ae0 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
15af0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
15b00 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
15b10 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
15b20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
15b30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15b40 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
15b50 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
15b60 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
15b70 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
15b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15b90 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
15ba0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
15bb0 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
15bc0 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
15bd0 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  y before during 
15be0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
15bf0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15c00 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
15c10 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
15c20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
15c30 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
15c40 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
15c50 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
15c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
15c80 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
15c90 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
15ca0 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
15cb0 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
15cc0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
15cd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
15ce0 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
15cf0 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
15d00 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
15d10 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
15d20 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
15d30 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
15d40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
15d50 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
15d60 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
15d70 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
15d80 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
15d90 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
15da0 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
15db0 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
15dc0 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
15dd0 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
15de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15df0 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
15e00 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
15e10 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
15e20 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
15e30 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
15e40 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
15e50 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
15e60 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
15e70 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
15e80 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
15e90 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
15ea0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
15eb0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
15ec0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
15ed0 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
15ee0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
15ef0 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
15f00 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
15f10 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
15f20 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
15f30 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
15f40 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
15f50 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
15f60 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
15f70 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
15f80 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
15f90 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
15fa0 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
15fb0 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
15fc0 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
15fd0 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
15fe0 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
15ff0 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
16000 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
16010 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
16020 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
16030 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
16040 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
16050 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
16060 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
16070 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
16080 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16090 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
160a0 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
160b0 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
160c0 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
160d0 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
160e0 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
160f0 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
16100 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
16110 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
16120 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
16130 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
16140 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
16150 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16160 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
16170 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16180 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
16190 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
161a0 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
161b0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
161c0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
161d0 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
161e0 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
161f0 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
16200 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
16210 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
16220 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
16230 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
16240 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
16250 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
16260 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
16270 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
16280 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
16290 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
162a0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
162b0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
162c0 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
162d0 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
162e0 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
162f0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
16300 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
16310 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
16320 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
16330 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
16340 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
16350 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
16360 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
16370 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
16380 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
16390 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
163a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
163b0 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
163c0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
163d0 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
163e0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
163f0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16400 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
16410 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
16420 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
16430 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
16440 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
16450 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
16460 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
16470 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
16480 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
16490 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
164a0 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
164b0 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
164c0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
164d0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
164e0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
164f0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
16500 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
16510 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
16520 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
16530 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
16540 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
16550 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
16560 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
16570 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
16580 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
16590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
165a0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
165b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
165c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  }.  assert( pPg 
165d0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
165e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
165f0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
16600 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20  N || pPg==0 );. 
16610 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
16620 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
16630 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
16640 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
16650 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16660 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
16670 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
16680 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
16690 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
166a0 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
166b0 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
166c0 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
166d0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
166e0 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  ){.    isSynced 
166f0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
16700 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d   || (*pOffset <=
16710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16720 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hdr);.  }else{. 
16730 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70     isSynced = (p
16740 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
16750 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
16760 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d  NEED_SYNC));.  }
16770 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
16780 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20  ager->fd).   && 
16790 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
167a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
167b0 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
167c0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
167d0 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65  N).   && isSynce
167e0 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f  d.  ){.    i64 o
167f0 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  fst = (pgno-1)*(
16800 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
16810 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61  Size;.    testca
16820 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  se( !isSavepnt &
16830 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67  & pPg!=0 && (pPg
16840 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
16850 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20  ED_SYNC)!=0 );. 
16860 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
16870 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16880 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
16890 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
168a0 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74  r->fd, (u8*)aDat
168b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
168c0 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
168d0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
168e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
168f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
16900 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
16910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
16920 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
16930 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
16940 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
16950 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
16960 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71  NOMEM);.      sq
16970 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
16980 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
16990 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44  p, pgno, (u8*)aD
169a0 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  ata);.      CODE
169b0 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
169c0 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
169d0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74  LITE_NOMEM, aDat
169e0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
169f0 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
16a00 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
16a10 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16a20 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
16a30 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
16a40 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
16a50 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
16a60 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
16a70 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16a80 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
16a90 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
16aa0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
16ab0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
16ac0 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
16ad0 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
16ae0 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
16af0 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
16b00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16b10 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
16b20 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
16b30 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
16b40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
16b50 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
16b60 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
16b70 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
16b80 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
16b90 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
16ba0 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
16bb0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
16bc0 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
16bd0 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
16be0 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
16bf0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
16c00 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
16c20 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
16c30 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
16c40 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
16c50 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
16c60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
16c70 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
16c80 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
16c90 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
16ca0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
16cb0 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
16cc0 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
16cd0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
16ce0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
16cf0 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
16d00 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
16d10 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
16d20 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
16d30 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
16d40 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
16d50 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
16d60 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
16d70 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
16d80 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
16d90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16da0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
16db0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l==0 );.    pPag
16dc0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b  er->doNotSpill++
16dd0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
16de0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
16df0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
16e00 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
16e10 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
16e20 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
16e30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
16e40 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63  ll--;.    if( rc
16e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16e60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67  turn rc;.    pPg
16e70 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
16e80 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
16e90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
16ea0 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
16eb0 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
16ec0 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
16ed0 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
16ee0 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
16ef0 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
16f00 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
16f10 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
16f20 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
16f30 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
16f40 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
16f50 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
16f60 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
16f70 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
16f80 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
16f90 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
16fa0 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
16fb0 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
16fc0 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
16fd0 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
16fe0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
16ff0 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
17000 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
17010 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
17020 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
17030 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
17040 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17050 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17060 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
17070 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
17080 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
17090 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
170a0 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
170b0 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
170c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
170d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
170e0 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
170f0 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
17100 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
17110 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
17120 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
17130 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
17140 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
17150 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
17160 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
17170 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
17180 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
17190 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
171a0 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
171b0 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
171c0 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
171d0 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
171e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
171f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17200 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
17210 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
17220 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
17230 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
17240 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
17250 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
17260 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
17270 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
17280 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
17290 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
172a0 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
172b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
172c0 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
172d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
172e0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
172f0 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
17300 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
17310 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
17320 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
17330 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
17340 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
17350 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
17360 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
17370 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
17380 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
17390 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
173a0 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
173b0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
173c0 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
173d0 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
173e0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
173f0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
17400 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
17410 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
17420 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
17430 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
17440 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17450 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
17460 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
17470 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
17480 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
17490 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
174a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
174b0 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
174c0 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
174d0 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
174e0 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
174f0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
17500 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
17510 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17520 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
17530 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
17540 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
17550 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17560 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ger) );.      sq
17570 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
17580 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
17590 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
175a0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
175b0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
175c0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
175d0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
175e0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
175f0 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
17600 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
17610 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
17620 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
17630 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
17640 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
17650 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
17660 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
17670 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
17680 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
17690 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
176a0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
176b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
176c0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
176d0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
176e0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
176f0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
17700 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
17710 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
17720 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
17730 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
17740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17750 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
17760 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
17770 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
17780 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
17790 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
177a0 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
177b0 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
177c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
177d0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
177e0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
177f0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
17800 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17810 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
17820 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17830 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
17840 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
17850 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
17860 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
17870 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
17880 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
17890 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
178a0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
178b0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
178c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
178d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
178e0 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
178f0 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
17900 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
17910 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
17920 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
17930 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
17940 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
17950 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
17960 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
17970 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
17980 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
17990 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
179a0 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
179b0 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
179c0 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
179d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
179e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
179f0 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
17a00 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
17a10 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
17a20 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
17a30 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
17a40 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
17a50 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
17a60 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
17a70 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
17a80 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
17a90 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
17aa0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
17ab0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
17ac0 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
17ad0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
17ae0 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
17af0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17b00 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
17b10 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
17b20 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
17b30 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
17b40 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17b50 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
17b60 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17b70 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
17b80 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
17b90 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
17ba0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
17bb0 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
17bc0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
17bd0 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
17be0 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
17bf0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
17c00 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
17c10 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
17c20 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
17c30 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
17c40 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
17c50 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
17c60 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
17c70 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
17c80 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
17c90 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
17ca0 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
17cb0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
17cc0 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
17cd0 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
17ce0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
17cf0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
17d00 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
17d10 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
17d20 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17d30 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
17d40 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
17d50 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
17d60 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
17d70 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
17d80 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
17d90 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
17da0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
17db0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
17dc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17dd0 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
17de0 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
17df0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
17e00 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
17e10 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
17e20 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
17e30 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
17e40 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
17e50 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
17e60 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
17e70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
17e80 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
17e90 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
17ea0 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
17eb0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
17ec0 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
17ed0 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
17ee0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
17ef0 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
17f00 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
17f10 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
17f20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
17f30 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
17f40 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17f70 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
17f80 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
17f90 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
17fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
17fb0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
17fc0 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
17fd0 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
17fe0 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
17ff0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18000 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
18010 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
18020 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
18030 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18040 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
18050 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
18060 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
18070 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18080 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
18090 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
180a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
180b0 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
180c0 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
180d0 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
180e0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
180f0 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
18100 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
18110 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
18120 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
18130 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
18140 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
18150 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
18160 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
18170 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
18180 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
18190 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
181a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
181b0 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
181c0 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
181d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
181e0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
181f0 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
18200 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
18210 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
18220 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
18230 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
18240 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18250 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
18260 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
18270 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
18280 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
18290 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
182a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
182b0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
182c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
182d0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
182e0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
182f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18300 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18310 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
18320 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
18330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18340 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18350 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
18360 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
18370 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18380 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
18390 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
183a0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
183b0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
183c0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
183d0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
183e0 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
183f0 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
18400 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
18410 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
18420 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
18430 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
18440 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
18450 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
18460 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
18470 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
18480 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
18490 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
184a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
184b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
184c0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
184d0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
184e0 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
184f0 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
18500 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
18510 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
18520 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
18530 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
18540 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
18550 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18560 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18570 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
18580 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
18590 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
185a0 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
185b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
185c0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
185d0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
185e0 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
185f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
18600 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18610 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18620 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
18630 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
18640 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
18650 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
18660 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
18670 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
18680 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
18690 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
186a0 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
186b0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
186c0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
186d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
186e0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
186f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18710 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18720 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
18730 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
18740 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
18750 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
18760 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
18770 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
18780 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
18790 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
187a0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
187b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
187c0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
187d0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
187e0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
187f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18800 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18810 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
18820 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
18830 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
18840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18850 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
18860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18870 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
18880 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
18890 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
188a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
188b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
188c0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
188d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
188e0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
188f0 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
18900 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
18910 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
18920 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
18930 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
18940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18950 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18960 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18970 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
18980 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
18990 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
189a0 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
189b0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
189c0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
189d0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
189e0 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
189f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18a00 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
18a10 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18a20 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
18a30 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
18a40 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
18a50 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
18a60 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
18a70 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
18a80 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
18a90 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
18aa0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
18ab0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
18ac0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18ad0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
18ae0 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
18af0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
18b00 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
18b10 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
18b20 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
18b30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18b40 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
18b50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
18b60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18b70 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
18b80 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
18b90 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
18ba0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
18bb0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
18bc0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
18bd0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
18be0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
18bf0 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
18c00 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
18c10 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
18c20 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
18c30 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
18c40 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
18c50 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
18c60 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
18c70 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
18c80 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
18c90 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
18ca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18cb0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
18cc0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
18cd0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
18ce0 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
18cf0 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
18d00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
18d10 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
18d20 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
18d30 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
18d40 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
18d50 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
18d60 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
18d70 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
18d80 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
18d90 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
18da0 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
18db0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
18dc0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
18dd0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
18de0 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
18df0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
18e00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
18e10 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
18e20 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
18e30 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
18e40 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
18e50 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
18e60 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
18e70 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
18e80 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
18e90 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
18ea0 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
18eb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
18ec0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
18ed0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
18ee0 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
18ef0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
18f00 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
18f10 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
18f20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18f30 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
18f40 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
18f50 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
18f60 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
18f70 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
18f80 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
18f90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18fa0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
18fb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
18fc0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
18fd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18fe0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
18ff0 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
19000 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
19010 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
19020 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
19030 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
19040 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
19050 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
19060 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
19070 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
19080 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19090 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
190a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
190b0 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
190c0 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
190d0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
190e0 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
190f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
19100 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
19110 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
19120 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
19130 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
19140 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19160 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19170 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19180 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19190 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
191a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
191b0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
191c0 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
191d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
191e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
191f0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19200 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
19210 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
19220 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19240 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
19250 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
19260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19280 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
19290 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
192a0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
192b0 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
192c0 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
192d0 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
192e0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
192f0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
19300 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
19310 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
19320 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
19330 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
19340 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
19350 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
19360 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
19370 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
19380 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
19390 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
193a0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
193b0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
193c0 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
193d0 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
193e0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
193f0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
19400 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
19410 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
19420 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
19430 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19440 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
19450 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
19460 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
19470 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
19480 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
19490 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
194a0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
194b0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
194c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
194d0 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
194e0 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
194f0 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
19500 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
19510 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
19520 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
19530 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19540 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
19550 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
19560 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19570 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
19580 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
19590 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
195a0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
195b0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
195c0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
195d0 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
195e0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
195f0 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
19600 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
19610 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
19620 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19630 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
19640 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
19650 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
19660 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
19670 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
19680 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
19690 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
196a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
196b0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
196c0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
196d0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
196e0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
196f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19700 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
19710 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
19720 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19740 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
19750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19760 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
19770 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
19780 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
19790 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
197a0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
197b0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
197c0 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
197d0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
197e0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
197f0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
19800 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19810 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19820 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19830 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19840 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19850 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19860 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19870 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19880 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19890 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
198a0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
198b0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
198c0 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
198d0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
198e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
198f0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
19900 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19910 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19920 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19930 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19940 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19960 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19970 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19980 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19990 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
199a0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
199b0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
199c0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
199d0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
199e0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
199f0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
19a00 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
19a10 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
19a20 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19a30 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
19a40 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
19a50 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
19a60 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
19a70 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
19a80 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
19a90 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
19aa0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
19ab0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19ac0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
19ad0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
19ae0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19af0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
19b00 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19b10 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
19b20 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
19b30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
19b40 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
19b50 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
19b60 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
19b70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
19b80 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
19b90 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
19ba0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
19bb0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
19bc0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
19bd0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
19be0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
19bf0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
19c00 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
19c10 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
19c20 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
19c30 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
19c40 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
19c50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
19c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
19c70 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
19c80 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
19c90 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
19ca0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
19cb0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
19cc0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
19cd0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
19ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19cf0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
19d00 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
19d10 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
19d20 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
19d30 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
19d40 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
19d50 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
19d60 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
19d70 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
19d80 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
19d90 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
19da0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
19db0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
19dc0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
19dd0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
19de0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
19df0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
19e00 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
19e10 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
19e20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
19e30 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
19e40 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
19e50 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
19e60 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
19e70 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
19e80 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
19e90 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
19ea0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
19eb0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
19ec0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
19ed0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
19ee0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
19ef0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
19f00 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
19f10 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
19f20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
19f30 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
19f40 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
19f50 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
19f60 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
19f70 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
19f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
19f90 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
19fa0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
19fb0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
19fc0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
19fd0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
19fe0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
19ff0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a000 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a010 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a020 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a030 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a040 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a050 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a060 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a070 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a080 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a090 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a0a0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a0b0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a0c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a0d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a0e0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a0f0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a100 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a110 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a120 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a130 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a140 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a150 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a160 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a170 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a180 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a190 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a1a0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a1b0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a1c0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a1d0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a1e0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a1f0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a200 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a210 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a220 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a230 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a240 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a250 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a260 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a270 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a280 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a290 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a2a0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a2d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a2e0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a2f0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a310 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a320 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a330 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a340 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a350 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a360 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a370 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a380 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a390 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a3a0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a3d0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a3e0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a400 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a410 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1a420 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1a430 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1a440 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1a450 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a460 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1a470 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1a480 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a490 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1a4a0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1a4b0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1a4c0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1a4d0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1a4e0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1a4f0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1a500 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1a510 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1a520 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1a530 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a540 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a550 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a560 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1a570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a580 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1a590 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1a5a0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1a5b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a5c0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1a5d0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1a5e0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1a5f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a600 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1a610 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1a620 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1a630 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1a640 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1a650 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1a660 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1a670 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1a680 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1a690 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1a6a0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1a6b0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1a6c0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1a6d0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1a6e0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1a6f0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1a700 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1a710 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1a720 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1a730 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1a740 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1a750 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1a760 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1a770 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1a780 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1a790 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1a7a0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1a7b0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1a7c0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1a7d0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1a7e0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1a7f0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1a800 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1a810 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1a820 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1a830 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1a840 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1a850 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1a860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1a870 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1a880 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1a890 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1a8a0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1a8b0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1a8c0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1a8d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1a8e0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1a8f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a900 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1a910 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1a920 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1a930 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1a940 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1a950 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1a960 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1a970 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1a980 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1a990 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1a9a0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1a9b0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1a9c0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1a9d0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1a9e0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1a9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1aa00 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1aa10 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1aa20 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1aa30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1aa40 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1aa50 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1aa60 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1aa70 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1aa80 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1aa90 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1aaa0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1aab0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1aac0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1aad0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1aae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1aaf0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1ab00 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1ab10 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1ab20 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1ab30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1ab40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ab50 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1ab60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ab70 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1ab80 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ab90 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1aba0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1abb0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1abc0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1abd0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1abe0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1abf0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1ac00 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1ac10 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1ac20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1ac30 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1ac40 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1ac50 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1ac60 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1ac70 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1ac80 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1ac90 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1aca0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1acb0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1acc0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1acd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ace0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1acf0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1ad00 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1ad10 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1ad20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1ad30 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1ad40 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1ad50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ad60 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1ad70 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1ad80 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1ad90 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1ada0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1adb0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1adc0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1add0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1ade0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1adf0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1ae00 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1ae10 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1ae20 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1ae30 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1ae40 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1ae50 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1ae60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1ae70 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1ae80 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1ae90 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1aea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1aeb0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1aec0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1aed0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1aee0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1aef0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1af00 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1af10 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1af20 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1af30 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1af40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1af50 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1af60 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1af70 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1af80 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1af90 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1afa0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1afb0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1afc0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1afd0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1afe0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1aff0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b000 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b010 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b020 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b030 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b040 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b050 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b060 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b070 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b080 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b090 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b0a0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b0b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b0c0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b0d0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b0e0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b0f0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b100 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b120 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b130 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b140 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b150 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b160 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b170 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b180 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b190 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b1a0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b1b0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b1c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b1d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b1e0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b1f0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b200 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b210 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b240 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b250 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b260 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b270 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b280 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b290 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b2a0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b2b0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b2c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b2d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b2e0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b2f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b300 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b310 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b320 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b330 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b340 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b350 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b360 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b370 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b380 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b390 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b3a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b3b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b3c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b3e0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b3f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b400 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1b410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b420 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1b430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1b450 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1b460 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1b470 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1b480 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1b490 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1b4a0 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1b4b0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1b4c0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1b4d0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1b4e0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1b4f0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1b500 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1b510 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1b520 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1b530 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1b540 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1b550 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1b560 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1b570 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1b580 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1b590 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1b5a0 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1b5b0 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1b5c0 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1b5d0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1b5e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1b600 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b620 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1b630 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1b640 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1b650 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1b660 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1b670 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1b680 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1b690 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1b6a0 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1b6b0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1b6c0 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1b6d0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1b6e0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1b6f0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1b700 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1b710 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1b720 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1b730 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1b740 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1b750 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1b780 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1b790 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1b7a0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1b7b0 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1b7c0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1b7d0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1b7e0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1b7f0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1b800 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1b810 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1b820 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1b830 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1b840 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1b850 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1b860 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1b870 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1b880 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1b890 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1b8a0 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1b8b0 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
1b8c0 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
1b8d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
1b8e0 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
1b8f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
1b900 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1b910 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1b920 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
1b930 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1b940 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
1b950 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
1b960 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
1b970 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
1b980 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
1b990 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
1b9a0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
1b9b0 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
1b9c0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
1b9d0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
1b9e0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
1b9f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
1ba00 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
1ba10 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
1ba20 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
1ba30 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
1ba40 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
1ba50 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
1ba60 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
1ba70 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
1ba80 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
1ba90 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
1baa0 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
1bab0 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
1bac0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
1bad0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
1bae0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
1baf0 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
1bb00 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
1bb10 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
1bb20 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1bb30 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
1bb40 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
1bb50 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
1bb60 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
1bb70 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
1bb80 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
1bb90 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1bba0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1bbb0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1bbc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
1bbd0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1bbe0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
1bbf0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1bc00 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1bc10 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1bc20 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1bc30 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
1bc40 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1bc50 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1bc60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bc70 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1bc80 6e 63 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  nc .   && (pPage
1bc90 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1bca0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1bcb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1bcc0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1bcd0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1bce0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1bcf0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1bd00 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
1bd10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bd20 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1bd30 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1bd40 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1bd50 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20  ter[0]!='\0');. 
1bd60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1bd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1bd80 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1bd90 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1bda0 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1bdb0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1bdc0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1bdd0 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1bde0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1bdf0 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1be00 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1be10 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1be20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1be30 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1be40 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1be50 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1be60 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1be70 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1be80 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  K );.  }..  /* T
1be90 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1bea0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1beb0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1bec0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1bed0 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1bee0 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1bef0 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1bf00 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1bf10 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1bf20 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1bf30 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1bf40 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1bf50 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1bf60 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1bf70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bf80 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1bf90 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1bfa0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1bfb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1bfc0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
1bfd0 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1bfe0 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1bff0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1c000 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1c010 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1c020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c030 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1c040 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1c050 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1c060 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1c070 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1c080 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1c090 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1c0a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1c0b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1c0c0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1c0d0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c0e0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1c0f0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1c100 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c110 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1c120 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1c130 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1c140 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1c150 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1c160 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1c170 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1c180 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
1c190 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1c1a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1c1b0 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
1c1c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c1d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1c1e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c1f0 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20  /.  int isInWal 
1c200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1c210 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67 65   /* True if page
1c220 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20   is in log file 
1c230 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1c240 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c250 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1c260 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1c270 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c280 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1c290 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1c2a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1c2b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1c2c0 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
1c2d0 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  R(!isOpen(pPager
1c2e0 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73  ->fd)) ){.    as
1c2f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
1c300 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65  mpFile );.    me
1c310 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
1c320 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
1c330 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Size);.    retur
1c340 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c350 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
1c360 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1c370 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1c380 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1c390 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1c3a0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1c3b0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28   sqlite3WalRead(
1c3c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
1c3d0 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67  no, &isInWal, pg
1c3e0 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
1c3f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c400 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49  QLITE_OK && !isI
1c410 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20  nWal ){.    i64 
1c420 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1c430 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1c440 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1c450 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1c460 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1c470 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1c480 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1c490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1c4a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1c4b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c4c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1c4d0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1c4e0 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1c4f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c500 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1c510 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1c520 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1c530 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1c540 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1c550 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1c560 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1c570 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1c580 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1c590 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1c5a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1c5b0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1c5c0 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1c5d0 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1c5e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1c5f0 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1c600 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1c610 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1c620 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1c630 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1c640 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1c650 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1c660 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1c670 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1c680 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1c690 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1c6a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1c6b0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1c6c0 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1c6d0 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1c6e0 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1c6f0 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1c700 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1c710 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1c720 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1c730 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1c740 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
1c750 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
1c760 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1c770 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1c780 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1c790 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1c7a0 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1c7b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1c7c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1c7d0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1c7e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1c7f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c800 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1c810 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1c820 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1c830 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1c840 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1c850 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1c860 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c870 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1c880 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1c890 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1c8a0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1c8b0 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1c8c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1c8d0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1c8e0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1c8f0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1c900 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1c910 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1c920 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1c930 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1c940 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1c950 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1c960 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1c970 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c980 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1c990 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1c9a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1c9b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1c9c0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1c9d0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1c9e0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1c9f0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1ca00 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1ca10 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1ca20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1ca30 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1ca40 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1ca50 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1ca60 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1ca70 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1ca80 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1ca90 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1caa0 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1cab0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1cac0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1cad0 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1cae0 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1caf0 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1cb00 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1cb10 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1cb20 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1cb30 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1cb40 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1cb50 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1cb60 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1cb70 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1cb80 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1cb90 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1cba0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1cbb0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1cbc0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1cbd0 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1cbe0 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1cbf0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1cc00 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1cc10 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1cc20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1cc30 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1cc40 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1cc50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1cc60 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1cc70 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1cc80 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1cc90 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
1cca0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1ccb0 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1ccc0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1ccd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1cce0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1ccf0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1cd00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1cd10 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1cd20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
1cd30 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
1cd40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cd50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cd60 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1cd70 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
1cd80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1cd90 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1cda0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1cdb0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
1cdc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1cdd0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
1cde0 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1cdf0 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
1ce00 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
1ce10 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
1ce20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1ce30 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
1ce40 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
1ce50 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
1ce60 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
1ce70 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
1ce80 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
1ce90 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
1cea0 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
1ceb0 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
1cec0 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
1ced0 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
1cee0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1cef0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1cf00 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
1cf10 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
1cf20 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
1cf30 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
1cf40 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
1cf50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
1cf60 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
1cf70 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
1cf80 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1cf90 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
1cfa0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
1cfb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cfc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cfd0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1cfe0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
1cff0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
1d000 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
1d010 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
1d020 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
1d030 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1d040 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d060 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
1d070 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
1d0a0 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
1d0b0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
1d0c0 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
1d0d0 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
1d0e0 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
1d0f0 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
1d100 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
1d110 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
1d120 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
1d130 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
1d140 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
1d150 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
1d160 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
1d170 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
1d180 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
1d190 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
1d1a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
1d1b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
1d1c0 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
1d1d0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1d1e0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1d1f0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
1d200 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
1d210 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
1d220 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1d230 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
1d240 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
1d250 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1d260 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1d270 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
1d280 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
1d290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
1d2a0 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
1d2b0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
1d2c0 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1d2d0 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
1d2e0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
1d2f0 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
1d300 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
1d310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d320 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d330 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
1d340 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
1d350 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
1d360 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
1d370 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1d380 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1d390 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
1d3a0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
1d3b0 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
1d3c0 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
1d3d0 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
1d3e0 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
1d3f0 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
1d400 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
1d410 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1d420 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1d430 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1d460 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1d470 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1d480 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1d490 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1d4a0 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1d4b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1d4c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1d4d0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1d4e0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1d4f0 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
1d500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d510 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1d520 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1d530 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20  sync_flags      
1d540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d550 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
1d560 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
1d570 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d5a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
1d5b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1d5c0 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  l );.  rc = sqli
1d5d0 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1d5e0 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1d5f0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1d600 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1d610 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1d620 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a  sync_flags.  );.
1d630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d640 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
1d650 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
1d660 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1d670 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1d680 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1d690 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1d6a0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1d6b0 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1d6c0 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1d6d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d6e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
1d6f0 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
1d700 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
1d710 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
1d720 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
1d730 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
1d740 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
1d750 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
1d760 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
1d770 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
1d780 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
1d790 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
1d7a0 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
1d7b0 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
1d7c0 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
1d7d0 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
1d7e0 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
1d7f0 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
1d800 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
1d810 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
1d820 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d830 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
1d840 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
1d850 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1d860 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d880 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1d890 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
1d8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8b0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
1d8c0 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
1d8d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
1d8e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1d8f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d900 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1d910 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
1d920 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1d930 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20  ER_READER );..  
1d940 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  /* sqlite3WalEnd
1d950 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1d960 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
1d970 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
1d980 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  s.  ** transacti
1d990 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  on in locking_mo
1d9a0 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53  de=EXCLUSIVE.  S
1d9b0 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20  o call it now.  
1d9c0 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69  If we.  ** are i
1d9d0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e  n locking_mode=N
1d9e0 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61  ORMAL and EndRea
1d9f0 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73  d() was previous
1da00 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20  ly called,.  ** 
1da10 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61  the duplicate ca
1da20 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a  ll is harmless..
1da30 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61    */.  sqlite3Wa
1da40 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1da50 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1da60 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1da70 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72  e3WalBeginReadTr
1da80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1da90 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64  ->pWal, &changed
1daa0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1dab0 49 54 45 5f 4f 4b 20 26 26 20 63 68 61 6e 67 65  ITE_OK && change
1dac0 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  d ){.    pager_r
1dad0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1dae0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1daf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1db00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1db10 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1db20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
1db30 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
1db40 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
1db50 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
1db60 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1db70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1db80 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
1db90 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
1dba0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
1dbb0 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
1dbc0 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
1dbd0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1dbe0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1dbf0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1dc00 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1dc10 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
1dc20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
1dc30 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
1dc40 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1dc50 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
1dc60 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
1dc70 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1dc80 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
1dc90 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
1dca0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1dcb0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
1dcc0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
1dcd0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
1dce0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1dcf0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1dd00 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
1dd10 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
1dd20 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
1dd30 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
1dd40 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
1dd50 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
1dd60 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
1dd70 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
1dd80 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
1dd90 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
1dda0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
1ddb0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1ddc0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
1ddd0 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
1dde0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1ddf0 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
1de00 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1de10 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
1de20 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
1de30 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
1de40 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
1de50 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
1de60 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
1de70 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1de80 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
1de90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dea0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
1deb0 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
1dec0 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20  noReadlock );.  
1ded0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57  nPage = sqlite3W
1dee0 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
1def0 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66  >pWal);..  /* If
1df00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1df10 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c  ze was not avail
1df20 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1df30 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20  L sub-system,.  
1df40 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20  ** determine it 
1df50 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
1df60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1df70 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73  e file. If the s
1df80 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ize.  ** of the 
1df90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1dfa0 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
1dfb0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
1dfc0 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20  page-size,.  ** 
1dfd0 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68  round down to th
1dfe0 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20  e nearest page. 
1dff0 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65  Except, any file
1e000 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20   larger than 0. 
1e010 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
1e020 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  e is considered 
1e030 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  to contain at le
1e040 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20  ast one page..  
1e050 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
1e060 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d  0 ){.    i64 n =
1e070 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e080 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e090 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74  f db file in byt
1e0a0 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  es */.    assert
1e0b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1e0c0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1e0d0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1e0e0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1e0f0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
1e100 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1e110 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1e120 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20  r->fd, &n);.    
1e130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e140 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e150 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e160 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67  }.    }.    nPag
1e170 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
1e180 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1e190 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  ;.    if( nPage=
1e1a0 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20  =0 && n>0 ){.   
1e1b0 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
1e1c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1e1d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1e1e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1e1f0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1e200 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ter than the.  *
1e210 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1e220 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1e230 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1e240 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1e250 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1e260 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1e270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1e280 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1e290 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1e2a0 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1e2b0 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  Page;.  }..  *pn
1e2c0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1e2d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e2e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ;.}.../*.** Chec
1e2f0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
1e300 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
1e310 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
1e320 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
1e330 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20  Pager.** exists 
1e340 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1e350 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20  is not empy, or 
1e360 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1e370 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  *-wal file does.
1e380 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79  ** not exist (by
1e390 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66   deleting it) if
1e3a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e3b0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
1e3c0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1e3d0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  se is not empty 
1e3e0 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  and the *-wal fi
1e3f0 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20  le exists, open 
1e400 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20  the pager.** in 
1e410 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68  WAL mode.  If th
1e420 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
1e430 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77  pty or if no *-w
1e440 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
1e450 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f  nd.** if no erro
1e460 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73  r occurs, make s
1e470 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ure Pager.journa
1e480 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74  lMode is not set
1e490 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   to.** PAGER_JOU
1e4a0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a  RNALMODE_WAL..**
1e4b0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1e4c0 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72  E_OK or an error
1e4d0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
1e4e0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
1e4f0 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
1e500 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1e510 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
1e520 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
1e530 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
1e540 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1e550 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
1e560 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
1e570 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
1e580 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
1e590 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
1e5a0 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
1e5b0 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
1e5c0 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
1e5d0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
1e5e0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
1e5f0 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
1e600 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
1e610 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1e620 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
1e630 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
1e640 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e650 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e670 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e680 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1e690 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1e6a0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k>=SHARED_LOCK |
1e6b0 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  | pPager->noRead
1e6c0 6c 6f 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21  lock );..  if( !
1e6d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1e6e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
1e6f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1e700 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e710 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
1e720 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
1e730 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1e740 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1e750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e760 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
1e770 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1e780 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1e790 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e7a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
1e7b0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1e7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e7d0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
1e7e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1e7f0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57  l, 0);.      isW
1e800 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1e810 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1e820 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
1e830 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1e840 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1e850 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
1e860 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
1e870 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
1e880 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e8a0 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
1e8b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1e8c0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1e8d0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
1e8e0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
1e8f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e900 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
1e910 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
1e920 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1e930 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1e940 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1e950 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
1e960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1e970 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
1e980 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
1e990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e9a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e9b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
1e9c0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
1e9d0 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
1e9e0 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
1e9f0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
1ea00 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
1ea10 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
1ea20 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
1ea30 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1ea40 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
1ea50 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
1ea60 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
1ea70 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
1ea80 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
1ea90 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
1eaa0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
1eab0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
1eac0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
1ead0 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
1eae0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
1eaf0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
1eb00 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
1eb10 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
1eb20 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
1eb30 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
1eb40 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
1eb50 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
1eb60 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
1eb70 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
1eb80 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
1eb90 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
1eba0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
1ebb0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
1ebc0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
1ebd0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
1ebe0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
1ebf0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
1ec00 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
1ec10 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1ec20 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
1ec30 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1ec40 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
1ec50 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
1ec60 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1ec70 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
1ec80 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
1ec90 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
1eca0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
1ecb0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
1ecc0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
1ecd0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
1ece0 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
1ecf0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1ed00 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
1ed10 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1ed20 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
1ed30 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
1ed40 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
1ed50 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
1ed60 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
1ed70 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
1ed80 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
1ed90 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
1eda0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
1edb0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
1edc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1edd0 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
1ede0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
1edf0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
1ee00 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
1ee10 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
1ee20 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
1ee30 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
1ee40 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
1ee50 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
1ee60 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
1ee70 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
1ee80 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
1ee90 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
1eea0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
1eeb0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
1eec0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
1eed0 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
1eee0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
1eef0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
1ef00 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
1ef10 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
1ef20 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1ef30 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
1ef40 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
1ef50 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
1ef60 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
1ef70 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
1ef80 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
1ef90 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
1efa0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
1efb0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
1efc0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
1efd0 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
1efe0 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
1eff0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
1f000 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
1f010 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
1f020 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
1f030 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1f040 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
1f050 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
1f060 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
1f070 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
1f080 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
1f090 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
1f0a0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
1f0b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
1f0c0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
1f0d0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
1f0e0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1f0f0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
1f100 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
1f110 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
1f120 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
1f130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
1f140 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
1f150 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
1f160 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
1f170 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f180 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
1f190 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
1f1a0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
1f1b0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
1f1c0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
1f1d0 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
1f1e0 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
1f1f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f200 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1f210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f220 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1f230 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
1f240 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1f250 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
1f260 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
1f270 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
1f280 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
1f290 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
1f2a0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
1f2b0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
1f2c0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
1f2d0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
1f2e0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1f2f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1f300 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f310 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
1f320 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
1f330 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
1f340 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
1f350 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
1f360 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
1f370 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
1f380 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
1f390 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
1f3a0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
1f3b0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1f3c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
1f3d0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1f3e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1f3f0 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
1f400 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
1f410 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
1f420 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
1f430 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
1f440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
1f450 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f460 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
1f470 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
1f480 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
1f490 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
1f4a0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
1f4b0 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
1f4c0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
1f4d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1f4e0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
1f4f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
1f500 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
1f510 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
1f520 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f530 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
1f540 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
1f550 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
1f560 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
1f570 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f580 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
1f590 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
1f5a0 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
1f5b0 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
1f5c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f5d0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
1f5e0 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
1f5f0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
1f600 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
1f610 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
1f620 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
1f630 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
1f640 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
1f650 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
1f660 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
1f670 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f680 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
1f690 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
1f6a0 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
1f6b0 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
1f6c0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
1f6d0 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
1f6e0 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
1f6f0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
1f700 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
1f710 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
1f720 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
1f730 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
1f740 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
1f750 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
1f760 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
1f770 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
1f780 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
1f790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
1f7a0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
1f7b0 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
1f7c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1f7d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1f7e0 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
1f7f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1f800 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1f810 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
1f820 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
1f830 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
1f840 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1f850 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1f860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1f870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1f880 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1f890 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
1f8a0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
1f8b0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1f8c0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
1f8d0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
1f8e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
1f8f0 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
1f900 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
1f910 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
1f920 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1f930 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
1f940 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
1f950 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
1f960 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
1f970 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
1f980 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
1f990 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
1f9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f9b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1f9c0 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
1f9d0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
1f9e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1f9f0 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
1fa00 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
1fa10 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
1fa20 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
1fa30 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
1fa40 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
1fa50 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
1fa60 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
1fa70 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
1fa80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
1fa90 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
1faa0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
1fab0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1fac0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1fad0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1fae0 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
1faf0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
1fb00 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
1fb10 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
1fb20 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
1fb30 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1fb40 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
1fb50 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1fb60 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
1fb70 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
1fb80 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
1fb90 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1fba0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1fbb0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1fbc0 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
1fbd0 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
1fbe0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1fbf0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
1fc00 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1fc10 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
1fc20 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
1fc30 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
1fc40 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
1fc50 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
1fc60 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
1fc70 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1fc80 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
1fc90 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1fca0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
1fcb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1fcc0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1fcd0 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
1fce0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1fcf0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
1fd00 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
1fd10 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
1fd20 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
1fd30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
1fd40 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
1fd50 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
1fd60 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
1fd70 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
1fd80 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
1fd90 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
1fda0 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
1fdb0 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
1fdc0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
1fdd0 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
1fde0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
1fdf0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
1fe00 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
1fe10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1fe20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
1fe30 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
1fe40 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
1fe50 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1fe60 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
1fe70 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1fe80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fe90 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f  WalSavepointUndo
1fea0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1feb0 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44  Savepoint->aWalD
1fec0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
1fed0 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
1fee0 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
1fef0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
1ff00 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
1ff10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
1ff20 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69  sert( offset==ii
1ff30 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1ff40 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
1ff50 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1ff60 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1ff70 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
1ff80 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
1ff90 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1ffa0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1ffb0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
1ffc0 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
1ffd0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
1ffe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1fff0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20000 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
20010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20020 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
20030 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
20040 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
20050 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
20060 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
20070 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
20080 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
20090 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
200a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
200b0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
200c0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
200d0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  age);.}../*.** A
200e0 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
200f0 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
20100 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
20110 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
20120 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
20130 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
20140 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
20150 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
20160 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
20170 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
20180 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
20190 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
201a0 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
201b0 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
201c0 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
201d0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
201e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
201f0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
20200 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
20210 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
20220 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
20230 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
20240 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
20250 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
20270 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
20280 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
20290 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
202a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
202b0 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
202c0 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
202d0 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
202e0 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
202f0 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
20300 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
20310 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
20320 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
20330 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
20340 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
20350 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
20360 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
20370 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
20380 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
20390 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
203a0 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
203b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
203c0 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
203d0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
203e0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
203f0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
20400 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
20410 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
20420 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
20430 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20440 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20450 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
20460 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
20470 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
20480 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
20490 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
204a0 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
204b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
204c0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
204d0 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
204e0 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
204f0 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
20500 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
20510 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
20520 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
20530 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
20550 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
20560 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
20570 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
20580 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
20590 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
205a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
205b0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
205c0 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
205d0 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
205e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
205f0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
20600 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
20610 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
20620 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
20630 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
20640 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70  bFullFsync){.  p
20650 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
20660 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
20670 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
20680 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
20690 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
206a0 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
206b0 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
206c0 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
206d0 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73  flags = (bFullFs
206e0 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ync?SQLITE_SYNC_
206f0 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43  FULL:SQLITE_SYNC
20700 5f 4e 4f 52 4d 41 4c 29 3b 0a 7d 0a 23 65 6e 64  _NORMAL);.}.#end
20710 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
20720 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
20730 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
20740 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
20750 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
20760 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
20770 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
20780 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
20790 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
207a0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
207b0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
207c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
207d0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
207e0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
207f0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
20800 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
20810 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
20820 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
20830 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
20840 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
20850 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
20860 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
20870 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
20880 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
20890 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
208a0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
208b0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
208c0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
208d0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
208e0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
208f0 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
20900 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
20910 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
20920 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
20930 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
20940 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
20950 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
20960 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
20970 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
20980 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
20990 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
209a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
209b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
209c0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
209d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
209e0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
209f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
20a00 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
20a10 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
20a20 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
20a30 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
20a40 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
20a50 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
20a60 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
20a70 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
20a80 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
20a90 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ab0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
20ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
20ad0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
20ae0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
20af0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
20b00 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
20b10 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
20b20 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
20b30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
20b40 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
20b50 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
20b60 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20b70 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
20b80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
20b90 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
20ba0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
20bb0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
20bc0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
20bd0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
20be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
20bf0 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
20c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20c10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
20c20 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
20c30 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
20c40 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
20c50 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
20c60 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
20c70 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
20c80 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
20c90 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
20ca0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
20cb0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
20cc0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
20cd0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
20ce0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
20cf0 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
20d00 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
20d10 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
20d20 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
20d30 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
20d40 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
20d50 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
20d60 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
20d70 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
20d80 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
20d90 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
20da0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
20db0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
20dc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
20dd0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
20de0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
20df0 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
20e00 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
20e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e40 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
20e50 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
20e60 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
20e70 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
20e80 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
20e90 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
20ea0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
20eb0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
20ec0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
20ed0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
20ee0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
20ef0 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
20f00 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
20f10 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
20f20 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
20f30 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
20f40 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
20f50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
20f60 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
20f70 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
20f80 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
20f90 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
20fa0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
20fb0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
20fc0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
20fd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
21000 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
21010 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
21020 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
21030 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
21040 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
21050 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
21060 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
21070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
21080 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
21090 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
210a0 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d  /.){  .  pPager-
210b0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
210c0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
210d0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
210e0 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
210f0 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a  andlerArg;.}../*
21100 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
21110 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
21120 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
21130 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
21140 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
21150 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
21160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
21170 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
21180 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
21190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
211a0 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
211b0 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
211c0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
211d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
211e0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
211f0 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
21200 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51  ITE_IOERR, an SQ
21210 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73  LITE_IOERR_xxx s
21220 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54  ub-code or SQLIT
21230 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
21240 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
21250 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
21260 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
21270 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
21280 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
21290 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
212a0 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
212b0 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
212c0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
212d0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
212e0 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
212f0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
21300 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
21310 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
21320 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
21330 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
21340 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
21350 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
21360 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
21370 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
21380 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
21390 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
213a0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
213b0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
213c0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
213d0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
213e0 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
213f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
21400 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
21410 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
21420 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
21430 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
21440 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
21450 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
21460 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
21470 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
21480 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
21490 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
214a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
214b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
214c0 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
214d0 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
214e0 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
214f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
21500 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
21510 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
21520 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
21530 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
21540 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
21550 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
21560 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
21570 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
21580 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
21590 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
215a0 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
215b0 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
215c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
215d0 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
215e0 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
215f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
21600 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
21610 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
21620 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
21630 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
21640 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
21650 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67  Pager, u32 *pPag
21660 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
21670 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
21680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
21690 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
216a0 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
216b0 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
216c0 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
216d0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
216e0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
216f0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
21700 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
21710 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
21720 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
21730 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
21740 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
21750 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70  **.  ** At one p
21760 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  oint this functi
21770 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
21780 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  rror if the page
21790 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50  r was in .  ** P
217a0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
217b0 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45  . But since PAGE
217c0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75  R_ERROR state gu
217d0 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20  arantees that.  
217e0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c  ** there is at l
217f0 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
21800 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
21810 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nce, this functi
21820 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  on.  ** is a no-
21830 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65  op for that case
21840 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20   anyhow..  */.. 
21850 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20   u32 pageSize = 
21860 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
21870 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
21880 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
21890 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
218a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
218b0 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
218c0 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
218d0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
218e0 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71  ize==0).   && sq
218f0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
21900 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
21910 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70  che)==0 .   && p
21920 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
21930 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72  ize!=(u32)pPager
21940 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b  ->pageSize .  ){
21950 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
21960 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
21970 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20      /* New temp 
21980 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34  space */.    i64
21990 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20   nByte = 0;..   
219a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
219b0 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26  ate>PAGER_OPEN &
219c0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
219d0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63  >fd) ){.      rc
219e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
219f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
21a00 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a   &nByte);.    }.
21a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
21a30 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
21a40 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
21a50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
21a60 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20   if( !pNew ) rc 
21a70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
21a80 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
21a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21aa0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
21ab0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
21ac0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
21ad0 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f 70  = (Pgno)(nByte/p
21ae0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
21af0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21b00 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
21b10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
21b20 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
21b30 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
21b40 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
21b50 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71 6c   pNew;.      sql
21b60 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
21b70 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
21b80 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
21b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
21ba0 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
21bb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
21bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21bd0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
21be0 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
21bf0 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
21c00 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
21c10 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
21c20 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
21c30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
21c40 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
21c50 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
21c60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
21c70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
21c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21c90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21ca0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
21cb0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
21cc0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
21cd0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
21ce0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
21cf0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
21d00 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
21d10 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
21d20 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
21d30 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
21d40 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
21d50 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
21d60 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
21d70 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
21d80 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
21d90 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
21da0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
21db0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
21dc0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
21dd0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
21de0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
21df0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
21e00 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
21e10 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
21e20 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21e30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
21e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
21e50 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
21e60 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
21e70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
21e80 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
21e90 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
21ea0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
21eb0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
21ec0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
21ed0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
21ee0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
21ef0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
21f00 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
21f10 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
21f20 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
21f30 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
21f40 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
21f50 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
21f60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
21f70 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
21f80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21f90 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
21fa0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
21fb0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
21fc0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
21fd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
21fe0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
21ff0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3c 70 50 61  ager->mxPgno<pPa
22000 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
22010 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
22020 6f 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  o = pPager->dbSi
22030 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
22040 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
22050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
22060 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
22070 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
22080 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
22090 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
220a0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
220b0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
220c0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
220d0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
220e0 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
220f0 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
22100 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
22110 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
22120 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
22130 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
22140 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
22150 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
22160 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
22170 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
22180 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
22190 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
221a0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
221b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
221c0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
221d0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
221e0 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
221f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
22200 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
22210 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
22220 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
22230 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
22240 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
22250 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
22260 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
22270 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
22280 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
22290 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
222a0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
222b0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
222c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
222d0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
222e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
222f0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
22300 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
22310 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
22320 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
22330 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
22340 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
22350 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
22360 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
22370 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
22380 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
22390 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
223a0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
223b0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
223c0 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
223d0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
223e0 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
223f0 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
22400 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
22410 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
22420 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
22430 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
22440 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
22450 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
22460 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
22470 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
22480 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
22490 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
224a0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
224b0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
224c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
224d0 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
224e0 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
224f0 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
22500 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
22510 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
22520 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
22530 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
22540 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
22550 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
22560 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
22570 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
22580 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
22590 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
225a0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
225b0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
225c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
225d0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
225e0 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
225f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
22600 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
22610 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
22620 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22630 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
22640 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
22650 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
22660 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
22670 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
22680 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
22690 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
226a0 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
226b0 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
226c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
226d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
226e0 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
226f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
22700 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
22710 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
22720 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
22730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22740 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
22750 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
22760 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22770 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
22780 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
22790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
227a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
227b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
227c0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
227d0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
227e0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
227f0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
22800 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
22810 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
22820 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
22830 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
22840 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
22850 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
22860 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
22870 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
22880 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
22890 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
228a0 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
228b0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
228c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
228d0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
228e0 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
228f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22900 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
22910 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
22920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
22930 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
22940 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
22950 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
22960 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
22970 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
22980 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
22990 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
229a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
229b0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
229c0 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
229d0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
229e0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
229f0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
22a00 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
22a10 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
22a20 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
22a30 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
22a40 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
22a50 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
22a60 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
22a70 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
22a80 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
22a90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
22aa0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
22ab0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
22ac0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
22ad0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
22ae0 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
22af0 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
22b00 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
22b10 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
22b20 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22b30 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
22b40 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
22b50 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
22b60 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
22b70 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
22b80 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
22b90 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
22ba0 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
22bb0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
22bc0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
22bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
22be0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
22bf0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22c00 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
22c10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22c40 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
22c50 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
22c60 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
22c70 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
22c80 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
22c90 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
22ca0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
22cb0 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
22cc0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
22cd0 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
22ce0 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
22cf0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
22d00 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
22d10 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
22d20 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
22d30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
22d40 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
22d50 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
22d60 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
22d70 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
22d80 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
22d90 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
22da0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
22db0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
22dc0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
22dd0 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
22de0 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
22df0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
22e00 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
22e10 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
22e20 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
22e30 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
22e40 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
22e50 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
22e60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22e70 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
22e80 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
22e90 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
22ea0 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
22eb0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
22ec0 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
22ed0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
22ee0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
22ef0 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
22f00 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
22f10 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
22f20 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
22f30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
22f40 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
22f50 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
22f60 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
22f70 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
22f80 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
22f90 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
22fa0 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
22fb0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
22fc0 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
22fd0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
22fe0 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
22ff0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
23000 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
23010 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
23020 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
23030 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
23040 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
23050 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
23060 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
23070 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
23080 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
23090 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
230a0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
230b0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
230c0 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
230d0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
230e0 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
230f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
23100 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
23110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
23120 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
23130 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
23140 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
23150 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
23160 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
23170 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
23180 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
23190 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
231a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
231b0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
231c0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
231d0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
231e0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
231f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
23200 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
23210 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
23220 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
23230 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
23240 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
23250 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
23260 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
23270 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
23280 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
23290 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
232a0 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
232b0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
232c0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
232d0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
232e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
232f0 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
23300 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
23310 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
23320 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
23330 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
23340 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
23350 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
23360 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
23370 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
23380 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
23390 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
233a0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
233b0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
233c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
233d0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
233e0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
233f0 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
23400 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
23410 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
23420 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
23430 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
23440 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
23450 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
23460 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
23470 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
23480 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
23490 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
234a0 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
234b0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
234c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
234d0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
234e0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
234f0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
23500 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
23510 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
23520 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
23530 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
23540 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
23550 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
23560 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23570 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
23580 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
23590 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
235a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
235b0 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
235c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
235d0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
235e0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
235f0 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
23600 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
23610 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
23620 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
23630 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
23640 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
23650 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
23660 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
23670 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
23680 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
23690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
236a0 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
236b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
236c0 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
236d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
236e0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
236f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
23700 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
23710 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
23720 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
23730 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
23740 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
23750 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
23760 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
23770 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
23780 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
23790 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
237a0 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
237b0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
237c0 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
237d0 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
237e0 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
237f0 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
23800 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
23810 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
23820 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
23830 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
23840 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
23850 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
23860 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
23870 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
23880 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
23890 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
238a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
238b0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
238c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
238d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
238e0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
238f0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
23900 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
23910 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
23920 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
23930 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
23940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23960 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
23970 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
23980 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
23990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
239a0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
239b0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
239c0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
239d0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
239e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
239f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
23a00 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
23a10 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23a20 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
23a30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
23a40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
23a50 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
23a60 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
23a70 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
23a80 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
23a90 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
23aa0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
23ab0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
23ac0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
23ad0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
23ae0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
23af0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
23b00 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
23b10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
23b20 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
23b30 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
23b40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
23b50 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
23b60 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
23b70 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
23b80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
23b90 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
23ba0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
23bb0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
23bc0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
23bd0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
23be0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
23bf0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
23c00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
23c10 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
23c20 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
23c30 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
23c40 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73  TmpSpace;..  dis
23c50 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23c60 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
23c70 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
23c80 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70  Malloc();.  /* p
23c90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
23ca0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
23cb0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
23cc0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
23cd0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
23ce0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
23cf0 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
23d00 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
23d10 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
23d20 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
23d30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23d40 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
23d50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
23d60 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
23d70 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
23d80 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
23d90 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
23da0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
23db0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
23dc0 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
23dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
23de0 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
23df0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
23e00 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
23e10 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
23e20 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
23e30 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
23e40 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
23e50 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
23e60 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
23e70 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
23e80 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
23e90 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
23ea0 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
23eb0 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
23ec0 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
23ed0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
23ee0 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
23ef0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
23f00 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
23f10 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
23f20 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
23f30 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
23f40 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
23f50 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
23f60 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
23f70 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
23f80 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
23f90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
23fa0 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
23fb0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
23fc0 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
23fd0 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
23fe0 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
23ff0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
24000 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
24010 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
24020 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
24030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
24040 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
24050 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
24060 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
24070 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
24080 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
24090 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
240a0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
240b0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
240c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
240d0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
240e0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
240f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24100 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
24110 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
24120 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
24130 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
24140 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
24150 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
24160 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
24170 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
24180 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
24190 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
241a0 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
241b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
241c0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
241d0 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
241e0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
241f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
24200 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
24210 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
24220 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
24230 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
24240 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
24250 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
24260 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
24270 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
24280 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
24290 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
242a0 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
242b0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
242c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
242d0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
242e0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
242f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24300 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
24310 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
24320 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
24330 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
24340 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
24350 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
24360 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
24370 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24380 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
24390 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
243a0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
243b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
243c0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
243d0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
243e0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
243f0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
24400 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
24410 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
24420 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
24430 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
24440 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
24450 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
24460 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
24470 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
24480 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
24490 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
244a0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
244b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
244c0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
244d0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
244e0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
244f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24500 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
24510 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
24520 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
24530 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
24540 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
24550 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
24560 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
24570 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  the the file-sys
24580 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
24590 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
245a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
245b0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
245c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
245d0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
245e0 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
245f0 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
24600 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
24610 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
24620 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
24630 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
24640 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
24650 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
24660 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
24670 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
24680 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
24690 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
246a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
246b0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
246c0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
246d0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
246e0 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
246f0 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
24700 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
24710 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
24720 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
24730 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
24740 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
24750 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
24760 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
24770 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
24780 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
24790 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
247a0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
247b0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
247c0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
247d0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
247e0 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
247f0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
24800 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
24810 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
24820 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
24830 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
24840 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
24850 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
24860 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
24870 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
24880 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
24890 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
248a0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
248b0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
248c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
248d0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
248e0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
248f0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
24900 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
24910 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
24920 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
24930 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
24940 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
24950 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
24960 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
24970 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24980 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
24990 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
249a0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
249b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
249c0 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
249d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
249f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
24a00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24a10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
24a20 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
24a30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
24a40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
24a50 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
24a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
24a70 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24a80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
24a90 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24aa0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24ac0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
24ad0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
24ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24af0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
24b00 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
24b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
24b20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24b30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
24b40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
24b50 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
24b60 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
24b70 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
24b80 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
24b90 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
24ba0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
24bb0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
24bc0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
24bd0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
24be0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
24bf0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
24c00 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
24c10 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
24c20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
24c30 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
24c40 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
24c50 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
24c60 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
24c70 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
24c80 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
24c90 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
24ca0 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
24cb0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
24cc0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
24cd0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
24ce0 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
24cf0 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
24d00 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
24d10 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
24d20 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
24d30 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
24d40 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
24d50 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
24d60 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
24d70 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
24d80 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
24d90 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
24da0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
24db0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
24dc0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
24dd0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
24de0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
24df0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
24e00 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
24e10 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
24e20 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
24e30 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
24e40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24e50 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
24e60 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
24e70 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
24e80 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
24e90 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
24ea0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
24eb0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
24ec0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
24ed0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
24ee0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
24ef0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
24f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
24f10 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
24f20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
24f30 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
24f40 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
24f50 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
24f60 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
24f70 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
24f80 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
24f90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
24fa0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
24fb0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
24fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
24fd0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
24fe0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
24ff0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
25000 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
25010 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
25020 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
25030 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
25040 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
25050 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
25060 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
25070 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
25080 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
25090 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
250a0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
250b0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
250c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
250d0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
250e0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
250f0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
25100 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
25110 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
25120 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
25130 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
25140 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
25150 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
25160 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
25170 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
25180 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25190 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
251a0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
251b0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
251c0 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
251d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
251e0 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
251f0 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
25200 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
25210 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
25220 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
25230 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
25240 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
25250 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
25260 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
25270 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
25280 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
25290 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
252a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
252b0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
252c0 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
252d0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
252e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
252f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25300 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
25310 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
25320 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
25330 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
25340 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
25350 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
25360 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
25370 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
25380 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
25390 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
253a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
253b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
253c0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
253d0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
253e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
253f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
25400 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25410 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
25420 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
25430 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
25440 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
25450 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
25460 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
25470 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
25480 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
25490 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
254a0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
254b0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
254c0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
254d0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
254e0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
254f0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
25500 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
25510 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
25520 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
25530 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
25540 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
25550 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
25560 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
25570 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
25580 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
25590 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
255a0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
255b0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
255c0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
255d0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
255e0 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
255f0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
25600 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
25610 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
25620 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
25630 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
25640 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
25650 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
25660 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
25670 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
25680 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
25690 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
256a0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
256b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
256c0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
256d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
256e0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
256f0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
25700 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
25710 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
25720 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
25730 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
25740 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
25750 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
25760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25770 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
25790 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
257a0 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
257b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
257c0 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
257d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
257e0 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
257f0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
25800 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
25810 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
25820 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
25830 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
25840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25850 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25860 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
25870 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
25880 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
25890 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
258a0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
258b0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
258c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
258d0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
258e0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
258f0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
25900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25910 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
25920 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
25930 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
25940 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
25950 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
25960 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
25970 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
25980 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
25990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
259a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
259b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
259c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
259d0 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
259e0 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69  rnalOff;.      i
259f0 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d  f( newHdr && 0==
25a00 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
25a10 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
25a20 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
25a30 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
25a40 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
25a50 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
25a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
25a80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
25a90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25aa0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
25ab0 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
25ac0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
25ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73  .  }..  /* Unles
25ae0 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
25af0 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74  n noSync mode, t
25b00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25b10 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73  was just .  ** s
25b20 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63  uccessfully sync
25b30 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
25b40 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
25b50 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
25b60 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65  n .  ** all page
25b70 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
25b80 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
25b90 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
25ba0 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72  Cache);.  pPager
25bb0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
25bc0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20  _WRITER_DBMOD;. 
25bd0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
25be0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
25bf0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
25c00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25c10 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
25c20 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
25c30 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
25c40 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
25c50 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
25c60 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
25c70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
25c80 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
25c90 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
25ca0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
25cb0 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
25cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25cd0 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
25ce0 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
25cf0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
25d00 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
25d10 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
25d20 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
25d30 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
25d40 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
25d50 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
25d60 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
25d70 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
25d80 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
25d90 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
25da0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
25db0 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
25dc0 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
25dd0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
25de0 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
25df0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
25e00 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
25e10 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
25e20 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
25e30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
25e40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
25e50 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
25e60 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
25e70 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
25e80 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
25e90 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
25ea0 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
25eb0 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
25ec0 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
25ed0 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
25ee0 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
25ef0 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
25f00 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
25f10 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
25f20 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
25f30 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
25f40 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
25f50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25f60 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
25f70 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
25f80 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
25f90 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
25fa0 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
25fb0 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
25fc0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
25fd0 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
25fe0 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
25ff0 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
26000 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
26010 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
26020 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
26030 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
26040 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
26050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26060 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
26070 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
26080 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
26090 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
260a0 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
260b0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
260c0 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
260d0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
260e0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
260f0 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
26100 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
26110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26120 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
26130 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
26140 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
26150 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
26160 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
26170 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
26180 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26190 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
261a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
261b0 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
261c0 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
261d0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
261e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
261f0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
26200 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  st(Pager *pPager
26210 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  , PgHdr *pList){
26220 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26230 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26240 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26250 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
26260 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26270 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
26280 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73   rollback pagers
26290 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
262a0 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73   state. */.  ass
262b0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
262c0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
262d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
262e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
262f0 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
26300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26310 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
26320 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
26330 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
26340 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
26350 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
26360 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
26370 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
26380 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
26390 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
263a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
263b0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
263c0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
263d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
263e0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
263f0 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
26400 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
26410 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
26420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26430 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
26440 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
26450 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
26460 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
26470 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
26480 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
26490 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
264a0 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
264b0 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
264c0 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
264d0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
264e0 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
264f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
26500 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
26510 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
26520 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26530 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
26540 64 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  dbSize>pPager->d
26550 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20  bHintSize ){.   
26560 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
26570 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
26580 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
26590 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
265a0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
265b0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
265c0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
265d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
265e0 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
265f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
26600 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
26610 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
26620 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
26630 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
26640 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
26650 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
26660 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
26670 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
26680 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
26690 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
266a0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
266b0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
266c0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
266d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
266e0 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
266f0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
26700 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
26710 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
26720 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
26730 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
26740 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
26750 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
26760 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
26770 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
26780 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
26790 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
267a0 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
267b0 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
267c0 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
267d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
267e0 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
267f0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
26800 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
26810 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
26820 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
26830 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
26840 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
26850 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
26860 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
26870 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
26880 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
26890 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
268c0 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
268d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
268e0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
268f0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
26900 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
26910 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
26920 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
26930 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
26940 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
26950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26960 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
26970 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
26980 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
26990 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
269a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
269b0 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
269c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
269d0 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
269e0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
269f0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
26a00 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
26a10 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
26a20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
26a30 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
26a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a50 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
26a60 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
26a70 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
26a80 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
26a90 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
26aa0 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
26ab0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
26ac0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
26ad0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
26ae0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
26af0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
26b00 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
26b10 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
26b20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
26b30 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
26b40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
26b50 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
26b60 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
26b70 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
26b80 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
26b90 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
26ba0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
26bb0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
26bc0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
26bd0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
26be0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
26bf0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
26c00 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
26c10 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
26c20 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
26c50 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
26c60 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
26c70 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
26c80 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
26c90 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
26ca0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
26cb0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
26cc0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
26cd0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
26ce0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
26cf0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
26d00 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
26d10 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
26d20 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
26d30 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
26d40 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
26d50 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
26d60 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
26d70 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
26d80 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
26d90 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
26da0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
26db0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26dc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
26dd0 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
26de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26df0 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
26e00 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
26e10 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
26e20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
26e30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26e40 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
26e50 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
26e60 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
26e70 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
26e80 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
26e90 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
26ea0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
26eb0 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
26ec0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
26ed0 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
26ee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26ef0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26f00 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
26f10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
26f20 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
26f30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
26f40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
26f50 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
26f60 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
26f70 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
26f80 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
26f90 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26fb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
26fc0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
26fd0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
26fe0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
26ff0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
27000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27010 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
27020 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
27030 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
27040 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
27050 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
27060 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
27070 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
27080 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
27090 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
270a0 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
270b0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
270c0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
270d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
270e0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
270f0 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
27100 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
27110 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
27120 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
27130 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
27140 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
27150 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
27160 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
27170 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
27180 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
27190 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
271a0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
271b0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
271c0 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
271d0 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
271e0 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
271f0 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
27200 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
27210 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
27220 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
27230 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
27240 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
27250 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
27260 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27270 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
27280 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
27290 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
272a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
272b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
272c0 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
272d0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
272e0 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
272f0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
27300 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
27310 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
27320 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
27330 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
27340 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
27350 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27360 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
27370 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27380 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
27390 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
273a0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
273b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
273c0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
273d0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
273e0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
273f0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
27400 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
27410 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
27420 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
27430 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27440 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
27450 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
27460 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
27470 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
27480 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
27490 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
274a0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
274b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
274c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
274d0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
274e0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
274f0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
27500 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
27510 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
27520 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
27530 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
27540 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
27550 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
27560 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
27570 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
27580 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
27590 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
275a0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
275b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
275c0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
275d0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
275e0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
275f0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
27600 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
27610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27620 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
27630 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
27640 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
27650 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
27660 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
27670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27680 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
27690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
276a0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
276b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
276c0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
276d0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
276e0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
276f0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
27700 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
27710 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27720 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27730 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
27740 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
27750 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
27760 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
27770 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
27780 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
27790 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
277a0 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
277b0 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
277c0 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
277d0 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
277e0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
277f0 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
27800 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
27810 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
27820 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
27830 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
27840 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
27850 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
27860 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
27870 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
27880 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
27890 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
278a0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
278b0 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
278c0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
278d0 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
278e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
278f0 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
27900 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
27910 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
27920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27930 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
27940 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
27950 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
27960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
27970 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27980 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
27990 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
279a0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
279b0 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
279c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
279d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
279e0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
279f0 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
27a00 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
27a10 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
27a20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
27a30 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
27a40 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
27a50 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
27a60 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
27a70 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
27a80 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
27a90 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
27aa0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
27ab0 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
27ac0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
27ad0 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
27ae0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
27af0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
27b00 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
27b10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27b20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
27b30 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
27b40 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
27b50 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
27b60 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
27b70 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
27b80 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73  cSpill flag is s
27b90 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
27ba0 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
27bb0 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
27bc0 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
27bd0 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
27be0 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
27bf0 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
27c00 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
27c10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27c20 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
27c30 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
27c40 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
27c50 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
27c60 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
27c70 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
27c80 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69  pill flag inhibi
27c90 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
27ca0 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  lling regardless
27cb0 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a   of whether.  **
27cc0 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
27cd0 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
27ce0 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  s is set during 
27cf0 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  a rollback..  **
27d00 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
27d10 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
27d20 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
27d30 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
27d40 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
27d50 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
27d60 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
27d70 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
27d80 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20  lementaton it . 
27d90 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
27da0 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 43 61  e for sqlite3PCa
27db0 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
27dc0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
27dd0 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20  ateFlag==1.  ** 
27de0 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
27df0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
27e00 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
27e10 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
27e20 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
27e30 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
27e40 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
27e50 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
27e60 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
27e70 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
27e80 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
27e90 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
27ea0 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
27eb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
27ec0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
27ed0 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
27ee0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
27ef0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
27f00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27f10 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
27f20 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
27f30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
27f40 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
27f50 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
27f60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27f70 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
27f80 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
27f90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
27fa0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
27fb0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
27fc0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
27fd0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
27fe0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
27ff0 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
28000 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
28010 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
28020 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
28030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28040 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
28050 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
28060 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
28070 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
28080 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
28090 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
280a0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
280b0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
280c0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
280d0 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
280e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
280f0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
28100 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
28110 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
28120 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
28130 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
28140 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
28150 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
28160 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
28170 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
28180 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
28190 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
281a0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
281b0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
281c0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
281d0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
281e0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
281f0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
28200 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
28210 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
28220 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
28230 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
28240 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
28250 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
28260 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
28270 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
28280 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
28290 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
282a0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
282b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
282c0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
282d0 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
282e0 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
282f0 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
28300 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
28310 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
28320 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
28330 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
28340 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
28350 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
28360 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
28370 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
28380 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
28390 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
283a0 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
283b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
283c0 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
283d0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
283e0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
283f0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
28400 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
28410 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
28420 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
28430 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
28440 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
28450 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
28460 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
28470 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
28480 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
28490 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
284a0 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
284b0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
284c0 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
284d0 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
284e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
284f0 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
28500 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
28510 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
28520 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
28530 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
28540 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
28550 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
28560 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
28570 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
28580 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
28590 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
285a0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
285b0 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
285c0 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
285d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
285e0 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
285f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
28600 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
28610 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
28620 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
28630 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
28640 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
28650 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
28660 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
28670 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
28680 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
28690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
286a0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
286b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
286c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
286d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
286e0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
286f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28700 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
28710 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
28720 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
28730 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
28740 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
28750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28760 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28770 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
28780 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28790 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
287a0 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
287b0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
287c0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
287d0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
287e0 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
287f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
28800 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
28810 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
28820 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
28830 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
28840 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
28850 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
28860 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
28870 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
28880 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
28890 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
288a0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
288b0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
288c0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
288d0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
288e0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
288f0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
28900 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
28910 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
28920 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
28930 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
28940 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
28950 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
28960 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
28970 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
28980 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
28990 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
289a0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
289b0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
289c0 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
289d0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
289e0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
289f0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
28a00 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
28a10 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
28a20 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
28a30 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
28a40 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
28a50 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
28a60 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
28a70 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
28a80 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
28a90 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
28aa0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
28ab0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
28ac0 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
28ad0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
28ae0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
28af0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
28b00 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
28b10 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
28b20 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
28b30 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
28b40 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
28b50 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
28b60 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
28b70 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
28b80 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
28b90 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
28ba0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
28bb0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
28bc0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
28bd0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
28be0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
28bf0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
28c00 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
28c10 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
28c20 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
28c30 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
28c40 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
28c50 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
28c60 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
28c70 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
28c80 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
28c90 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
28ca0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
28cb0 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
28cc0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
28cd0 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
28ce0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
28cf0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
28d00 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
28d10 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
28d20 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
28d30 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
28d40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
28d50 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
28d60 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
28d70 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
28d80 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
28d90 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
28da0 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
28db0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
28dc0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
28dd0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28de0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
28df0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
28e00 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
28e10 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
28e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28e30 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
28e40 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
28e50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28e60 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
28e70 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
28e80 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
28e90 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
28ea0 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
28eb0 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
28ec0 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
28ed0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
28ee0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f00 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
28f10 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
28f20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
28f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
28f40 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
28f50 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
28f60 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
28f70 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
28f80 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
28f90 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
28fa0 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
28fb0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
28fc0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
28fd0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
28fe0 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
28ff0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
29000 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29010 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
29020 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
29030 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
29040 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29050 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
29060 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
29070 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
29080 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
29090 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
290a0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
290b0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
290c0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
290d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
290e0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
290f0 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
29100 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
29110 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
29120 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
29130 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
29140 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
29150 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
29160 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
29170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29180 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
29190 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
291a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
291b0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
291c0 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
291d0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
291e0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
291f0 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
29200 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
29210 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
29220 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
29230 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
29240 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
29250 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
29260 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
29270 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
29280 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
29290 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
292a0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
292b0 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
292c0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
292d0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
292e0 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
292f0 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
29300 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
29310 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
29320 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
29330 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
29340 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
29350 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
29360 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
29370 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
29380 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
29390 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
293a0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
293b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
293c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
293d0 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
293e0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
293f0 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
29400 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
29410 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
29420 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
29430 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
29440 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
29450 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
29460 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
29470 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
29480 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
29490 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
294a0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
294b0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
294c0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
294d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
294e0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
294f0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
29500 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
29510 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
29520 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
29530 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
29540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29550 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
29560 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
29570 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
29580 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
29590 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
295a0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
295b0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
295c0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
295d0 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
295e0 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
295f0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
29600 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
29610 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
29620 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
29630 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
29640 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
29650 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
29660 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
29670 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
29680 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
29690 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
296a0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
296b0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
296c0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
296d0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
296e0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
296f0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
29700 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
29710 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
29720 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
29730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29740 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
29750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29760 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
29770 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
29780 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
29790 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
297a0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
297b0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
297c0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
297d0 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
297e0 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
297f0 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
29800 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
29810 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
29820 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
29830 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
29840 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
29850 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
29860 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
29870 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
29880 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
29890 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
298a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
298b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
298c0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
298d0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
298e0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
298f0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
29900 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
29910 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
29920 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
29930 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
29940 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
29950 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29960 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
29970 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
29980 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
29990 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
299a0 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
299b0 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
299c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
299d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
299e0 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
299f0 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
29a00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
29a10 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
29a20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29a30 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
29a40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
29a50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29a60 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
29a70 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
29a80 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29a90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
29aa0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
29ab0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
29ac0 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
29ad0 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
29ae0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
29af0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
29b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29b10 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
29b20 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
29b30 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
29b40 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
29b50 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
29b60 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
29b70 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
29b80 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
29b90 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
29ba0 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
29bb0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
29bc0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
29bd0 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
29be0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
29bf0 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
29c00 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
29c10 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
29c20 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
29c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
29c40 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
29c50 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
29c60 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
29c70 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
29c80 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
29c90 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
29ca0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
29cb0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
29cd0 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
29ce0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
29cf0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
29d00 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
29d10 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
29d20 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
29d30 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
29d40 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
29d50 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
29d60 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
29d70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
29d80 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
29d90 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
29da0 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
29db0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
29dc0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
29dd0 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
29de0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
29df0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
29e00 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
29e10 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
29e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
29e30 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
29e40 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
29e50 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
29e60 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
29e70 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20  me + 8 + 1      
29e80 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
29e90 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
29ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
29eb0 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
29ec0 20 34 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   4 + 1          
29ed0 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
29ee0 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
29ef0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
29f00 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
29f10 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
29f20 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
29f30 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
29f40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29f50 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
29f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29f70 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
29f80 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
29f90 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
29fa0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
29fb0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
29fc0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
29fd0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
29fe0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
29ff0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2a000 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2a010 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2a020 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2a030 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2a040 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2a050 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2a060 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2a070 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2a080 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2a090 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2a0a0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2a0b0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2a0c0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2a0d0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2a0e0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2a0f0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2a100 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2a110 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2a120 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2a130 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2a140 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2a150 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2a160 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70  athname ){.    p
2a170 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2a180 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2a190 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2a1a0 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1);.    memcpy(p
2a1b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2a1c0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a1d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2a1e0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2a1f0 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2a200 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2a210 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2a220 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2a230 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
2a240 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 8);.    if( pP
2a250 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2a260 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0]==0 ){.      p
2a270 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2a280 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  0] = 0;.    }.#i
2a290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a2a0 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73 65 7b 0a  T_WAL.    else{.
2a2b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57        pPager->zW
2a2c0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2a2d0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2a2e0 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  +8+1];.      mem
2a2f0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2a300 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a310 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
2a320 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2a330 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
2a340 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "-wal", 4);.    
2a350 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
2a360 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2a370 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2a380 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2a390 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2a3a0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2a3b0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2a3c0 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2a3d0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2a3e0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2a3f0 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  && !memDb ){.   
2a400 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2a430 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2a440 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2a450 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2a460 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2a470 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2a480 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2a490 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  t);.    readOnly
2a4a0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2a4b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2a4c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2a4d0 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2a4e0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2a4f0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2a500 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2a510 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2a520 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2a530 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2a540 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2a550 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2a560 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2a570 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2a580 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2a590 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2a5a0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2a5b0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2a5c0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2a5d0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2a5e0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2a5f0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2a600 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2a610 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2a620 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2a630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a640 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2a650 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2a660 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2a670 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a680 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2a690 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2a6a0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a6b0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2a6c0 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2a6d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2a6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2a6f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2a700 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2a710 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2a720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2a730 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2a740 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a750 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2a760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a770 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2a780 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2a790 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2a7a0 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2a7b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2a7c0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2a7d0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2a7e0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2a7f0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2a800 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2a810 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2a820 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a830 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2a840 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2a850 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2a860 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2a870 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2a880 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2a890 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2a8a0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a8b0 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2a8c0 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2a8d0 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2a8e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2a8f0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2a900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a910 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2a920 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2a930 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2a940 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2a950 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2a960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a970 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2a980 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2a990 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2a9a0 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2a9b0 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2a9c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2a9d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2a9e0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2a9f0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2aa00 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2aa10 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2aa20 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2aa30 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2aa40 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2aa50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2aa60 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2aa70 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2aa80 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2aa90 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2aaa0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2aab0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2aac0 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2aad0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2aae0 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2aaf0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2ab00 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2ab10 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2ab20 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2ab30 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2ab40 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2ab50 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2ab60 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2ab70 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2ab80 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2ab90 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2aba0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2abb0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2abc0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2abd0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2abe0 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2abf0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2ac00 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2ac10 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2ac20 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2ac30 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2ac40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac50 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2ac60 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2ac70 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2ac80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2ac90 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2aca0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2acb0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2acc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2acd0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2ace0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2acf0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2ad00 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2ad10 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2ad20 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2ad30 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2ad40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2ad50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad60 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2ad70 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2ad80 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2ad90 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2ada0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2adb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2adc0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2add0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2ade0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2adf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2ae00 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2ae10 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2ae20 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2ae30 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2ae40 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2ae50 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2ae60 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2ae70 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2ae80 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2ae90 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2aea0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2aeb0 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2aec0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2aed0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2aee0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2aef0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2af00 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2af10 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2af20 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2af30 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2af40 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2af50 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
2af60 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
2af70 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
2af80 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
2af90 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2afa0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2afb0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2afc0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2afd0 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2afe0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2aff0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2b000 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2b010 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2b020 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2b030 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2b040 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2b050 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2b060 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2b070 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2b080 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2b090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2b0a0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2b0b0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2b0c0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2b0d0 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2b0e0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2b0f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2b100 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2b110 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2b120 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2b130 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b140 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2b150 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2b160 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2b170 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2b180 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2b190 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2b1a0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2b1b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2b1c0 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2b1d0 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2b1e0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2b1f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2b200 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2b210 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2b220 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2b230 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2b240 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2b250 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2b260 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2b270 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2b280 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2b290 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2b2a0 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2b2b0 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2b2c0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
2b2d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2b2e0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
2b2f0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2b300 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2b310 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2b320 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2b330 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2b340 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2b350 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2b360 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2b370 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2b380 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2b390 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2b3a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2b3b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2b3c0 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2b3d0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2b3e0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2b3f0 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2b400 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b410 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2b420 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2b430 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2b440 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2b450 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2b460 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b470 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2b480 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2b490 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2b4a0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2b4b0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2b4c0 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2b4d0 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2b4e0 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2b4f0 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2b500 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2b510 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
2b520 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2b530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b540 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
2b550 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2b560 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2b570 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2b580 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2b590 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2b5a0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2b5b0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2b5c0 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2b5d0 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2b5e0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2b5f0 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2b600 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2b610 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2b620 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2b630 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2b640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2b650 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2b660 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2b670 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2b680 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2b690 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2b6a0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2b6b0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2b6c0 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2b6d0 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2b6e0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2b6f0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2b700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b710 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2b720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b730 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2b740 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2b750 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2b760 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2b770 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2b780 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2b790 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2b7a0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2b7b0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2b7c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2b7d0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2b7e0 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2b7f0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2b800 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2b810 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2b820 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2b830 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2b840 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2b850 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2b860 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2b870 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2b880 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2b890 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2b8a0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2b8b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2b8c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2b8d0 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2b8e0 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2b8f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2b900 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2b910 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2b920 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2b930 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2b940 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2b950 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2b960 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b970 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2b980 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2b990 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2b9a0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2b9b0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2b9c0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2b9d0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2b9e0 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2b9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ba00 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2ba10 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2ba20 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2ba30 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2ba40 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2ba50 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2ba60 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2ba70 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2ba80 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2ba90 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2baa0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2bab0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2bac0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2bad0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2bae0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2baf0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2bb00 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2bb10 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2bb20 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2bb30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2bb40 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2bb50 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2bb60 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2bb70 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2bb80 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2bb90 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2bba0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2bbb0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2bbc0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2bbd0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2bbe0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2bbf0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2bc00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bc10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2bc20 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2bc30 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2bc40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2bc50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2bc60 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2bc70 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2bc80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2bc90 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2bca0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2bcb0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2bcc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2bcd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2bce0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2bcf0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2bd00 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2bd10 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2bd20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2bd30 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2bd40 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2bd50 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2bd60 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2bd70 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2bd80 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2bd90 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2bda0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2bdb0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2bdc0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2bdd0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2bde0 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2bdf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2be00 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2be10 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2be20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2be30 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2be40 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2be50 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2be60 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2be70 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2be80 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2be90 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2bea0 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2beb0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2bec0 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2bed0 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2bee0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2bef0 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2bf00 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2bf10 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2bf20 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2bf30 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2bf40 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2bf50 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2bf60 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2bf70 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2bf80 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2bf90 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2bfa0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2bfb0 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2bfc0 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2bfd0 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2bfe0 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2bff0 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2c000 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2c010 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2c020 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2c030 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2c040 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2c050 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2c060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c070 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2c080 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2c090 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2c0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c0b0 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2c0c0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c0e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c0f0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2c100 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
2c110 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
2c120 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c130 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
2c140 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
2c150 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
2c160 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2c170 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
2c180 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
2c190 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
2c1a0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
2c1b0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
2c1c0 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
2c1d0 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
2c1e0 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
2c1f0 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
2c200 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
2c210 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
2c220 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
2c230 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
2c240 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2c250 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2c260 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2c270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c290 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
2c2a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c2b0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2c2c0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2c2d0 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2c2e0 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2c2f0 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2c300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c310 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2c320 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2c330 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2c340 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 55            pagerU
2c350 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2c360 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2c370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c380 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2c390 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2c3a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c3b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2c3c0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2c3d0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2c3e0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2c3f0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2c400 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2c410 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2c420 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2c430 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2c440 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2c450 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2c460 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2c470 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2c480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2c490 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2c4a0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2c4b0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2c4c0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2c4d0 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2c4e0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2c4f0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2c500 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c510 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2c520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2c530 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2c540 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2c550 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2c560 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2c570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c580 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2c590 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2c5a0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2c5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c5c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2c5d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c5e0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2c5f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2c600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c610 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2c620 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2c630 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2c640 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c650 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2c660 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2c670 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c680 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2c690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c6a0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2c6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c6c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2c6d0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2c6e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c6f0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2c700 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2c710 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2c730 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2c740 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2c750 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2c760 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2c770 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2c780 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2c790 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2c7a0 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2c7b0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2c7c0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2c7d0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2c7e0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2c7f0 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2c800 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2c810 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2c820 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2c830 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2c840 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2c850 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2c860 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2c870 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2c880 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2c890 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2c8a0 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2c8c0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2c8d0 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2c8e0 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2c8f0 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2c900 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2c910 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2c920 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2c930 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2c940 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2c950 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2c960 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2c970 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2c980 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c990 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2c9a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c9b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c9c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c9e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2c9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2ca00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ca10 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2ca20 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2ca30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2ca40 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2ca50 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2ca60 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2ca70 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2ca80 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2ca90 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2caa0 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2cab0 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2cac0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2cad0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2cae0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2caf0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2cb00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2cb10 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2cb20 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2cb30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2cb40 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2cb50 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2cb60 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2cb70 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2cb80 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2cb90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cba0 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2cbb0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2cbc0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2cbd0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2cbe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cbf0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2cc00 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2cc10 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2cc20 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2cc30 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2cc40 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2cc50 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2cc60 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2cc70 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2cc80 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2cc90 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2cca0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2ccb0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2ccc0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2ccd0 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2cce0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2ccf0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2cd00 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2cd10 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2cd20 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2cd30 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2cd40 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2cd50 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2cd60 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2cd70 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2cd80 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2cd90 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2cda0 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2cdb0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2cdc0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2cdd0 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2cde0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2cdf0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2ce00 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2ce10 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2ce20 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2ce30 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2ce40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ce50 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2ce60 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2ce70 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2ce80 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2ce90 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2cea0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2ceb0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2cec0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2ced0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2cee0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2cef0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2cf00 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2cf10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2cf20 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2cf30 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2cf40 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2cf50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2cf60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2cf70 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2cf80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2cf90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cfa0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2cfb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2cfc0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2cfd0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2cfe0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2cff0 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2d000 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2d010 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2d020 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2d030 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2d040 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2d050 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2d060 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2d070 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2d080 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2d090 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2d0a0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2d0b0 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2d0c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d0d0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2d0e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d0f0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2d100 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2d110 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2d120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2d130 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2d140 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2d150 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2d160 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2d170 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2d180 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2d190 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2d1a0 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2d1b0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2d1c0 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2d1d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2d1e0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2d1f0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2d200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d210 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2d220 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2d230 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2d240 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2d250 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d260 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2d270 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64   || pPager->read
2d280 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28  Only );..    if(
2d290 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2d2a0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
2d2b0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2d2c0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2d2d0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2d2e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d2f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d300 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d310 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2d320 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2d330 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2d340 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2d350 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2d360 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2d370 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2d380 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2d390 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2d3a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2d3b0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2d3c0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2d3d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2d3e0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2d3f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2d400 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2d410 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2d420 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2d430 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2d440 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2d450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d470 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2d480 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2d490 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2d4a0 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
2d4b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2d4c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2d4d0 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
2d4e0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
2d4f0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
2d500 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2d510 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
2d520 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
2d530 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
2d540 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2d550 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
2d560 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
2d570 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
2d580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2d590 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
2d5a0 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
2d5b0 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
2d5c0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2d5d0 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
2d5e0 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
2d5f0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
2d600 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
2d610 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
2d620 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
2d630 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
2d640 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2d650 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2d660 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
2d670 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
2d680 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
2d690 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
2d6a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2d6b0 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
2d6c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
2d6d0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
2d6e0 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
2d6f0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
2d700 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
2d710 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
2d720 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
2d730 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
2d740 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
2d750 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2d760 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
2d770 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
2d780 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
2d790 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
2d7a0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2d7b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
2d7c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2d7d0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
2d7e0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
2d7f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2d800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d810 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
2d820 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2d830 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
2d840 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2d850 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
2d860 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
2d870 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
2d880 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
2d890 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2d8a0 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
2d8b0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
2d8c0 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
2d8d0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2d8e0 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
2d8f0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2d900 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
2d910 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
2d920 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
2d930 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
2d940 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
2d950 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
2d960 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
2d970 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
2d980 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
2d990 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
2d9a0 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
2d9b0 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
2d9c0 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
2d9d0 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
2d9e0 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
2d9f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2da00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
2da10 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
2da20 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
2da30 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
2da40 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2da50 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
2da60 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
2da70 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
2da80 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
2da90 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
2daa0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2dab0 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
2dac0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
2dad0 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
2dae0 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
2daf0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
2db00 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
2db10 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2db20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2db30 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2db40 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2db50 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2db60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2db70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2db80 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2db90 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2dba0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
2dbb0 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
2dbc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2dbd0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2dbe0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
2dbf0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2dc00 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
2dc10 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2dc20 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2dc30 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
2dc40 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
2dc50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dc60 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
2dc70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2dc80 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2dc90 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2dca0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2dcb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2dcc0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2dcd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2dce0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2dcf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2dd00 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2dd10 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2dd20 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2dd30 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
2dd40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dd50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2dd60 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2dd70 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
2dd80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dd90 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
2dda0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2ddb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ddc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2ddd0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
2dde0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2ddf0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2de00 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
2de10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
2de30 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
2de40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
2de50 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
2de60 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
2de70 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
2de80 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
2de90 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
2dea0 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
2deb0 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
2dec0 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
2ded0 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
2dee0 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
2def0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
2df00 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
2df10 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
2df20 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2df30 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
2df40 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
2df50 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
2df60 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
2df70 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
2df80 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
2df90 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
2dfa0 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
2dfb0 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
2dfc0 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
2dfd0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
2dfe0 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
2dff0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
2e000 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e010 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
2e020 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2e030 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2e040 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
2e050 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2e060 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2e070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e080 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2e090 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e0a0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
2e0b0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2e0c0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
2e0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e0e0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
2e0f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2e100 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
2e110 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2e120 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2e130 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2e140 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2e160 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2e170 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
2e180 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2e190 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
2e1a0 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
2e1b0 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
2e1c0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
2e1d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2e1e0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2e1f0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2e200 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
2e210 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
2e220 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
2e230 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
2e240 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
2e250 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
2e260 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
2e270 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
2e280 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
2e290 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
2e2a0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
2e2b0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
2e2c0 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
2e2d0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
2e2e0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
2e2f0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
2e300 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2e310 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
2e320 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
2e330 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
2e340 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
2e350 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
2e360 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
2e370 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
2e380 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
2e390 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
2e3a0 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
2e3b0 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
2e3c0 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
2e3d0 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
2e3e0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
2e3f0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2e400 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
2e410 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
2e420 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
2e430 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
2e440 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
2e450 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
2e460 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
2e470 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
2e480 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
2e490 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
2e4a0 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
2e4b0 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
2e4c0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
2e4d0 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
2e4e0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
2e4f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
2e500 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
2e510 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
2e520 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
2e530 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2e540 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
2e550 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2e560 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2e570 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2e580 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2e590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2e5a0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
2e5b0 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2e5c0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
2e5d0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2e5e0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
2e5f0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
2e600 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
2e610 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
2e620 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26  empFile .     &&
2e630 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   (pPager->pBacku
2e640 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
2e650 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2e660 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20  er->pPCache)>0) 
2e670 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2e680 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
2e690 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
2e6a0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
2e6b0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
2e6c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
2e6d0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
2e6e0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
2e6f0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
2e700 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
2e710 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2e720 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
2e730 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
2e740 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
2e750 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
2e760 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2e770 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
2e780 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
2e790 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
2e7a0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
2e7b0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
2e7c0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
2e7d0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
2e7e0 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
2e7f0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
2e800 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
2e810 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
2e820 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
2e830 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
2e840 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
2e850 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
2e860 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
2e870 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
2e880 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
2e890 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
2e8a0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
2e8b0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
2e8c0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
2e8d0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2e8e0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
2e8f0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
2e900 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
2e910 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
2e920 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
2e930 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
2e940 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
2e950 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
2e960 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
2e970 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
2e980 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
2e990 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2e9a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
2e9b0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
2e9c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2e9d0 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
2e9e0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2e9f0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2ea00 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2ea10 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
2ea20 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
2ea30 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
2ea40 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
2ea50 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2ea60 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
2ea70 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
2ea80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2ea90 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
2eaa0 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
2eab0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
2eac0 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
2ead0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2eae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2eaf0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2eb00 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2eb10 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2eb20 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
2eb30 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2eb40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
2eb50 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
2eb60 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2eb70 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
2eb80 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
2eb90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2eba0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
2ebb0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2ebc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2ebd0 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
2ebe0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
2ebf0 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
2ec00 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
2ec10 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
2ec20 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
2ec30 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
2ec40 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2ec50 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2ec60 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
2ec70 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  esent(pPager);. 
2ec80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ec90 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
2eca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2ecb0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
2ecc0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2ecd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
2ece0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2ecf0 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
2ed00 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
2ed10 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2ed20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
2ed30 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2ed40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2ed50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2ed60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2ed70 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
2ed80 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
2ed90 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
2eda0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2edb0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
2edc0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
2edd0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
2ede0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2edf0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
2ee00 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
2ee10 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2ee20 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2ee30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ee40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
2ee50 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
2ee60 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
2ee70 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
2ee80 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
2ee90 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
2eea0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
2eeb0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
2eec0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
2eed0 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
2eee0 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
2eef0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
2ef00 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
2ef10 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
2ef20 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
2ef30 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
2ef40 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
2ef50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
2ef60 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
2ef70 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
2ef80 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
2ef90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
2efa0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
2efb0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2efc0 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
2efd0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
2efe0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
2eff0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2f000 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
2f010 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
2f020 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
2f030 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
2f040 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
2f050 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
2f060 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
2f070 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
2f080 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
2f090 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
2f0a0 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
2f0b0 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
2f0c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2f0d0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2f0e0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
2f0f0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
2f100 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
2f110 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
2f120 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
2f130 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2f140 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
2f150 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
2f160 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2f170 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
2f180 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
2f190 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
2f1a0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
2f1b0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
2f1c0 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
2f1d0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
2f1e0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
2f1f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2f200 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
2f210 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
2f220 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
2f230 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
2f240 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
2f250 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
2f260 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
2f270 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
2f280 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
2f290 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
2f2a0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
2f2b0 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
2f2c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2f2d0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
2f2e0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
2f2f0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
2f300 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
2f310 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
2f320 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
2f330 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
2f340 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
2f350 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
2f360 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
2f370 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
2f380 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
2f390 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
2f3a0 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
2f3b0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
2f3c0 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
2f3d0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
2f3e0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
2f3f0 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
2f400 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2f410 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
2f420 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
2f430 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2f440 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
2f450 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
2f460 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
2f470 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
2f480 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
2f490 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
2f4a0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
2f4b0 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
2f4c0 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
2f4d0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
2f4e0 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
2f4f0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
2f500 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2f510 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
2f520 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2f530 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
2f540 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
2f550 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
2f560 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
2f570 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
2f580 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
2f590 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
2f5a0 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
2f5b0 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
2f5c0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
2f5d0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
2f5e0 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
2f5f0 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
2f600 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
2f610 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
2f620 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
2f630 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
2f640 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2f650 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
2f660 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
2f670 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
2f680 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
2f690 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
2f6a0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
2f6b0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
2f6c0 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
2f6d0 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
2f6e0 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
2f6f0 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
2f700 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2f710 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
2f720 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
2f730 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
2f740 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
2f750 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2f760 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
2f770 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
2f780 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
2f790 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
2f7a0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
2f7b0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
2f7c0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
2f7d0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
2f7e0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2f7f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2f800 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2f810 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
2f820 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2f830 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2f840 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
2f850 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
2f860 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
2f870 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
2f880 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
2f890 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
2f8a0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
2f8b0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
2f8c0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
2f8d0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
2f8e0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
2f8f0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
2f900 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
2f910 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
2f920 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
2f930 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
2f940 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
2f950 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
2f960 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
2f970 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
2f980 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
2f990 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
2f9a0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
2f9b0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
2f9c0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
2f9d0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
2f9e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
2f9f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2fa00 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
2fa10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
2fa20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
2fa30 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
2fa40 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
2fa50 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
2fa60 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2fa70 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
2fa80 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
2fa90 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
2faa0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
2fab0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
2fac0 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
2fad0 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
2fae0 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
2faf0 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
2fb00 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
2fb10 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
2fb20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2fb30 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
2fb40 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
2fb50 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2fb60 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2fb70 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
2fb80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2fb90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fba0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
2fbb0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2fbc0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2fbd0 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
2fbe0 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
2fbf0 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
2fc00 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
2fc10 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
2fc20 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
2fc30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2fc40 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de!=SQLITE_OK ){
2fc50 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
2fc60 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
2fc70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
2fc80 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2fc90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
2fca0 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65   pgno, 1, ppPage
2fcb0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
2fcc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fcd0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2fce0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2fcf0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
2fd00 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
2fd10 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
2fd20 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
2fd30 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
2fd40 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
2fd50 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2fd60 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
2fd70 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
2fd80 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
2fd90 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
2fda0 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
2fdb0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
2fdc0 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
2fdd0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
2fde0 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
2fdf0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
2fe00 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2fe10 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
2fe20 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
2fe30 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
2fe40 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
2fe50 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
2fe60 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
2fe70 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
2fe80 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
2fe90 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
2fea0 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
2feb0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
2fec0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
2fed0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
2fee0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
2fef0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
2ff00 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
2ff10 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
2ff20 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
2ff30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ff40 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
2ff50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
2ff60 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
2ff70 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
2ff80 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
2ff90 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
2ffa0 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a  itialized.  */..
2ffb0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
2ffc0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
2ffd0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
2ffe0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
2fff0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
30000 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
30010 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
30020 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
30030 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
30040 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
30050 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
30060 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
30070 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
30080 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
30090 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
300a0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
300b0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
300c0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
300d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
300e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
300f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
30100 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
30110 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
30120 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
30130 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
30140 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
30150 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
30160 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
30170 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
30180 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30190 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
301a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
301b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
301c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
301d0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
301e0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
301f0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
30200 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
30210 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
30220 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
30230 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
30240 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
30250 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
30260 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
30270 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
30280 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
30290 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
302a0 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
302b0 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
302c0 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
302d0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
302e0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
302f0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
30300 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
30310 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
30320 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
30330 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
30340 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
30350 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
30360 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
30370 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
30380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
30390 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
303a0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
303b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
303c0 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
303d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
303e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
303f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30400 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
30410 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
30420 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
30430 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
30440 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
30450 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
30460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30470 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
30480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30490 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
304a0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
304b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
304c0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
304d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
304e0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
304f0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
30500 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
30510 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63  ager );.      rc
30520 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
30530 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
30540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30550 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
30560 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
30570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
30580 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
30590 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
305a0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
305b0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
305c0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
305d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
305e0 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
305f0 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
30600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
30610 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
30620 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
30630 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
30640 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
30650 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70  d(pPager);..  *p
30660 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
30670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30680 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
30690 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
306a0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
306b0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
306c0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
306d0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
306e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
306f0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
30700 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
30710 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
30720 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
30730 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
30740 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
30750 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
30760 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
30770 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
30780 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
30790 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
307a0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
307b0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
307c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
307d0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
307e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
307f0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
30800 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
30810 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
30820 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
30830 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
30840 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
30850 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
30860 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
30870 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
30880 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
30890 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
308a0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
308b0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
308c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
308d0 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
308e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
308f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
30900 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
30910 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
30920 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69  _ERROR );.  sqli
30930 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
30940 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
30950 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
30960 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
30970 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
30980 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
30990 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
309a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
309b0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
309c0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
309d0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
309e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
309f0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
30a00 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
30a10 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
30a20 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
30a30 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
30a40 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
30a50 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
30a60 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
30a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
30a80 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
30a90 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
30aa0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
30ab0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
30ac0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
30ad0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
30ae0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
30af0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
30b00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
30b10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30b20 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
30b30 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
30b40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
30b50 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
30b60 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
30b70 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
30b80 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30b90 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
30ba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30bb0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
30bc0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
30bd0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
30be0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
30bf0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
30c00 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
30c10 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
30c20 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
30c30 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
30c40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
30c50 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
30c60 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
30c70 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
30c80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
30c90 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
30ca0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
30cb0 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
30cc0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
30cd0 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
30ce0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
30cf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
30d00 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
30d10 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
30d20 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
30d30 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
30d40 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
30d50 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
30d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
30d70 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
30d80 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
30d90 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
30da0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
30db0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
30dc0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
30dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30de0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
30df0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
30e00 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30e10 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
30e20 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
30e30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
30e40 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
30e50 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
30e60 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
30e70 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
30e80 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
30e90 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
30ea0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
30eb0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
30ec0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
30ed0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
30ee0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
30ef0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
30f00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
30f10 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
30f20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30f30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30f40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30f60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30f70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
30f80 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
30f90 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
30fa0 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
30fb0 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
30fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30fd0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
30fe0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
30ff0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
31000 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
31010 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
31020 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
31030 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
31040 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
31050 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31060 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
31070 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
31080 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
31090 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
310a0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
310b0 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
310c0 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
310d0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
310e0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
310f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
31100 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
31110 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
31120 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
31130 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31140 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
31150 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31160 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
31170 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
31180 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
31190 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
311a0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
311b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
311c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
311d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
311e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
311f0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
31200 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
31210 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
31220 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
31230 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31240 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
31250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
31260 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31270 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
31280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
31290 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
312a0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
312b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
312c0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
312d0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
312e0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
312f0 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
31300 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
31310 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
31320 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31330 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
31340 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
31350 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
31360 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
31370 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
31380 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
31390 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
313a0 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
313b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
313c0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
313d0 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  );.  #ifdef SQLI
313e0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
313f0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 72  _WRITE.        r
31400 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
31410 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
31420 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
31430 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31440 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
31450 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
31460 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 29  Pager).        )
31470 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20  ;.  #else.      
31480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31490 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
314a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
314b0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
314c0 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
314d0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
314e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
314f0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
31500 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
31510 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
31520 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
31530 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
31540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31550 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
31560 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
31570 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
31580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
315a0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
315b0 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
315c0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
315d0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
315e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
315f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
31600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
31610 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
31620 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
31630 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
31640 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
31650 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
31660 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
31670 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
31680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31690 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
316a0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
316b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
316c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
316d0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
316e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
316f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31700 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
31710 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
31720 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
31730 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
31740 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
31750 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31760 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
31770 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
31780 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
31790 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
317a0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
317b0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
317c0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
317d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
317e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
317f0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
31800 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
31810 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
31820 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
31830 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
31840 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
31850 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
31860 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
31870 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
31880 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
31890 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
318a0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
318b0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
318c0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
318d0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
318e0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
318f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
31900 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
31910 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
31920 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
31930 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
31940 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
31950 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
31960 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
31970 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
31980 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
31990 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
319a0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
319b0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
319c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
319d0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
319e0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
319f0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
31a00 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
31a10 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
31a20 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
31a30 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
31a40 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
31a50 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
31a60 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
31a70 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
31a80 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
31a90 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
31aa0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
31ab0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
31ac0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
31ad0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
31ae0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
31af0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
31b00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31b10 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
31b20 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
31b30 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
31b40 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
31b50 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
31b60 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
31b70 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
31b80 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
31b90 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
31ba0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
31bb0 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
31bc0 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
31bd0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
31be0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
31bf0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
31c00 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
31c10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
31c20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
31c30 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
31c40 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
31c50 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
31c60 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
31c70 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
31c80 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
31c90 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
31ca0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
31cb0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
31cc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31cd0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
31ce0 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
31cf0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
31d00 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
31d10 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
31d20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31d30 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
31d40 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
31d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
31d90 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
31da0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
31db0 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
31dc0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
31dd0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
31de0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
31df0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
31e00 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
31e10 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
31e20 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
31e30 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
31e40 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
31e50 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
31e60 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
31e70 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
31e80 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
31e90 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
31ea0 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
31eb0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
31ec0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
31ed0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
31ee0 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
31ef0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
31f00 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
31f10 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
31f20 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
31f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
31f40 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
31f50 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
31f60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
31f70 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
31f80 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
31f90 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
31fa0 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
31fb0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
31fc0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
31fd0 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
31fe0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
31ff0 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
32000 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
32010 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
32020 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
32030 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
32040 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32050 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
32060 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
32070 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
32080 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
32090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
320a0 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
320b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
320c0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
320d0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
320e0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
320f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32110 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
32120 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
32130 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
32140 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
32150 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
32160 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
32170 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
32180 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
32190 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
321a0 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
321b0 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
321c0 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
321d0 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
321e0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
321f0 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
32200 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
32210 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
32220 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
32230 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
32240 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
32250 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
32260 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
32270 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
32280 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
32290 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
322a0 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
322b0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
322c0 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
322d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
322e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
322f0 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
32300 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
32310 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
32320 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
32330 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
32340 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
32350 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
32360 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
32370 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
32380 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32390 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
323a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
323b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
323c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
323d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
323e0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
323f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
32400 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32410 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
32420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
32430 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
32440 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
32450 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
32460 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
32470 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
32480 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
32490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
324a0 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
324b0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
324c0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
324d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
324e0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
324f0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
32500 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
32510 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
32520 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
32530 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
32540 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
32550 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
32560 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
32570 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
32580 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
32590 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
325a0 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
325b0 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
325c0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
325d0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
325e0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
325f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
32600 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
32610 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
32620 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
32630 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
32640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
32650 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
32660 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
32670 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74  unless a write-t
32680 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
32690 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65  lready .  ** bee
326a0 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a  n started. The j
326b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
326c0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
326d0 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
326e0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76  ..  ** It is nev
326f0 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  er called in the
32700 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20   ERROR state..  
32710 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
32720 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32730 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
32740 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
32750 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32760 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
32770 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
32780 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32790 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
327a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
327b0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
327c0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
327d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
327e0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
327f0 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72   detected, repor
32800 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  t the same error
32810 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69  .  ** again. Thi
32820 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70  s should not hap
32830 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65  pen, but the che
32840 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75  ck provides robu
32850 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
32860 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
32870 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
32880 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
32890 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
328a0 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
328b0 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
328c0 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
328d0 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
328e0 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
328f0 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
32900 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
32910 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
32920 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
32930 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
32940 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43  TE_PERM;..  CHEC
32950 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
32960 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
32970 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
32980 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
32990 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
329a0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
329b0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
329c0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
329d0 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
329e0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
329f0 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61  y(pPg);.  if( pa
32a00 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
32a10 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65   && !subjRequire
32a20 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
32a30 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
32a40 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
32a50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32a60 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
32a70 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
32a80 4d 4f 44 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  MOD );.  }else{.
32a90 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
32aa0 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
32ab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
32ac0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
32ad0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
32ae0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32af0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
32b00 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
32b10 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
32b20 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
32b30 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
32b40 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
32b50 61 64 79 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ady obtained the
32b60 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
32b70 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 67 69 6e  .    ** to begin
32b80 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
32b90 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 20  action, but the 
32ba0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
32bb0 20 6d 69 67 68 74 20 6e 6f 74 20 0a 20 20 20 20   might not .    
32bc0 2a 2a 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20  ** yet be open. 
32bd0 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74  Open it now if t
32be0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
32bf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32c00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32c10 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32c20 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  KED ){.      rc 
32c30 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
32c40 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
32c50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32c60 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
32c70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
32c80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32c90 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
32ca0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
32cb0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
32cc0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
32cd0 67 65 72 29 20 29 3b 0a 20 20 0a 20 20 20 20 2f  ger) );.  .    /
32ce0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
32cf0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
32d00 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
32d10 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
32d20 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
32d30 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
32d40 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
32d50 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
32d60 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
32d70 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
32d80 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
32d90 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
32da0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
32db0 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
32dc0 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
32dd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32de0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
32df0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
32e00 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
32e10 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
32e20 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
32e30 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e  igSize && isOpen
32e40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32e50 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
32e60 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
32e70 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20   *pData2;.      
32e80 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
32e90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
32ea0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
32eb0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
32ec0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
32ed0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
32ee0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
32ef0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
32f00 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
32f10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
32f20 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
32f30 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
32f40 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
32f50 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
32f60 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
32f70 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
32f80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
32f90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
32fa0 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r<=pPager->journ
32fb0 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20  alOff );.       
32fc0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
32fd0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
32fe0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
32ff0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
33000 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
33010 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
33020 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
33030 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a2);..        /*
33040 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
33050 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
33060 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
33070 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
33080 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
33090 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
330a0 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
330b0 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
330c0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
330d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
330e0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
330f0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
33100 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
33110 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
33120 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
33130 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
33140 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
33150 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
33160 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
33170 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
33180 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
33190 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
331a0 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
331b0 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
331c0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
331d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
331e0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
331f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
33200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
33210 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
33220 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
33230 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
33240 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33250 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
33260 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
33270 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
33280 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
33290 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
332a0 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20  e, iOff+4);.    
332b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
332c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
332d0 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
332e0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
332f0 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50  er->jfd, iOff+pP
33300 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
33310 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
33320 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33330 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
33340 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ..        IOTRAC
33350 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
33360 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
33370 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
333a0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
333b0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
333c0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
333d0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
333e0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
333f0 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
33400 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
33410 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
33420 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
33430 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
33440 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
33450 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
33460 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
33470 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
33480 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
33490 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
334a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
334b0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20  urnalOff += 8 + 
334c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
334d0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
334e0 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
334f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33500 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
33510 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
33520 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
33530 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
33540 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
33550 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
33560 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
33570 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
33580 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33590 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
335a0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
335b0 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
335c0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
335d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
335e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
335f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33600 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
33610 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
33620 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
33630 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
33650 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
33660 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
33670 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
33680 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
33690 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
336a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
336b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
336c0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
336d0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
336e0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
33700 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
33710 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
33720 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
33730 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
33740 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
33750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33760 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
33770 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
33780 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
33790 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
337a0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
337b0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
337c0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
337d0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
337e0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
337f0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
33800 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
33810 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
33820 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
33830 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
33840 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
33850 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
33860 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
33870 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
33880 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
33890 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
338a0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
338b0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
338c0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
338d0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
338e0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
338f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
33900 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
33910 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
33920 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
33930 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
33940 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
33950 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
33960 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
33970 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
33980 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
33990 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
339a0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
339b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
339c0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
339d0 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
339e0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
339f0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
33a00 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
33a10 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
33a20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
33a30 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
33a40 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
33a50 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
33a60 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
33a70 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
33a80 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
33a90 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
33aa0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
33ab0 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
33ac0 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
33ad0 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
33ae0 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
33af0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
33b00 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
33b10 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
33b20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
33b30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
33b40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
33b50 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
33b60 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
33b70 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
33b80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
33b90 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
33ba0 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
33bb0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
33bc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33bd0 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
33be0 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
33bf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33c00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33c10 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
33c20 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
33c30 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
33c40 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
33c50 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
33c60 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
33c70 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  Size);..  assert
33c80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33c90 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
33ca0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
33cb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33cc0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
33cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
33ce0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
33cf0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
33d00 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
33d10 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
33d20 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
33d30 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
33d40 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
33d50 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
33d60 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
33d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33d80 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
33d90 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
33da0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
33db0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
33dc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
33dd0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
33de0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
33df0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
33e00 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
33e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
33e30 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
33e40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
33e50 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
33e60 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
33e70 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
33e80 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
33e90 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
33ea0 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
33eb0 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
33ec0 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
33ed0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
33ee0 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
33ef0 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
33f00 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
33f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
33f20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
33f30 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
33f40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
33f50 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
33f60 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
33f70 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
33f80 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
33f90 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
33fa0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
33fb0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
33fc0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
33fd0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
33fe0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
33ff0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
34000 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
34010 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
34020 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
34030 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
34040 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
34050 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
34060 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
34070 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
34080 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
34090 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
340a0 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
340b0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
340c0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
340d0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
340e0 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
340f0 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
34100 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
34110 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
34120 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
34130 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
34140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
34150 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
34160 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
34170 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
34180 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
34190 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
341a0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
341b0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
341c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
341d0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
341e0 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
341f0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
34200 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
34210 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
34220 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
34230 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
34240 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
34250 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
34260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
34270 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
34280 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
34290 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
342a0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
342b0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
342c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
342d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
342e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
342f0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
34300 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
34310 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
34320 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
34330 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
34340 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
34350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
34360 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
34370 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
34380 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
34390 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
343a0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
343b0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
343c0 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
343d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
343e0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
343f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
34400 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
34410 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
34420 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
34430 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
34440 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
34450 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
34460 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
34470 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
34480 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
34490 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
344a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
344b0 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
344c0 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
344d0 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
344e0 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
344f0 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
34500 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
34510 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
34520 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
34530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
34540 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
34550 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
34560 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
34570 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
34580 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
34590 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
345a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
345b0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
345c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
345d0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
345e0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
345f0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
34600 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
34610 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
34620 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
34630 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
34640 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
34650 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
34660 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
34670 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
34680 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
34690 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
346a0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
346b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
346c0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
346d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
346e0 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
346f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
34700 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73  cSpill--;.  }els
34710 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
34720 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
34730 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
34740 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
34750 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
34760 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
34770 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
34780 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
34790 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
347a0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
347b0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
347c0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
347d0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
347e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
347f0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
34800 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
34810 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34820 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
34830 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
34840 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
34850 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
34860 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
34870 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
34880 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
34890 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
348a0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
348b0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
348c0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
348d0 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
348e0 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
348f0 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
34900 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
34910 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
34920 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
34930 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
34940 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
34950 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
34960 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
34970 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
34980 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
34990 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
349a0 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
349b0 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
349c0 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
349d0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
349e0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
349f0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
34a00 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
34a10 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
34a20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
34a30 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
34a40 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
34a50 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
34a60 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
34a70 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
34a80 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
34a90 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
34aa0 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
34ab0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
34ac0 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
34ad0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
34ae0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
34af0 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
34b00 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
34b10 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
34b20 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
34b30 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
34b40 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
34b50 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
34b60 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
34b70 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
34b80 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
34b90 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
34ba0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
34bb0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
34bc0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
34bd0 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
34be0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
34bf0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
34c00 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
34c10 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
34c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
34c30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
34c40 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
34c50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
34c60 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
34c70 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
34c80 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
34c90 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
34ca0 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
34cb0 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
34cc0 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
34cd0 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
34ce0 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  f the isDirectMo
34cf0 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  de flag is zero,
34d00 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
34d10 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
34d20 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
34d30 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
34d40 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
34d50 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
34d60 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
34d70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
34d80 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
34d90 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
34da0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
34db0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
34dc0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
34dd0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
34de0 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
34df0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
34e00 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
34e10 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
34e20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
34e30 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
34e40 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
34e50 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
34e60 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
34e70 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
34e80 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
34e90 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
34ea0 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
34eb0 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
34ec0 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
34ed0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
34ee0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
34ef0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
34f00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
34f10 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
34f20 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
34f30 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
34f40 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
34f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
34f60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
34f70 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34f80 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
34f90 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
34fa0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34fb0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
34fc0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
34fd0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
34fe0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c  r) );..  /* Decl
34ff0 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  are and initiali
35000 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65  ze constant inte
35010 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20  ger 'isDirect'. 
35020 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d  If the.  ** atom
35030 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
35040 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
35050 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
35060 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20  then isDirect.  
35070 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ** is initialize
35080 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  d to the value p
35090 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44  assed as the isD
350a0 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65  irectMode parame
350b0 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ter.  ** to this
350c0 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
350d0 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61  wise, it is alwa
350e0 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
350f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64    **.  ** The id
35100 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68  ea is that if th
35110 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
35120 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
35130 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20  ot.  ** enabled 
35140 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
35150 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61   the compiler ca
35160 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73  n omit the tests
35170 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65   of.  ** 'isDire
35180 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65  ct' below, as we
35190 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20  ll as the block 
351a0 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a  enclosed in the.
351b0 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65    ** "if( isDire
351c0 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e  ct )" condition.
351d0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
351e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
351f0 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e  IC_WRITE.# defin
35200 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a  e DIRECT_MODE 0.
35210 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
35220 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
35230 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
35240 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
35250 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49  else.# define DI
35260 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65  RECT_MODE isDire
35270 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20  ctMode.#endif.. 
35280 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
35290 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
352a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
352b0 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
352c0 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20  pPgHdr;         
352d0 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65         /* Refere
352e0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
352f0 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f  .    u32 change_
35300 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
35310 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
35320 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f  lue of change-co
35330 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a  unter field */..
35340 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
35350 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
35360 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
35370 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fd) );..    /* O
35380 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
35390 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
353a0 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
353b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
353c0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
353d0 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dr);.    assert(
353e0 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63   pPgHdr==0 || rc
353f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
35400 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f      /* If page o
35410 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73  ne was fetched s
35420 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64  uccessfully, and
35430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35440 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65  s not.    ** ope
35450 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74  rating in direct
35460 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65  -mode, make page
35470 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68   1 writable.  Wh
35480 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a  en not in .    *
35490 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70  * direct mode, p
354a0 61 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20  age 1 is always 
354b0 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e  held in cache an
354c0 64 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65  d hence the Page
354d0 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62  rGet().    ** ab
354e0 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75  ove is always su
354f0 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65  ccessful - hence
35500 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72   the ALWAYS on r
35510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  c==SQLITE_OK..  
35520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49    */.    if( !DI
35530 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57  RECT_MODE && ALW
35540 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  AYS(rc==SQLITE_O
35550 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
35560 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35570 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
35580 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
35590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
355a0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
355b0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
355c0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
355d0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
355e0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65   */.      change
355f0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
35600 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
35610 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
35620 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  rs);.      chang
35630 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
35640 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
35650 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
35660 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
35670 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20  ounter);..      
35680 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
35690 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
356a0 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
356b0 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
356c0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 39 32       ** bytes 92
356d0 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63  ..95 store the c
356e0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f  hange counter fo
356f0 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73  r which the vers
35700 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ion number.     
35710 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f   ** is valid. */
35720 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
35730 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
35740 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
35750 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20  ge_counter);.   
35760 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
35770 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
35780 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56  ta)+96, SQLITE_V
35790 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a  ERSION_NUMBER);.
357a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
357b0 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
357c0 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
357d0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
357e0 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
357f0 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52 45  /.      if( DIRE
35800 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20  CT_MODE ){.     
35810 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
35820 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Buf;.        ass
35830 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46  ert( pPager->dbF
35840 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20  ileSize>0 );.   
35850 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
35860 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61 74  er, pPgHdr->pDat
35870 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49  a, 1, 6, rc=SQLI
35880 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b  TE_NOMEM, zBuf);
35890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
358a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
358b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
358c0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
358d0 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
358e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
358f0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
35900 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35920 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
35930 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
35940 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35960 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
35970 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
35980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
35990 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
359a0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
359b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
359c0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
359d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
359e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
359f0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
35a00 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
35a10 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
35a20 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20  memory files.** 
35a30 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68  or pages with th
35a40 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
35a50 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
35a60 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
35a70 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
35a80 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
35a90 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
35aa0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
35ab0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
35ac0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
35ad0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
35ae0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
35af0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
35b00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35b10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35b40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
35b50 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
35b60 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
35b70 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
35b80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
35b90 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
35ba0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
35bb0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
35bc0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
35bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35be0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35bf0 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
35c00 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72  alled while a wr
35c10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35c20 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20  is active in.** 
35c30 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65  rollback. If the
35c40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
35c50 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73  n WAL mode, this
35c60 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
35c70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
35c80 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
35c90 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  on does not alre
35ca0 61 64 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c  ady have an EXCL
35cb0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a  USIVE lock on .*
35cc0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
35cd0 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ile, an attempt 
35ce0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
35cf0 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n one..**.** If 
35d00 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
35d10 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
35d20 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70  ld or the attemp
35d30 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69  t to obtain it i
35d40 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c  s.** successful,
35d50 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   or the connecti
35d60 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  on is in WAL mod
35d70 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
35d80 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
35d90 65 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53  erwise, either S
35da0 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e  QLITE_BUSY or an
35db0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
35dc0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
35dd0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
35de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35df0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50  rExclusiveLock(P
35e00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35e10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35e20 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
35e30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35e40 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
35e50 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  EMOD .       || 
35e60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35e70 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
35e80 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
35e90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35ea0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35eb0 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
35ec0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
35ed0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
35ee0 20 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73    if( 0==pagerUs
35ef0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
35f00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
35f10 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
35f20 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
35f30 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  CK);.  }.  retur
35f40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
35f50 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
35f60 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
35f70 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
35f80 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
35f90 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
35fa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
35fb0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
35fc0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
35fd0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
35fe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
35ff0 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
36000 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
36010 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
36020 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
36030 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
36040 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
36050 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
36060 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
36070 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
36080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
36090 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73  hange-counter is
360a0 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a   updated,.**   *
360b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
360c0 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74  synced (unless t
360d0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
360e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
360f0 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c  used),.**   * al
36100 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72  l dirty pages ar
36110 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
36120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
36130 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
36140 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75  base file is tru
36150 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69  ncated (if requi
36160 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  red), and.**   *
36170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36180 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a  le synced. .**.*
36190 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
361a0 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
361b0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
361c0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69  saction is to fi
361d0 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65  nalize .** (dele
361e0 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20  te, truncate or 
361f0 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70  zero the first p
36200 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72  art of) the jour
36210 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a  nal file (or .**
36220 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
36230 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
36240 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
36250 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
36260 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
36270 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
36280 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
36290 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
362a0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
362b0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
362c0 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
362d0 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
362e0 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79  parameter - noSy
362f0 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68  nc - is true, th
36300 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
36310 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69  file itself.** i
36320 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68  s not synced. Th
36330 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61  e caller must ca
36340 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ll sqlite3PagerS
36350 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74  ync() directly t
36360 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61  o.** sync the da
36370 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
36380 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69  re calling Commi
36390 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64  tPhaseTwo() to d
363a0 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  elete the.** jou
363b0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69  rnal file in thi
363c0 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
363d0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
363e0 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67  tPhaseOne(.  Pag
363f0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
36400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36410 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
36420 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
36430 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  aster,          
36440 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
36450 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
36460 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
36470 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20  nt noSync       
36480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36490 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74  * True to omit t
364a0 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20  he xSync on the 
364b0 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  db file */.){.  
364c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
364d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
364e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
364f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
36500 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36510 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36520 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36530 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36540 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36550 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36560 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36570 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
36580 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
36590 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
365a0 52 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ROR.  );.  asser
365b0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
365c0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
365d0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
365e0 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
365f0 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72  , report that er
36600 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ror again. */.  
36610 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
36620 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
36630 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
36640 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  ode;..  PAGERTRA
36650 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59  CE(("DATABASE SY
36660 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
36670 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
36680 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
36690 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
366a0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
366b0 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  bSize));..  /* I
366c0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68  f no database ch
366d0 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
366e0 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72  made, return ear
366f0 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ly. */.  if( pPa
36700 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
36710 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
36720 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  D ) return SQLIT
36730 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  E_OK;..  if( MEM
36740 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  DB ){.    /* If 
36750 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
36760 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
36770 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
36780 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
36790 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
367a0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
367b0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
367c0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
367d0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
367e0 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
367f0 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
36800 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
36810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
36820 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
36830 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
36840 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36850 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
36860 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
36870 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
36880 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
36890 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
368a0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69  PCache);.      i
368b0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
368c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
368d0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
368e0 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64  pList, pPager->d
368f0 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20  bSize, 1, .     
36900 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
36910 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65  fullSync ? pPage
36920 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20  r->sync_flags : 
36930 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
36940 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36970 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
36980 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
36990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
369a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
369b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
369c0 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
369d0 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61  nge-counter. Exa
369e0 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20  ctly how it.    
369f0 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64    ** does this d
36a00 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
36a10 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
36a20 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
36a30 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ization.      **
36a40 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
36a50 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e  compile time, an
36a60 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61  d if this transa
36a70 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20  ction meets the 
36a80 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  .      ** runtim
36a90 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
36aa0 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
36ab0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
36ac0 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c   **    * The fil
36ad0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
36ae0 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
36af0 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
36b00 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c        **      bl
36b10 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
36b20 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20  e-size, and .   
36b30 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20     **    * This 
36b40 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61  commit is not pa
36b50 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
36b60 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  le transaction, 
36b70 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  and.      **    
36b80 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  * Exactly one pa
36b90 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
36ba0 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
36bb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
36bc0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
36bd0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
36be0 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f  imization was no
36bf0 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  t enabled at com
36c00 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20  pile time, then 
36c10 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
36c20 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
36c30 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
36c40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
36c50 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
36c60 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72        ** counter
36c70 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f   in 'indirect-mo
36c80 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69  de'. If the opti
36c90 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  mization is comp
36ca0 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20  iled in but.    
36cb0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c    ** is not appl
36cc0 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
36cd0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c  ransaction, call
36ce0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
36cf0 72 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a  reate().      **
36d00 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
36d10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
36d20 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e  as actually been
36d30 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
36d40 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  all.      ** pag
36d50 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
36d60 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
36d70 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
36d80 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74  nter in indirect
36d90 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  .      ** mode. 
36da0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
36db0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
36dc0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
36dd0 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65  n is both enable
36de0 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65  d and applicable
36df0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
36e00 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
36e10 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
36e20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
36e30 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
36e40 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74     ** in 'direct
36e50 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  ' mode. In this 
36e60 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
36e70 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
36e80 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65   be.      ** cre
36e90 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
36ea0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
36eb0 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c   */.  #ifdef SQL
36ec0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
36ed0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67  C_WRITE.      Pg
36ee0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
36ef0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
36f00 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
36f10 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
36f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
36f30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36f40 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
36f50 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
36f60 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
36f70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
36f80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
36f90 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20  if( !zMaster && 
36fa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
36fb0 66 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  fd) .       && p
36fc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36fd0 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  f==jrnlBufferSiz
36fe0 65 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  e(pPager) .     
36ff0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53    && pPager->dbS
37000 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ize>=pPager->dbO
37010 72 69 67 53 69 7a 65 0a 20 20 20 20 20 20 20 26  rigSize.       &
37020 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c  & (0==(pPg = sql
37030 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
37040 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
37050 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d  che)) || 0==pPg-
37060 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29  >pDirty).      )
37070 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  {.        /* Upd
37080 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
37090 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
370a0 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
370b0 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
370c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
370d0 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
370e0 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
370f0 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
37100 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
37110 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63         ** to inc
37120 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
37130 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
37140 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
37150 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
37160 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  * directly to th
37170 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37180 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
37190 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20  atomic-write .  
371a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74        ** propert
371b0 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
371c0 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20  le-system, this 
371d0 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20  is safe..       
371e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
371f0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
37200 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
37210 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
37220 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
37230 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
37240 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
37250 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37270 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
37280 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
37290 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
372a0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
372b0 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20      }.  #else.  
372c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
372d0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
372e0 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
372f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
37300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37310 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
37320 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
37330 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
37340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
37350 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
37360 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
37370 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
37380 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
37390 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
373a0 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
373b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
373c0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
373d0 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  le. This can onl
373e0 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  y happen in auto
373f0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20  -vacuum mode..  
37400 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
37410 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74  Before reading t
37420 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61  he pages with pa
37430 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65  ge numbers large
37440 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20  r than the .    
37450 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c    ** current val
37460 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
37470 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62  ze, set dbSize b
37480 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
37490 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
374a0 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
374b0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
374c0 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
374d0 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  e, the.      ** 
374e0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
374f0 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
37500 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
37510 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20  nstead of .     
37520 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61   ** reading data
37530 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
37540 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
37550 2f 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49  /.  #ifndef SQLI
37560 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
37570 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  UM.      if( pPa
37580 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67  ger->dbSize<pPag
37590 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
375a0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
375b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
375c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
375d0 5f 4f 46 46 0a 20 20 20 20 20 20 29 7b 0a 20 20  _OFF.      ){.  
375e0 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20        Pgno i;   
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37610 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
37620 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37630 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70  const Pgno iSkip
37640 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
37650 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e  (pPager); /* Pen
37660 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a  ding lock page *
37670 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
37680 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50  Pgno dbSize = pP
37690 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20  ager->dbSize;   
376a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
376b0 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20  image size */ . 
376c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
376d0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
376e0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20  dbOrigSize;.    
376f0 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a      for( i=dbSiz
37700 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  e+1; i<=pPager->
37710 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20  dbOrigSize; i++ 
37720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
37730 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
37740 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
37750 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
37760 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
37770 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
37780 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
37790 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e  /* Page to journ
377a0 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  al */.          
377b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
377c0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
377d0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
377e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
377f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
37800 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
37810 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
37820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37830 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29  agerWrite(pPage)
37840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
37850 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
37860 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
37870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37880 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
37890 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
378a0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
378b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
378c0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
378d0 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20   = dbSize;.     
378e0 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a   } .  #endif.  .
378f0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
37900 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
37910 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
37920 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
37930 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20   a master .     
37940 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
37950 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
37960 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
37970 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
37980 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  le, .      ** or
37990 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e   if zMaster is N
379a0 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a  ULL (no master j
379b0 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68  ournal), then th
379c0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
379d0 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
379e0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
379f0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
37a00 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
37a10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37a20 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
37a30 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
37a40 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53  t;.  .      /* S
37a50 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
37a60 66 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 61  file and write a
37a70 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
37a80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
37a90 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
37aa0 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
37ab0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65  timization is be
37ac0 69 6e 67 20 75 73 65 64 2c 20 74 68 69 73 20 73  ing used, this s
37ad0 79 6e 63 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20  ync will not .  
37ae0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 74 68      ** create th
37af0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
37b00 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 72 65  r perform any re
37b10 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a 0a  al IO..      **.
37b20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
37b30 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
37b40 74 65 72 20 70 61 67 65 20 77 61 73 20 6a 75 73  ter page was jus
37b50 74 20 6d 6f 64 69 66 69 65 64 2c 20 75 6e 6c 65  t modified, unle
37b60 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
37b70 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
37b80 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
37b90 65 64 20 69 74 20 69 73 20 61 6c 6d 6f 73 74 20  ed it is almost 
37ba0 63 65 72 74 61 69 6e 20 74 68 61 74 20 74 68 65  certain that the
37bb0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
37bc0 6c 20 72 65 71 75 69 72 65 73 20 61 20 73 79 6e  l requires a syn
37bd0 63 20 68 65 72 65 2e 20 48 6f 77 65 76 65 72 2c  c here. However,
37be0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
37bf0 3d 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20  =exclusive.     
37c00 20 2a 2a 20 6f 6e 20 61 20 73 79 73 74 65 6d 20   ** on a system 
37c10 75 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72 65  under memory pre
37c20 73 73 75 72 65 20 69 74 20 69 73 20 6a 75 73 74  ssure it is just
37c30 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
37c40 68 69 73 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  his is .      **
37c50 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 20 49   not the case. I
37c60 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
37c70 73 20 6c 69 6b 65 6c 79 20 65 6e 6f 75 67 68 20  s likely enough 
37c80 74 68 61 74 20 74 68 65 20 72 65 64 75 6e 64 61  that the redunda
37c90 6e 74 0a 20 20 20 20 20 20 2a 2a 20 78 53 79 6e  nt.      ** xSyn
37ca0 63 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65  c() call will be
37cb0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 6e 6f   changed to a no
37cc0 2d 6f 70 20 62 79 20 74 68 65 20 4f 53 20 61 6e  -op by the OS an
37cd0 79 68 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  yhow. .      */.
37ce0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
37cf0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30  ournal(pPager, 0
37d00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
37d20 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
37d30 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
37d40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
37d50 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
37d60 65 72 2c 73 71 6c 69 74 65 33 50 63 61 63 68 65  er,sqlite3Pcache
37d70 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
37d80 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20  ->pPCache));.   
37d90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37db0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
37dc0 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
37dd0 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
37de0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
37df0 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  e_exit;.      }.
37e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
37e10 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
37e20 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
37e30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
37e40 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
37e50 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69   not the same si
37e60 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ze as the databa
37e70 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20  se image,.      
37e80 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65  ** then use page
37e90 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72  r_truncate to gr
37ea0 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65  ow or shrink the
37eb0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
37ec0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
37ed0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70  Pager->dbSize!=p
37ee0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
37ef0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  e ){.        Pgn
37f00 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d  o nNew = pPager-
37f10 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65  >dbSize - (pPage
37f20 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52  r->dbSize==PAGER
37f30 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
37f40 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
37f50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37f60 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37f70 44 42 4d 4f 44 20 29 3b 0a 20 20 20 20 20 20 20  DBMOD );.       
37f80 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
37f90 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65  cate(pPager, nNe
37fa0 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
37fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37fc0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
37fd0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
37fe0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
37ff0 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68  Finally, sync th
38000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
38010 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
38020 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
38030 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
38040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38050 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
38060 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
38070 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a  flags);.      }.
38080 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
38090 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
380a0 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 7d  ager)).    }.  }
380b0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
380c0 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  ne_exit:.  if( r
380d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
380e0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
380f0 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 61 67  ger) ){.    pPag
38100 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
38110 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
38120 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ED;.  }.  return
38130 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
38140 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
38150 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
38160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
38170 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
38180 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
38190 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
381a0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
381b0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
381c0 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
381d0 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
381e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
381f0 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
38200 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
38210 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
38220 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
38230 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
38240 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
38250 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
38260 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
38270 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
38280 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
38290 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
382a0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
382b0 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
382c0 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
382d0 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
382e0 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
382f0 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
38300 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
38310 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
38320 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
38330 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
38340 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
38350 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
38360 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
38370 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
38380 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
38390 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
383a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
383b0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
383c0 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
383d0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
383e0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
383f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
38400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
38410 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38420 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
38430 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
38440 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
38450 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
38460 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
38470 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
38480 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
38490 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72  ed if a prior er
384a0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
384b0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64  ..  ** But if (d
384c0 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
384d0 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69  rror elsewhere i
384e0 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74  n the system) it
384f0 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63   does get.  ** c
38500 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75  alled, just retu
38510 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
38520 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64  r code without d
38530 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a  oing anything. *
38540 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
38550 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
38560 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
38570 65 72 72 43 6f 64 65 3b 0a 0a 20 20 61 73 73 65  errCode;..  asse
38580 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
38590 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
385a0 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
385b0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
385c0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
385d0 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
385e0 7c 20 28 70 61 67 65 72 55 73 65 57 61 6c 28 70  | (pagerUseWal(p
385f0 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
38600 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
38610 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 29  WRITER_CACHEMOD)
38620 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
38630 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
38640 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
38650 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
38660 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
38670 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
38680 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
38690 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
386a0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, th